内容正文:
编写说明:湖南省普通高校对口招生专业理论考试《计算机应用类专业综合考纲百套卷》,依据《湖南省普通高校对口招生计算机应用类专业综合知识基本要求及考试大纲》编写。每门课程均分三层训练:基础层(具象化支架)拆解考点为微目标,紧扣考纲 “掌握”“理解” 要求编写考点训练卷;巩固层(关联性支架)强化知识交叉与场景关联,按考纲专题编专题训练卷;应用层(引导性支架)聚焦真题突破,结合知识模块与教材编写课程综合卷。
本试卷是第96卷,按《计算机编程语言——C语言》范围和要求编写。具体内容为:①C语言基础知识;②分支结构程序设计;③循环结构程序设计;④数组;⑤函数;⑥结构体和共用体;⑦指针、文件。
湖南省《计算机应用类专业综合考纲百套卷》 第96卷
《计算机编程语言——C语言》
课程综合卷
考试时间60分钟 满分100分
班级________姓名________学号________成绩________
一、单项选择题(本大题共10小题,每题2分,共20分)
1.执行int a=7,b=3; double s=(double)a/b - a/b; printf("%.2lf",s);输出( )
A. 0.00 B. 0.33 C. 0.67 D. 1.00
【答案】B
【解析】(double) 7/3≈2.33;7/3 整数除法 = 2;差值 0.33,保留两位小数 0.33。
2.算法描述方式不包含以下哪一种( )
A. 流程图 B. N-S 图 C. 机器语言指令 D. 伪代码
【答案】C
【解析】机器语言是底层执行代码,不属于算法描述工具。
3.设有语句:int data=19,p; p=data>>3; 执行后 p 的值是( )
A. 2 B. 3 C. 6 D. 9
【答案】A
【解析】19 二进制 10011,右移 3 位变为 00010,十进制 2。
4.程序段 int n=11; printf("%d", n & 9); 输出结果为( )
A. 8 B. 9 C. 10 D. 11
【答案】B
【解析】11 二进制 1011,9 二进制 1001,按位与 1001=9。
5.设有语句:int m=13,n=0;执行int flag = m>20 || (n++, m-5);后 n 的值为( )
A. 0 B. 1 C. 8 D. 13
【答案】B
【解析】m>20为假,必须执行右侧逗号表达式,n++生效,n 变为 1。
6.能正确描述 “x 大于 0,且 x 不在 [5,15] 区间” 的表达式是( )
A. x>0 && (x<5 || x>15) B. x>0 || x<5 && x>15
C. 0<x<5 || 0<x>15 D. x>0 && !(5<=x<=15)
【答案】A
【解析】A正确:x>0且(x<5或x>15)精确对应题意;B优先级错误;C语法非法;D中5<=x<=15实际等价于(5<=x)<=15,逻辑错误,故选A。
7.设有以下程序段,则输出结果是( )
int a = 5;
int b = a *= a - 2;
printf("%d", b);
A.15 B.10 C.25 D.3
【答案】A
【解析】复合赋值右结合,先算a-2=3,a = a * 3 = 15,b=15。
8.设有以下程序段,则输出结果是( )
int x = 2, y = 5;
int res = x > 1 && y++ < 10;
printf("%d,%d", res, y);
A. 1,5 B. 1,6 C. 0,5 D. 0,6
【答案】B
【解析】&&无短路,左边 x>1 成立,继续执行右侧y++;y 自增为 6,逻辑表达式结果为真 1。
9.设有以下程序段,则输出结果是( )
char ch = '5';
printf("%d", ch - '3');
A. 2 B. 53 C. 50 D. 随机数
【答案】A
【解析】字符 '5'ASCII 减 '3'ASCII,直接得到对应数字差值 5-3=2。
10.执行以下程序的输出结果是( )
#include <stdio.h>
char **shift(char **p, int step)
{ return p + step;}
int main()
{ char *week[] = {"Sun","Mon","Tue","Wed","Thu"};
char **pt = week;
pt = shift(pt, 3);
printf("%s", *pt);
return 0; }
A. Sun B. Tue C. Wed D. Thu
【答案】C
【解析】week是指针数组,数组名week为二级指针;调用函数偏移 3 位,指向week[3],对应字符串Wed。
二、阅读程序,写出运行结果(本大题共10小题。每空2分,合计20分)
1.下列程序的运行结果是__________________。
#include <stdio.h>
void calcTotal(int *arr, int len, int *total)
{ int *p = arr;
*total = 0;
while (p < arr + len)
{ if (*p % 3 == 0 && *p % 5 != 0)
*total += *p;
p++;
}
}
int main()
{ int arr[14]={3,5,9,15,6,20,12,18,25,21,30,24,7,8};
int i, res;
calcTotal(arr, 14, &res);
printf("符合条件元素总和:%d
", res);
return 0;}
【答案】符合条件元素总和:93
2.下列程序的运行结果是__________________。
#include <stdio.h>
void absArr(int *arr, int len)
{
int *p = arr;
while (p < arr + len)
{
if (*p < 0)
*p = -(*p);
p++;
}
}
int main()
{ int arr[10]={-5,8,-2,0,-9,12,-3,7,-1,4};
int i;
absArr(arr, 10);
for (i = 0; i < 10; i++)
printf("%d ", arr[i]);
return 0; }
【答案】5 8 2 0 9 12 3 7 1 4
3.下列程序的运行结果是__________________。
#include <stdio.h>
char *getSubStr(char *s, int start, int len)
{ static char sub[64];
int i = 0;
while(len-- > 0)
{
sub[i++] = *(s + start++);
}
sub[i] = '\0';
return sub;
}
int main()
{ char *longStr = "ProgrammingLanguage";
puts(getSubStr(longStr, 4, 6));
return 0; }
【答案】rammin
4.下列程序的运行结果是__________________。
#include <stdio.h>
int main() {
int a=3, b=4, c=5;
if(a>b)
if(b<c) printf("1");
else printf("2");
else
if(a<c) printf("3");
else printf("4");
return 0;
}
【答案】3
5.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{ FILE *fp;
int ch;
fp = fopen("file18.txt", "w");
fprintf(fp, "5678");
fflush(fp);
fseek(fp, -2, SEEK_CUR);
fputc('1', fp);
fclose(fp);
fp = fopen("file18.txt", "r");
while((ch = fgetc(fp)) != EOF)
putchar(ch);
fclose(fp);
return 0;}
【答案】5618
6.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{ int m,n,k,result;
m = 22;
n = 13;
k = 7;
if(m > n)
{
if(n > k)
result = m - n + k;
else
{
if(m % k == 0)
result = m + n;
else
result = m - k;
}
}
else
result = m * n / k;
printf("m=%d,n=%d,k=%d,result=%d",m,n,k,result);
return 0;
}
【答案】m=22,n=13,k=7,result=16
7.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{
int a, b, t;
t = 0;
for (a = 3; a <= 5; a++)
{
b = a;
while (b < 6)
{
if (a + b == 8)
break;
t += a * 2 + b;
b++;
}
}
printf("t=%d", t);
return 0; }
【答案】t=34
8.下列程序的运行结果是__________________。
#include <stdio.h>
void pathRec(int n, int path[][2], int pos)
{ if(n == 1)
{
path[pos][0] = 1;
path[pos][1] = 1 % 2;
return;
}
path[pos][0] = n;
path[pos][1] = n % 2;
if(n % 2 == 0)
pathRec(n / 2, path, pos + 1);
else
pathRec(n - 1, path, pos + 1);
}
int calcEven(int p[][2])
{
int i, sum;
sum = 0;
for(i = 0; p[i][0] != 1; i++)
if(p[i][1] == 0)
sum = sum + p[i][0];
return sum;
}
int main(void)
{
int route[30][2];
int evenSum,i;
pathRec(9, route, 0);
evenSum = calcEven(route);
for(i = 0; route[i][0] != 1; i++)
printf("%d , %d-", route[i][0], route[i][1]);
printf("%d", evenSum);
return 0;
}
【答案】9 , 1-8 , 0-4 , 0-2 , 0-14
9.下列程序的运行结果是__________________。
#include <stdio.h>
char shift(char ch)
{
if(ch >= 'a' && ch <= 'z')
return (ch - 'a' + 2) % 26 + 'a';
return ch;
}
int main(void)
{
FILE *fp;
char buf[10];
int cnt = 0, i;
fp = fopen("s.txt", "w");
fputs("abcx", fp);
fclose(fp);
fp = fopen("s.txt", "r");
fgets(buf, 10, fp);
fclose(fp);
remove("s.txt");
for(i = 0; buf[i] != '\0'; i++)
{
char c = shift(buf[i]);
if(c >= 'a' && c <= 'z')
cnt++;
}
printf("%d", cnt);
return 0;
}
【答案】4
10.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{
int src[4] = {2,4,1,3};
int buf[4];
FILE *fp;
int v1, v2, i, t, sum;
int *p;
fp = fopen("swap.dat", "wb");
fwrite(src, sizeof(int), 4, fp);
fclose(fp);
fp = fopen("swap.dat", "rb+");
fseek(fp, sizeof(int) * 1, SEEK_SET);
v1 = 1;
fwrite(&v1, sizeof(int), 1, fp);
fseek(fp, sizeof(int) * 3, SEEK_SET);
v2 = 2;
fwrite(&v2, sizeof(int), 1, fp);
fseek(fp, 0, SEEK_SET);
fread(buf, sizeof(int), 4, fp);
fclose(fp);
remove("swap.dat");
p = buf;
for (i = 0; i < 4; i += 2)
{
t = *(p + i);
*(p + i) = *(p + i + 1);
*(p + i + 1) = t;
}
sum = 0;
for (i = 0; i < 4; i++)
sum += buf[i];
printf("%d", sum);
return 0;
}
【答案】6
三、程序填空。按照题目要求,将正确内容填入答题卡相应位置,使程序完整(每空2分,共计40分)
1.下列程序的功能是:判断每一个字符串是否为回文串,将判断结果(1/0)存入一维数组带回,主函数输出每个字符串及是否为回文的标记。
#include <stdio.h>
#include <string.h>
void checkPalin(char (*strArr)[6], int row, int flag[])
{
int i, l, r;
for (i = 0; i < row; i++)
{
l = 0;
r = __________①__________
flag[i] = 1;
while (l < r)
{
if (___________②_________)
{
flag[i] = _______③_______;
________④________
}
l++;
r--;
}
}
}
int main()
{
char strList[3][6] = {"level", "world", "madam"};
int result[3];
int i;
___________⑤__________
for (i = 0; i < 3; i++)
{
printf("%-6s 是否回文:%d
", strList[i], result[i]);
}
return 0; }
【答案】①strlen(strArr[i]) - 1;
②strArr[i][l] != strArr[i][r] ③0
④break; ⑤checkPalin(strList, 3, result);
2.在由英文单词、空格组成的文章中,查找并统计英文单词出现的次数和第一次出现的首字符位置。规定:完整单词之间必须由空格隔开且不区分大小写。位置从0开始,若未找到,输出-1;若找到,输出次数与首次出现的位置。
#include <stdio.h>
#include <string.h>
char word[20];
char article[1000010];
int wlen, alen;
char cToLower(char c){
return c<='Z'? ________①________ ;
}
int isMatch(int pos) {
int i;
if(pos>0 && article[pos-1]!=' ')
return 0;
for(i=0;i<wlen;i++){
if(cToLower(article[pos+i]) != cToLower(word[i]))
return 0;
}
if( ________②________ &article[pos+wlen]!=' ')
return 0;
________③________
}
int main(){
int count=0,index=-1,i;
scanf("%s",word); //输入要查找的单词
getchar();
fgets(article,1000010,stdin); //输入文章
wlen=strlen(word);
alen=strlen(article);
if(article[alen-1]=='
'){
article[alen-1]='\0';
alen--;
}
for(i=0;i<alen;i++){
if(isMatch(i)==1){
________④________
if(index==-1)
________⑤________
}
}
if(count==0)
printf("-1
");
else
printf("%d %d
",count,index);
return 0;
}
【答案】① c+32 : c 或者 c-'A'+'a' : c
② pos+wlen < alen (或者是 pos+wlen != alen,确保不越界且不是结尾)
③ return 1;
④ count++;
⑤ index = i;
3.下列程序的功能是:输入上限 N,数组存储 2~N 所有整数;双层循环判定素数,筛选差值等于 2 的孪生素数对;输出全部配对,统计总对数;N<5 提示无孪生素数。
#include <stdio.h>
int main(void)
{
int arr[1000];
int N, i, j, num1, num2, k, flag1, flag2, pairCnt, pos;
pairCnt = 0;
pos = 0;
printf("输入数字上限N:");
scanf("%d", &N);
if(N < 5)
{
printf("区间内无孪生素数
");
return 0;
}
for(i = 2; i <= N; i++)
{
arr[pos] = i;
________①_______
}
printf("区间内孪生素数对:");
for(i = 0; i < pos; i++)
{
num1 = arr[i];
__________②__________
for(k = 2; k * k <= num1; k++)
{
if(__________③_________)
{
flag1 = 0;
break;
}
}
if(flag1 == 0)
continue;
num2 = num1 + 2;
if(num2 > N)
________④________
flag2 = 1;
for(k = 2; k * k <= num2; k++)
{
if(num2 % k == 0)
{
flag2 = 0;
break;
}
}
if(flag2 == 1)
{
printf("(%d,%d) ", num1, num2);
pairCnt = ________⑤_________
}
}
printf("
孪生素数总对数:%d
", pairCnt);
return 0;
}
【答案】①pos = pos + 1; ②flag1 = 1; ③num1 % k == 0
④continue; ⑤pairCnt + 1;
4.过剩数(莫尔数):所有真因数之和 > 数字本身,如 12、18、20,下列程序的功能是删除所有非过剩数节点,计算剩余所有节点累加和并输出。
#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];
tail->next = NULL;
}
return ________②_________
}
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 isAbundant(int n)
{
return _________③________
}
ListNode* filterAbundant(ListNode* head)
{
ListNode dummy;
ListNode *prev, *tmp;
dummy.next = head;
prev = &dummy;
while (head != NULL)
{
if (!isAbundant(head->val))
{
tmp = head;
__________④_________
free(tmp);
prev->next = head;
}
else
{
prev = head;
head = head->next;
}
}
return dummy.next;
}
int main(void)
{
int arr[] = {8,12,14,18,20,23};
int len = 6;
ListNode *head, *p;
int sum = 0;
head = createList(arr, len);
p = filterAbundant(head);
while (p != NULL)
{
_________⑤_________
p = p->next;
}
printf("过剩数节点总和:%d", sum);
return 0;
}
【答案】①(ListNode*)malloc(sizeof(ListNode));
②dummy.next; ③factorSum(n) > n;
④head = head->next; ⑤sum += p->val;
四、阅读程序:修改程序中的错误,不得增行或删行,也不得更改程序结构。请在答题卡中指出错误代码所在的行号,并给出该行修改后的程序代码。(每空2分,共计20分)
1.下列程序的功能是:输入两个分别带有5个元素的数组,通过程序实现将两个数组中的最大值交换,并输出交换最大值之后的两个数组。。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 #define N 5
L3 int *max(int a, int n)
L4 {
L5 int *p, *q;
L6 q=a;
L7 for(p=a+1;p<a+n;p++)
L8 {
L9 if(*p>*q)
L10 q=p;
L11 }
L12 return q;
L13 }
L14 void swap(int *pa, int *pb)
L15 {
L16 int temp;
L17 temp=*pa;
L18 *pa=*pb;
L19 *pb=*temp;
L20 }
L21 main()
L22 {
L23 int a[N], b[N];
L24 int *pa, *pb, *p;
L25 printf("input array a with 5 element
");
L26 for(p=a;p<a+N;p++)
L27 {
L28 scanf("%d",p);
L29 }
L30 printf("input array b with 5 element
");
L31 for(p=b;p<b+N;p++)
L32 {
L33 scanf("%d",p);
L34 }
L35 pa=max(a,N);
L36 pb=max(b,N);
L37 printf("The max numbers are %d and %d
",*pa,*pb);
L38 swap(*pa,*pb);
L39 printf("now a: ");
L40 for(p=a;p<a+N;p++)
L41 {
L42 printf ("%3d",*p);
L43 }
L44 printf("
now b: ");
L45 for(p=b;p<b+N;p++)
L46 {
L47 printf ("%3d",*p);
L48 }
L49 printf("
");
L50 }
【答案】①L3 int *max(int *a, int n)
②L19 *pb=temp;
③L38 swap(pa,pb);
2.下列程序的功能是:生成日志文本写入文件,依靠字符指针过滤全部数字字符,奇数数字乘 2、偶数数字乘 1 累加加权总和。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 #include <string.h>
L3 int main(void){
L4 char log[]="prod7,amt19,num4,id23";
L5 char buf[64],*p;
L6 File *fp;
L7 int sum=0,val;
L8 fp=fopen("log.txt","w");
L9 fputs(log,fp);
L10 fclose(fp);
L11 fp=fopen("log.txt","r");
L12 fread(buf,sizeof(char),64,fp);
L13 fclose(fp);
L14 p=buf;
L15 while(*p!='\0'){
L16 if(*p>='0'&&*p<='9'){
L17 val=*p-'0';
L18 sum+=(val%2==1)?val:val*2;
L19 }
L20 p++;
L21 }
L22 printf("日志数字加权总和:%d",sum);
L23 remove("log.txt");
L24 return 0;
L25 }
【答案】①L6 FILE *fp;
②L18 sum+=(val%2==1)?val*2:val;
3.青蛙跳台阶:输入台阶数 n,递归计算跳法总数(一次跳 1 阶/2 阶),使用指针数组存储每阶结果,写入文本文件输出数列。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 #include <stdlib.h>
L3 long jump(int n)
L4 {
L5 if (n <= 2)
L6 {
L7 return n;
L8 }
L9 return jump(n - 1) + jump(n - 2);
L10 }
L11 int main(void)
L12 {
L13 int n, i;
L14 long *dp;
L15 FILE *fp;
L16 char buf[256];
L17 printf("输入台阶数量:");
L18 scanf("%d", &n);
L19 getchar();
L20 dp = (long *)malloc((n + 1) * sizeof(long));
L21 if (dp == NULL)
L22 {
L23 printf("内存分配失败
");
L24 return -1;
L25 }
L26 for (i = 1; i <= n; i++)
L27 {
L28 dp + i = jump(i);
L29 }
L30 fp = fopen("jump_step.txt", "w");
L31 if (fp == NULL)
L32 {
L33 printf("文件创建失败
");
L34 free(dp);
L35 return -1;
L36 }
L37 fprintf(fp, "1~%d阶跳法数列:", n);
L38 for (i = 1; i <= n; i++)
L39 {
L40 fprintf(fp, "%ld ", *(dp + i));
L41 }
L42 fclose(fp);
L43 fp = fopen("jump_step.txt", "r");
L44 fgets(buf, 256, *fp);
L45 printf("%s
%d阶总跳法:%ld
", buf, n, dp + n);
L46 fclose(fp);
L47 free(dp);
L48 remove("jump_step.txt");
L49 return 0;
L50 }
【答案】①L28 *(dp + i) = jump(i);
②L44 fgets(buf, 256, fp);
③L45 printf("%s
%d阶总跳法:%ld
", buf, n, *(dp + n));
4.下列程序的功能是:输入一个正整数,递归分解出全部质因数,使用指针数组存储所有质因子,最后循环输出分解式。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 #include <stdlib.h>
L3 int factor(int num, int *p, int idx)
L4 {
L5 int i;
L6 if(num == 1)
L7 return idx;
L8 for(i=2;i<=num;i++)
L9 {
L10 if(num%i == 0)
L11 {
L12 *(p+idx) = i;
L13 return factor(num/i, *p, idx+1);
L14 }
L15 }
L16 return idx;
L17 }
L18 int main(void)
L19 {
L20 int n,len,i;
L21 int *facBuf;
L22 printf("请输入待分解的正整数:");
L23 scanf("%d",&n);
L24 facBuf = (int*)malloc(n*sizeof(int));
L25 if(facBuf == NULL)
L26 {
L27 printf("内存分配失败
");
L28 return -1;
L29 }
L30 len = factor(n, facBuf, 0);
L31 printf("%d = ",n);
L32 for(i=0;i<len;i++)
L33 {
L34 if(i>0)
L35 printf("*");
L36 printf("%d",*(facBuf+1));
L37 }
L38 free(facBuf);
L39 return 0;
L40 }
【答案】①L13 return factor(num/i, p, idx+1);
②L36 printf("%d",*(facBuf+i));
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
编写说明:湖南省普通高校对口招生专业理论考试《计算机应用类专业综合考纲百套卷》,依据《湖南省普通高校对口招生计算机应用类专业综合知识基本要求及考试大纲》编写。每门课程均分三层训练:基础层(具象化支架)拆解考点为微目标,紧扣考纲 “掌握”“理解” 要求编写考点训练卷;巩固层(关联性支架)强化知识交叉与场景关联,按考纲专题编专题训练卷;应用层(引导性支架)聚焦真题突破,结合知识模块与教材编写课程综合卷。
本试卷是第96卷,按《计算机编程语言——C语言》范围和要求编写。具体内容为:①C语言基础知识;②分支结构程序设计;③循环结构程序设计;④数组;⑤函数;⑥结构体和共用体;⑦指针、文件。
湖南省《计算机应用类专业综合考纲百套卷》 第96卷
《计算机编程语言——C语言》
课程综合卷
考试时间60分钟 满分100分
班级________姓名________学号________成绩________
一、单项选择题(本大题共10小题,每题2分,共20分)
1.执行int a=7,b=3; double s=(double)a/b - a/b; printf("%.2lf",s);输出( )
A. 0.00 B. 0.33 C. 0.67 D. 1.00
2.算法描述方式不包含以下哪一种( )
A. 流程图 B. N-S 图 C. 机器语言指令 D. 伪代码
3.设有语句:int data=19,p; p=data>>3; 执行后 p 的值是( )
A. 2 B. 3 C. 6 D. 9
4.程序段 int n=11; printf("%d", n & 9); 输出结果为( )
A. 8 B. 9 C. 10 D. 11
5.设有语句:int m=13,n=0;执行int flag = m>20 || (n++, m-5);后 n 的值为( )
A. 0 B. 1 C. 8 D. 13
6.能正确描述 “x 大于 0,且 x 不在 [5,15] 区间” 的表达式是( )
A. x>0 && (x<5 || x>15) B. x>0 || x<5 && x>15
C. 0<x<5 || 0<x>15 D. x>0 && !(5<=x<=15)
7.设有以下程序段,则输出结果是( )
int a = 5;
int b = a *= a - 2;
printf("%d", b);
A.15 B.10 C.25 D.3
8.设有以下程序段,则输出结果是( )
int x = 2, y = 5;
int res = x > 1 && y++ < 10;
printf("%d,%d", res, y);
A. 1,5 B. 1,6 C. 0,5 D. 0,6
9.设有以下程序段,则输出结果是( )
char ch = '5';
printf("%d", ch - '3');
A. 2 B. 53 C. 50 D. 随机数
10.执行以下程序的输出结果是( )
#include <stdio.h>
char **shift(char **p, int step)
{ return p + step;}
int main()
{ char *week[] = {"Sun","Mon","Tue","Wed","Thu"};
char **pt = week;
pt = shift(pt, 3);
printf("%s", *pt);
return 0; }
A. Sun B. Tue C. Wed D. Thu
二、阅读程序,写出运行结果(本大题共10小题。每空2分,合计20分)
1.下列程序的运行结果是__________________。
#include <stdio.h>
void calcTotal(int *arr, int len, int *total)
{ int *p = arr;
*total = 0;
while (p < arr + len)
{ if (*p % 3 == 0 && *p % 5 != 0)
*total += *p;
p++;
}
}
int main()
{ int arr[14]={3,5,9,15,6,20,12,18,25,21,30,24,7,8};
int i, res;
calcTotal(arr, 14, &res);
printf("符合条件元素总和:%d
", res);
return 0;}
2.下列程序的运行结果是__________________。
#include <stdio.h>
void absArr(int *arr, int len)
{
int *p = arr;
while (p < arr + len)
{
if (*p < 0)
*p = -(*p);
p++;
}
}
int main()
{ int arr[10]={-5,8,-2,0,-9,12,-3,7,-1,4};
int i;
absArr(arr, 10);
for (i = 0; i < 10; i++)
printf("%d ", arr[i]);
return 0; }
3.下列程序的运行结果是__________________。
#include <stdio.h>
char *getSubStr(char *s, int start, int len)
{ static char sub[64];
int i = 0;
while(len-- > 0)
{
sub[i++] = *(s + start++);
}
sub[i] = '\0';
return sub;
}
int main()
{ char *longStr = "ProgrammingLanguage";
puts(getSubStr(longStr, 4, 6));
return 0; }
4.下列程序的运行结果是__________________。
#include <stdio.h>
int main() {
int a=3, b=4, c=5;
if(a>b)
if(b<c) printf("1");
else printf("2");
else
if(a<c) printf("3");
else printf("4");
return 0;
}
5.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{ FILE *fp;
int ch;
fp = fopen("file18.txt", "w");
fprintf(fp, "5678");
fflush(fp);
fseek(fp, -2, SEEK_CUR);
fputc('1', fp);
fclose(fp);
fp = fopen("file18.txt", "r");
while((ch = fgetc(fp)) != EOF)
putchar(ch);
fclose(fp);
return 0;}
6.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{ int m,n,k,result;
m = 22;
n = 13;
k = 7;
if(m > n)
{
if(n > k)
result = m - n + k;
else
{
if(m % k == 0)
result = m + n;
else
result = m - k;
}
}
else
result = m * n / k;
printf("m=%d,n=%d,k=%d,result=%d",m,n,k,result);
return 0;
}
7.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{
int a, b, t;
t = 0;
for (a = 3; a <= 5; a++)
{
b = a;
while (b < 6)
{
if (a + b == 8)
break;
t += a * 2 + b;
b++;
}
}
printf("t=%d", t);
return 0; }
8.下列程序的运行结果是__________________。
#include <stdio.h>
void pathRec(int n, int path[][2], int pos)
{ if(n == 1)
{
path[pos][0] = 1;
path[pos][1] = 1 % 2;
return;
}
path[pos][0] = n;
path[pos][1] = n % 2;
if(n % 2 == 0)
pathRec(n / 2, path, pos + 1);
else
pathRec(n - 1, path, pos + 1);
}
int calcEven(int p[][2])
{
int i, sum;
sum = 0;
for(i = 0; p[i][0] != 1; i++)
if(p[i][1] == 0)
sum = sum + p[i][0];
return sum;
}
int main(void)
{
int route[30][2];
int evenSum,i;
pathRec(9, route, 0);
evenSum = calcEven(route);
for(i = 0; route[i][0] != 1; i++)
printf("%d , %d-", route[i][0], route[i][1]);
printf("%d", evenSum);
return 0;
}
9.下列程序的运行结果是__________________。
#include <stdio.h>
char shift(char ch)
{
if(ch >= 'a' && ch <= 'z')
return (ch - 'a' + 2) % 26 + 'a';
return ch;
}
int main(void)
{
FILE *fp;
char buf[10];
int cnt = 0, i;
fp = fopen("s.txt", "w");
fputs("abcx", fp);
fclose(fp);
fp = fopen("s.txt", "r");
fgets(buf, 10, fp);
fclose(fp);
remove("s.txt");
for(i = 0; buf[i] != '\0'; i++)
{
char c = shift(buf[i]);
if(c >= 'a' && c <= 'z')
cnt++;
}
printf("%d", cnt);
return 0;
}
10.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{
int src[4] = {2,4,1,3};
int buf[4];
FILE *fp;
int v1, v2, i, t, sum;
int *p;
fp = fopen("swap.dat", "wb");
fwrite(src, sizeof(int), 4, fp);
fclose(fp);
fp = fopen("swap.dat", "rb+");
fseek(fp, sizeof(int) * 1, SEEK_SET);
v1 = 1;
fwrite(&v1, sizeof(int), 1, fp);
fseek(fp, sizeof(int) * 3, SEEK_SET);
v2 = 2;
fwrite(&v2, sizeof(int), 1, fp);
fseek(fp, 0, SEEK_SET);
fread(buf, sizeof(int), 4, fp);
fclose(fp);
remove("swap.dat");
p = buf;
for (i = 0; i < 4; i += 2)
{
t = *(p + i);
*(p + i) = *(p + i + 1);
*(p + i + 1) = t;
}
sum = 0;
for (i = 0; i < 4; i++)
sum += buf[i];
printf("%d", sum);
return 0;
}
三、程序填空。按照题目要求,将正确内容填入答题卡相应位置,使程序完整(每空2分,共计40分)
1.下列程序的功能是:判断每一个字符串是否为回文串,将判断结果(1/0)存入一维数组带回,主函数输出每个字符串及是否为回文的标记。
#include <stdio.h>
#include <string.h>
void checkPalin(char (*strArr)[6], int row, int flag[])
{
int i, l, r;
for (i = 0; i < row; i++)
{
l = 0;
r = __________①__________
flag[i] = 1;
while (l < r)
{
if (___________②_________)
{
flag[i] = _______③_______;
________④________
}
l++;
r--;
}
}
}
int main()
{
char strList[3][6] = {"level", "world", "madam"};
int result[3];
int i;
___________⑤__________
for (i = 0; i < 3; i++)
{
printf("%-6s 是否回文:%d
", strList[i], result[i]);
}
return 0; }
2.在由英文单词、空格组成的文章中,查找并统计英文单词出现的次数和第一次出现的首字符位置。规定:完整单词之间必须由空格隔开且不区分大小写。位置从0开始,若未找到,输出-1;若找到,输出次数与首次出现的位置。
#include <stdio.h>
#include <string.h>
char word[20];
char article[1000010];
int wlen, alen;
char cToLower(char c){
return c<='Z'? ________①________ ;
}
int isMatch(int pos) {
int i;
if(pos>0 && article[pos-1]!=' ')
return 0;
for(i=0;i<wlen;i++){
if(cToLower(article[pos+i]) != cToLower(word[i]))
return 0;
}
if( ________②________ &article[pos+wlen]!=' ')
return 0;
________③________
}
int main(){
int count=0,index=-1,i;
scanf("%s",word); //输入要查找的单词
getchar();
fgets(article,1000010,stdin); //输入文章
wlen=strlen(word);
alen=strlen(article);
if(article[alen-1]=='
'){
article[alen-1]='\0';
alen--;
}
for(i=0;i<alen;i++){
if(isMatch(i)==1){
________④________
if(index==-1)
________⑤________
}
}
if(count==0)
printf("-1
");
else
printf("%d %d
",count,index);
return 0;
}
3.下列程序的功能是:输入上限 N,数组存储 2~N 所有整数;双层循环判定素数,筛选差值等于 2 的孪生素数对;输出全部配对,统计总对数;N<5 提示无孪生素数。
#include <stdio.h>
int main(void)
{
int arr[1000];
int N, i, j, num1, num2, k, flag1, flag2, pairCnt, pos;
pairCnt = 0;
pos = 0;
printf("输入数字上限N:");
scanf("%d", &N);
if(N < 5)
{
printf("区间内无孪生素数
");
return 0;
}
for(i = 2; i <= N; i++)
{
arr[pos] = i;
________①_______
}
printf("区间内孪生素数对:");
for(i = 0; i < pos; i++)
{
num1 = arr[i];
__________②__________
for(k = 2; k * k <= num1; k++)
{
if(__________③_________)
{
flag1 = 0;
break;
}
}
if(flag1 == 0)
continue;
num2 = num1 + 2;
if(num2 > N)
________④________
flag2 = 1;
for(k = 2; k * k <= num2; k++)
{
if(num2 % k == 0)
{
flag2 = 0;
break;
}
}
if(flag2 == 1)
{
printf("(%d,%d) ", num1, num2);
pairCnt = ________⑤_________
}
}
printf("
孪生素数总对数:%d
", pairCnt);
return 0;
}
4.过剩数(莫尔数):所有真因数之和 > 数字本身,如 12、18、20,下列程序的功能是删除所有非过剩数节点,计算剩余所有节点累加和并输出。
#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];
tail->next = NULL;
}
return ________②_________
}
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 isAbundant(int n)
{
return _________③________
}
ListNode* filterAbundant(ListNode* head)
{
ListNode dummy;
ListNode *prev, *tmp;
dummy.next = head;
prev = &dummy;
while (head != NULL)
{
if (!isAbundant(head->val))
{
tmp = head;
__________④_________
free(tmp);
prev->next = head;
}
else
{
prev = head;
head = head->next;
}
}
return dummy.next;
}
int main(void)
{
int arr[] = {8,12,14,18,20,23};
int len = 6;
ListNode *head, *p;
int sum = 0;
head = createList(arr, len);
p = filterAbundant(head);
while (p != NULL)
{
_________⑤_________
p = p->next;
}
printf("过剩数节点总和:%d", sum);
return 0;
}
四、阅读程序:修改程序中的错误,不得增行或删行,也不得更改程序结构。请在答题卡中指出错误代码所在的行号,并给出该行修改后的程序代码。(每空2分,共计20分)
1.下列程序的功能是:输入两个分别带有5个元素的数组,通过程序实现将两个数组中的最大值交换,并输出交换最大值之后的两个数组。。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 #define N 5
L3 int *max(int a, int n)
L4 {
L5 int *p, *q;
L6 q=a;
L7 for(p=a+1;p<a+n;p++)
L8 {
L9 if(*p>*q)
L10 q=p;
L11 }
L12 return q;
L13 }
L14 void swap(int *pa, int *pb)
L15 {
L16 int temp;
L17 temp=*pa;
L18 *pa=*pb;
L19 *pb=*temp;
L20 }
L21 main()
L22 {
L23 int a[N], b[N];
L24 int *pa, *pb, *p;
L25 printf("input array a with 5 element
");
L26 for(p=a;p<a+N;p++)
L27 {
L28 scanf("%d",p);
L29 }
L30 printf("input array b with 5 element
");
L31 for(p=b;p<b+N;p++)
L32 {
L33 scanf("%d",p);
L34 }
L35 pa=max(a,N);
L36 pb=max(b,N);
L37 printf("The max numbers are %d and %d
",*pa,*pb);
L38 swap(*pa,*pb);
L39 printf("now a: ");
L40 for(p=a;p<a+N;p++)
L41 {
L42 printf ("%3d",*p);
L43 }
L44 printf("
now b: ");
L45 for(p=b;p<b+N;p++)
L46 {
L47 printf ("%3d",*p);
L48 }
L49 printf("
");
L50 }
2.下列程序的功能是:生成日志文本写入文件,依靠字符指针过滤全部数字字符,奇数数字乘 2、偶数数字乘 1 累加加权总和。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 #include <string.h>
L3 int main(void){
L4 char log[]="prod7,amt19,num4,id23";
L5 char buf[64],*p;
L6 File *fp;
L7 int sum=0,val;
L8 fp=fopen("log.txt","w");
L9 fputs(log,fp);
L10 fclose(fp);
L11 fp=fopen("log.txt","r");
L12 fread(buf,sizeof(char),64,fp);
L13 fclose(fp);
L14 p=buf;
L15 while(*p!='\0'){
L16 if(*p>='0'&&*p<='9'){
L17 val=*p-'0';
L18 sum+=(val%2==1)?val:val*2;
L19 }
L20 p++;
L21 }
L22 printf("日志数字加权总和:%d",sum);
L23 remove("log.txt");
L24 return 0;
L25 }
3.青蛙跳台阶:输入台阶数 n,递归计算跳法总数(一次跳 1 阶/2 阶),使用指针数组存储每阶结果,写入文本文件输出数列。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 #include <stdlib.h>
L3 long jump(int n)
L4 {
L5 if (n <= 2)
L6 {
L7 return n;
L8 }
L9 return jump(n - 1) + jump(n - 2);
L10 }
L11 int main(void)
L12 {
L13 int n, i;
L14 long *dp;
L15 FILE *fp;
L16 char buf[256];
L17 printf("输入台阶数量:");
L18 scanf("%d", &n);
L19 getchar();
L20 dp = (long *)malloc((n + 1) * sizeof(long));
L21 if (dp == NULL)
L22 {
L23 printf("内存分配失败
");
L24 return -1;
L25 }
L26 for (i = 1; i <= n; i++)
L27 {
L28 dp + i = jump(i);
L29 }
L30 fp = fopen("jump_step.txt", "w");
L31 if (fp == NULL)
L32 {
L33 printf("文件创建失败
");
L34 free(dp);
L35 return -1;
L36 }
L37 fprintf(fp, "1~%d阶跳法数列:", n);
L38 for (i = 1; i <= n; i++)
L39 {
L40 fprintf(fp, "%ld ", *(dp + i));
L41 }
L42 fclose(fp);
L43 fp = fopen("jump_step.txt", "r");
L44 fgets(buf, 256, *fp);
L45 printf("%s
%d阶总跳法:%ld
", buf, n, dp + n);
L46 fclose(fp);
L47 free(dp);
L48 remove("jump_step.txt");
L49 return 0;
L50 }
4.下列程序的功能是:输入一个正整数,递归分解出全部质因数,使用指针数组存储所有质因子,最后循环输出分解式。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 #include <stdlib.h>
L3 int factor(int num, int *p, int idx)
L4 {
L5 int i;
L6 if(num == 1)
L7 return idx;
L8 for(i=2;i<=num;i++)
L9 {
L10 if(num%i == 0)
L11 {
L12 *(p+idx) = i;
L13 return factor(num/i, *p, idx+1);
L14 }
L15 }
L16 return idx;
L17 }
L18 int main(void)
L19 {
L20 int n,len,i;
L21 int *facBuf;
L22 printf("请输入待分解的正整数:");
L23 scanf("%d",&n);
L24 facBuf = (int*)malloc(n*sizeof(int));
L25 if(facBuf == NULL)
L26 {
L27 printf("内存分配失败
");
L28 return -1;
L29 }
L30 len = factor(n, facBuf, 0);
L31 printf("%d = ",n);
L32 for(i=0;i<len;i++)
L33 {
L34 if(i>0)
L35 printf("*");
L36 printf("%d",*(facBuf+1));
L37 }
L38 free(facBuf);
L39 return 0;
L40 }
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$