内容正文:
编写说明:湖南省普通高校对口招生专业理论考试《计算机应用类专业综合考纲百套卷》,依据《湖南省普通高校对口招生计算机应用类专业综合知识基本要求及考试大纲》编写。每门课程均分三层训练:基础层(具象化支架)拆解考点为微目标,紧扣考纲 “掌握”“理解” 要求编写考点训练卷;巩固层(关联性支架)强化知识交叉与场景关联,按考纲专题编专题训练卷;应用层(引导性支架)聚焦真题突破,结合知识模块与教材编写课程综合卷。
本试卷是第100卷,按《计算机编程语言——C语言》范围和要求编写。具体内容为:①C语言基础知识;②分支结构程序设计;③循环结构程序设计;④数组;⑤函数;⑥结构体和共用体;⑦指针、文件。
湖南省《计算机应用类专业综合考纲百套卷》 第100卷
《计算机编程语言——C语言》
课程综合卷
考试时间60分钟 满分100分
班级________姓名________学号________成绩________
一、单项选择题(本大题共10小题,每题2分,共20分)
1.已知 int x=-13,y=-5; 执行 x%=y-2; 后 x 的值为( )
A. -1 B. -2 C. -3 D. -6
【答案】D
【解析】首先计算赋值运算符右侧的表达式 y-2,即 -5-2=-7,原式变为 x%=-7。在C语言中,取余运算结果的符号与被除数(x)相同,计算 -13 除以 -7 的余数(-13 = (-7)×1 + (-6)),余数为 -6,因此 x 的最终值为 -6,选D。
2.执行 int a=6; a-=a^5; 变量 a 的值是( )
A. 3 B. 5 C. 7 D. 9
【答案】A
【解析】6 二进制 110,5 二进制 101,异或得 011=3;a=6-3=3。
3.已知 int a=7,b=4,c=9,k; k=(a^b)|c; k 的值为( )
A. 9 B. 11 C. 13 D. 15
【答案】B
【解析】a=7(0111),b=4(0100),a^b=0011;c=9(1001),0011|1001=1011(11),选B。
4.设有语句:int s=22; s/=s+10; 执行后 s 的值为( )
A. 0 B. 1 C. 10 D. 22
【答案】A
【解析】s+10=32,整数除法 22/32 直接舍弃小数,结果 0。
5.表达式!(8<=5) && (3>1) || (6%2!=0)运算结果是( )
A. 1 B. 0 C. 2 D. -1
【答案】A
【解析】优先级!> && > ||;!(8<=5)=1,1&&1=1,逻辑或短路,后半段不参与计算,整体为 1。
6.执行以下程序段的输出结果是( )
int p=6,q=3;
if(p/2==3)
if(q>5) printf("Win");
else
printf("Lose");
A. Win B. Lose C. 无输出 D. 编译报错
【答案】B
【解析】p/2==3为真,进入第一个if;q>5为假,执行与之配对的else输出Lose,选B。
7.下列不属于算法时间复杂度衡量依据的是( )
A. 循环执行次数 B. 加减乘除运算次数
C. 程序运行占用内存大小 D. 分支判断执行次数
【答案】C
【解析】内存占用属于空间复杂度,时间复杂度只统计执行操作次数。
8.执行以下程序段的输出结果是( )
int x = 4, y = 0;
y = x > 5 ? 10 : x < 2 ? 20 : 30;
printf("%d", y);
A.10 B.20 C.30 D.0
【答案】C
【解析】三目右结合,x=4 不大于 5,再判断 4<2 不成立,取 30。
9.执行以下程序段的输出结果是( )
int n = 4;
n += n *= n - 2;
printf("%d", n);
A. 8 B. 12 C. 16 D. 24
【答案】C
【解析】复合赋值运算符右结合。第一步:n *= n-2 → n = 4 * 2 = 8;第二步:n += 8 → n = 8 + 8 = 16。
10.执行以下程序段的输出结果是( )
unsigned int x = 2;
int y = -3;
if (x + y > 0)printf("T");
else printf("F");
A. T B. F C. 随机乱码 D. 编译报错
【答案】A
【解析】无符号与有符号混合运算时,有符号 y 自动转换为无符号大数,x+y 结果是极大正数,条件成立输出 T。
二、阅读程序,写出运行结果(本大题共10小题。每空2分,合计20分)
1.下列程序的运行结果是__________________。
#include <stdio.h>
char *xorConvert(char *s, char key)
{ static char out[100];
int i = 0;
while(s[i] != '\0')
{ out[i] = s[i] ^ key;
i++;}
out[i] = '\0';
return out;
}
int main()
{ char str[] = "ab";
char *ret = xorConvert(str, 0);
puts(ret);
return 0; }
【答案】ab
2.下列程序的运行结果是__________________。
#define M 16-7
#include <stdio.h>
int main(void)
{
int x,y,flag,ans;
x = M * 3 - 4;
y = x % M;
flag = (x > M && y >= 0);
switch(flag)
{
case 1:
if(y > 3)
ans = x - M;
else
ans = x + M;
break;
case 0:
ans = x / M;
break;
}
printf("M=%d,x=%d,y=%d,ans=%d",M,x,y,ans);
return 0;
}
【答案】M=9,x=-9,y=-16,ans=-7
3.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{
int mat[4][3] = {{12,5,18},{7,22,9},{0,0,0}};
int i, j, rowMax, total;
total = 0;
for(i = 0; i < 4; i++)
{
rowMax = mat[i][0];
for(j = 1; j < 3; j++)
{
if(mat[i][j] > rowMax)
rowMax = mat[i][j];
}
if(rowMax != 0)
total = total + rowMax;
}
printf("%d", total);
return 0;
}
【答案】40
4.下列程序的运行结果是__________________。
#include <stdio.h>
void dfsModify(int mat[][4], int n)
{
if(n < 0)
return;
mat[n][3 - n] = mat[n][3 - n] * 2;
dfsModify(mat, n - 1);
}
void printAll(int m[][4])
{
int i, j;
for(i = 0; i < 4; i++)
{
for(j = 0; j < 4; j++)
printf("%d ", m[i][j]);
printf("
");
}
}
int main(void)
{
int grid[4][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
dfsModify(grid, 3);
printf("修改反对角线后的4阶矩阵:
");
printAll(grid);
return 0;
}
【答案】
修改反对角线后的4阶矩阵:
1 2 3 8
5 6 14 8
9 20 11 12
26 14 15 16
5.下列程序的运行结果是__________________。
#include <stdio.h>
void recDiag(int mat[][3], int n)
{
if(n < 0)
return;
mat[n][n] = mat[n][n] * 3;
recDiag(mat, n - 1);
}
void printTri(int m[][3])
{
int i, j;
for(i = 0; i < 3; i++)
for(j = i + 1; j < 3; j++)
printf("%d ", m[i][j]);
for(i = 0; i < 3; i++)
for(j = 0; j < i; j++)
printf("%d ", m[i][j]);
}
int main(void)
{
int data[3][3] = {2,1,4,3,5,2,1,6,3};
recDiag(data, 2);
printTri(data);
return 0; }
【答案】1 4 2 3 1 6
6.下列程序的运行结果是__________________。
#include <stdio.h>
union CharGroup
{
unsigned char c[4];
unsigned int num;
};
int evenCount(union CharGroup u)
{
int cnt = 0, i;
for(i = 0; i < 4; i++)
if(u.c[i] % 2 == 0) cnt++;
return cnt;
}
int main(void)
{ int m;
union CharGroup u;
u.num = 0;
for(m = 0; m < 4; m++)
u.c[m] = m * 7 + 3;
printf("%d", evenCount(u));
return 0; }
【答案】2
7.下列程序的运行结果是__________________。
#include <stdio.h>
#include <stdlib.h>
struct Node{int score;struct Node *next;};
void modify(struct Node *p,int s)
{ p->score=s; }
int main(void)
{ struct Node *n1,*n2,*n3;
FILE *fp;struct Node *cur;int sum=0;
n1=(struct Node*)malloc(sizeof(struct Node));
n2=(struct Node*)malloc(sizeof(struct Node));
n3=(struct Node*)malloc(sizeof(struct Node));
n1->score=55;
n2->score=72;
n3->score=41;
n1->next=n2;
n2->next=n3;
n3->next=NULL;
modify(n3,66);
fp=fopen("score.txt","w");
cur=n1;
while(cur)
{ sum+=cur->score;
cur=cur->next; }
fclose(fp);
printf("%d",sum);
free(n1);free(n2);free(n3);
return 0; }
【答案】193
8.下列程序的运行结果是__________________。
#include <stdio.h>
char encode(char c)
{
if (c >= 'a' && c <= 'z')
return (c - 'a' + 5) % 26 + 'a';
return c;
}
char decode(char c)
{
if (c >= 'a' && c <= 'z')
return (c - 'a' - 5 + 26) % 26 + 'a';
return c;
}
int main(void)
{
char raw[] = "program";
FILE *fp;
char tmp[20];
int asciiTotal = 0, i;
fp = fopen("code.txt", "w");
for (i = 0; raw[i] != '\0'; i++)
fputc(encode(raw[i]), fp);
fclose(fp);
fp = fopen("code.txt", "rb+");
fgets(tmp, 20, fp);
fclose(fp);
for (i = 0; tmp[i] != '\0'; i++)
{
char real = decode(tmp[i]);
asciiTotal += real;
}
remove("code.txt");
printf("%d", asciiTotal);
return 0;
}
【答案】760
9.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{
FILE *fp;
char buf[20];
int low = 0, up = 0, i;
fp = fopen("tmp.txt", "w");
fputs("aBcDe", fp);
fclose(fp);
fp = fopen("tmp.txt", "rb+");
fseek(fp, 2, SEEK_SET);
fputs("XY", fp);
fseek(fp, 0, SEEK_SET);
fgets(buf, 20, fp);
fclose(fp);
remove("tmp.txt");
for(i = 0; buf[i] != '\0'; i++)
{
if(buf[i] >= 'a' && buf[i] <= 'z')
low++;
else if(buf[i] >= 'A' && buf[i] <= 'Z')
up++;
}
printf("%d", low - up);
return 0;
}
【答案】-1
10.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{
int s1[3] = {1,3,2};
int s2[2] = {4,1};
int s3[4] = {2,5,3,1};
int *pArr[3] = {s1, s2, s3};
int len[3] = {3,2,4};
int total = 0, i, j;
for(i = 0; i < 3; i++)
{
for(j = 0; j < len[i]; j++)
{
if(j % 2 == 1)
total += pArr[i][j];
}
}
printf("%d", total);
return 0;
}
【答案】10
三、程序填空。按照题目要求,将正确内容填入答题卡相应位置,使程序完整(每空2分,共计40分)
1.下列程序的功能是:两个 3 行 3 列二维数组代表两组选手分数,行指针作参数。取出两组数组每一行的最大值进行对比,逐行输出胜负(第一组胜 / 第二组胜 / 平局)。
#include <stdio.h>
int getRowMax(int (*arr)[3], int r)
{
int j, max = _________①________
for (j = 1; j < 3; j++)
if (_________②_________)
max = arr[r][j];
return _______③_______
}
void pk(int (*a)[3], int (*b)[3], int row)
{
int i, maxA, maxB;
for (i = 0; i < row; i++)
{
maxA = _______④________
maxB = getRowMax(b, i);
printf("第%d轮:", i+1);
if (maxA > maxB)
printf("第一组胜利
");
else if (maxA < maxB)
printf("第二组胜利
");
else
printf("双方平局
");
}
}
int main()
{
int groupA[3][3] = {{12,45,23},{78,33,61},{22,9,56}};
int groupB[3][3] = {{36,19,28},{55,81,42},{47,31,18}};
__________⑤__________
return 0; }
【答案】①arr[r][0]; ②arr[r][j] > max
③max; ④getRowMax(a, i); ⑤pk(groupA, groupB, 3);
2.统计循环输入中连续重复数字段长度:循环持续输入整数,输入 - 1 结束统计;程序实时判断当前数字与上一个输入数字是否相等,统计每一段连续相同数字的最长长度,最终输出最长连续重复段的数值与长度。仅输入 - 1 则提示无有效数据。
#include <stdio.h>
int main(void)
{ int cur, pre, maxLen, curLen, maxVal, flag;
flag = 0;
maxLen = 1;
curLen = 1;
printf("不断输入整数,输入-1结束统计:
");
while (1)
{ scanf("%d", &cur);
if (cur == -1)
_______①________
if (flag == 0)
{ _______②______
maxVal = cur;
flag = 1;
_________③_______ }
if (________④_________)
{ curLen++;
if (curLen > maxLen)
{ maxLen = curLen;
maxVal = cur; }
}
else
{ curLen = 1;
________⑤________
}
}
if (flag == 0)
printf("未输入任何有效数字!
");
else
printf("最长连续重复数字:%d,连续出现%d次
", maxVal, maxLen);
return 0; }
【答案】①break; ②pre = cur; ③continue;
④cur == pre ⑤pre = cur;
3.下列程序代码的功能是:判断数组是否为阶梯数组(每一行所有元素均大于上一行所有元素),函数返回判断结果,主函数输出结论。
#include <stdio.h>
int isStepArray(int (*arr)[4], int rows)
{
int i, j;
int currMin, prevMax;
for (i = 1; i < rows; i++)
{
prevMax = ________①________;
for (j = 1; j < 4; j++)
if (_________②________)
prevMax = arr[i-1][j];
currMin = _________③_________
for (j = 1; j < 4; j++)
if (arr[i][j] < currMin)
_________④_________
if (currMin <= prevMax)
return 0;
}
return 1;
}
int main()
{
int arr[5][4] = {{1, 2, 3, 4},{5, 6, 7, 8},
{9,10,11,12},{13,14,15,16},{17,18,19,20}};
int res = _________⑤_________
if (res)
printf("该数组是阶梯数组
");
else
printf("该数组不是阶梯数组
");
return 0; }
【答案】①arr[i-1][0] ②arr[i-1][j] > prevMax
③arr[i][0]; ④currMin = arr[i][j];
⑤isStepArray(arr, 5);
4.合数链表分区重排:原地重排链表:所有质数节点放链表前半段,所有合数节点放后半段,打印重排完成后的完整链表用于校验。。
#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 = (ListNode*)malloc(sizeof(ListNode));
tail = tail->next;
tail->val = arr[i];
tail->next = NULL;
}
return dummy.next;
}
void printList(__________①__________)
{
while (head != NULL)
{
printf("%d ", head->val);
head = ________②_________
}
printf("
");
}
int isPrime(int n)
{
int i;
if (n <= 1) return 0;
for (i = 2; i * i <= n; i++)
if (n % i == 0) return 0;
return 1;
}
ListNode* partitionPrime(ListNode* head)
{
ListNode primeDummy, compositeDummy;
ListNode *p, *pTail, *cTail;
primeDummy.next = NULL;
compositeDummy.next = NULL;
pTail = &primeDummy;
cTail = &compositeDummy;
while (head != NULL)
{
p = _______③________
head = head->next;
if (__________④_________)
{
pTail->next = p;
pTail = pTail->next;
}
else
{
cTail->next = p;
cTail = cTail->next;
}
___________⑤___________
}
pTail->next = compositeDummy.next;
return primeDummy.next;
}
int main(void)
{
int arr[] = {13,24,7,32,11,45,17,50};
int len = 8;
ListNode *head, *res;
head = createList(arr, len);
res = partitionPrime(head);
printList(res);
return 0;
}
【答案】①ListNode* head ②head->next;
③head; ④isPrime(p->val) ⑤p->next = NULL;
四、阅读程序:修改程序中的错误,不得增行或删行,也不得更改程序结构。请在答题卡中指出错误代码所在的行号,并给出该行修改后的程序代码。(每空2分,共计20分)
1.下列程序的功能是实现对两个字符串进行匹配操作,即在第一个字符串中查找是否存在第二个字符串,如果字符串完全匹配,则提示匹配信息,并显示第二个字符串在第一个字符串中的开始位置,否则提示不匹配。以下程序只允许修改两行。
L1 #include "stdio.h"
L2 #include <string.h>
L3 int match(char *B, char *A)
L4 {
L5 int i, j, start = 0;
L6 int lastB = strlen(B) - 1;
L7 int lastA = strlen(A) - 1;
L8 int endmatch = lastA;
L9 for (j = 0; endmatch <= lastB; endmatch++, start++)
L10 {
L11 if (B[endmatch] == A[lastA])
L12 for (j = 0, i = start; j < lastA || B[i] == A[j];)
L13 i++, j++;
L14 if (j == lastA)
L15 {
L16 return (start + 1);
L17 }
L18 }
L19 if (endmatch < lastB)
L20 {
L21 printf("The string is not matchable!");
L22 return - 1;
L23 }
L24 }
L25 void main()
L26 {
L27 char s[] = "One world,one dream";
L28 char t[] = "world";
L29 int p = match(s, t);
L30 if (p != - 1)
L31 {
L32 printf("Matchable!
");
L33 printf("The start position is %d", p);
L34 }
L35 printf("
");
L36 }
【答案】①L12 for (j = 0, i = start; j < lastA && B[i] == A[j];)
②L19 if (endmatch > lastB)
2.下列程序的功能是:两份独立配置文件存储字母参数,指针逐字符读取合并,重复字符仅保留一次,写入合并配置文件,最终输出去重后的完整文本。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 int main(void){
L3 FILE *f1,*f2,*out;
L4 char ch,flag[128]={0};
L5 f1=fopen("cfg1.txt","w");
L6 fputs("abcdf",f1);fclose(f1);
L7 f2=fopen("cfg2.txt","w");
L8 fputs("defgh",f2);fclose(f2);
L9 out=fopen("merge_cfg.txt","w");
L10 f1=fopen("cfg1.txt","r");
L11 while((ch=fgetc(f1))!=EOF)
L12 { if(flag[ch]=0)
L13 { flag[ch]=1;
L14 fputc(ch,out);}}
L15 fclose(f1);
L16 f2=fopen("cfg2.txt","r");
L17 while((ch=fgetc(f2))!=EOF)
L18 { if(flag[ch]==0)
L19 { flag[ch]=1;
L20 fputc(ch,out);}}
L21 fclose(f2);
L22 fclose(out);
L23 out=fopen("merge_cfg.txt","r");
L24 printf("合并去重配置:");
L25 while((ch=fgetc(f2))!=EOF)
L26 { putchar(ch); }
L27 fclose(out);
L28 remove("cfg1.txt");
L29 remove("cfg2.txt");
L30 remove("merge_cfg.txt");
L31 return 0;
L32 }
【答案】①L12 { if(flag[ch]==0)
②L25 while((ch=fgetc(out))!=EOF)
3.完全数 = 所有真因数之和等于自身,下列程序的功能是遍历 1~1000 筛选全部完全数,动态数组存储结果,二进制文件持久化。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 #include<stdlib.h>
L3 int getSum(int x)
L4 {
L5 int i, sum;
L6 sum = 0;
L7 for (i = 1; i < x; i++)
L8 {
L9 if (x % i == 0)
L10 {
L11 sum = sum + 1;
L12 }
L13 }
L14 return sum;
L15 }
L16 int main(void)
L17 {
L18 int i, count, idx;
L19 int *resBuf;
L20 FILE *fp;
L21 count = 0;
L22 for (i = 1; i <= 1000; i++)
L23 {
L24 if (getSum(i) == i)
L25 {
L26 count = count + 1;
L27 }
L28 }
L29 resBuf = (int *)malloc(count * sizeof(int));
L30 if (resBuf == NULL)
L31 {
L32 printf("内存分配失败
");
L33 return -1;
L34 }
L35 idx = 0;
L36 for (i = 1; i <= 1000; i++)
L37 {
L38 if (getSum(i) == i)
L39 {
L40 resBuf[idx] = i;
L41 idx = idx + 1;
L42 }
L43 }
L44 fp = fopen("perfect.dat", "wb");
L45 if (fp == NULL)
L46 {
L47 printf("文件创建失败
");
L48 free(resBuf);
L49 return -1;
L50 }
L51 fwrite(count, sizeof(int), 1, fp);
L52 fwrite(resBuf, sizeof(int), count, fp);
L53 fclose(fp);
L54 fp = fopen("perfect.dat", "rb");
L55 fread(&count, sizeof(int), 1, fp);
L56 printf("1~1000以内完全数共%d个:", count);
L57 for (i = 0; i < count; i++)
L58 {
L59 int num;
L60 fread(num, sizeof(int), 1, fp);
L61 printf("%d ", num);
L62 }
L63 printf("
");
L64 fclose(fp);
L65 free(resBuf);
L66 remove("perfect.dat");
L67 return 0;
L68 }
【答案】①L11 sum = sum + i;
②L51 fwrite(&count, sizeof(int), 1, fp);
③L60 fread(&num, sizeof(int), 1, fp);
4.卡普雷卡常数:输入四位不全相同数字,循环拆分各位数字,指针排序求最大、最小四位数作差,迭代直到结果为 6174,输出每一轮计算过程。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 void sortNum(int arr[],int len)
L3 {
L4 int i,j,t,*p;
L5 for(i=0;i<len-1;i++)
L6 for(j=0;j<len-1;j++)
L7 {
L8 p = arr + j;
L9 if(p > (p+1))
L10 {
L11 t = *p;
L12 *p = *(p+1);
L13 *(p+1) = t;
L14 }
L15 }
L16 }
L17 int getDiff(int x)
L18 {
L19 int digit[4],i,max,min;
L20 for(i=0;i<4;i++)
L21 {
L22 digit[i] = x/10;
L23 x /= 10;
L24 }
L25 sortNum(digit,4);
L26 min = digit[0]*1000 + digit[1]*100 + digit[2]*10 + digit[3];
L27 max = digit[3]*1000 + digit[2]*100 + digit[1]*10 + digit[0];
L28 return max - min;
L29 }
L30 int main(void)
L31 {
L32 int num,round=1;
L33 printf("输入四位不全部相同整数:");
L34 scanf("%d",&num);
L35 while(num != 6174)
L36 {
L37 num = getDiff(num);
L38 printf("第%d轮结果:%d
",round,num);
L39 round++;
L40 }
L41 printf("进入6174数字黑洞,迭代结束");
L42 return 0;
L43 }
【答案】①L6 for(j=0;j<len-1-i;j++)
②L9 if(*p > *(p+1))
③L22 digit[i] = x%10;
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
编写说明:湖南省普通高校对口招生专业理论考试《计算机应用类专业综合考纲百套卷》,依据《湖南省普通高校对口招生计算机应用类专业综合知识基本要求及考试大纲》编写。每门课程均分三层训练:基础层(具象化支架)拆解考点为微目标,紧扣考纲 “掌握”“理解” 要求编写考点训练卷;巩固层(关联性支架)强化知识交叉与场景关联,按考纲专题编专题训练卷;应用层(引导性支架)聚焦真题突破,结合知识模块与教材编写课程综合卷。
本试卷是第100卷,按《计算机编程语言——C语言》范围和要求编写。具体内容为:①C语言基础知识;②分支结构程序设计;③循环结构程序设计;④数组;⑤函数;⑥结构体和共用体;⑦指针、文件。
湖南省《计算机应用类专业综合考纲百套卷》 第100卷
《计算机编程语言——C语言》
课程综合卷
考试时间60分钟 满分100分
班级________姓名________学号________成绩________
一、单项选择题(本大题共10小题,每题2分,共20分)
1.已知 int x=-13,y=-5; 执行 x%=y-2; 后 x 的值为( )
A. -1 B. -2 C. -3 D. -6
2.执行 int a=6; a-=a^5; 变量 a 的值是( )
A. 3 B. 5 C. 7 D. 9
3.已知 int a=7,b=4,c=9,k; k=(a^b)|c; k 的值为( )
A. 9 B. 11 C. 13 D. 15
4.设有语句:int s=22; s/=s+10; 执行后 s 的值为( )
A. 0 B. 1 C. 10 D. 22
5.表达式!(8<=5) && (3>1) || (6%2!=0)运算结果是( )
A. 1 B. 0 C. 2 D. -1
6.执行以下程序段的输出结果是( )
int p=6,q=3;
if(p/2==3)
if(q>5) printf("Win");
else
printf("Lose");
A. Win B. Lose C. 无输出 D. 编译报错
7.下列不属于算法时间复杂度衡量依据的是( )
A. 循环执行次数 B. 加减乘除运算次数
C. 程序运行占用内存大小 D. 分支判断执行次数
8.执行以下程序段的输出结果是( )
int x = 4, y = 0;
y = x > 5 ? 10 : x < 2 ? 20 : 30;
printf("%d", y);
A.10 B.20 C.30 D.0
9.执行以下程序段的输出结果是( )
int n = 4;
n += n *= n - 2;
printf("%d", n);
A. 8 B. 12 C. 16 D. 24
10.执行以下程序段的输出结果是( )
unsigned int x = 2;
int y = -3;
if (x + y > 0)printf("T");
else printf("F");
A. T B. F C. 随机乱码 D. 编译报错
二、阅读程序,写出运行结果(本大题共10小题。每空2分,合计20分)
1.下列程序的运行结果是__________________。
#include <stdio.h>
char *xorConvert(char *s, char key)
{ static char out[100];
int i = 0;
while(s[i] != '\0')
{ out[i] = s[i] ^ key;
i++;}
out[i] = '\0';
return out;
}
int main()
{ char str[] = "ab";
char *ret = xorConvert(str, 0);
puts(ret);
return 0; }
2.下列程序的运行结果是__________________。
#define M 16-7
#include <stdio.h>
int main(void)
{
int x,y,flag,ans;
x = M * 3 - 4;
y = x % M;
flag = (x > M && y >= 0);
switch(flag)
{
case 1:
if(y > 3)
ans = x - M;
else
ans = x + M;
break;
case 0:
ans = x / M;
break;
}
printf("M=%d,x=%d,y=%d,ans=%d",M,x,y,ans);
return 0;
}
3.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{
int mat[4][3] = {{12,5,18},{7,22,9},{0,0,0}};
int i, j, rowMax, total;
total = 0;
for(i = 0; i < 4; i++)
{
rowMax = mat[i][0];
for(j = 1; j < 3; j++)
{
if(mat[i][j] > rowMax)
rowMax = mat[i][j];
}
if(rowMax != 0)
total = total + rowMax;
}
printf("%d", total);
return 0;
}
4.下列程序的运行结果是__________________。
#include <stdio.h>
void dfsModify(int mat[][4], int n)
{
if(n < 0)
return;
mat[n][3 - n] = mat[n][3 - n] * 2;
dfsModify(mat, n - 1);
}
void printAll(int m[][4])
{
int i, j;
for(i = 0; i < 4; i++)
{
for(j = 0; j < 4; j++)
printf("%d ", m[i][j]);
printf("
");
}
}
int main(void)
{
int grid[4][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
dfsModify(grid, 3);
printf("修改反对角线后的4阶矩阵:
");
printAll(grid);
return 0;
}
5.下列程序的运行结果是__________________。
#include <stdio.h>
void recDiag(int mat[][3], int n)
{
if(n < 0)
return;
mat[n][n] = mat[n][n] * 3;
recDiag(mat, n - 1);
}
void printTri(int m[][3])
{
int i, j;
for(i = 0; i < 3; i++)
for(j = i + 1; j < 3; j++)
printf("%d ", m[i][j]);
for(i = 0; i < 3; i++)
for(j = 0; j < i; j++)
printf("%d ", m[i][j]);
}
int main(void)
{
int data[3][3] = {2,1,4,3,5,2,1,6,3};
recDiag(data, 2);
printTri(data);
return 0; }
6.下列程序的运行结果是__________________。
#include <stdio.h>
union CharGroup
{
unsigned char c[4];
unsigned int num;
};
int evenCount(union CharGroup u)
{
int cnt = 0, i;
for(i = 0; i < 4; i++)
if(u.c[i] % 2 == 0) cnt++;
return cnt;
}
int main(void)
{ int m;
union CharGroup u;
u.num = 0;
for(m = 0; m < 4; m++)
u.c[m] = m * 7 + 3;
printf("%d", evenCount(u));
return 0; }
7.下列程序的运行结果是__________________。
#include <stdio.h>
#include <stdlib.h>
struct Node{int score;struct Node *next;};
void modify(struct Node *p,int s)
{ p->score=s; }
int main(void)
{ struct Node *n1,*n2,*n3;
FILE *fp;struct Node *cur;int sum=0;
n1=(struct Node*)malloc(sizeof(struct Node));
n2=(struct Node*)malloc(sizeof(struct Node));
n3=(struct Node*)malloc(sizeof(struct Node));
n1->score=55;
n2->score=72;
n3->score=41;
n1->next=n2;
n2->next=n3;
n3->next=NULL;
modify(n3,66);
fp=fopen("score.txt","w");
cur=n1;
while(cur)
{ sum+=cur->score;
cur=cur->next; }
fclose(fp);
printf("%d",sum);
free(n1);free(n2);free(n3);
return 0; }
8.下列程序的运行结果是__________________。
#include <stdio.h>
char encode(char c)
{
if (c >= 'a' && c <= 'z')
return (c - 'a' + 5) % 26 + 'a';
return c;
}
char decode(char c)
{
if (c >= 'a' && c <= 'z')
return (c - 'a' - 5 + 26) % 26 + 'a';
return c;
}
int main(void)
{
char raw[] = "program";
FILE *fp;
char tmp[20];
int asciiTotal = 0, i;
fp = fopen("code.txt", "w");
for (i = 0; raw[i] != '\0'; i++)
fputc(encode(raw[i]), fp);
fclose(fp);
fp = fopen("code.txt", "rb+");
fgets(tmp, 20, fp);
fclose(fp);
for (i = 0; tmp[i] != '\0'; i++)
{
char real = decode(tmp[i]);
asciiTotal += real;
}
remove("code.txt");
printf("%d", asciiTotal);
return 0;
}
9.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{
FILE *fp;
char buf[20];
int low = 0, up = 0, i;
fp = fopen("tmp.txt", "w");
fputs("aBcDe", fp);
fclose(fp);
fp = fopen("tmp.txt", "rb+");
fseek(fp, 2, SEEK_SET);
fputs("XY", fp);
fseek(fp, 0, SEEK_SET);
fgets(buf, 20, fp);
fclose(fp);
remove("tmp.txt");
for(i = 0; buf[i] != '\0'; i++)
{
if(buf[i] >= 'a' && buf[i] <= 'z')
low++;
else if(buf[i] >= 'A' && buf[i] <= 'Z')
up++;
}
printf("%d", low - up);
return 0;
}
10.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{
int s1[3] = {1,3,2};
int s2[2] = {4,1};
int s3[4] = {2,5,3,1};
int *pArr[3] = {s1, s2, s3};
int len[3] = {3,2,4};
int total = 0, i, j;
for(i = 0; i < 3; i++)
{
for(j = 0; j < len[i]; j++)
{
if(j % 2 == 1)
total += pArr[i][j];
}
}
printf("%d", total);
return 0;
}
三、程序填空。按照题目要求,将正确内容填入答题卡相应位置,使程序完整(每空2分,共计40分)
1.下列程序的功能是:两个 3 行 3 列二维数组代表两组选手分数,行指针作参数。取出两组数组每一行的最大值进行对比,逐行输出胜负(第一组胜 / 第二组胜 / 平局)。
#include <stdio.h>
int getRowMax(int (*arr)[3], int r)
{
int j, max = _________①________
for (j = 1; j < 3; j++)
if (_________②_________)
max = arr[r][j];
return _______③_______
}
void pk(int (*a)[3], int (*b)[3], int row)
{
int i, maxA, maxB;
for (i = 0; i < row; i++)
{
maxA = _______④________
maxB = getRowMax(b, i);
printf("第%d轮:", i+1);
if (maxA > maxB)
printf("第一组胜利
");
else if (maxA < maxB)
printf("第二组胜利
");
else
printf("双方平局
");
}
}
int main()
{
int groupA[3][3] = {{12,45,23},{78,33,61},{22,9,56}};
int groupB[3][3] = {{36,19,28},{55,81,42},{47,31,18}};
__________⑤__________
return 0; }
2.统计循环输入中连续重复数字段长度:循环持续输入整数,输入 - 1 结束统计;程序实时判断当前数字与上一个输入数字是否相等,统计每一段连续相同数字的最长长度,最终输出最长连续重复段的数值与长度。仅输入 - 1 则提示无有效数据。
#include <stdio.h>
int main(void)
{ int cur, pre, maxLen, curLen, maxVal, flag;
flag = 0;
maxLen = 1;
curLen = 1;
printf("不断输入整数,输入-1结束统计:
");
while (1)
{ scanf("%d", &cur);
if (cur == -1)
_______①________
if (flag == 0)
{ _______②______
maxVal = cur;
flag = 1;
_________③_______ }
if (________④_________)
{ curLen++;
if (curLen > maxLen)
{ maxLen = curLen;
maxVal = cur; }
}
else
{ curLen = 1;
________⑤________
}
}
if (flag == 0)
printf("未输入任何有效数字!
");
else
printf("最长连续重复数字:%d,连续出现%d次
", maxVal, maxLen);
return 0; }
3.下列程序代码的功能是:判断数组是否为阶梯数组(每一行所有元素均大于上一行所有元素),函数返回判断结果,主函数输出结论。
#include <stdio.h>
int isStepArray(int (*arr)[4], int rows)
{
int i, j;
int currMin, prevMax;
for (i = 1; i < rows; i++)
{
prevMax = ________①________;
for (j = 1; j < 4; j++)
if (_________②________)
prevMax = arr[i-1][j];
currMin = _________③_________
for (j = 1; j < 4; j++)
if (arr[i][j] < currMin)
_________④_________
if (currMin <= prevMax)
return 0;
}
return 1;
}
int main()
{
int arr[5][4] = {{1, 2, 3, 4},{5, 6, 7, 8},
{9,10,11,12},{13,14,15,16},{17,18,19,20}};
int res = _________⑤_________
if (res)
printf("该数组是阶梯数组
");
else
printf("该数组不是阶梯数组
");
return 0; }
4.合数链表分区重排:原地重排链表:所有质数节点放链表前半段,所有合数节点放后半段,打印重排完成后的完整链表用于校验。。
#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 = (ListNode*)malloc(sizeof(ListNode));
tail = tail->next;
tail->val = arr[i];
tail->next = NULL;
}
return dummy.next;
}
void printList(__________①__________)
{
while (head != NULL)
{
printf("%d ", head->val);
head = ________②_________
}
printf("
");
}
int isPrime(int n)
{
int i;
if (n <= 1) return 0;
for (i = 2; i * i <= n; i++)
if (n % i == 0) return 0;
return 1;
}
ListNode* partitionPrime(ListNode* head)
{
ListNode primeDummy, compositeDummy;
ListNode *p, *pTail, *cTail;
primeDummy.next = NULL;
compositeDummy.next = NULL;
pTail = &primeDummy;
cTail = &compositeDummy;
while (head != NULL)
{
p = _______③________
head = head->next;
if (__________④_________)
{
pTail->next = p;
pTail = pTail->next;
}
else
{
cTail->next = p;
cTail = cTail->next;
}
___________⑤___________
}
pTail->next = compositeDummy.next;
return primeDummy.next;
}
int main(void)
{
int arr[] = {13,24,7,32,11,45,17,50};
int len = 8;
ListNode *head, *res;
head = createList(arr, len);
res = partitionPrime(head);
printList(res);
return 0;
}
四、阅读程序:修改程序中的错误,不得增行或删行,也不得更改程序结构。请在答题卡中指出错误代码所在的行号,并给出该行修改后的程序代码。(每空2分,共计20分)
1.下列程序的功能是实现对两个字符串进行匹配操作,即在第一个字符串中查找是否存在第二个字符串,如果字符串完全匹配,则提示匹配信息,并显示第二个字符串在第一个字符串中的开始位置,否则提示不匹配。以下程序只允许修改两行。
L1 #include "stdio.h"
L2 #include <string.h>
L3 int match(char *B, char *A)
L4 {
L5 int i, j, start = 0;
L6 int lastB = strlen(B) - 1;
L7 int lastA = strlen(A) - 1;
L8 int endmatch = lastA;
L9 for (j = 0; endmatch <= lastB; endmatch++, start++)
L10 {
L11 if (B[endmatch] == A[lastA])
L12 for (j = 0, i = start; j < lastA || B[i] == A[j];)
L13 i++, j++;
L14 if (j == lastA)
L15 {
L16 return (start + 1);
L17 }
L18 }
L19 if (endmatch < lastB)
L20 {
L21 printf("The string is not matchable!");
L22 return - 1;
L23 }
L24 }
L25 void main()
L26 {
L27 char s[] = "One world,one dream";
L28 char t[] = "world";
L29 int p = match(s, t);
L30 if (p != - 1)
L31 {
L32 printf("Matchable!
");
L33 printf("The start position is %d", p);
L34 }
L35 printf("
");
L36 }
2.下列程序的功能是:两份独立配置文件存储字母参数,指针逐字符读取合并,重复字符仅保留一次,写入合并配置文件,最终输出去重后的完整文本。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 int main(void){
L3 FILE *f1,*f2,*out;
L4 char ch,flag[128]={0};
L5 f1=fopen("cfg1.txt","w");
L6 fputs("abcdf",f1);fclose(f1);
L7 f2=fopen("cfg2.txt","w");
L8 fputs("defgh",f2);fclose(f2);
L9 out=fopen("merge_cfg.txt","w");
L10 f1=fopen("cfg1.txt","r");
L11 while((ch=fgetc(f1))!=EOF)
L12 { if(flag[ch]=0)
L13 { flag[ch]=1;
L14 fputc(ch,out);}}
L15 fclose(f1);
L16 f2=fopen("cfg2.txt","r");
L17 while((ch=fgetc(f2))!=EOF)
L18 { if(flag[ch]==0)
L19 { flag[ch]=1;
L20 fputc(ch,out);}}
L21 fclose(f2);
L22 fclose(out);
L23 out=fopen("merge_cfg.txt","r");
L24 printf("合并去重配置:");
L25 while((ch=fgetc(f2))!=EOF)
L26 { putchar(ch); }
L27 fclose(out);
L28 remove("cfg1.txt");
L29 remove("cfg2.txt");
L30 remove("merge_cfg.txt");
L31 return 0;
L32 }
3.完全数 = 所有真因数之和等于自身,下列程序的功能是遍历 1~1000 筛选全部完全数,动态数组存储结果,二进制文件持久化。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 #include<stdlib.h>
L3 int getSum(int x)
L4 {
L5 int i, sum;
L6 sum = 0;
L7 for (i = 1; i < x; i++)
L8 {
L9 if (x % i == 0)
L10 {
L11 sum = sum + 1;
L12 }
L13 }
L14 return sum;
L15 }
L16 int main(void)
L17 {
L18 int i, count, idx;
L19 int *resBuf;
L20 FILE *fp;
L21 count = 0;
L22 for (i = 1; i <= 1000; i++)
L23 {
L24 if (getSum(i) == i)
L25 {
L26 count = count + 1;
L27 }
L28 }
L29 resBuf = (int *)malloc(count * sizeof(int));
L30 if (resBuf == NULL)
L31 {
L32 printf("内存分配失败
");
L33 return -1;
L34 }
L35 idx = 0;
L36 for (i = 1; i <= 1000; i++)
L37 {
L38 if (getSum(i) == i)
L39 {
L40 resBuf[idx] = i;
L41 idx = idx + 1;
L42 }
L43 }
L44 fp = fopen("perfect.dat", "wb");
L45 if (fp == NULL)
L46 {
L47 printf("文件创建失败
");
L48 free(resBuf);
L49 return -1;
L50 }
L51 fwrite(count, sizeof(int), 1, fp);
L52 fwrite(resBuf, sizeof(int), count, fp);
L53 fclose(fp);
L54 fp = fopen("perfect.dat", "rb");
L55 fread(&count, sizeof(int), 1, fp);
L56 printf("1~1000以内完全数共%d个:", count);
L57 for (i = 0; i < count; i++)
L58 {
L59 int num;
L60 fread(num, sizeof(int), 1, fp);
L61 printf("%d ", num);
L62 }
L63 printf("
");
L64 fclose(fp);
L65 free(resBuf);
L66 remove("perfect.dat");
L67 return 0;
L68 }
4.卡普雷卡常数:输入四位不全相同数字,循环拆分各位数字,指针排序求最大、最小四位数作差,迭代直到结果为 6174,输出每一轮计算过程。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 void sortNum(int arr[],int len)
L3 {
L4 int i,j,t,*p;
L5 for(i=0;i<len-1;i++)
L6 for(j=0;j<len-1;j++)
L7 {
L8 p = arr + j;
L9 if(p > (p+1))
L10 {
L11 t = *p;
L12 *p = *(p+1);
L13 *(p+1) = t;
L14 }
L15 }
L16 }
L17 int getDiff(int x)
L18 {
L19 int digit[4],i,max,min;
L20 for(i=0;i<4;i++)
L21 {
L22 digit[i] = x/10;
L23 x /= 10;
L24 }
L25 sortNum(digit,4);
L26 min = digit[0]*1000 + digit[1]*100 + digit[2]*10 + digit[3];
L27 max = digit[3]*1000 + digit[2]*100 + digit[1]*10 + digit[0];
L28 return max - min;
L29 }
L30 int main(void)
L31 {
L32 int num,round=1;
L33 printf("输入四位不全部相同整数:");
L34 scanf("%d",&num);
L35 while(num != 6174)
L36 {
L37 num = getDiff(num);
L38 printf("第%d轮结果:%d
",round,num);
L39 round++;
L40 }
L41 printf("进入6174数字黑洞,迭代结束");
L42 return 0;
L43 }
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$