内容正文:
编写说明:本冲刺卷严格依据湖南省计算机应用类高考考纲编写,依托《C语言程序设计》(高等教育出版社第5版),聚焦高三考生冲刺需求,助力高效提分。内容上深度覆盖考纲掌握、理解层级考点,既系统梳理构建知识框架,又强化应用能力训练;同时结合近五年高考真题,精准把握高频考点、命题趋势与题型特点,确保贴合高考方向。
湖南省计算机应用类
《C语言程序设计》
高频考点冲刺卷(一)解析版
时间:60分钟 总分:100分
班级:_________ 姓名:________ 学号:________ 成绩:_________
一、单选题(在本题的每一小题的备选答案中,只有一个答案是正确的。本大题共5小题,每小题2分,共10分)
1.若有整型变量a,执行:int *pa=&a;后,以下scanf语句中能正确为变量a读入数据的是( )
A.scanf(“%d”,pa); B.scanf(“%d”,a);
C.scanf(“%d”,&pa); D.scanf(“%d”,*pa);
【答案】A
【解析】scanf要求传入变量地址,pa是指向a的指针,本身就是a的地址,可直接传入;B 选项a是变量值,C 选项&pa是指针自身地址,D 选项*pa是a的值,均不符合要求。
2.设有以下语句,其中对数组元素a不正确的引用是:( )(其中0≤i<10)
int a[10]={0,1,2,3,4,5,6,7,8,9},*p=a;
A.a[p-a] B.*(&a[i]) C.p[i] D.*(*(a+i))
【答案】D
【解析】观察程序可知,a实际上就是数组a的首地址,所以”*(a+i)"表示的就是数组a中的第i个元素的值,进而我们可以知道*(*(a+i))必然不是对a数组元素的正确引用。故本题答案为D。
3.若有定义:int a=25,b=14,c=19;,则执行以下语句的输出结果是( )
a<=25&&b--<=2&&c?printf("***a=%d,b=%d,c=%d
",a,b,c):printf("###a=%d,b=%d,c=%d
",a,b,c);
A.***a=25,b=13,c=19 B.***a=26,b=14,c=19
C.###a=25,b=13,c=19 D.###a=26,b=14,c=19
【答案】C
【解析】逻辑与&&遇假即短路,a<=25为真,b--<=2中b原值为 14,判断为假后b自减为 13,后续c不再判断,整体条件为假,执行else分支输出###a=25,b=13,c=19。
4.设有定义int a[3][3];和函数调用语句sort(a,3);则下列选项中正确的函数声明是( )
A.void sort(int a,n); B.void sort(int a[ ][ ],int n);
C.void sort(int a[ ][3],int n); D.void sort(int a[ ][3],n);
【答案】C
【解析】二维数组作为函数参数时,行长度可省略,列长度必须指定,int a[][3]符合语法;A、D 参数类型不完整,B 列长度省略不符合 C 语言语法规范。
5.有函数定义:int func(int *p),x和y是int型变量,则正确的调用是( )
A.y=func(x); B.func(x); C.func()=x; D.y=func(&x);
【答案】D
【解析】根据func函数的定义可以知道调用func函数需要传入一个指针,且该指针的指向类型是int型,只有D项传入的是指向int型数据的指针。
二、程序分析题(本大题共3小题,共70分)
1.阅读程序,写出运行结果(每空2分,共14分)
(1)下列程序的运行结果是_________________。
#include <stdio.h>
void inv(int *p,int n)
{ int *i,*j,m=(n-1)/2,t;
j=p+n-1;
for(i=p;i<p+m;i++,j--)
{ t=*i;*i=*j;*j=t;}
}
void main()
{ int i;
int a[6]={3,5,7,0,6,2};
inv(a,6);
for(i=0;i<6;i++)
{ printf("%d",a[i]); }
}
【答案】267053
(2)下列程序的运行结果是_________________。
#include <stdio.h>
int main() {
char s[] = "01234";
int sum = 0,i;
for (i = 0; s[i]; i++) {
if (i % 2 == 0) sum += s[i] - '0';
}
printf("%d
", sum);
}
【答案】6
(3)下列程序的运行结果是_________________。
#include <stdio.h>
main() {
char s[] = "XYZ";
int shift = 3,i;
for (i = 0; s[i]; i++) {
s[i] = ((s[i] - 'A' + shift) % 26) + 'A';
if (i % 2 == 0) s[i] = s[i] + 1;
}
printf("%s
", s);
}
【答案】BBD
(4)下列程序的运行结果是_________________。
#include <stdio.h>
struct pair
{ int first,second; };
struct pair get_min_max(int*array, int len)
{
int i;
struct pair res;
res.first=array[0];
res.second=array[0];
for(i=1;i<len;i++)
{
if(array[i]<res.first)
res.first=array[i];
if(array[i]>res.second)
res.second=array[i];
}
return res;
}
main()
{
int array[5]={9,1,3,4};
struct pair min_max =get_min_max(array,5);
printf("min=%d,max=%d
",min_max.first, min_max.second);
}
【答案】min=0,max=9
(5)下列程序的运行结果是_________________。
#include<stdio.h>
#define M 4
void fun(int *a)
{ int i,j,k,m;
for(i=M;i>0;i--)
{ k=*(a+M-1);
for(j=M-1;j>=0;j--)
*(a+j+1)=*(a+j);
*a=k;
for(m=0;m<M;m++)
printf("%d ",*(a+m));
printf("
");
}
}
main()
{ int a[M]={1,2,3,4};
fun(a);}
【答案】
4 1 2 3
3 4 1 2
2 3 4 1
1 2 3 4
(6)下列程序的运行结果是_________________。
#include<stdio.h>
#include <stdio.h>
short fun(char *p1,char*p2)
{
while(*p1&&*p2&&p1!=p2)
p1++,p2++;
if(*p1-*p2)return(*p2-*p1);
return 0;
}
short main()
{printf("%d",fun("abeTAA","abcta")) ;
return 0;
}
【答案】-65
(7)下列程序的运行结果是_________________。
#include <stdio.h>
#include <string.h>
struct Node
{ int data;int *ptr;};
void process(struct Node *n, int *arr, int size) {
int i;
static int count = 0;
for(i = 0; i < size; i++) {
if(arr[i] % 2 == 0)
{ n->data += arr[i] + count; }
else
{ n->data -= arr[i] - count;}
}
count++;
*(n->ptr) = n->data; }
main() {
int a = 10, b = 20;
int arr[] = {1, 2, 3, 4, 5};
struct Node node1 = {5, &a};
struct Node node2 = {8, &b};
process(&node1, arr, 3);
process(&node2, arr + 1, 3);
process(&node1, arr + 2, 2);
printf("node1.data=%d, node2.data=%d
", node1.data, node2.data);
}
【答案】node1.data=8, node2.data=14
2.程序填空。按照题目要求,将正确内容填入程序空白处,使程序完整(每空2分,共36分)。
(1)程序中将m个人的成绩存放在score数组中,请编写函数fun(),它的功能是将低于平均分的人数作为函数值返回,将低于平均分的分数放在below所指的数组中。(4空)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int fun(int score[],int m, int below[])
{
int i,j=0;
float av=0.0;
for(i=0;i<m;i++)
av=________①_______;
for(i=0;i<m;i++)
if(score[i]<av)
_________②_________;
return j;
}
void main()
{
FILE * wf;
int i, n, below[9];
int score[9]={10,20,30,40,50,60,70,80,90};
system("CLS");
n=_________③__________;
printf("
Below the average score are:");
for(i=0;i<n;i++)
printf("% d",below[i]);
wf=fopen("out.dat","w");
for(i=0;i<n;i++)
fprintf(___________④____________);
fclose(wf);
}
【答案】①av+score[i]/m ②below[j++]=score[i]
③fun (score, 9, below) ④wf,"%d",below[i]
(2)下列程序的功能是在屏幕上显示杨辉三角形。(4空)
#include<stdio.h>
int c(int x, int y)
{
int z;
if (_______①_______) return 1;
z = c(________②_______) + c(x - 1, y);
return z;
}
int main()
{
int i, j, n = 13;
printf("N=");
while (n>12)
scanf("%d", &n);
for (i = 0; i <= n; i++)
{
for (j = 0; j<_____③______; j++) printf(" ");
for (j = 1; j<______④______; j++) printf("%4d", c(i, j));
printf("
");
}
}
【答案】①(y==1)||(y==x+1) ②x-1,y-1
③24-2*i ④i+2
(3)在此程序中,函数fun()的功能是将NxN矩阵中的元素按列向右移动1个位置,右边被移出矩阵的元素绕回左边第1列。请在程序的下划线处填入正确的内容,使程序得出正确的结果。(4空)
#include <stdio.h>
#define N 4
void fun(int (*t)[N])
{ int i,j,x;
for (i=0;i<N;i++)
{ x=_______①__________;
for (j=_____②______;j>0;j--)
t[i][j]=t[i][j-1];
__________③_________; }
}
main()
{
int i,j,t[ ][N]={21,12,13,24,25,16,47,38,29,11,32,54,42,21,33,10};
printf("The original array:
");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%2d ",t[i][j]);
printf("
");
}
__________④__________
printf("
The result is:
");
for(i=0;i<N;i++)
{
for (j=0;j<N;j++)
printf("%2d ",t[i][j]);
printf("
"); }
}
【答案】①t[i][N-1] ②N-1 ③t[i][0]=x ④fun(t);
(4)函数fun的作用是:参数xx的前10个元素已经按升序排好序,将参数num按升序插入到数组xx中。请在程序的下划线处填入正确的内容,使程序得出正确的结果。(3空)
#include <stdio.h>
void func(int xx[], int num)
{
int n1,n2,pos,i,j;
pos=xx[9];
if (num > pos)
xx[10] = _______①______;
else {
for(i=0;i<10;i++)
{
if(xx[i]>num){
n1=xx[i];
xx[i]=num;
for(j=i+1;j<11;j++){
n2=xx[j];
xx[j] = n1;
________②________;
}
______③_______;
}
}
}
}
main()
{
int xx[11] = {2,5,7,10,17,51,63,73,85,99};
int i,num;
printf("original array is:
");
for(i=0;i<10;i++) printf("%5d",xx[i]);
printf("
");
printf("insert a new number:");
scanf("%d", &num);
func(xx, num);
for(i=0;i<11;i++) printf("%5d", xx[i]);
printf("
");
}
【答案】①num ②n1=n2 ③break
(5)下列程序的功能是将十进制正整数转换成十六进制。请填空。(3空)
#include<stdio.h>
#include<string.h>
void c10_16(char *p,int b)
{ int j;
while(b>0)
{j=b%16;
if(______①_______) *p=j+48;
else *p=j+55;
b=b/16;
_______②_______;}
*p='\0';
}
main()
{ int a,i;
char s[20];
printf("Input a:
");
scanf("%d",&a);
c10_16(s,a);
for(i=________③________;i>=0;i--)
printf("%c",*(s+i));
printf("
");
}
【答案】①j<10 ②p++ ③strlen(s)-1
3.阅读程序:修改程序中的错误,不得增行或删行,也不得更改程序结构,请在作答处指出错误代码所在的行号,并给出该行修改后的程序代码。(每空2分,共20分)。
(1)在此程序中,函数fum()的功能是根据整型参数m的值,计算如下公式。
例如,若m中的值为5,则应输出0.536389。请改正程序中的错误,使它能得出正确的结果。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 double fun (int m)
L3 {double y=1.0;
L4 int i;
L5 for(i=2;i<m;i++)
L6 y-=1/(i*i);;
L7 return(y);
L8 }
L9 main()
L10 {int n=5;
L11 printf("
The result is% lf
", fun(n));
L12 }
①___________________________________________________
②___________________________________________________
【答案】①L5 for(i=2;i<=m;i++)
②L6 y-= 1.0/(i*i);
(2)下列给定程序中,函数fun()的功能是:将n个无序整数从小到大排序。请改正程序指定部位的错误,使它能得到正确结果。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 void fun(int n, int *a)
L3 {
L4 int i,j,p,t;
L5 for(j=0;j<n-1;j++)
L6 { p=j;
L7 for(i=j+1;i<n-1;i++)
L8 if(a[p]>a[i])
L9 t=i;
L10 if(p!=j)
L11 { t=a[j];
L12 a[j]=a[p];
L13 a[p]=t; }
L14 }
L15 }
L16 void putarr(int n, int *z)
L17 { int i;
L18 for(i=1;i<=n;i++,z++)
L19 { printf("%4d",z);
L20 if(!(i%10))
L21 printf("
"); }
L22 printf("
"); }
L23 void main()
L24 {
L25 int aa[20]={9,3,0,4,1,2,5,6,8,10,7,52,33,42},n=11;
L26 printf("
Before sorting %d numbers:
",n);
L27 putarr(n,aa);
L28 fun(n,aa);
L29 printf("
After sorting %d numbers:
",n);
L30 putarr(n,aa); }
①___________________________________________________
②___________________________________________________
③___________________________________________________
【答案】①L7 for(i=j+1;i<n;i++)
②L9 p=i;
③L19 { printf("%4d",*z);
(3)如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。下列程序的功能是求出3000以内的全部亲密数。以下程序只允许修改两行。
L1 #include<stdio.h>
L2 int main()
L3 {
L4 int a,i,b,n;
printf("There are following friendly–numbers pair smaller than 3000:
");
L5 for(a=1;a<3000;a++)
L6 {
L7 for(b=0,i=1;i<=a/2;i++)
L8 if(!(a%i))
L9 b+=i+1;
L10 for(n=0,i=1;i<=b/2;i++)
L11 if(!(b%i))
L12 n+=i;
L13 if(n==a||a<b)
L14 printf("%4d..%4d ",a,b);
L15 }
L16 }
①___________________________________________________
②___________________________________________________
【答案】①L9 b+=i; ②L13 if(n==a&&a<b)
(4)下面程序的功能是:验证2000以内的正偶数都能够分解为两个素数之和(即验证歌德巴赫猜想对2000以内的正偶数成立) 。以下程序只允许修改三行。
L1 #include<stdio.h>
L2 #include<math.h>
L3 int fflag(int n);
L4 int main()
L5 {
L6 int i,n;
L7 for(i=4;i<=2000;i+=2)
L8 {
L9 for(n=2;n<i;n++)
L10 if(fflag(n))
L11 if(fflag(i))
L12 {
L13 printf("%14d=%d+%d
",i,n,i-n);
L14 continue; }
L15 if(n==i) printf("error %d
",i); }
L16 }
L17 int fflag(int i)
L18 {int j;
L19 if(i<=1)return 0;
L20 if(i==2)return 1;
L21 if(!(i%2))return 0;
L22 for(j=3;j<=(int)(sqrt((double)i)+1);j+=2)
L23 if(i%j)return 0;
L24 return 1; }
①___________________________________________________
②___________________________________________________
③___________________________________________________
【答案】①L11 if(fflag(i-n))
②L14 break; }
③L23 if(!(i%j))return 0;
三、程序设计题(本大题共2小题,合计20分)
1.下列程序的功能是:创建一个链表,链表中每个节点都包含一个0或1。这个链表的数字是二进制数字的列表。返回链表中数字的十进制值。(每空2分,共10分)
#include <stdio.h>
#include <stdlib.h>
struct ListNode
{
int val;
struct ListNode* next;
};
int getDecimalValue(struct ListNode* head)
{
struct ListNode* curr;
int result;
__________①___________;
result = 0;
while (curr != NULL)
{
result = ____________②___________;
___________③_____________;
}
return result;
}
struct ListNode* createList(int arr[], int n)
{
struct ListNode* head;
struct ListNode* tail;
int i;
struct ListNode* node;
head = NULL;
tail = NULL;
for (i = 0; i < n; i++)
{
node = _____________④____________;
node->val = __________⑤____________;
node->next = NULL;
if (head == NULL)
{
head = node;
tail = node;
}
else
{
tail->next = node;
tail = node;
}
}
return head;
}
void printBinary(struct ListNode* head)
{
struct ListNode* curr;
curr = head;
while (curr != NULL)
{
printf("%d", curr->val);
curr = curr->next;
}
}
main()
{
int len, i;
int* arr;
struct ListNode* head;
int decimal;
printf("===== 二进制链表转十进制 =====
");
printf("请输入二进制数的位数:");
scanf("%d", &len);
arr = (int*)malloc(len * sizeof(int));
printf("请输入 %d 位二进制数(只能输入 0 或 1):
", len);
for (i = 0; i < len; i++)
{
scanf("%d", &arr[i]);
}
head = createList(arr, len);
printf("
二进制链表:");
printBinary(head);
decimal = getDecimalValue(head);
printf("
转换后的十进制:%d
", decimal);
free(arr);
}
【答案】①curr = head ②result * 2 + curr->val
③curr = curr->next
④(struct ListNode*)malloc(sizeof(struct ListNode))
⑤arr[i]
2.下列程序的功能是:创建一个长度为偶数的链表,求链表中孪生节点对的最大和。孪生节点对是第i个节点和第(n-1-i)个节点的和。(每空2分,共10分)
#include <stdio.h>
#include <stdlib.h>
struct ListNode
{
int val;
struct ListNode* next;
};
int pairSum(struct ListNode* head)
{
struct ListNode* slow;
struct ListNode* fast;
struct ListNode* prev;
struct ListNode* curr;
struct ListNode* next;
int max_sum;
int sum;
slow = head;
fast = head;
while (fast != NULL && fast->next != NULL)
{
slow = slow->next;
_____________①_______________;
}
prev = NULL;
__________②___________;
while (curr != NULL)
{
_________③________;
curr->next = prev;
prev = curr;
curr = next;
}
________④_________;
while (prev != NULL)
{
_____________⑤___________;
if (sum > max_sum)
{
max_sum = sum;
}
head = head->next;
prev = prev->next;
}
return max_sum;
}
struct ListNode* createList(int arr[], int n)
{
struct ListNode* head;
struct ListNode* tail;
int i;
struct ListNode* node;
head = NULL;
tail = NULL;
for (i = 0; i < n; i++)
{
node = (struct ListNode*)malloc(sizeof(struct ListNode));
node->val = arr[i];
node->next = NULL;
if (head == NULL)
{
head = node;
tail = node;
}
else
{
tail->next = node;
tail = node;
}
}
return head;
}
void printList(struct ListNode* head)
{
struct ListNode* curr;
curr = head;
while (curr != NULL)
{
printf("%d ", curr->val);
curr = curr->next;
}
}
main()
{
int len, i;
int* arr;
struct ListNode* head;
int result;
printf("===== 求链表孪生节点对最大和 =====
");
printf("请输入链表节点个数(必须是偶数):");
scanf("%d", &len);
arr = (int*)malloc(len * sizeof(int));
printf("请输入 %d 个整数:
", len);
for (i = 0; i < len; i++)
{
scanf("%d", &arr[i]);
}
head = createList(arr, len);
printf("
你输入的链表:");
printList(head);
result = pairSum(head);
printf("
最大孪生节点和为:%d
", result);
free(arr);
}
【答案】①fast = fast->next->next ②curr = slow
③next = curr->next ④max_sum = 0
⑤sum = head->val + prev->val
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
编写说明:本冲刺卷严格依据湖南省计算机应用类高考考纲编写,依托《C语言程序设计》(高等教育出版社第5版),聚焦高三考生冲刺需求,助力高效提分。内容上深度覆盖考纲掌握、理解层级考点,既系统梳理构建知识框架,又强化应用能力训练;同时结合近五年高考真题,精准把握高频考点、命题趋势与题型特点,确保贴合高考方向。
湖南省计算机应用类
《C语言程序设计》
高频考点冲刺卷(一)解析版
时间:60分钟 总分:100分
班级:_________ 姓名:________ 学号:________ 成绩:_________
一、单选题(在本题的每一小题的备选答案中,只有一个答案是正确的。本大题共5小题,每小题2分,共10分)
1.若有整型变量a,执行:int *pa=&a;后,以下scanf语句中能正确为变量a读入数据的是( )
A.scanf(“%d”,pa); B.scanf(“%d”,a);
C.scanf(“%d”,&pa); D.scanf(“%d”,*pa);
2.设有以下语句,其中对数组元素a不正确的引用是:( )(其中0≤i<10)
int a[10]={0,1,2,3,4,5,6,7,8,9},*p=a;
A.a[p-a] B.*(&a[i]) C.p[i] D.*(*(a+i))
3.若有定义:int a=25,b=14,c=19;,则执行以下语句的输出结果是( )
a<=25&&b--<=2&&c?printf("***a=%d,b=%d,c=%d
",a,b,c):printf("###a=%d,b=%d,c=%d
",a,b,c);
A.***a=25,b=13,c=19 B.***a=26,b=14,c=19
C.###a=25,b=13,c=19 D.###a=26,b=14,c=19
4.设有定义int a[3][3];和函数调用语句sort(a,3);则下列选项中正确的函数声明是( )
A.void sort(int a,n); B.void sort(int a[ ][ ],int n);
C.void sort(int a[ ][3],int n); D.void sort(int a[ ][3],n);
5.有函数定义:int func(int *p),x和y是int型变量,则正确的调用是( )
A.y=func(x); B.func(x); C.func()=x; D.y=func(&x);
二、程序分析题(本大题共3小题,共70分)
1.阅读程序,写出运行结果(每空2分,共14分)
(1)下列程序的运行结果是_________________。
#include <stdio.h>
void inv(int *p,int n)
{ int *i,*j,m=(n-1)/2,t;
j=p+n-1;
for(i=p;i<p+m;i++,j--)
{ t=*i;*i=*j;*j=t;}
}
void main()
{ int i;
int a[6]={3,5,7,0,6,2};
inv(a,6);
for(i=0;i<6;i++)
{ printf("%d",a[i]); }
}
(2)下列程序的运行结果是_________________。
#include <stdio.h>
int main() {
char s[] = "01234";
int sum = 0,i;
for (i = 0; s[i]; i++) {
if (i % 2 == 0) sum += s[i] - '0';
}
printf("%d
", sum);
}
(3)下列程序的运行结果是_________________。
#include <stdio.h>
main() {
char s[] = "XYZ";
int shift = 3,i;
for (i = 0; s[i]; i++) {
s[i] = ((s[i] - 'A' + shift) % 26) + 'A';
if (i % 2 == 0) s[i] = s[i] + 1;
}
printf("%s
", s);
}
(4)下列程序的运行结果是_________________。
#include <stdio.h>
struct pair
{ int first,second; };
struct pair get_min_max(int*array, int len)
{
int i;
struct pair res;
res.first=array[0];
res.second=array[0];
for(i=1;i<len;i++)
{
if(array[i]<res.first)
res.first=array[i];
if(array[i]>res.second)
res.second=array[i];
}
return res;
}
main()
{
int array[5]={9,1,3,4};
struct pair min_max =get_min_max(array,5);
printf("min=%d,max=%d
",min_max.first, min_max.second);
}
(5)下列程序的运行结果是_________________。
#include<stdio.h>
#define M 4
void fun(int *a)
{ int i,j,k,m;
for(i=M;i>0;i--)
{ k=*(a+M-1);
for(j=M-1;j>=0;j--)
*(a+j+1)=*(a+j);
*a=k;
for(m=0;m<M;m++)
printf("%d ",*(a+m));
printf("
");
}
}
main()
{ int a[M]={1,2,3,4};
fun(a);}
(6)下列程序的运行结果是_________________。
#include<stdio.h>
#include <stdio.h>
short fun(char *p1,char*p2)
{
while(*p1&&*p2&&p1!=p2)
p1++,p2++;
if(*p1-*p2)return(*p2-*p1);
return 0;
}
short main()
{printf("%d",fun("abeTAA","abcta")) ;
return 0;
}
(7)下列程序的运行结果是_________________。
#include <stdio.h>
#include <string.h>
struct Node
{ int data;int *ptr;};
void process(struct Node *n, int *arr, int size) {
int i;
static int count = 0;
for(i = 0; i < size; i++) {
if(arr[i] % 2 == 0)
{ n->data += arr[i] + count; }
else
{ n->data -= arr[i] - count;}
}
count++;
*(n->ptr) = n->data; }
main() {
int a = 10, b = 20;
int arr[] = {1, 2, 3, 4, 5};
struct Node node1 = {5, &a};
struct Node node2 = {8, &b};
process(&node1, arr, 3);
process(&node2, arr + 1, 3);
process(&node1, arr + 2, 2);
printf("node1.data=%d, node2.data=%d
", node1.data, node2.data);
}
2.程序填空。按照题目要求,将正确内容填入程序空白处,使程序完整(每空2分,共36分)。
(1)程序中将m个人的成绩存放在score数组中,请编写函数fun(),它的功能是将低于平均分的人数作为函数值返回,将低于平均分的分数放在below所指的数组中。(4空)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int fun(int score[],int m, int below[])
{
int i,j=0;
float av=0.0;
for(i=0;i<m;i++)
av=________①_______;
for(i=0;i<m;i++)
if(score[i]<av)
_________②_________;
return j;
}
void main()
{
FILE * wf;
int i, n, below[9];
int score[9]={10,20,30,40,50,60,70,80,90};
system("CLS");
n=_________③__________;
printf("
Below the average score are:");
for(i=0;i<n;i++)
printf("% d",below[i]);
wf=fopen("out.dat","w");
for(i=0;i<n;i++)
fprintf(___________④____________);
fclose(wf);
}
(2)下列程序的功能是在屏幕上显示杨辉三角形。(4空)
#include<stdio.h>
int c(int x, int y)
{
int z;
if (_______①_______) return 1;
z = c(________②_______) + c(x - 1, y);
return z;
}
int main()
{
int i, j, n = 13;
printf("N=");
while (n>12)
scanf("%d", &n);
for (i = 0; i <= n; i++)
{
for (j = 0; j<_____③______; j++) printf(" ");
for (j = 1; j<______④______; j++) printf("%4d", c(i, j));
printf("
");
}
}
(3)在此程序中,函数fun()的功能是将NxN矩阵中的元素按列向右移动1个位置,右边被移出矩阵的元素绕回左边第1列。请在程序的下划线处填入正确的内容,使程序得出正确的结果。(4空)
#include <stdio.h>
#define N 4
void fun(int (*t)[N])
{ int i,j,x;
for (i=0;i<N;i++)
{ x=_______①__________;
for (j=_____②______;j>0;j--)
t[i][j]=t[i][j-1];
__________③_________; }
}
main()
{
int i,j,t[ ][N]={21,12,13,24,25,16,47,38,29,11,32,54,42,21,33,10};
printf("The original array:
");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%2d ",t[i][j]);
printf("
");
}
__________④__________
printf("
The result is:
");
for(i=0;i<N;i++)
{
for (j=0;j<N;j++)
printf("%2d ",t[i][j]);
printf("
"); }
}
(4)函数fun的作用是:参数xx的前10个元素已经按升序排好序,将参数num按升序插入到数组xx中。请在程序的下划线处填入正确的内容,使程序得出正确的结果。(3空)
#include <stdio.h>
void func(int xx[], int num)
{
int n1,n2,pos,i,j;
pos=xx[9];
if (num > pos)
xx[10] = _______①______;
else {
for(i=0;i<10;i++)
{
if(xx[i]>num){
n1=xx[i];
xx[i]=num;
for(j=i+1;j<11;j++){
n2=xx[j];
xx[j] = n1;
________②________;
}
______③_______;
}
}
}
}
main()
{
int xx[11] = {2,5,7,10,17,51,63,73,85,99};
int i,num;
printf("original array is:
");
for(i=0;i<10;i++) printf("%5d",xx[i]);
printf("
");
printf("insert a new number:");
scanf("%d", &num);
func(xx, num);
for(i=0;i<11;i++) printf("%5d", xx[i]);
printf("
");
}
(5)下列程序的功能是将十进制正整数转换成十六进制。请填空。(3空)
#include<stdio.h>
#include<string.h>
void c10_16(char *p,int b)
{ int j;
while(b>0)
{j=b%16;
if(______①_______) *p=j+48;
else *p=j+55;
b=b/16;
_______②_______;}
*p='\0';
}
main()
{ int a,i;
char s[20];
printf("Input a:
");
scanf("%d",&a);
c10_16(s,a);
for(i=________③________;i>=0;i--)
printf("%c",*(s+i));
printf("
");
}
3.阅读程序:修改程序中的错误,不得增行或删行,也不得更改程序结构,请在作答处指出错误代码所在的行号,并给出该行修改后的程序代码。(每空2分,共20分)。
(1)在此程序中,函数fum()的功能是根据整型参数m的值,计算如下公式。
例如,若m中的值为5,则应输出0.536389。请改正程序中的错误,使它能得出正确的结果。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 double fun (int m)
L3 {double y=1.0;
L4 int i;
L5 for(i=2;i<m;i++)
L6 y-=1/(i*i);;
L7 return(y);
L8 }
L9 main()
L10 {int n=5;
L11 printf("
The result is% lf
", fun(n));
L12 }
①___________________________________________________
②___________________________________________________
(2)下列给定程序中,函数fun()的功能是:将n个无序整数从小到大排序。请改正程序指定部位的错误,使它能得到正确结果。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 void fun(int n, int *a)
L3 {
L4 int i,j,p,t;
L5 for(j=0;j<n-1;j++)
L6 { p=j;
L7 for(i=j+1;i<n-1;i++)
L8 if(a[p]>a[i])
L9 t=i;
L10 if(p!=j)
L11 { t=a[j];
L12 a[j]=a[p];
L13 a[p]=t; }
L14 }
L15 }
L16 void putarr(int n, int *z)
L17 { int i;
L18 for(i=1;i<=n;i++,z++)
L19 { printf("%4d",z);
L20 if(!(i%10))
L21 printf("
"); }
L22 printf("
"); }
L23 void main()
L24 {
L25 int aa[20]={9,3,0,4,1,2,5,6,8,10,7,52,33,42},n=11;
L26 printf("
Before sorting %d numbers:
",n);
L27 putarr(n,aa);
L28 fun(n,aa);
L29 printf("
After sorting %d numbers:
",n);
L30 putarr(n,aa); }
①___________________________________________________
②___________________________________________________
③___________________________________________________
(3)如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。下列程序的功能是求出3000以内的全部亲密数。以下程序只允许修改两行。
L1 #include<stdio.h>
L2 int main()
L3 {
L4 int a,i,b,n;
printf("There are following friendly–numbers pair smaller than 3000:
");
L5 for(a=1;a<3000;a++)
L6 {
L7 for(b=0,i=1;i<=a/2;i++)
L8 if(!(a%i))
L9 b+=i+1;
L10 for(n=0,i=1;i<=b/2;i++)
L11 if(!(b%i))
L12 n+=i;
L13 if(n==a||a<b)
L14 printf("%4d..%4d ",a,b);
L15 }
L16 }
①___________________________________________________
②___________________________________________________
(4)下面程序的功能是:验证2000以内的正偶数都能够分解为两个素数之和(即验证歌德巴赫猜想对2000以内的正偶数成立) 。以下程序只允许修改三行。
L1 #include<stdio.h>
L2 #include<math.h>
L3 int fflag(int n);
L4 int main()
L5 {
L6 int i,n;
L7 for(i=4;i<=2000;i+=2)
L8 {
L9 for(n=2;n<i;n++)
L10 if(fflag(n))
L11 if(fflag(i))
L12 {
L13 printf("%14d=%d+%d
",i,n,i-n);
L14 continue; }
L15 if(n==i) printf("error %d
",i); }
L16 }
L17 int fflag(int i)
L18 {int j;
L19 if(i<=1)return 0;
L20 if(i==2)return 1;
L21 if(!(i%2))return 0;
L22 for(j=3;j<=(int)(sqrt((double)i)+1);j+=2)
L23 if(i%j)return 0;
L24 return 1; }
①___________________________________________________
②___________________________________________________
③___________________________________________________
三、程序设计题(本大题共2小题,合计20分)
1.下列程序的功能是:创建一个链表,链表中每个节点都包含一个0或1。这个链表的数字是二进制数字的列表。返回链表中数字的十进制值。(每空2分,共10分)
#include <stdio.h>
#include <stdlib.h>
struct ListNode
{
int val;
struct ListNode* next;
};
int getDecimalValue(struct ListNode* head)
{
struct ListNode* curr;
int result;
__________①___________;
result = 0;
while (curr != NULL)
{
result = ____________②___________;
___________③_____________;
}
return result;
}
struct ListNode* createList(int arr[], int n)
{
struct ListNode* head;
struct ListNode* tail;
int i;
struct ListNode* node;
head = NULL;
tail = NULL;
for (i = 0; i < n; i++)
{
node = _____________④____________;
node->val = __________⑤____________;
node->next = NULL;
if (head == NULL)
{
head = node;
tail = node;
}
else
{
tail->next = node;
tail = node;
}
}
return head;
}
void printBinary(struct ListNode* head)
{
struct ListNode* curr;
curr = head;
while (curr != NULL)
{
printf("%d", curr->val);
curr = curr->next;
}
}
main()
{
int len, i;
int* arr;
struct ListNode* head;
int decimal;
printf("===== 二进制链表转十进制 =====
");
printf("请输入二进制数的位数:");
scanf("%d", &len);
arr = (int*)malloc(len * sizeof(int));
printf("请输入 %d 位二进制数(只能输入 0 或 1):
", len);
for (i = 0; i < len; i++)
{
scanf("%d", &arr[i]);
}
head = createList(arr, len);
printf("
二进制链表:");
printBinary(head);
decimal = getDecimalValue(head);
printf("
转换后的十进制:%d
", decimal);
free(arr);
}
2.下列程序的功能是:创建一个长度为偶数的链表,求链表中孪生节点对的最大和。孪生节点对是第i个节点和第(n-1-i)个节点的和。(每空2分,共10分)
#include <stdio.h>
#include <stdlib.h>
struct ListNode
{
int val;
struct ListNode* next;
};
int pairSum(struct ListNode* head)
{
struct ListNode* slow;
struct ListNode* fast;
struct ListNode* prev;
struct ListNode* curr;
struct ListNode* next;
int max_sum;
int sum;
slow = head;
fast = head;
while (fast != NULL && fast->next != NULL)
{
slow = slow->next;
_____________①_______________;
}
prev = NULL;
__________②___________;
while (curr != NULL)
{
_________③________;
curr->next = prev;
prev = curr;
curr = next;
}
________④_________;
while (prev != NULL)
{
_____________⑤___________;
if (sum > max_sum)
{
max_sum = sum;
}
head = head->next;
prev = prev->next;
}
return max_sum;
}
struct ListNode* createList(int arr[], int n)
{
struct ListNode* head;
struct ListNode* tail;
int i;
struct ListNode* node;
head = NULL;
tail = NULL;
for (i = 0; i < n; i++)
{
node = (struct ListNode*)malloc(sizeof(struct ListNode));
node->val = arr[i];
node->next = NULL;
if (head == NULL)
{
head = node;
tail = node;
}
else
{
tail->next = node;
tail = node;
}
}
return head;
}
void printList(struct ListNode* head)
{
struct ListNode* curr;
curr = head;
while (curr != NULL)
{
printf("%d ", curr->val);
curr = curr->next;
}
}
main()
{
int len, i;
int* arr;
struct ListNode* head;
int result;
printf("===== 求链表孪生节点对最大和 =====
");
printf("请输入链表节点个数(必须是偶数):");
scanf("%d", &len);
arr = (int*)malloc(len * sizeof(int));
printf("请输入 %d 个整数:
", len);
for (i = 0; i < len; i++)
{
scanf("%d", &arr[i]);
}
head = createList(arr, len);
printf("
你输入的链表:");
printList(head);
result = pairSum(head);
printf("
最大孪生节点和为:%d
", result);
free(arr);
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$