内容正文:
编写说明:湖南省普通高校对口招生专业理论考试《计算机应用类专业综合考纲百套卷》,依据《湖南省普通高校对口招生计算机应用类专业综合知识基本要求及考试大纲》编写。每门课程均分三层训练:基础层(具象化支架)拆解考点为微目标,紧扣考纲 “掌握”“理解” 要求编写考点训练卷;巩固层(关联性支架)强化知识交叉与场景关联,按考纲专题编专题训练卷;应用层(引导性支架)聚焦真题突破,结合知识模块与教材编写课程综合卷。
本试卷是第98卷,按《计算机编程语言——C语言》范围和要求编写。具体内容为:①C语言基础知识;②分支结构程序设计;③循环结构程序设计;④数组;⑤函数;⑥结构体和共用体;⑦指针、文件。
湖南省《计算机应用类专业综合考纲百套卷》 第98卷
《计算机编程语言——C语言》
课程综合卷
考试时间60分钟 满分100分
班级________姓名________学号________成绩________
一、单项选择题(本大题共10小题,每题2分,共20分)
1.设有语句:#define S(x) x*x int a=S(4-1); printf("%d",a);输出结果( )
A. -7 B. 1 C. 7 D. 12
2.下列关于 C 语言 main 函数说法正确的是( )
A. 多个源文件可以同时存在多个 main 函数
B. main 函数必须写在所有自定义函数前面
C. C 程序运行时,从 main 函数第一行代码开始执行
D. main 函数的返回值类型只能省略不写
3.下列不属于算法五大特性的是( )
A. 可行性 B. 可读性 C. 确定性 D. 有穷性
4.设有语句:int m=9,n=4; int res = m<n ? m++ : --n; res 与 n 的值依次是( )
A. 3,3 B. 4,3 C. 9,4 D. 4,4
5.设有语句:int x=0,y=5; int ret = x && --y; 执行后 y 的值为( )
A. 4 B. 5 C. 0 D. 1
6.设有语句:scanf("%d%*c%d", &x, &y); 输入 5,9 ,下列说法正确的是( )
A.x=5,y=9 B.x=5,y 随机垃圾值
C. 程序编译报错 D.x=5,y=5
7.执行以下程序段的输出结果是( )
float f = 3.6;
int a = (int)f + (int)2.9;
printf("%d", a);
A.6 B.5 C.7 D.3
8.执行以下程序段的输出结果是( )
int a = 1, b = 2, c = 3;
int res = a && ++b || c++;
printf("%d,%d,%d", a, b, c);
A.1,3,3 B.1,2,4 C.1,3,4 D.1,2,3
9.执行以下程序段的输出结果是( )
int x = 10, y = 20;
int *p = &x;
*p = y++;
printf("%d,%d", x, y);
A.10,20 B.20,21 C.21,20 D.20,20
10.执行以下程序段的输出结果是( )
int a = 3;
int b = (a += a *= a - 1);
printf("%d", b);
A. 6 B. 12 C. 18 D. 24
二、阅读程序,写出运行结果(本大题共10小题。每空2分,合计20分)
1.下列程序的运行结果是__________________。
#include <stdio.h>
int getAreaSum(int (*a)[4], int sRow, int eRow, int sCol, int eCol)
{
int i, j, sum = 0;
for(i = sRow; i <= eRow; i++)
for(j = sCol; j <= eCol; j++)
sum += a[i][j];
return sum;
}
int main()
{
int m[4][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,16}
};
printf("%d", getAreaSum(m, 1, 2, 1, 2));
return 0;
}
2.下列程序的运行结果是__________________。
#include <stdio.h>
int *selectOdd(int *a, int n, int *cnt)
{ static int odd[20];
int i, k = 0;
for(i = 0; i < n; i++)
{ if(a[i] % 2 != 0)
odd[k++] = a[i];
}
*cnt = k;
return odd;
}
int main()
{ int arr[] = {12, 7, 19, 4, 25, 8};
int count, i;
int *p = selectOdd(arr, 6, &count);
for(i = 0; i < count; i++)
{ printf("%d ", *(p + i));}
return 0; }
3.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{ FILE *fp;
int digit = 0;
int c;
fp = fopen("file20.txt", "w");
fputs("x9y8z7#6", fp);
fclose(fp);
fp = fopen("file20.txt", "r");
while(1)
{ c = fgetc(fp);
if(c == EOF)
break;
if(c >= '0' && c <= '9')
digit++;
}
printf("数字总数:%d", digit);
fclose(fp);
return 0; }
4.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{
int p,q,logic,out;
p = 9;
q = 0;
logic = (p < 6 || (q++, p - q)) && (p % 2 != 0);
switch(logic)
{
case 1:
if(q > 0)
out = p * q;
else
out = p + q;
break;
case 0:
out = p / 3;
break;
}
printf("p=%d,q=%d,logic=%d,out=%d",p,q,logic,out);
return 0;
}
5.下列程序的运行结果是__________________。
#include <stdio.h>
int travel(int arr[], int left, int right)
{
int mid, l, r;
if(left > right)
return 0;
mid = (left + right) / 2;
l = travel(arr, left, mid - 1);
r = travel(arr, mid + 1, right);
return arr[mid] + l + r;
}
int main(void)
{
int a[6] = {2,5,1,8,3,7};
int total;
total = travel(a, 0, 5);
printf("数组全部元素累加总和:%d", total);
return 0;
}
6.下列程序的运行结果是__________________。
#include <stdio.h>
void fillTri(int tri[][5], int row, int col)
{
if(row >= 5)
return;
tri[row][col] = row + col;
if(col + 1 < 5)
fillTri(tri, row, col + 1);
else
fillTri(tri, row + 1, 0);
}
void printComposite(int mat[][5])
{
int i, j, k, flag;
for(i = 0; i < 5; i++)
{
for(j = 0; j < 5; j++)
{
flag = 1;
if(mat[i][j] < 2)
flag = 0;
for(k = 2; k * k <= mat[i][j]; k++)
if(mat[i][j] % k == 0)
flag = 0;
if(flag == 0 && mat[i][j] >= 4)
printf("%d ", mat[i][j]);
}
}
}
int main(void)
{
int grid[5][5];
fillTri(grid, 0, 0);
printComposite(grid);
return 0;
}
7.下列程序的运行结果是__________________。
#include <stdio.h>
#include <stdlib.h>
struct Node{int val;struct Node *next;};
struct Node* del(struct Node *h,int tar){
struct Node *p,*pre;
p=h;pre=NULL;
while(p&&p->val!=tar)
{pre=p;p=p->next;}
if(!p)return h;
if(!pre)
{ h=p->next;free(p);return h;}
pre->next=p->next;
free(p);
return h;
}
int digitSum(int n)
{ int s=0;
while(n)
{ s+=n%10; n/=10;}
return s;}
int main(void)
{
struct Node *n1,*n2,*n3,*h;int total=0;
n1=(struct Node*)malloc(sizeof(struct Node));
n2=(struct Node*)malloc(sizeof(struct Node));
n3=(struct Node*)malloc(sizeof(struct Node));
n1->val=47;
n2->val=22;
n3->val=39;
n1->next=n2;
n2->next=n3;
n3->next=NULL;
h=del(n1,22);
while(h)
{ total+=digitSum(h->val);
h=h->next;}
printf("%d",total);
free(n1);free(n3);
return 0; }
8.下列程序的运行结果是__________________。
#include <stdio.h>
long quickPow(int a, int b)
{
long res;
if(b == 0) return 1;
res = quickPow(a, b / 2);
res = res * res;
if(b % 2 == 1)
res = res * a;
return res;
}
int main(void)
{
int base[4] = {2, 3, 4, 5};
int exp[4] = {3, 2, 3, 2};
int *pB = base, *pE = exp;
long total = 0;
int i;
for(i = 0; i < 4; i++)
{
total += quickPow(*(pB + i), *(pE + i));
}
printf("%ld", total);
return 0;
}
9.下列程序的运行结果是__________________。
#include <stdio.h>
int mem[200];
int getFactorSum(int x)
{
int i, sum = 0;
if (mem[x] != -1)
return mem[x];
for (i = 1; i <= x / 2; i++)
if (x % i == 0)
sum += i;
mem[x] = sum;
return sum;
}
int main(void)
{
int arr[5] = {6, 12, 18, 24, 30};
int i, j, s, total = 0;
for (i = 0; i < 200; i++)
mem[i] = -1;
for (i = 0; i < 5; i++)
{
for (j = i; j < 5; j++)
{
int vis[200] = {0};
int subSum = 0;
for (s = i; s <= j; s++)
{
int fs = getFactorSum(arr[s]);
if (!vis[fs])
{
subSum += fs;
vis[fs] = 1;
}
}
total += subSum;
}
}
printf("%d", total);
return 0;
}
10.下列程序的运行结果是__________________。
#include <stdio.h>
char hashMark[200] = {0};
void dfs(int arr[], int n, int idx, int curSum)
{
if (idx >= n)
{
hashMark[curSum] = 'A';
return;
}
dfs(arr, n, idx + 1, curSum + arr[idx]);
dfs(arr, n, idx + 1, curSum);
}
int main(void)
{
int data[3] = {4, 7, 9};
int i, totalAscii = 0;
dfs(data, 3, 0, 0);
for (i = 0; i < 200; i++)
if (hashMark[i] != 0)
totalAscii += hashMark[i];
printf("%d", totalAscii);
return 0;
}
三、程序填空。按照题目要求,将正确内容填入答题卡相应位置,使程序完整(每空2分,共计40分)
1.下列程序的功能是:定义一个 5 行 4 列整型二维数组,使用行指针作为函数形参。自定义函数完成三项任务:
找出整个数组的最大值与最小值;
统计最大值、最小值各自出现的次数;
通过指针参数将最大值、最小值、对应出现次数全部带回主函数,最终统一输出
#include <stdio.h>
void getMaxMinStat(int (*arr)[4], int rows, int *maxVal, int *minVal, int *cntMax, int *cntMin)
{
int i, j;
*maxVal = arr[0][0];
*minVal = arr[0][0];
*cntMax = 1;
*cntMin = 1;
for (i = 0; i < _________①________; i++)
{
for (j = 0; j < 4; j++)
{
if (____________②__________)
{
*maxVal = arr[i][j];
_________③_________
}
else if (arr[i][j] == *maxVal)
{
(*cntMax)++;
}
if (arr[i][j] < *minVal)
{
*minVal = arr[i][j];
*cntMin = 1;
}
else if (__________④__________)
{
(*cntMin)++;
}
}
}
}
int main()
{
int data[5][4] = {{29, 11, 76, 11},{88, 23, 55, 76},
{11, 62, 88, 37},{41, 76, 19, 88},{88, 52, 29, 63} };
int max, min, countMax, countMin;
getMaxMinStat(____________⑤___________);
printf("数组最大值:%d,出现次数:%d
", max, countMax);
printf("数组最小值:%d,出现次数:%d
", min, countMin);
return 0; }
2.阶梯收费规则:10 吨以内 2 元 / 吨;10~20 吨超出部分 3 元 / 吨;20 吨以上超出部分 4 元 / 吨。输入用水吨数,分段累加计算总水费,吨数负数报错。
#include <stdio.h>
int main(void)
{
int water;
double fee;
printf("输入本月用水吨数:");
_________①_________
if(water < 0)
{
printf("用水量非法
");
return 0;
}
_________②_________
while(water > 0)
{
if(water > 20)
{
________③________
water = 20;
}
else if(water > 10)
{
________④_________
water = 10;
}
else
{
__________⑤_________
water = 0;
}
}
printf("本月应交水费:%.2lf 元
", fee);
return 0;
}
3.亲和数链表配对统计:亲和数定义:A 的所有真因数之和 = B,B 的所有真因数之和 = A,A≠B,遍历链表,统计链表中属于亲和数的节点总个数并输出。。
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
ListNode* createList(int arr[], int n)
{
ListNode dummy;
ListNode *tail;
int i;
dummy.next = NULL;
tail = &dummy;
for (i = 0; i < n; i++)
{
tail->next = ____________①__________
tail = tail->next;
tail->val = arr[i];
_________②_________
}
return dummy.next;
}
int factorSum(int n)
{
int sum, i;
sum = 0;
for (i = 1; i <= n / 2; i++)
if (n % i == 0) sum += i;
return sum;
}
int main(void)
{
int arr[] = {220,284,1184,1210,2620,2924};
int len = 6,b;
ListNode *head, *p;
int buf[6], i, j, cnt = 0, flag;
head = __________③_________
p = head;
for (i = 0; i < 6; i++)
{
buf[i] = p->val;
________④_________
}
for (i = 0; i < 6; i++)
{
flag = 0;
b = factorSum(buf[i]);
for (j = 0; j < 6; j++)
{
if (buf[j] == b && ____________⑤__________)
{
flag = 1;
break;
}
}
if (flag) cnt++;
}
printf("链表内亲和数总个数:%d", cnt);
return 0;
}
4.下列程序的功能是删除链表倒数第 k 个节点,最后输出处理后的完整链表。
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
ListNode* createList(int n)
{
ListNode dummy;
ListNode *tail;
int i, num;
dummy.next = NULL;
tail = _______①______
for (i = 0; i < n; i++)
{
printf("请输入第%d个节点数值:", i + 1);
scanf("%d", &num);
tail->next = (ListNode*)malloc(sizeof(ListNode));
tail = tail->next;
tail->val = num;
tail->next = NULL;
}
return dummy.next;
}
void printList(ListNode* head)
{
while (head != NULL)
{
printf("%d ", head->val);
__________②__________
}
printf("
");
}
ListNode* removeLastKth(ListNode* head, int k)
{
ListNode dummy;
ListNode *fast, *slow;
int i;
ListNode *tmp;
dummy.next = head;
fast = &dummy;
slow = &dummy;
for (i = 0; i < k; i++)
fast = fast->next;
while (__________③_________)
{
fast = fast->next;
slow = slow->next;
}
tmp = _________④________
slow->next = ________⑤_______
free(tmp);
return dummy.next;
}
int main(void)
{
int n, k;
ListNode *head, *res, *p, *del;
printf("请输入链表节点总数:");
scanf("%d", &n);
head = createList(n);
printf("原始链表:");
printList(head);
printf("请输入需要删除的倒数节点序号k:");
scanf("%d", &k);
res = removeLastKth(head, k);
printf("删除倒数第%d个节点后的链表:", k);
printList(res);
p = res;
while (p != NULL)
{
del = p;
p = p->next;
free(del);
}
return 0;
}
四、阅读程序:修改程序中的错误,不得增行或删行,也不得更改程序结构。请在答题卡中指出错误代码所在的行号,并给出该行修改后的程序代码。(每空2分,共计20分)
1.下列程序的功能是:在有序(升序)的数组中插入一个数,使插入后的数组仍然有序。以下程序只允许修改两行。
L1 #include<stdio.h>
L2 #define N 10
L3 void insert(int *a, int n, int x)
L4 {
L5 int*p, *q;
L6 for(p=a;p<a+n; p++)
L7 {
L8 if(p>x)
L9 {
L10 q=p;
L11 break;
L12 }
L13 }
L14 for(p=a+n;p>=q;p--)
L15 *p=*(p-1);
L16 q=x;
L17 }
L18 main()
L19 {
L20 int i, a[N+1],an;
L21 int *p;
L22 printf("Input 10 seriate integer :
");
L23 for (i = 0; i < N; i++)
L24 scanf("%d", &a[i]);
L25 printf("input inserting data: ");
L26 scanf("%d", &an);
L27 insert(a,N,an);
L28 for(p=a;p<a+N+1;p++)
L29 {
L30 printf("%3d",*p);
L31 }
L32 }
2.下列程序的功能是实现将现有文本文档的内容复制到新建的文本文档中。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 main()
L3 {
L4 FILE *in,*out;
L5 char ch, infile[50], outfile[50];
L6 printf("Enter the infile name:
");
L7 scanf("%s", infile);
L8 printf("Enter the outfile name:
");
L9 scanf("%c", outfile);
L10 if ((in = fopen(infile, "r")) == NULL)
L11 {
L12 printf("cannot open infile
");
L13 exit(0);
L14 }
L15 if ((out = fopen(outfile, "w")) == NULL)
L16 {
L17 printf("cannot open outfile
");
L18 exit(0);
L19 }
L20 ch = fgetc();
L21 while (ch != EOF)
L22 {
L23 fputc(ch, out);
L24 ch = fgetc(in);
L25 }
L26 fclose(in);
L27 fclose(out);
L28 }
3.下列程序的功能是实现比较两个有序数组中的元素,输出两个数组中第一个相同的元素值。以下程序只允许修改三行。
L1 #include "stdio.h"
L2 int *find(int *pa, int *pb, int an, int bn)
L3 {
L4 int *pta, *ptb;
L5 pta = pa;
L6 ptb = pb;
L7 while (*pta < pa + an && *ptb < pb + bn)
L8 {
L9 if (*pta < *ptb)
L10 pta++;
L11 else if (*pta > *ptb)
L12 ptb++;
L13 else
L14 return *pta;
L15 }
L16 return 0;
L17 }
L18 void main()
L19 {
L20 int p, i;
L21 int a[] = {1, 3, 5, 7, 9, 11, 13, 15};
L22 int b[] = { 2, 4, 6, 8, 11, 15, 17 };
L23 printf("The elements of array a:
");
L24 for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
L25 printf("%d ", a[i]);
L26 printf("
The elements of array b:
");
L27 for (i = 0; i < sizeof(b) / sizeof(b[0]); i++)
L28 printf("%d ", b[i]);
L29 p=find(a, b, sizeof(a)/sizeof(a[0]), sizeof(b) / sizeof(b[0]));
L30 if (p)
L31 printf("
The first element in both arrays is %d
", *p);
L32 else
L33 printf("Doesn't found the same element!
");
L34 getch();
L35 }
4.下列程序功能是:有8位同学排队接水,编号依次为1~8。请修改程序,使所有同学平均等待时间(不包括接水时间)最短,输出平均等待时间。例如,每位同学接水时长(分钟)依次为:1,2,2,3,1,4,2,3,平均等待时间为 5.75 分钟。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 struct Person {
L3 int id;
L4 int time;
L5 };
L6 void sort(struct Person *p,int n){
L7 int i,j;
L8 for(i=1;i<=n-1;i++){
L9 for(j=1;j<=n-i;j++){
L10 if(p[j].time>p[j+1].time){
L11 Person temp=p[j];
L12 p[j]=p[j+1];
L13 p[j+1]=temp;
L14 }
L15 }
L16 }
L17 }
L18 int main(){
L19 int n=8,total=0,sum=0,i;
L20 double avg;
L21 struct Person p[9];
L22 int arr[]={1,2,2,3,1,4,2,3};
L23 for(i=1;i<=n;i++){
L24 p[i].id=i;
L25 p[i].time=arr[i];
L26 }
L27 sort(p,n);
L28 for(i=1;i<n;i++){
L29 sum+=p[i].time;
L30 total+=sum;
L31 }
L32 avg=total/n;
L33 printf("
%.2f
",avg);
L34 return 0;
L35 }
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
编写说明:湖南省普通高校对口招生专业理论考试《计算机应用类专业综合考纲百套卷》,依据《湖南省普通高校对口招生计算机应用类专业综合知识基本要求及考试大纲》编写。每门课程均分三层训练:基础层(具象化支架)拆解考点为微目标,紧扣考纲 “掌握”“理解” 要求编写考点训练卷;巩固层(关联性支架)强化知识交叉与场景关联,按考纲专题编专题训练卷;应用层(引导性支架)聚焦真题突破,结合知识模块与教材编写课程综合卷。
本试卷是第98卷,按《计算机编程语言——C语言》范围和要求编写。具体内容为:①C语言基础知识;②分支结构程序设计;③循环结构程序设计;④数组;⑤函数;⑥结构体和共用体;⑦指针、文件。
湖南省《计算机应用类专业综合考纲百套卷》 第98卷
《计算机编程语言——C语言》
课程综合卷
考试时间60分钟 满分100分
班级________姓名________学号________成绩________
一、单项选择题(本大题共10小题,每题2分,共20分)
1.设有语句:#define S(x) x*x int a=S(4-1); printf("%d",a);输出结果( )
A. -7 B. 1 C. 7 D. 12
【答案】A
【解析】文本替换 5-2*5-2,先乘后加减,结果 - 7。
2.下列关于 C 语言 main 函数说法正确的是( )
A. 多个源文件可以同时存在多个 main 函数
B. main 函数必须写在所有自定义函数前面
C. C 程序运行时,从 main 函数第一行代码开始执行
D. main 函数的返回值类型只能省略不写
【答案】C
【解析】A:整个工程只能有 1 个 main;B:main 位置无强制要求;D:标准 C 要求写 int main;C 描述完全正确。
3.下列不属于算法五大特性的是( )
A. 可行性 B. 可读性 C. 确定性 D. 有穷性
【答案】B
【解析】算法五大特性:输入、输出、有穷性、确定性、可行性;可读性是代码规范,不是算法必备特性。
4.设有语句:int m=9,n=4; int res = m<n ? m++ : --n; res 与 n 的值依次是( )
A. 3,3 B. 4,3 C. 9,4 D. 4,4
【答案】A
【解析】条件 m<n 即 9<4 为假,因此执行冒号后的 --n(前置自减,n先变为3),并将结果3赋值给res,所以res和n的值均为3,选A。
5.设有语句:int x=0,y=5; int ret = x && --y; 执行后 y 的值为( )
A. 4 B. 5 C. 0 D. 1
【答案】B
【解析】逻辑 && 短路,x=0 整体表达式直接为假,右侧 --y 不执行,y 不变。
6.设有语句:scanf("%d%*c%d", &x, &y); 输入 5,9 ,下列说法正确的是( )
A.x=5,y=9 B.x=5,y 随机垃圾值
C. 程序编译报错 D.x=5,y=5
【答案】A
【解析】%*c 读取逗号并丢弃,不存入变量,成功读取 5、9 到 x、y。
7.执行以下程序段的输出结果是( )
float f = 3.6;
int a = (int)f + (int)2.9;
printf("%d", a);
A.6 B.5 C.7 D.3
【答案】B
【解析】强制 int 直接截断小数,(int) 3.6=3,(int) 2.9=2,和为 5。
8.执行以下程序段的输出结果是( )
int a = 1, b = 2, c = 3;
int res = a && ++b || c++;
printf("%d,%d,%d", a, b, c);
A.1,3,3 B.1,2,4 C.1,3,4 D.1,2,3
【答案】A
【解析】短路求值:a&&++b 结果为真,||右侧 c++ 不执行;b 自增为 3,c 不变。
9.执行以下程序段的输出结果是( )
int x = 10, y = 20;
int *p = &x;
*p = y++;
printf("%d,%d", x, y);
A.10,20 B.20,21 C.21,20 D.20,20
【答案】B
【解析】p 指向 x,*p 修改 x 为 20;取值 y=20 后 y 自增为 21。
10.执行以下程序段的输出结果是( )
int a = 3;
int b = (a += a *= a - 1);
printf("%d", b);
A. 6 B. 12 C. 18 D. 24
【答案】B
【解析】复合赋值从右往左计算,先a = 3*(3-1)=6,再a=6+6=12,b 接收最终 a 的值 12。
二、阅读程序,写出运行结果(本大题共10小题。每空2分,合计20分)
1.下列程序的运行结果是__________________。
#include <stdio.h>
int getAreaSum(int (*a)[4], int sRow, int eRow, int sCol, int eCol)
{
int i, j, sum = 0;
for(i = sRow; i <= eRow; i++)
for(j = sCol; j <= eCol; j++)
sum += a[i][j];
return sum;
}
int main()
{
int m[4][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,16}
};
printf("%d", getAreaSum(m, 1, 2, 1, 2));
return 0;
}
【答案】34
2.下列程序的运行结果是__________________。
#include <stdio.h>
int *selectOdd(int *a, int n, int *cnt)
{ static int odd[20];
int i, k = 0;
for(i = 0; i < n; i++)
{ if(a[i] % 2 != 0)
odd[k++] = a[i];
}
*cnt = k;
return odd;
}
int main()
{ int arr[] = {12, 7, 19, 4, 25, 8};
int count, i;
int *p = selectOdd(arr, 6, &count);
for(i = 0; i < count; i++)
{ printf("%d ", *(p + i));}
return 0; }
【答案】7 19 25
3.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{ FILE *fp;
int digit = 0;
int c;
fp = fopen("file20.txt", "w");
fputs("x9y8z7#6", fp);
fclose(fp);
fp = fopen("file20.txt", "r");
while(1)
{ c = fgetc(fp);
if(c == EOF)
break;
if(c >= '0' && c <= '9')
digit++;
}
printf("数字总数:%d", digit);
fclose(fp);
return 0; }
【答案】数字总数:4
4.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{
int p,q,logic,out;
p = 9;
q = 0;
logic = (p < 6 || (q++, p - q)) && (p % 2 != 0);
switch(logic)
{
case 1:
if(q > 0)
out = p * q;
else
out = p + q;
break;
case 0:
out = p / 3;
break;
}
printf("p=%d,q=%d,logic=%d,out=%d",p,q,logic,out);
return 0;
}
【答案】p=9,q=1,logic=1,out=9
5.下列程序的运行结果是__________________。
#include <stdio.h>
int travel(int arr[], int left, int right)
{
int mid, l, r;
if(left > right)
return 0;
mid = (left + right) / 2;
l = travel(arr, left, mid - 1);
r = travel(arr, mid + 1, right);
return arr[mid] + l + r;
}
int main(void)
{
int a[6] = {2,5,1,8,3,7};
int total;
total = travel(a, 0, 5);
printf("数组全部元素累加总和:%d", total);
return 0;
}
【答案】数组全部元素累加总和:26
6.下列程序的运行结果是__________________。
#include <stdio.h>
void fillTri(int tri[][5], int row, int col)
{
if(row >= 5)
return;
tri[row][col] = row + col;
if(col + 1 < 5)
fillTri(tri, row, col + 1);
else
fillTri(tri, row + 1, 0);
}
void printComposite(int mat[][5])
{
int i, j, k, flag;
for(i = 0; i < 5; i++)
{
for(j = 0; j < 5; j++)
{
flag = 1;
if(mat[i][j] < 2)
flag = 0;
for(k = 2; k * k <= mat[i][j]; k++)
if(mat[i][j] % k == 0)
flag = 0;
if(flag == 0 && mat[i][j] >= 4)
printf("%d ", mat[i][j]);
}
}
}
int main(void)
{
int grid[5][5];
fillTri(grid, 0, 0);
printComposite(grid);
return 0;
}
【答案】4 4 4 6 4 6 4 6 8
7.下列程序的运行结果是__________________。
#include <stdio.h>
#include <stdlib.h>
struct Node{int val;struct Node *next;};
struct Node* del(struct Node *h,int tar){
struct Node *p,*pre;
p=h;pre=NULL;
while(p&&p->val!=tar)
{pre=p;p=p->next;}
if(!p)return h;
if(!pre)
{ h=p->next;free(p);return h;}
pre->next=p->next;
free(p);
return h;
}
int digitSum(int n)
{ int s=0;
while(n)
{ s+=n%10; n/=10;}
return s;}
int main(void)
{
struct Node *n1,*n2,*n3,*h;int total=0;
n1=(struct Node*)malloc(sizeof(struct Node));
n2=(struct Node*)malloc(sizeof(struct Node));
n3=(struct Node*)malloc(sizeof(struct Node));
n1->val=47;
n2->val=22;
n3->val=39;
n1->next=n2;
n2->next=n3;
n3->next=NULL;
h=del(n1,22);
while(h)
{ total+=digitSum(h->val);
h=h->next;}
printf("%d",total);
free(n1);free(n3);
return 0; }
【答案】23
8.下列程序的运行结果是__________________。
#include <stdio.h>
long quickPow(int a, int b)
{
long res;
if(b == 0) return 1;
res = quickPow(a, b / 2);
res = res * res;
if(b % 2 == 1)
res = res * a;
return res;
}
int main(void)
{
int base[4] = {2, 3, 4, 5};
int exp[4] = {3, 2, 3, 2};
int *pB = base, *pE = exp;
long total = 0;
int i;
for(i = 0; i < 4; i++)
{
total += quickPow(*(pB + i), *(pE + i));
}
printf("%ld", total);
return 0;
}
【答案】106
9.下列程序的运行结果是__________________。
#include <stdio.h>
int mem[200];
int getFactorSum(int x)
{
int i, sum = 0;
if (mem[x] != -1)
return mem[x];
for (i = 1; i <= x / 2; i++)
if (x % i == 0)
sum += i;
mem[x] = sum;
return sum;
}
int main(void)
{
int arr[5] = {6, 12, 18, 24, 30};
int i, j, s, total = 0;
for (i = 0; i < 200; i++)
mem[i] = -1;
for (i = 0; i < 5; i++)
{
for (j = i; j < 5; j++)
{
int vis[200] = {0};
int subSum = 0;
for (s = i; s <= j; s++)
{
int fs = getFactorSum(arr[s]);
if (!vis[fs])
{
subSum += fs;
vis[fs] = 1;
}
}
total += subSum;
}
}
printf("%d", total);
return 0;
}
【答案】845
10.下列程序的运行结果是__________________。
#include <stdio.h>
char hashMark[200] = {0};
void dfs(int arr[], int n, int idx, int curSum)
{
if (idx >= n)
{
hashMark[curSum] = 'A';
return;
}
dfs(arr, n, idx + 1, curSum + arr[idx]);
dfs(arr, n, idx + 1, curSum);
}
int main(void)
{
int data[3] = {4, 7, 9};
int i, totalAscii = 0;
dfs(data, 3, 0, 0);
for (i = 0; i < 200; i++)
if (hashMark[i] != 0)
totalAscii += hashMark[i];
printf("%d", totalAscii);
return 0;
}
【答案】520
三、程序填空。按照题目要求,将正确内容填入答题卡相应位置,使程序完整(每空2分,共计40分)
1.下列程序的功能是:定义一个 5 行 4 列整型二维数组,使用行指针作为函数形参。自定义函数完成三项任务:
找出整个数组的最大值与最小值;
统计最大值、最小值各自出现的次数;
通过指针参数将最大值、最小值、对应出现次数全部带回主函数,最终统一输出
#include <stdio.h>
void getMaxMinStat(int (*arr)[4], int rows, int *maxVal, int *minVal, int *cntMax, int *cntMin)
{
int i, j;
*maxVal = arr[0][0];
*minVal = arr[0][0];
*cntMax = 1;
*cntMin = 1;
for (i = 0; i < _________①________; i++)
{
for (j = 0; j < 4; j++)
{
if (____________②__________)
{
*maxVal = arr[i][j];
_________③_________
}
else if (arr[i][j] == *maxVal)
{
(*cntMax)++;
}
if (arr[i][j] < *minVal)
{
*minVal = arr[i][j];
*cntMin = 1;
}
else if (__________④__________)
{
(*cntMin)++;
}
}
}
}
int main()
{
int data[5][4] = {{29, 11, 76, 11},{88, 23, 55, 76},
{11, 62, 88, 37},{41, 76, 19, 88},{88, 52, 29, 63} };
int max, min, countMax, countMin;
getMaxMinStat(____________⑤___________);
printf("数组最大值:%d,出现次数:%d
", max, countMax);
printf("数组最小值:%d,出现次数:%d
", min, countMin);
return 0; }
【答案】①rows ②arr[i][j] > *maxVal ③*cntMax = 1;
④arr[i][j] == *minVal
⑤data, 5, &max, &min, &countMax, &countMin
2.阶梯收费规则:10 吨以内 2 元 / 吨;10~20 吨超出部分 3 元 / 吨;20 吨以上超出部分 4 元 / 吨。输入用水吨数,分段累加计算总水费,吨数负数报错。
#include <stdio.h>
int main(void)
{
int water;
double fee;
printf("输入本月用水吨数:");
_________①_________
if(water < 0)
{
printf("用水量非法
");
return 0;
}
_________②_________
while(water > 0)
{
if(water > 20)
{
________③________
water = 20;
}
else if(water > 10)
{
________④_________
water = 10;
}
else
{
__________⑤_________
water = 0;
}
}
printf("本月应交水费:%.2lf 元
", fee);
return 0;
}
【答案】①scanf("%d", &water); ②fee = 0;
③fee += (water - 20) * 4; ④fee += (water - 10) * 3;
⑤fee += water * 2;
3.亲和数链表配对统计:亲和数定义:A 的所有真因数之和 = B,B 的所有真因数之和 = A,A≠B,遍历链表,统计链表中属于亲和数的节点总个数并输出。。
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
ListNode* createList(int arr[], int n)
{
ListNode dummy;
ListNode *tail;
int i;
dummy.next = NULL;
tail = &dummy;
for (i = 0; i < n; i++)
{
tail->next = ____________①__________
tail = tail->next;
tail->val = arr[i];
_________②_________
}
return dummy.next;
}
int factorSum(int n)
{
int sum, i;
sum = 0;
for (i = 1; i <= n / 2; i++)
if (n % i == 0) sum += i;
return sum;
}
int main(void)
{
int arr[] = {220,284,1184,1210,2620,2924};
int len = 6,b;
ListNode *head, *p;
int buf[6], i, j, cnt = 0, flag;
head = __________③_________
p = head;
for (i = 0; i < 6; i++)
{
buf[i] = p->val;
________④_________
}
for (i = 0; i < 6; i++)
{
flag = 0;
b = factorSum(buf[i]);
for (j = 0; j < 6; j++)
{
if (buf[j] == b && ____________⑤__________)
{
flag = 1;
break;
}
}
if (flag) cnt++;
}
printf("链表内亲和数总个数:%d", cnt);
return 0;
}
【答案】①(ListNode*)malloc(sizeof(ListNode));
②tail->next = NULL; ③createList(arr, len);
④p = p->next; ⑤factorSum(b) == buf[i]&& buf[i] != b
4.下列程序的功能是删除链表倒数第 k 个节点,最后输出处理后的完整链表。
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
ListNode* createList(int n)
{
ListNode dummy;
ListNode *tail;
int i, num;
dummy.next = NULL;
tail = _______①______
for (i = 0; i < n; i++)
{
printf("请输入第%d个节点数值:", i + 1);
scanf("%d", &num);
tail->next = (ListNode*)malloc(sizeof(ListNode));
tail = tail->next;
tail->val = num;
tail->next = NULL;
}
return dummy.next;
}
void printList(ListNode* head)
{
while (head != NULL)
{
printf("%d ", head->val);
__________②__________
}
printf("
");
}
ListNode* removeLastKth(ListNode* head, int k)
{
ListNode dummy;
ListNode *fast, *slow;
int i;
ListNode *tmp;
dummy.next = head;
fast = &dummy;
slow = &dummy;
for (i = 0; i < k; i++)
fast = fast->next;
while (__________③_________)
{
fast = fast->next;
slow = slow->next;
}
tmp = _________④________
slow->next = ________⑤_______
free(tmp);
return dummy.next;
}
int main(void)
{
int n, k;
ListNode *head, *res, *p, *del;
printf("请输入链表节点总数:");
scanf("%d", &n);
head = createList(n);
printf("原始链表:");
printList(head);
printf("请输入需要删除的倒数节点序号k:");
scanf("%d", &k);
res = removeLastKth(head, k);
printf("删除倒数第%d个节点后的链表:", k);
printList(res);
p = res;
while (p != NULL)
{
del = p;
p = p->next;
free(del);
}
return 0;
}
【答案】①&dummy; ②head = head->next;
③fast->next != NULL ④slow->next; ⑤slow->next->next;
四、阅读程序:修改程序中的错误,不得增行或删行,也不得更改程序结构。请在答题卡中指出错误代码所在的行号,并给出该行修改后的程序代码。(每空2分,共计20分)
1.下列程序的功能是:在有序(升序)的数组中插入一个数,使插入后的数组仍然有序。以下程序只允许修改两行。
L1 #include<stdio.h>
L2 #define N 10
L3 void insert(int *a, int n, int x)
L4 {
L5 int*p, *q;
L6 for(p=a;p<a+n; p++)
L7 {
L8 if(p>x)
L9 {
L10 q=p;
L11 break;
L12 }
L13 }
L14 for(p=a+n;p>=q;p--)
L15 *p=*(p-1);
L16 q=x;
L17 }
L18 main()
L19 {
L20 int i, a[N+1],an;
L21 int *p;
L22 printf("Input 10 seriate integer :
");
L23 for (i = 0; i < N; i++)
L24 scanf("%d", &a[i]);
L25 printf("input inserting data: ");
L26 scanf("%d", &an);
L27 insert(a,N,an);
L28 for(p=a;p<a+N+1;p++)
L29 {
L30 printf("%3d",*p);
L31 }
L32 }
【答案】①L8 if(*p>x)
②L16 *q=x;
2.下列程序的功能是实现将现有文本文档的内容复制到新建的文本文档中。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 main()
L3 {
L4 FILE *in,*out;
L5 char ch, infile[50], outfile[50];
L6 printf("Enter the infile name:
");
L7 scanf("%s", infile);
L8 printf("Enter the outfile name:
");
L9 scanf("%c", outfile);
L10 if ((in = fopen(infile, "r")) == NULL)
L11 {
L12 printf("cannot open infile
");
L13 exit(0);
L14 }
L15 if ((out = fopen(outfile, "w")) == NULL)
L16 {
L17 printf("cannot open outfile
");
L18 exit(0);
L19 }
L20 ch = fgetc();
L21 while (ch != EOF)
L22 {
L23 fputc(ch, out);
L24 ch = fgetc(in);
L25 }
L26 fclose(in);
L27 fclose(out);
L28 }
【答案】①L9 scanf("%s", outfile);
②L20 ch = fgetc(in);
3.下列程序的功能是实现比较两个有序数组中的元素,输出两个数组中第一个相同的元素值。以下程序只允许修改三行。
L1 #include "stdio.h"
L2 int *find(int *pa, int *pb, int an, int bn)
L3 {
L4 int *pta, *ptb;
L5 pta = pa;
L6 ptb = pb;
L7 while (*pta < pa + an && *ptb < pb + bn)
L8 {
L9 if (*pta < *ptb)
L10 pta++;
L11 else if (*pta > *ptb)
L12 ptb++;
L13 else
L14 return *pta;
L15 }
L16 return 0;
L17 }
L18 void main()
L19 {
L20 int p, i;
L21 int a[] = {1, 3, 5, 7, 9, 11, 13, 15};
L22 int b[] = { 2, 4, 6, 8, 11, 15, 17 };
L23 printf("The elements of array a:
");
L24 for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
L25 printf("%d ", a[i]);
L26 printf("
The elements of array b:
");
L27 for (i = 0; i < sizeof(b) / sizeof(b[0]); i++)
L28 printf("%d ", b[i]);
L29 p=find(a, b, sizeof(a)/sizeof(a[0]), sizeof(b) / sizeof(b[0]));
L30 if (p)
L31 printf("
The first element in both arrays is %d
", *p);
L32 else
L33 printf("Doesn't found the same element!
");
L34 getch();
L35 }
【答案】①L7 while (pta < pa + an && ptb < pb + bn)
②L14 return pta;
③L20 int *p, i;
4.下列程序功能是:有8位同学排队接水,编号依次为1~8。请修改程序,使所有同学平均等待时间(不包括接水时间)最短,输出平均等待时间。例如,每位同学接水时长(分钟)依次为:1,2,2,3,1,4,2,3,平均等待时间为 5.75 分钟。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 struct Person {
L3 int id;
L4 int time;
L5 };
L6 void sort(struct Person *p,int n){
L7 int i,j;
L8 for(i=1;i<=n-1;i++){
L9 for(j=1;j<=n-i;j++){
L10 if(p[j].time>p[j+1].time){
L11 Person temp=p[j];
L12 p[j]=p[j+1];
L13 p[j+1]=temp;
L14 }
L15 }
L16 }
L17 }
L18 int main(){
L19 int n=8,total=0,sum=0,i;
L20 double avg;
L21 struct Person p[9];
L22 int arr[]={1,2,2,3,1,4,2,3};
L23 for(i=1;i<=n;i++){
L24 p[i].id=i;
L25 p[i].time=arr[i];
L26 }
L27 sort(p,n);
L28 for(i=1;i<n;i++){
L29 sum+=p[i].time;
L30 total+=sum;
L31 }
L32 avg=total/n;
L33 printf("
%.2f
",avg);
L34 return 0;
L35 }
【答案】①L11 struct Person temp=p[j];
②L25 p[i].time=arr[i-1];
③L32 avg=(double)total/n;
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$