内容正文:
编写说明:本冲刺卷严格依据湖南省计算机应用类高考考纲编写,依托《C语言程序设计》(高等教育出版社第5版),聚焦高三考生冲刺需求,助力高效提分。内容上深度覆盖考纲掌握、理解层级考点,既系统梳理构建知识框架,又强化应用能力训练;同时结合近五年高考真题,精准把握高频考点、命题趋势与题型特点,确保贴合高考方向。
湖南省计算机应用类
《C语言程序设计》
高频考点冲刺卷(九)解析版
时间:60分钟 总分:100分
班级:_________ 姓名:________ 学号:________ 成绩:_________
一、单选题(在本题的每一小题的备选答案中,只有一个答案是正确的。本大题共5小题,每小题2分,共10分)
1.若有说明:int i,j=2,*p=&i;,则能完成i=j赋值功能的语句是( )
A.i=*p; B.*p=*&j; C.i=&j; D.i=**p;
【答案】B
【解析】p 是指向 i 的指针,*p 等价于变量 i;*&j 等价于变量 j(&j 取 j 的地址,* 解引用得到 j 的值)。选项 B 中 *p=*&j 等价于 i=j,完成赋值功能。
2.以下选项中,当x的绝对值在1至6范围内表达式值为"真"的是( )
A.(x>=1)&&(x<=6)&&(x>=-6)&&(x<=-1)
B.(x>=-6)&&(x<=-1)||(x>=1)&&(x<=6)
C.(x>=-6)||(x<=-1)||(x>=1)||(x<=6)
D.(x>=1)&&(x<=6)||(x>=-1)&&(x<=-6)
【答案】B
【解析】根据题目要求可知x的取值范围是[-1,-6]和[1,6].,B选项中只需要或的两个表达式中有一个为真,结果为真。当x取[-1,-6]时,X>=-6)&e(x(=-1)为真,故表达式为真;当x取[1,6]时,(x>=1)&&(x<=6)为真,故表达式为真,符合题意,故选项B正确。所以本题答案选B。
3.设有以下定义和输入语句,若要求给c1输入字母M,给c2输入字母N,则以下输入形式中正确的是( )(注:£代表空格,输入从第一列开始)
char c1, c2;
scanf("%3c%3c", &c1,&c2);
A.M£N££<回车> B.££M££N<回车>
C.M<回车>N<回车> D.££M<回车>££N<回车>
【答案】A
【解析】scanf函数的般调用形式如下:scanf(格式控制,输入项1,输入项2....)。可以在格式字符前加入一个正整数指定输入数据所占的宽度,本题中的格式控制是%3c,每个变量所占的宽度应为3个字符,故选项A正确。
4.设有以下程序代码。则程序运行后的输出结果是( )
#include<stdio.h>
int new_div(double a,double b)
{return a/b+0.5;}
main()
{printf("%d", new_div(7.8,3.1));}
A.0 B.1 C.2 D.3
【答案】D
【解析】ew div函数被定义为int类型,所以返回值a/B、+0.5也是int类型,a/b+0.5=8/3+0.5=2+0.5=2.5,转换为整型后,四舍五入,经计算得出,返回值为3,故D选项正确。
5.设有定义:int x[10],*p=x,i,若要为数组x读入数据,以下选项正确的是( )
A. for(i=0;i<10;i++) scanf("%d", p+i);
B. for(i=0;i<10;i++) scanf("%d", *p+i);
C. for(i=0;i<10;i++) scanf("%d",*(p+i);
D. for(i=0;i<10;i++) scanf("%d" ,x[i]);
【答案】A
【解析】指针p一开始指向的是数组x的首地址。p+1表示指针p指向存储单元x[1],以此类推,故选项A正确。
二、程序分析题(本大题共3小题,共70分)
1.阅读程序,写出运行结果(每空2分,共14分)
(1)下列程序的运行结果是_________________。
#include <stdio.h>
main()
{
int arr[ ]={77,25,64,22,1};
int n=sizeof(arr)/sizeof(arr[0]),i,j,min_index,temp;
for(i=0;i<n-1;i++)
{ min_index=i;
for(j=i+1;j<n;j++)
{ if(arr[j]<arr[min_index])
{ min_index=j; }
}
if(min_index!=i)
{ temp=arr[i];
arr[i]=arr[min_index];
arr[min_index]=temp;
}
}
for(i=0;i<n;i++)
{ printf("%d ",arr[i]); }
}
【答案】1 22 25 64 77
(2)下列程序的运行结果是_________________。
#include <stdio.h>
int mystery(int n)
{
static int cache = 1;
static int calls = 0;
calls++;
if (n == 0) return cache;
if (calls % 2 == 0)
{ cache = cache * n;}
else
{ cache = cache + n; }
return mystery(n - 1) + cache;
}
main() {
int result = mystery(3);
printf("%d
", result);
}
【答案】36
(3)下列程序的运行结果是_________________。
#include <stdio.h>
int main() {
char s[] = "AABBCDDAE";
char *p = s, *q = s,*k;
int found;
while (*q) {
found = 0;
for (k = s; k < p; k++) {
if (*k == *q) { found = 1; break; }
}
if (!found) *p++ = *q;
q++;
}
*p = '\0';
printf("%s,%d
", s, p - s);
}
【答案】ABCDE,5
(4)下列程序的运行结果是_________________。
#include<stdio.h>
void f(char *from,char *to)
{ while(*to)
to++;
while((*to++=*from++)!='\0');
}
main()
{ char s1[80]="abc";
char s2[80]="123";
f(s2,s1);
printf("s1=%s
",s1);
printf("s2=%s
",s2);
}
【答案】
s1=abc123
s2=123
(5)下列程序的运行结果是_________________。
#include <stdio.h>
int f(int x) {
static int y = 0;
y += x; return y; }
int g(int *a, int n) {
int sum = 0,i;
for(i = 0; i < n; i++) {
if(a[i] > 3) {
sum += f(a[i]);}
else {
sum -= f(a[i] - 1); }
}
return sum;}
main() {
int arr[] = {2, 5, 1, 4, 3};
int result = 0,i;
for(i = 0; i < 3; i++) {
result += g(arr + i, 3); }
printf("%d
", result); }
【答案】-3
(6)程序运行时输入58,则下列程序的运行结果是_________________。
#include<stdio.h>
main()
{
int a[6]={34,23,45,67,19};
int i,j,t,x;
for(i=0;i<5-1;i++)
for(j=i+1;j<5;j++)
if(a[i]<a[j])
{t=a[i];a[i]=a[j];a[j]=t;}
scanf("%d",&x);
i=4;
while(i>=0&&a[i]<x)
{a[i+1]=a[i];i--;}
a[i+1]=x;
for(i=0;i<6;i++)
printf("%5d",a[i]);
printf("
");
}
【答案】 67 58 45 34 23 19
(7)下列程序的运行结果是_________________。
#include<stdio.h>
int fun2(int x,int y)
{int z;
z=x*y%3;
return z;}
int fun1(int x,int y)
{int z;x+=x;y+=y;
z=fun2(x,y);
return z*z;}
main()
{
int x=11,y=19;
printf("%d
",fun1(x,y));
}
【答案】4
2.程序填空。按照题目要求,将正确内容填入程序空白处,使程序完整(每空2分,共36分)。
(1)在此程序中,函数fun()的功能是在3x4的矩阵中找出在行上最大,在列上最小的元素,若没有符合条件的元素则输出相应信息。
例如,有下列矩阵:
1 2 13 4
7 8 10 6
3 5 9 7
程序执行结果为find:a[2][2]=9.
请在程序的下划线处填入正确的内容,使程序得出正确的结果。(4空)
#include <stdio.h>
#define M 3
#define N 4
void fun(int (*a)[N])
{int i=0,j,find=0,rmax,c,k;
while(_______①_______)
{ rmax=a[i][0];c=0;
for(j=1;j<N;j++)
if(_______②_______)
{ rmax=a[i][j];
c=j;}
find=1;k=0;
while(k<M && find)
{
if (__________③_________)
find=0;
k++;
}
if(________④________)
printf("find:a[%d][%d]=% d
",i,c,a[i][c]);
i++;
}
if(! find)
printf("Not found!
");
}
main()
{int x[M][N],i,j;
printf("Enter number for array:
");
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%d",&x[i][j]);
printf("The array:
");
for(i=0;i<M;i++)
{for(j=0;j<N;j++)
printf("% 3d",x[i][j]);
printf("
");
}
fun(x);
}
【答案】①(i<M) &&(!find) ②rmax<a[i][j]
③k!=i&&a[k][c]<=rmax ④find
(2)某商场有若干个种商品,每种商品的信息包括编号,名称,每季度的营业额(单位:万元)。从键盘输入每种商品的信息,计算每种商品的年平均营业额,将原有数据和平均值存入二进制文件 yye.bin中,再从文件 yye.bin中将数据读出并显示在屏幕上。(5空)
#include <stdio.h>
#define N 3 //N个商品
#define M 4 //M个季度
struct gs
{
char bh[6]; //商品编号
char mc[10]; //商品名称
float yue[M]; //季度营业额
float ave; //平均营业额
}goods[N];
void main()
{
FILE *fp;
int i,j;
float sum;
for(i=0;i<N;i++)
{
printf("请输入第%d商品的信息:
",i+1);
printf("编号:");
scanf("%s",__________①_________);
printf("名称:");
scanf("%s",goods[i].mc);
sum=0.0;
for(j=0;j<M;j++)
{
printf("输入%d个季度的营业额:",j+1);
scanf("%f",&goods[i].yue[j]);
__________②___________;
}
goods[i].ave=_______③______;
}
if((fp=fopen("yye.bin",______④_____))==NULL)
{
printf("不能打开文件,写文件失败!
");
return;
}
fwrite(goods,sizeof(struct gs),N,fp);
_________⑤___________;
printf("编号\t名称\t1季度\t2季度\t3季度\t4季度\t平均额
");
for(i=0;i<N;i++)
{
fread(&goods[i],sizeof(struct gs),1,fp);
printf("%s\t%s\t%7.2f\t%7.2f\t%7.2f\t%7.2\t%7.2f
",goods[i].bh,
goods[i].mc,goods[i].yue[0],goods[i].yue[1],
goods[i].yue[2],goods[i].yue[3],goods[i].ave);
}
fclose(fp);
}
【答案】①goods[i].bh ②sum=sum+goods[i].yue[j]
③sum/M ④"wb+" ⑤rewind(fp)
(3)下列程序通过定义并赋初值的方式,利用结构体变量存储了一名学生的学号,姓名和3门课的成绩。函数fun的功能是将该学生的各科成绩都乘以一个系数a,请在程序的下划线处填入正确的内容,使程序得出正确的结果。(4空)
#include <stdio.h>
#include <string.h>
typedef struct
{
int num;
char name[9];
float score[3];
}STU;
void show(STU tt)
{
int i;
printf("%d %s:",_______①__________);
for(i=0;i<3;i++)
printf("%5.1f ",tt.score[i]);
printf("
");
}
void modify(_______②______,float a)
{
int i;
for(i=0;i<3;i++)
ss->score[i]=________③__________
}
main()
{
STU std={1,"Zhang",76.5,78.0,82.0};
float a;
printf("n The original number and name and scores:
");
show(std);
printf("
Input a number:");
scanf("%f",&a);
________④_________;
printf("
A result of modifying:
");
show(std);
}
【答案】①tt.num,tt.name ②STU *ss ③ss->score[i]*a;
④modify(&std,a)
(4)以下程序的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放在主函数的age数组中;要求函数把0至9岁年龄段的人数放在d[0]中,把10至19岁年龄段的人数放在d[1]中,把20至29岁年龄段的人数放在d[2]中,其余依次类推,把100岁(含100岁)以上年龄的人数放在d[10]中。(5空)
#include <stdio.h>
#define N 50
#define M 11
void fun(int *a, int *b)
{
int i,j;
for (j=0;j<M;j++)
b[j]=0;
for (i=0;i<N;i++)
{
switch (_______①________)
{
case 0:b[0]++; break;
case 1:b[1]++; break;
case 2:b[2]++;break;
case 3:b[3]++;break;
case 4:b[4]++; break;
case 5:b[5]++; break;
case 6:b[6]++; break;
case 7:b[7]++; break;
case 8:b[8]++; break;
case 9:b[9]++; break;
default:b[10]++;break; }
}
}
double rnd( )
{static int t=29,c=217,m=1024,r=0;
r=________②_________;
return((double)r/m);
}
main()
{
int age[N],i,d[M];
for(i=0;i< N;i++)
age [i]=(int)(115*rnd());
printf ("The original data:
");
for(i=0;i< N;i++)
printf(______③_______?"%4d
":"%4d",age[i]);
printf("
");
_________④__________;
for(i=0; i< 10;i++)
printf("%4d---%4d:%4d
",________⑤_______);
printf("Over 100:%4d
",d[10]);
}
【答案】①a[i]/10 ②(r*t+c)%m ③(i+1)%10==0
④fun(age,d) ⑤i*10,i*10+9,d[i]
3.阅读程序:修改程序中的错误,不得增行或删行,也不得更改程序结构,请在作答处指出错误代码所在的行号,并给出该行修改后的程序代码。(每空2分,共20分)。
(1)在此程序中,函数fun()的功能是找出一个大于给定整数m且紧随m的素数,并将其作为函数值返回。请改正程序中的错误,使它能得出正确的结果。以下程序只允许修改两行。
L1 #include <stdlib.h>
L2 #include <stdio.h>
L3 int fun(int m)
L4 { int i,k;
L5 for(i=m+1;;i++)
L6 { for (k=2;k<i;k++)
L7 if (i%k!=0)
L8 break;
L9 if (k<i)
L10 return(i);
L11 }
L12 }
L13 void main()
L14 {
L15 int n;
L16 system("CLS");
L17 printf("
Please enter n:");
L18 scanf("%d",&n);
L19 printf ("%d
",fun(n));
L20 }
①___________________________________________________
②___________________________________________________
【答案】①L7 if(i%k==0) ②L9 if(k==i)
(2)在下列程序中,函数fun的功能是:先将s所指字符串中的字符按逆序存放到t所指字符串中,然后 s所指串中的字符按正序连接到t所指串的后面。请改正程序中的错误,使它能得出正确的结果。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 #include <string.h>
L3 void fun(char *s, char *t)
L4 {
L5 int i,s1;
L6 i=0;
L7 s1=strlen(s);
L8 for(;i<s1;i++)
L9 t[i]=s[s1-i];
L10 for(i=0;i<s1;i++)
L11 t[s1]=s[i];
L12 t[2*s1]='\0';
L13 }
L14 main()
L15 {
L16 char s[100],t[100];
L17 printf("
Please enter string s:
");
L18 scanf("%c",s);
L19 fun(s,t);
L20 printf("The result is:%s
",t);
L21 }
①___________________________________________________
②___________________________________________________
③___________________________________________________
【答案】①L9 t[i]=s[s1-i-1];
②L11 t[s1+i]=s[i];
③L18 scanf("%s",s);
(3)中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何,下列程序的功能是求出翁、母、雏各有多少只。以下程序只允许修改两行。
L1 #include<stdio.h>
L2 int main()
L3 {
L4 int x,y,z,j=0;
L5printf("Folleing are possible plans to buy 100 fowls with 100 Yuan.
");
L6 for(x=0;x<=20;x++)
L7 for(y=0;y<=33;y++)
L8 {
L9 z=100-x;
L10 if(z%3==0||5*x+3*y+z/3==100)
L11 printf("%2d:cock=%2d hen=%2d chicken=%2d
",++j,x,y,z);
L12 }
L13 }
①___________________________________________________
②___________________________________________________
【答案】①L9 z=100-x-y;
②L10 if(z%3==0&&5*x+3*y+z/3==100)
(4)下面程序的功能是:求四位的可逆素数。可逆素数指:一个素数将其各位数字的顺序倒过来构成的反序数也是素数。以下程序只允许修改三行。
L1 #include<stdio.h>
L2 #include<math.h>
L3 int num(int number);
L4 int ok(int number);
L5 int main()
L6 {int i,count;
L7 printf("There are invertable primes with 4 digits:
");
L8 for(count=0,i=1001;i<9999;i+=2)
L9 {if(num(i))
L10 printf(count%9 ? "%3d:%d" : "%3d:%d
",++count,i); }
L11 return 0; }
L12 int num(int number)
L13 { int i,j;
L14 if(ok(number))return 0;
L15 for(i=number,j=0;i>0;i%=10)
L16 { j=j*10 + i%10; }
L17 if(number>j)
L18 { if(!ok(i))
L19 { return 0; }
L20 else
L21 { return 1; }
L22 }
L23 else
L24 { return 0; }
L25 getchar();
L26 return 0; }
L27 int ok(int number)
L28 { int i,j;
L29 if(number%2 ==0)
L30 return 0;
L31 j= sqrt((double)number) +1 ;
L32 for(i=3;i<j;i+=2)
L33 { if(number %i ==0)
L34 return 0; }
L35 return 1; }
①___________________________________________________
②___________________________________________________
③___________________________________________________
【答案】①L14 if(!ok(number))return 0;
②L15 for(i=number,j=0;i>0;i/=10)
③L17 if(number<j)
三、程序设计题(本大题共2小题,合计20分)
1.下列程序的功能是:给定链表头结点head,列表中的每个节点都有一个唯一的整数值。同时给定列表G,该列表是链表值的一个子集。返回列表中组件的个数。程序运行结果如下图所示。(每空2分,共10分)
#include <stdio.h>
#include <stdlib.h>
struct ListNode
{
int val;
struct ListNode* next;
};
int numComponents(_________________①___________________)
{
int hash[10000] = {0};
int i;
int components;
struct ListNode* curr;
int in_component;
for (i = 0; i < GSize; i++)
{
___________②_________;
}
components = 0;
curr = head;
in_component = 0;
while (curr != NULL)
{
if (__________③__________)
{
if (!in_component)
{
components++;
in_component = 1;
}
}
else
{
in_component = 0;
}
________________④________________;
}
return components;
}
struct ListNode* createListByInput()
{
int n, i, val;
struct ListNode *head = NULL;
struct ListNode *cur = NULL;
struct ListNode *newNode = NULL;
printf("请输入链表节点个数:");
scanf("%d", &n);
if (n <= 0) return NULL;
printf("请输入链表的 %d 个节点值:
", n);
for (i = 0; i < n; i++)
{
scanf("%d", &val);
______________________⑤_________________________;
newNode->val = val;
newNode->next = NULL;
if (head == NULL)
{
head = newNode;
cur = head;
}
else
{
cur->next = newNode;
cur = cur->next;
}
}
return head;
}
void inputG(int** G, int* GSize)
{
int i;
printf("请输入数组 G 的大小:");
scanf("%d", GSize);
*G = (int*)malloc((*GSize) * sizeof(int));
printf("请输入数组 G 的 %d 个元素:
", *GSize);
for (i = 0; i < *GSize; i++)
{
scanf("%d", &(*G)[i]);
}
}
void printList(struct ListNode* head)
{
struct ListNode* p;
p = head;
while (p != NULL)
{
printf("%d", p->val);
if (p->next != NULL)
printf("->");
p = p->next;
}
printf("
");
}
main()
{
struct ListNode* head;
int* G;
int GSize;
int result;
printf("===== 链表组件计数程序 =====
");
head = createListByInput();
printf("
");
inputG(&G, &GSize);
printf("
你的链表:");
printList(head);
result = numComponents(head, G, GSize);
printf("组件个数:%d
", result);
}
【答案】①struct ListNode* head, int* G, int GSize
②hash[G[i]] = 1 ③hash[curr->val]
④curr = curr->next
⑤newNode = (struct ListNode*)malloc(sizeof(struct ListNode))
2.下列程序的功能是实现两个独立无环单链表的基础查找功能:程序接收用户从键盘输入的两组整型数据,分别构建两个单链表,随后通过遍历两个链表,查找第一个节点值相等的节点,若找到该节点则返回其指针并输出对应数值;若遍历完两个链表均未找到值相等的节点,则返回空指针,并提示无相同节点。请你将程序中的空白处进行补充。(每空2分,共10分)
#include <stdio.h>
#include <stdlib.h>
struct ListNode
{
int val;
struct ListNode* next;
};
struct ListNode* findFirstEqualNode(____________①__________)
{
struct ListNode* pA;
struct ListNode* pB;
pA = headA;
while (pA != NULL)
{
____________②____________;
while (pB != NULL)
{
if (___________③___________)
{
return pA;
}
pB = pB->next;
}
______________④_____________;
}
return NULL;
}
struct ListNode* createList(void)
{
int num;
struct ListNode* head;
struct ListNode* tail;
struct ListNode* newNode;
head = NULL;
tail = NULL;
printf("请输入链表节点整型值(输入-1结束创建):");
scanf("%d", &num);
while (num != -1)
{
newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
if (newNode == NULL)
{
printf("内存分配失败,程序终止!
");
exit(1);
}
newNode->val = num;
newNode->next = NULL;
if (head == NULL)
{
head = newNode;
tail = newNode;
}
else
{
tail->next = newNode;
tail = newNode;
}
scanf("%d", &num);
}
return head;
}
void printList(struct ListNode* head)
{
struct ListNode* cur;
cur = head;
if (cur == NULL)
{
printf("链表为空
");
return;
}
while (cur != NULL)
{
printf("%d", cur->val);
if (cur->next != NULL)
{
printf(" -> ");
}
cur = cur->next;
}
printf(" -> NULL
");
}
void freeList(struct ListNode* head)
{
struct ListNode* temp;
temp = NULL;
while (head != NULL)
{
temp = head;
______________⑤____________;
free(temp);
}
}
main()
{
struct ListNode* headA;
struct ListNode* headB;
struct ListNode* resultNode;
printf("========== 构建第一个链表(链表A) ==========
");
headA = createList();
printf("链表A结构:");
printList(headA);
printf("
========== 构建第二个链表(链表B) ==========
");
headB = createList();
printf("链表B结构:");
printList(headB);
resultNode = findFirstEqualNode(headA, headB);
printf("
========== 查找结果 ==========
");
if (resultNode != NULL)
{
printf("两个链表第一个值相等的节点值为:%d
", resultNode->val);
}
else
{
printf("两个链表无值相等的节点
");
}
freeList(headA);
freeList(headB);
}
【答案】①struct ListNode* headA, struct ListNode* headB
②pB = headB ③pA->val == pB->val
④pA = pA->next ⑤head = head->next
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
编写说明:本冲刺卷严格依据湖南省计算机应用类高考考纲编写,依托《C语言程序设计》(高等教育出版社第5版),聚焦高三考生冲刺需求,助力高效提分。内容上深度覆盖考纲掌握、理解层级考点,既系统梳理构建知识框架,又强化应用能力训练;同时结合近五年高考真题,精准把握高频考点、命题趋势与题型特点,确保贴合高考方向。
湖南省计算机应用类
《C语言程序设计》
高频考点冲刺卷(九)解析版
时间:60分钟 总分:100分
班级:_________ 姓名:________ 学号:________ 成绩:_________
一、单选题(在本题的每一小题的备选答案中,只有一个答案是正确的。本大题共5小题,每小题2分,共10分)
1.若有说明:int i,j=2,*p=&i;,则能完成i=j赋值功能的语句是( )
A.i=*p; B.*p=*&j; C.i=&j; D.i=**p;
2.以下选项中,当x的绝对值在1至6范围内表达式值为"真"的是( )
A.(x>=1)&&(x<=6)&&(x>=-6)&&(x<=-1)
B.(x>=-6)&&(x<=-1)||(x>=1)&&(x<=6)
C.(x>=-6)||(x<=-1)||(x>=1)||(x<=6)
D.(x>=1)&&(x<=6)||(x>=-1)&&(x<=-6)
3.设有以下定义和输入语句,若要求给c1输入字母M,给c2输入字母N,则以下输入形式中正确的是( )(注:£代表空格,输入从第一列开始)
char c1, c2;
scanf("%3c%3c", &c1,&c2);
A.M£N££<回车> B.££M££N<回车>
C.M<回车>N<回车> D.££M<回车>££N<回车>
4.设有以下程序代码。则程序运行后的输出结果是( )
#include<stdio.h>
int new_div(double a,double b)
{return a/b+0.5;}
main()
{printf("%d", new_div(7.8,3.1));}
A.0 B.1 C.2 D.3
5.设有定义:int x[10],*p=x,i,若要为数组x读入数据,以下选项正确的是( )
A. for(i=0;i<10;i++) scanf("%d", p+i);
B. for(i=0;i<10;i++) scanf("%d", *p+i);
C. for(i=0;i<10;i++) scanf("%d",*(p+i);
D. for(i=0;i<10;i++) scanf("%d" ,x[i]);
二、程序分析题(本大题共3小题,共70分)
1.阅读程序,写出运行结果(每空2分,共14分)
(1)下列程序的运行结果是_________________。
#include <stdio.h>
main()
{
int arr[ ]={77,25,64,22,1};
int n=sizeof(arr)/sizeof(arr[0]),i,j,min_index,temp;
for(i=0;i<n-1;i++)
{ min_index=i;
for(j=i+1;j<n;j++)
{ if(arr[j]<arr[min_index])
{ min_index=j; }
}
if(min_index!=i)
{ temp=arr[i];
arr[i]=arr[min_index];
arr[min_index]=temp;
}
}
for(i=0;i<n;i++)
{ printf("%d ",arr[i]); }
}
(2)下列程序的运行结果是_________________。
#include <stdio.h>
int mystery(int n)
{
static int cache = 1;
static int calls = 0;
calls++;
if (n == 0) return cache;
if (calls % 2 == 0)
{ cache = cache * n;}
else
{ cache = cache + n; }
return mystery(n - 1) + cache;
}
main() {
int result = mystery(3);
printf("%d
", result);
}
(3)下列程序的运行结果是_________________。
#include <stdio.h>
int main() {
char s[] = "AABBCDDAE";
char *p = s, *q = s,*k;
int found;
while (*q) {
found = 0;
for (k = s; k < p; k++) {
if (*k == *q) { found = 1; break; }
}
if (!found) *p++ = *q;
q++;
}
*p = '\0';
printf("%s,%d
", s, p - s);
}
(4)下列程序的运行结果是_________________。
#include<stdio.h>
void f(char *from,char *to)
{ while(*to)
to++;
while((*to++=*from++)!='\0');
}
main()
{ char s1[80]="abc";
char s2[80]="123";
f(s2,s1);
printf("s1=%s
",s1);
printf("s2=%s
",s2);
}
(5)下列程序的运行结果是_________________。
#include <stdio.h>
int f(int x) {
static int y = 0;
y += x; return y; }
int g(int *a, int n) {
int sum = 0,i;
for(i = 0; i < n; i++) {
if(a[i] > 3) {
sum += f(a[i]);}
else {
sum -= f(a[i] - 1); }
}
return sum;}
main() {
int arr[] = {2, 5, 1, 4, 3};
int result = 0,i;
for(i = 0; i < 3; i++) {
result += g(arr + i, 3); }
printf("%d
", result); }
(6)程序运行时输入58,则下列程序的运行结果是_________________。
#include<stdio.h>
main()
{
int a[6]={34,23,45,67,19};
int i,j,t,x;
for(i=0;i<5-1;i++)
for(j=i+1;j<5;j++)
if(a[i]<a[j])
{t=a[i];a[i]=a[j];a[j]=t;}
scanf("%d",&x);
i=4;
while(i>=0&&a[i]<x)
{a[i+1]=a[i];i--;}
a[i+1]=x;
for(i=0;i<6;i++)
printf("%5d",a[i]);
printf("
");
}
(7)下列程序的运行结果是_________________。
#include<stdio.h>
int fun2(int x,int y)
{int z;
z=x*y%3;
return z;}
int fun1(int x,int y)
{int z;x+=x;y+=y;
z=fun2(x,y);
return z*z;}
main()
{
int x=11,y=19;
printf("%d
",fun1(x,y));
}
2.程序填空。按照题目要求,将正确内容填入程序空白处,使程序完整(每空2分,共36分)。
(1)在此程序中,函数fun()的功能是在3x4的矩阵中找出在行上最大,在列上最小的元素,若没有符合条件的元素则输出相应信息。
例如,有下列矩阵:
1 2 13 4
7 8 10 6
3 5 9 7
程序执行结果为find:a[2][2]=9.
请在程序的下划线处填入正确的内容,使程序得出正确的结果。(4空)
#include <stdio.h>
#define M 3
#define N 4
void fun(int (*a)[N])
{int i=0,j,find=0,rmax,c,k;
while(_______①_______)
{ rmax=a[i][0];c=0;
for(j=1;j<N;j++)
if(_______②_______)
{ rmax=a[i][j];
c=j;}
find=1;k=0;
while(k<M && find)
{
if (__________③_________)
find=0;
k++;
}
if(________④________)
printf("find:a[%d][%d]=% d
",i,c,a[i][c]);
i++;
}
if(! find)
printf("Not found!
");
}
main()
{int x[M][N],i,j;
printf("Enter number for array:
");
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%d",&x[i][j]);
printf("The array:
");
for(i=0;i<M;i++)
{for(j=0;j<N;j++)
printf("% 3d",x[i][j]);
printf("
");
}
fun(x);
}
(2)某商场有若干个种商品,每种商品的信息包括编号,名称,每季度的营业额(单位:万元)。从键盘输入每种商品的信息,计算每种商品的年平均营业额,将原有数据和平均值存入二进制文件 yye.bin中,再从文件 yye.bin中将数据读出并显示在屏幕上。(5空)
#include <stdio.h>
#define N 3 //N个商品
#define M 4 //M个季度
struct gs
{
char bh[6]; //商品编号
char mc[10]; //商品名称
float yue[M]; //季度营业额
float ave; //平均营业额
}goods[N];
void main()
{
FILE *fp;
int i,j;
float sum;
for(i=0;i<N;i++)
{
printf("请输入第%d商品的信息:
",i+1);
printf("编号:");
scanf("%s",__________①_________);
printf("名称:");
scanf("%s",goods[i].mc);
sum=0.0;
for(j=0;j<M;j++)
{
printf("输入%d个季度的营业额:",j+1);
scanf("%f",&goods[i].yue[j]);
__________②___________;
}
goods[i].ave=_______③______;
}
if((fp=fopen("yye.bin",______④_____))==NULL)
{
printf("不能打开文件,写文件失败!
");
return;
}
fwrite(goods,sizeof(struct gs),N,fp);
_________⑤___________;
printf("编号\t名称\t1季度\t2季度\t3季度\t4季度\t平均额
");
for(i=0;i<N;i++)
{
fread(&goods[i],sizeof(struct gs),1,fp);
printf("%s\t%s\t%7.2f\t%7.2f\t%7.2f\t%7.2\t%7.2f
",goods[i].bh,
goods[i].mc,goods[i].yue[0],goods[i].yue[1],
goods[i].yue[2],goods[i].yue[3],goods[i].ave);
}
fclose(fp);
}
(3)下列程序通过定义并赋初值的方式,利用结构体变量存储了一名学生的学号,姓名和3门课的成绩。函数fun的功能是将该学生的各科成绩都乘以一个系数a,请在程序的下划线处填入正确的内容,使程序得出正确的结果。(4空)
#include <stdio.h>
#include <string.h>
typedef struct
{
int num;
char name[9];
float score[3];
}STU;
void show(STU tt)
{
int i;
printf("%d %s:",_______①__________);
for(i=0;i<3;i++)
printf("%5.1f ",tt.score[i]);
printf("
");
}
void modify(_______②______,float a)
{
int i;
for(i=0;i<3;i++)
ss->score[i]=________③__________
}
main()
{
STU std={1,"Zhang",76.5,78.0,82.0};
float a;
printf("n The original number and name and scores:
");
show(std);
printf("
Input a number:");
scanf("%f",&a);
________④_________;
printf("
A result of modifying:
");
show(std);
}
(4)以下程序的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放在主函数的age数组中;要求函数把0至9岁年龄段的人数放在d[0]中,把10至19岁年龄段的人数放在d[1]中,把20至29岁年龄段的人数放在d[2]中,其余依次类推,把100岁(含100岁)以上年龄的人数放在d[10]中。(5空)
#include <stdio.h>
#define N 50
#define M 11
void fun(int *a, int *b)
{
int i,j;
for (j=0;j<M;j++)
b[j]=0;
for (i=0;i<N;i++)
{
switch (_______①________)
{
case 0:b[0]++; break;
case 1:b[1]++; break;
case 2:b[2]++;break;
case 3:b[3]++;break;
case 4:b[4]++; break;
case 5:b[5]++; break;
case 6:b[6]++; break;
case 7:b[7]++; break;
case 8:b[8]++; break;
case 9:b[9]++; break;
default:b[10]++;break; }
}
}
double rnd( )
{static int t=29,c=217,m=1024,r=0;
r=________②_________;
return((double)r/m);
}
main()
{
int age[N],i,d[M];
for(i=0;i< N;i++)
age [i]=(int)(115*rnd());
printf ("The original data:
");
for(i=0;i< N;i++)
printf(______③_______?"%4d
":"%4d",age[i]);
printf("
");
_________④__________;
for(i=0; i< 10;i++)
printf("%4d---%4d:%4d
",________⑤_______);
printf("Over 100:%4d
",d[10]);
}
3.阅读程序:修改程序中的错误,不得增行或删行,也不得更改程序结构,请在作答处指出错误代码所在的行号,并给出该行修改后的程序代码。(每空2分,共20分)。
(1)在此程序中,函数fun()的功能是找出一个大于给定整数m且紧随m的素数,并将其作为函数值返回。请改正程序中的错误,使它能得出正确的结果。以下程序只允许修改两行。
L1 #include <stdlib.h>
L2 #include <stdio.h>
L3 int fun(int m)
L4 { int i,k;
L5 for(i=m+1;;i++)
L6 { for (k=2;k<i;k++)
L7 if (i%k!=0)
L8 break;
L9 if (k<i)
L10 return(i);
L11 }
L12 }
L13 void main()
L14 {
L15 int n;
L16 system("CLS");
L17 printf("
Please enter n:");
L18 scanf("%d",&n);
L19 printf ("%d
",fun(n));
L20 }
①___________________________________________________
②___________________________________________________
(2)在下列程序中,函数fun的功能是:先将s所指字符串中的字符按逆序存放到t所指字符串中,然后 s所指串中的字符按正序连接到t所指串的后面。请改正程序中的错误,使它能得出正确的结果。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 #include <string.h>
L3 void fun(char *s, char *t)
L4 {
L5 int i,s1;
L6 i=0;
L7 s1=strlen(s);
L8 for(;i<s1;i++)
L9 t[i]=s[s1-i];
L10 for(i=0;i<s1;i++)
L11 t[s1]=s[i];
L12 t[2*s1]='\0';
L13 }
L14 main()
L15 {
L16 char s[100],t[100];
L17 printf("
Please enter string s:
");
L18 scanf("%c",s);
L19 fun(s,t);
L20 printf("The result is:%s
",t);
L21 }
①___________________________________________________
②___________________________________________________
③___________________________________________________
(3)中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何,下列程序的功能是求出翁、母、雏各有多少只。以下程序只允许修改两行。
L1 #include<stdio.h>
L2 int main()
L3 {
L4 int x,y,z,j=0;
L5printf("Folleing are possible plans to buy 100 fowls with 100 Yuan.
");
L6 for(x=0;x<=20;x++)
L7 for(y=0;y<=33;y++)
L8 {
L9 z=100-x;
L10 if(z%3==0||5*x+3*y+z/3==100)
L11 printf("%2d:cock=%2d hen=%2d chicken=%2d
",++j,x,y,z);
L12 }
L13 }
①___________________________________________________
②___________________________________________________
(4)下面程序的功能是:求四位的可逆素数。可逆素数指:一个素数将其各位数字的顺序倒过来构成的反序数也是素数。以下程序只允许修改三行。
L1 #include<stdio.h>
L2 #include<math.h>
L3 int num(int number);
L4 int ok(int number);
L5 int main()
L6 {int i,count;
L7 printf("There are invertable primes with 4 digits:
");
L8 for(count=0,i=1001;i<9999;i+=2)
L9 {if(num(i))
L10 printf(count%9 ? "%3d:%d" : "%3d:%d
",++count,i); }
L11 return 0; }
L12 int num(int number)
L13 { int i,j;
L14 if(ok(number))return 0;
L15 for(i=number,j=0;i>0;i%=10)
L16 { j=j*10 + i%10; }
L17 if(number>j)
L18 { if(!ok(i))
L19 { return 0; }
L20 else
L21 { return 1; }
L22 }
L23 else
L24 { return 0; }
L25 getchar();
L26 return 0; }
L27 int ok(int number)
L28 { int i,j;
L29 if(number%2 ==0)
L30 return 0;
L31 j= sqrt((double)number) +1 ;
L32 for(i=3;i<j;i+=2)
L33 { if(number %i ==0)
L34 return 0; }
L35 return 1; }
①___________________________________________________
②___________________________________________________
③___________________________________________________
三、程序设计题(本大题共2小题,合计20分)
1.下列程序的功能是:给定链表头结点head,列表中的每个节点都有一个唯一的整数值。同时给定列表G,该列表是链表值的一个子集。返回列表中组件的个数。程序运行结果如下图所示。(每空2分,共10分)
#include <stdio.h>
#include <stdlib.h>
struct ListNode
{
int val;
struct ListNode* next;
};
int numComponents(_________________①___________________)
{
int hash[10000] = {0};
int i;
int components;
struct ListNode* curr;
int in_component;
for (i = 0; i < GSize; i++)
{
___________②_________;
}
components = 0;
curr = head;
in_component = 0;
while (curr != NULL)
{
if (__________③__________)
{
if (!in_component)
{
components++;
in_component = 1;
}
}
else
{
in_component = 0;
}
________________④________________;
}
return components;
}
struct ListNode* createListByInput()
{
int n, i, val;
struct ListNode *head = NULL;
struct ListNode *cur = NULL;
struct ListNode *newNode = NULL;
printf("请输入链表节点个数:");
scanf("%d", &n);
if (n <= 0) return NULL;
printf("请输入链表的 %d 个节点值:
", n);
for (i = 0; i < n; i++)
{
scanf("%d", &val);
______________________⑤_________________________;
newNode->val = val;
newNode->next = NULL;
if (head == NULL)
{
head = newNode;
cur = head;
}
else
{
cur->next = newNode;
cur = cur->next;
}
}
return head;
}
void inputG(int** G, int* GSize)
{
int i;
printf("请输入数组 G 的大小:");
scanf("%d", GSize);
*G = (int*)malloc((*GSize) * sizeof(int));
printf("请输入数组 G 的 %d 个元素:
", *GSize);
for (i = 0; i < *GSize; i++)
{
scanf("%d", &(*G)[i]);
}
}
void printList(struct ListNode* head)
{
struct ListNode* p;
p = head;
while (p != NULL)
{
printf("%d", p->val);
if (p->next != NULL)
printf("->");
p = p->next;
}
printf("
");
}
main()
{
struct ListNode* head;
int* G;
int GSize;
int result;
printf("===== 链表组件计数程序 =====
");
head = createListByInput();
printf("
");
inputG(&G, &GSize);
printf("
你的链表:");
printList(head);
result = numComponents(head, G, GSize);
printf("组件个数:%d
", result);
}
2.下列程序的功能是实现两个独立无环单链表的基础查找功能:程序接收用户从键盘输入的两组整型数据,分别构建两个单链表,随后通过遍历两个链表,查找第一个节点值相等的节点,若找到该节点则返回其指针并输出对应数值;若遍历完两个链表均未找到值相等的节点,则返回空指针,并提示无相同节点。请你将程序中的空白处进行补充。(每空2分,共10分)
#include <stdio.h>
#include <stdlib.h>
struct ListNode
{
int val;
struct ListNode* next;
};
struct ListNode* findFirstEqualNode(____________①__________)
{
struct ListNode* pA;
struct ListNode* pB;
pA = headA;
while (pA != NULL)
{
____________②____________;
while (pB != NULL)
{
if (___________③___________)
{
return pA;
}
pB = pB->next;
}
______________④_____________;
}
return NULL;
}
struct ListNode* createList(void)
{
int num;
struct ListNode* head;
struct ListNode* tail;
struct ListNode* newNode;
head = NULL;
tail = NULL;
printf("请输入链表节点整型值(输入-1结束创建):");
scanf("%d", &num);
while (num != -1)
{
newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
if (newNode == NULL)
{
printf("内存分配失败,程序终止!
");
exit(1);
}
newNode->val = num;
newNode->next = NULL;
if (head == NULL)
{
head = newNode;
tail = newNode;
}
else
{
tail->next = newNode;
tail = newNode;
}
scanf("%d", &num);
}
return head;
}
void printList(struct ListNode* head)
{
struct ListNode* cur;
cur = head;
if (cur == NULL)
{
printf("链表为空
");
return;
}
while (cur != NULL)
{
printf("%d", cur->val);
if (cur->next != NULL)
{
printf(" -> ");
}
cur = cur->next;
}
printf(" -> NULL
");
}
void freeList(struct ListNode* head)
{
struct ListNode* temp;
temp = NULL;
while (head != NULL)
{
temp = head;
______________⑤____________;
free(temp);
}
}
main()
{
struct ListNode* headA;
struct ListNode* headB;
struct ListNode* resultNode;
printf("========== 构建第一个链表(链表A) ==========
");
headA = createList();
printf("链表A结构:");
printList(headA);
printf("
========== 构建第二个链表(链表B) ==========
");
headB = createList();
printf("链表B结构:");
printList(headB);
resultNode = findFirstEqualNode(headA, headB);
printf("
========== 查找结果 ==========
");
if (resultNode != NULL)
{
printf("两个链表第一个值相等的节点值为:%d
", resultNode->val);
}
else
{
printf("两个链表无值相等的节点
"); }
freeList(headA);
freeList(headB);
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$