内容正文:
编写说明:湖南省普通高校对口招生专业理论考试《计算机应用类专业综合考纲百套卷》,依据《湖南省普通高校对口招生计算机应用类专业综合知识基本要求及考试大纲》编写。每门课程均分三层训练:基础层(具象化支架)拆解考点为微目标,紧扣考纲 “掌握”“理解” 要求编写考点训练卷;巩固层(关联性支架)强化知识交叉与场景关联,按考纲专题编专题训练卷;应用层(引导性支架)聚焦真题突破,结合知识模块与教材编写课程综合卷。
本试卷是第97卷,按《计算机编程语言——C语言》范围和要求编写。具体内容为:①C语言基础知识;②分支结构程序设计;③循环结构程序设计;④数组;⑤函数;⑥结构体和共用体;⑦指针、文件。
湖南省《计算机应用类专业综合考纲百套卷》 第97卷
《计算机编程语言——C语言》
课程综合卷
考试时间60分钟 满分100分
班级________姓名________学号________成绩________
一、单项选择题(本大题共10小题,每题2分,共20分)
1.设有语句:int x=12; x &= ~(1<<1); printf("%d",x);输出结果( )
A. 10 B. 12 C. 8 D. 14
【答案】A
【解析】1<<1=2;~2 清除二进制第 1 位;12 二进制 1100,清除第二位后 1010=10。
2.关于 getchar () 函数说法正确的是( )
A. 返回值类型为 char B. 输入回车时返回值为 10
C. 无法读取空格、换行符 D. EOF 的 ASCII 码为 0
【答案】B
【解析】A 返回 int;C 可读取所有空白字符;D EOF 值为 - 1;换行
ASCII=10。
3.使用 scanf("%d%c",&a,&ch),输入 56#,ch 中存储的字符是( )
A. '5' B. '6' C. '#' D. 换行符
【答案】C
【解析】% d 读取数字 56 后,后续紧跟的 #直接被 % c 读取,无空白符则不跳过。
4.设有语句:int a=7,b=14,c=2; printf("%d", (c=a+b,a-5)); 输出结果为( )
A. 9 B. 16 C. 21 D. 2
【答案】A
【解析】逗号表达式先执行 c=a+b,舍弃结果;最终取值 a-5=7-5=9。
5.关于 putchar 与 getchar 说法错误的是( )
A. getchar 每次读取单个字符,包含空格、换行
B. putchar 参数只能是字符或对应 ASCII 整型
C. putchar(getchar()) 实现读取一个字符并原样输出
D. getchar 读取数字字符可直接参与整数四则运算
【答案】D
【解析】getchar 读取到的是字符的 ASCII 码,如字符 '9' 值为 57,不能直接当作数字 9 运算,需要减去 '0' 转换。
6.下列关于算法 “可行性” 描述正确的是( )
A. 只要逻辑正确,超出硬件运算范围也算可行
B. 每一步操作都能通过有限次基础运算完成
C. 算法可以包含无限循环语句
D. 复杂数学公式无需拆解直接作为算法步骤
【答案】B
【解析】可行性要求每一步操作都能在现有计算机上通过基础运算实现;无限循环违反有穷性,超大数值无法运算则不满足可行性。
7.下列关于 C 语言程序结构,说法正确的是( )
A. 一个 C 程序可以包含多个 main 函数
B. C 语言程序最小执行单元是语句
C. 所有可执行代码必须写在函数内部
D. 函数外可以定义 if 分支语句
【答案】C
【解析】A 错误,有且仅有 1 个 main;B 错误,基本单位是函数;D 错误,分支只能写在函数体内。
8.设有语句:int x=15,y=4,z; z = 2.8 + x / y; 执行后 z 的值为( )
A. 6 B. 5 C. 5.8 D. 6.8
【答案】B
【解析】x/y 是整数除法 15/4=3;2.8+3=5.8,赋值给 int 变量 z 自动截断小数,结果 5。
9.设有定义int a=2,b=3; int res = a>1 || ++b; 执行后 b、res 的值为( )
A. b=3,res=1 B. b=4,res=1
C. b=3,res=0 D. b=4,res=0
【答案】A
【解析】逻辑或短路,a>1 成立,右侧 ++b 完全不执行,b 保持 3,逻辑真为 1。
10.摄氏转换公式 C=5/9*(F-32),float C,F; 正确无精度丢失的表达式( )
A. C=5/9*(F-32) B. C=(5.0/9)(F-32)
C. C=5/(9(F-32)) D. C=5*F-32/9
【答案】B
【解析】5/9 是整数除法结果 0;必须写 5.0 转为浮点运算。
二、阅读程序,写出运行结果(本大题共10小题。每空2分,合计20分)
1.下列程序的运行结果是__________________。
#include <stdio.h>
int findTarget(int *arr, int len, int *val)
{ int *p = arr + 1;
while (p < arr + len - 1)
{ if (*p > *(p - 1) && *p < *(p + 1))
{ *val = *p;
return 1; }
p++;
}
return 0;
}
int main()
{ int arr[13]={9,3,7,2,8,13,5,4,6,2,7,3,9};
int i, num, flag;
flag = findTarget(arr, 13, &num);
if (flag == 1)
printf("目标元素:%d
", num);
else
printf("未找到符合条件的元素
");
return 0; }
【答案】目标元素:8
2.下列程序的运行结果是__________________。
#include <stdio.h>
int *reverseArr(int *arr, int n)
{ int i = 0, j = n - 1 ,t;
while(i < j)
{ t = arr[i];
arr[i] = arr[j];
arr[j] = t;
i++;
j--;
}
return arr;
}
int main()
{ int data[] = {8, 1, 9, 3, 6};
int *p = reverseArr(data, 5);
printf("%d %d", *(p+1), *(p+3));
return 0; }
【答案】3 1
3.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{ FILE *fp;
int data[3] = {9,18,27};
int res;
fp = fopen("file19.dat", "wb+");
fwrite(data, sizeof(int), 3, fp);
fseek(fp, sizeof(int), SEEK_SET);
fread(&res, sizeof(int), 1, fp);
printf("%d ", res);
rewind(fp);
fread(&res, sizeof(int), 1, fp);
printf("%d", res);
fclose(fp);
return 0;}
【答案】18 9
4.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{
int year,leap,num;
year = 2300;
leap = year%4==0 && year%100!=0 || year%400==0;
switch(leap)
{
case 1:
if(year > 2000)
num = year / 400;
else
num = year / 100;
break;
case 0:
num = year % 100;
break;
}
printf("year=%d,leap=%d,num=%d",year,leap,num);
return 0;
}
【答案】year=2300,leap=0,num=0
5.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{
int num, i;
num = 0;
i = -4;
do
{
if (i % 2 == 0)
num += i * 3;
else
num -= i * 2;
i++;
} while (i <= 4);
printf("num=%d,i=%d", num, i);
return 0; }
【答案】num=0,i=5
6.下列程序的运行结果是__________________。
#include <stdio.h>
static int tri[10];
int triNum(int n)
{
int val;
if(n == 0)
return 0;
val = triNum(n - 1) + n;
tri[n - 1] = val;
return val;
}
int main(void)
{
int i;
triNum(6);
for(i = 0; i < 6; i++)
printf("%d ", tri[i]);
return 0;
}
【答案】1 3 6 10 15 21
7.下列程序的运行结果是__________________。
#include <stdio.h>
int getFactor(int n, int fac[], int pos)
{
if(n == 1)
return pos;
if(6 % n == 0 && n != 6)
{
fac[pos] = n;
pos = pos + 1;
}
pos = getFactor(n - 1, fac, pos);
return pos;
}
int sumFac(int f[], int len)
{
int i, s;
s = 0;
for(i = 0; i < len; i++)
s = s + f[i];
return s;
}
int main(void)
{
int factor[20];
int count, total,i;
count = getFactor(5, factor, 0);
for(i = 0; i < count; i++)
printf("%d ", factor[i]);
total = sumFac(factor, count);
printf("%d", total);
return 0;
}
【答案】3 2 5
8.下列程序的运行结果是__________________。
#include <stdio.h>
#include <stdlib.h>
struct Node{int x;struct Node *next;};
void swapV(struct Node *a,struct Node *b)
{int t=a->x;
a->x=b->x;
b->x=t;}
int main(void)
{ struct Node *n1,*n2;FILE *fp,*fr;char buf[30];
n1=(struct Node*)malloc(sizeof(struct Node));
n2=(struct Node*)malloc(sizeof(struct Node));
n1->x=36;
n2->x=58;
n1->next=n2;
n2->next=NULL;
swapV(n1,n2);
fp=fopen("swap.txt","w");
fprintf(fp,"X%dY%d",n1->x,n2->x);
fclose(fp);
fr=fopen("swap.txt","r");
fgets(buf,30,fr);
printf("%s",buf);
free(n1);free(n2);
return 0; }
【答案】X58Y36
9.下列程序的运行结果是__________________。
#include <stdio.h>
int getMax(int *arr, int l, int r)
{
int mid, leftMax, rightMax, m;
if(l == r)
return arr[l];
mid = (l + r) / 2;
leftMax = getMax(arr, l, mid);
rightMax = getMax(arr, mid + 1, r);
m = leftMax > rightMax ? leftMax : rightMax;
return m;
}
int main(void)
{
int a1[4] = {3, 9, 2, 7};
int a2[3] = {12, 4, 15};
int a3[5] = {6, 11, 8, 19, 5};
int *ptrArr[3] = {a1, a2, a3};
int len[3] = {4, 3, 5};
int total = 0, i, j;
for(i = 0; i < 3; i++)
{
for(j = 0; j < len[i]; j++)
{
int s;
for(s = j; s < len[i]; s++)
{
int val = getMax(ptrArr[i], j, s);
total += val;
}
}
}
printf("%d", total);
return 0;
}
【答案】361
10.下列程序的运行结果是__________________。
#include <stdio.h>
#include <stdlib.h>
void rotateRight(int *arr, int n, int k)
{
int i, j, tmp;
k = k % n;
for(i = 0; i < k; i++)
{
tmp = *(arr + n - 1);
for(j = n - 1; j > 0; j--)
*(arr + j) = *(arr + j - 1);
*arr = tmp;
}
}
int main(void)
{
int buf[6] = {2, 5, 9, 1, 7, 4};
int mod[3] = {10, -3, 6};
FILE *fp;
int sum = 0, i;
fp = fopen("tmp.dat", "wb");
fwrite(buf, sizeof(int), 6, fp);
fclose(fp);
fp = fopen("tmp.dat", "rb+");
fwrite(mod, sizeof(int), 3, fp);
fseek(fp, 0, SEEK_SET);
fread(buf, sizeof(int), 6, fp);
fclose(fp);
rotateRight(buf, 6, 2);
rotateRight(buf, 6, 4);
for(i = 0; i < 6; i++)
sum += buf[i];
printf("%d", sum);
remove("tmp.dat");
return 0;
}
【答案】25
三、程序填空。按照题目要求,将正确内容填入答题卡相应位置,使程序完整(每空2分,共计40分)
1.下列程序的功能是:自定义函数计算一个整数各位数字之和,再遍历数组,将数组每个元素替换为其各位数字之和,输出最终数组。
#include <stdio.h>
int digitSum(int n)
{ ________①_________
while (n != 0)
{ s += n % 10;
n =_________②_______ }
return s;
}
void transArr(int *arr, int len)
{ int *p = arr;
while (_________③________)
{ *p = ________④________
p++;}
}
int main()
{ int arr[6];
int i;
for (i = 0; i < 6; i++)
scanf("%d", &arr[i]);
________⑤________
for (i = 0; i < 6; i++)
printf("%d ", arr[i]);
return 0; }
【答案】①int s = 0; ② n / 10; ③p < arr + len
④digitSum(*p); ⑤transArr(arr, 6);
2.输入 6 位生日数字,再输入 8 个随机数字;自定义函数拆分生日每一位存入数组,第二个函数统计随机数组中和生日任意数位相同的数字,第三个函数输出匹配星级:匹配≥4 颗★,2~3 颗☆,0~1 颗△。输出生日各位、原始随机数组、匹配数字列表、匹配星级评价。
输入6位生日数字:200805
输入8个随机整数:5 13 28 35 80 59 17 42
生日拆分各位:5 0 8 0 0 2
随机数字数组:5 13 28 35 80 59 17 42
包含生日数字的幸运数字:5 28 35 80 59 42
匹配总数:6
匹配幸运星级:★★★★ 本命超契合!
#include <stdio.h>
void splitBirth(int birth, int digit[], int len[])
{
int i = 0;
while(birth > 0)
{
digit[i] = __________①________
i++;
birth = birth / 10;
}
len[0] = ________②_______;
}
void matchNum(int src[], int n, int birthDig[], int digLen, int res[], int resLen[])
{
int i,j,cnt=0;
int flag,temp;
for(i=0;i<n;i++)
{
flag = 0;
temp = src[i];
while(temp>0)
{
int d = temp % 10;
for(j=0;j<digLen;j++)
{
if(__________③_________)
flag = 1;
}
temp /= 10;
}
if(flag == 1)
{
__________④__________
cnt++;
}
}
resLen[0] = _________⑤________
}
void showStar(int cnt)
{
printf("匹配幸运星级:");
if(cnt >= 4)
printf("★★★★ 本命超契合!");
else if(cnt >= 2)
printf("☆☆ 小有缘分");
else
printf("△ 缘分很浅");
}
int main(void)
{
int birth, random[8], birDig[6], matchBuf[8];
int i, birLen[1], matchCount[1];
printf("输入6位生日数字:");
scanf("%d", &birth);
printf("输入8个随机整数:");
for(i=0;i<8;i++)
scanf("%d", &random[i]);
splitBirth(birth, birDig, birLen);
matchNum(random,8,birDig,birLen[0],matchBuf,matchCount);
printf("生日拆分各位:");
for(i=0;i<birLen[0];i++)
printf("%d ", birDig[i]);
printf("
随机数字数组:");
for(i=0;i<8;i++)
printf("%d ", random[i]);
printf("
包含生日数字的幸运数字:");
for(i=0;i<matchCount[0];i++)
printf("%d ", matchBuf[i]);
printf("
匹配总数:%d
", matchCount[0]);
showStar(matchCount[0]);
return 0;
}
【答案】①birth % 10; ②i ③d == birthDig[j]
④res[cnt] = src[i]; ⑤cnt;
3.自守数:数字平方后末尾几位和自身完全相等(5、6、25、76 等)
内置链表[3,5,12,25,34,76,91],删除链表中非自守数节点,打印剩余链表,统计剩余节点数量。
#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(ListNode* head)
{
while (head != NULL)
{
printf("%d ", head->val);
___________①___________
}
printf("
");
}
int isAutomorphic(int n)
{
long powVal;
int mod, tmp;
powVal = (long)n * n;
mod = 10;
tmp = n;
while (tmp / 10 > 0)
{
mod *= 10;
________②________
}
return ___________③__________
}
ListNode* filterAuto(ListNode* head)
{
ListNode dummy;
ListNode *prev, *tmp;
dummy.next = head;
prev = &dummy;
while (head != NULL)
{
if (!isAutomorphic(head->val))
{
tmp = head;
head = head->next;
free(tmp);
___________④__________
}
else
{
prev = head;
___________⑤__________
}
}
return dummy.next;
}
int main(void)
{
int arr[] = {3,5,12,25,34,76,91};
int len = 7;
ListNode *head, *p;
int count = 0;
head = createList(arr, len);
p = filterAuto(head);
printList(p);
while (p != NULL)
{
count++;
p = p->next;
}
printf("剩余节点个数:%d", count);
return 0; }
【答案】①head = head->next; ②tmp /= 10;
③(powVal % mod) == n; ④prev->next = head;
⑤head = head->next;
4.用户分别输入两条链表长度与所有升序节点数值,将其合并为一条升序链表;
最后输出合并完成后的整条链表。
#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 = &dummy;
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);
head = head->next;
}
printf("
");
}
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2)
{
ListNode dummy;
ListNode *cur;
dummy.next = NULL;
cur = &dummy;
while (_____________①____________)
{
if (l1->val < l2->val)
{
cur->next = l1;
__________②__________
}
else
{
cur->next = l2;
l2 = l2->next;
}
___________③__________
}
if (l1 != NULL) cur->next = l1;
if (l2 != NULL) ________④_______
return dummy.next;
}
int main(void)
{
int n1, n2;
ListNode *l1, *l2, *merge, *p, *del;
printf("输入第一条链表长度:");
scanf("%d", &n1);
printf("依次输入第一条升序链表数据
");
l1 = createList(n1);
printf("输入第二条链表长度:");
scanf("%d", &n2);
printf("依次输入第二条升序链表数据
");
l2 = createList(n2);
printf("链表1:"); printList(l1);
printf("链表2:"); printList(l2);
__________⑤___________
printf("合并后有序链表:");
printList(merge);
p = merge;
while (p != NULL)
{
del = p;
p = p->next;
free(del);
}
return 0;
}
【答案】①l1 != NULL && l2 != NULL ②l1 = l1->next;
③cur = cur->next; ④cur->next = l2;
⑤merge = mergeTwoLists(l1, l2);
四、阅读程序:修改程序中的错误,不得增行或删行,也不得更改程序结构。请在答题卡中指出错误代码所在的行号,并给出该行修改后的程序代码。(每空2分,共计20分)
1.下列程序功能是:提取字符串中的数字,并将这些数字组成一个最大的数。程序运行结果是 9821。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 #include <string.h>
L3 void sortDesc(char *arr,int len){
L4 int i,j;
L5 for(i=0;i<len-1;i++){
L6 for(j=i+1;j<len;j++){
L7 if(arr[i]<arr[j]){
L8 char temp=arr[i];
L9 arr[i]=arr[j];
L10 arr[j]=temp;
L11 }
L12 }
L13 }
L14 }
L15 int main(){
L16 char s[12]="ab12c98df",nums[13];
L17 int idx=0,i;
L18 int n=len(s);
L19 for(i=0;i<n;i++){
L20 if(s[i]>='0'&&s[i]<='9'){
L21 nums[idx++]=s[i];
L22 }
L23 }
L24 nums[idx]='\0';
L25 sortDesc(s,idx);
L26 printf("%s
",nums);
L27 return 0;
L28 }
【答案】①L18 int n=strlen(s);
②L25 sortDesc(nums,idx);
2.下列程序的功能是:遍历 100~999 所有水仙花数,逐行写入文本文件后读取打印。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 int check(int num){
L3 int *p=num,a,b,c,sum;
L4 a=*p/100;
L5 b=(*p/10)%10;
L6 c=*p%10;
L7 sum=a*a*a+b*b*b+c*c*c;
L8 return sum==p?1:0;
L9 }
L10 int main(void){
L11 int i;char ch;
L12 FILE *fp;
L13 fp=fopen("narcissus.txt","w");
L14 for(i=100;i<=999;i++)
L15 if(check(i))
L16 fprintf(fp,"%d
",i);
L17 fclose(fp);
L18 fp=fopen("narcissus.txt","r");
L19 printf("三位数水仙花数:
");
L20 while((ch=fgetc(fp))!=EOF)
L21 putchar(ch);
L22 fclose(fp);
L23 remove("narcissus.txt");
L24 return 0;
L25 }
【答案】①L3 int *p=&num,a,b,c,sum;
②L8 return sum==*p?1:0;
3.下列程序的功能是:不定数量输入整数(以 0 结束输入),动态开辟数组存储,使用指针完成快速排序分区,升序输出全部数据。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 #include <stdlib.h>
L3 int partition(int *left,int *right)
L4 {
L5 int pivot,temp;
L6 int *p,*q;
L7 pivot = *left;
L8 p = left;
L9 q = right;
L10 while(p < q)
L11 {
L12 while(p<q && *q>=pivot) q--;
L13 temp = *p;*p=*q;*q=temp;
L14 while(p<q && *p<=pivot) p++;
L15 temp = *p;*p=*q;*q=temp;
L16 }
L17 p = pivot;
L18 return p-left;
L19 }
L20 void quickSort(int *arr,int l,int r)
L21 {
L22 int mid;
L23 if(l >= r) return;
L24 mid = l + partition(arr,arr);
L25 quickSort(arr,l,mid-1);
L26 quickSort(arr,mid+1,r);
L27 }
L28 int main(void)
L29 {
L30 int buf[200],n=0,x,i;
L31 int *dynArr;
L32 printf("输入任意整数,输入0结束:");
L33 while(1)
L34 {
L35 scanf("%d",&x);
L36 if(x == 0) break;
L37 buf[n++] = x;
L38 }
L39 dynArr = (int*)malloc(n*sizeof(int));
L40 if(dynArr == NULL)
L41 {
L42 printf("内存分配失败");
L43 return -1;
L44 }
L45 for(i=0;i<n;i++) dynArr+i = buf[i];
L46 quickSort(dynArr,0,n-1);
L47 printf("升序排序结果:");
L48 for(i=0;i<n;i++) printf("%d ",*(dynArr+i));
L49 free(dynArr);
L50 return 0;
L51 }
【答案】①L17 *p = pivot;
②L24 mid = l + partition(arr+l,arr+r);
③L45 for(i=0;i<n;i++) *(dynArr+i) = buf[i];
4.下列程序的功能是实现学生成绩信息的输入与输出,通过键盘输入学生成绩信息,保存到指定磁盘文件中,输入全部信息后,将磁盘文件中保存的信息输出到屏幕。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 struct student_score
L3 {
L4 char name[10];
L5 int num;
L6 int China;
L7 int Math;
L8 int English;
L9 } score[100];
L10 void save(char name, int n)
L11 {
L12 FILE *fp;
L13 int i;
L14 if ((fp = fopen(name, "wb")) == NULL)
L15 {
L16 printf("cannot open file
");
L17 return;
L18 }
L19 for (i = 0; i < n; i++)
L20 if (fwrite(&score[i],sizeof(struct student_score),1,fp)!=1)
L21 printf("file write error
");
L22 fclose(fp);
L23 }
L24 void show(char *name, int n)
L25 {
L26 int i;
L27 FILE *fp;
L28 if ((fopen(name, "rb")) == NULL)
L29 {
L30 printf("cannot open file
");
L31 return;
L32 } for (i = 0; i < n; i++)
L33 {
L34 fread(score[i], sizeof(struct student_score), 1, fp);
L35 printf("%-10s%4d%4d%4d%4d
",score[i].name,score[i].num,
score[i].China,score[i].Math,score[i].English);
L36 }
L37 fclose(fp);
L38 }
L39 main()
L40 {
L41 int i, n;
L42 char filename[50];
L43 printf("how many students in your class?
");
L44 scanf("%d", &n);
L45 printf("please input filename:
");
L46 scanf("%s", filename);
L47 printf("please input name,number,China,math,English:
");
L48 for (i = 0; i < n; i++)
L49 {
L50 printf("NO%d", i + 1);
L51 scanf("%s%d%d%d%d",score[i].name,&score[i].num,
&score[i].China,&score[i].Math,&score[i].English);
L52 save(filename, n);
L53 } show(filename, n);
L54 }
【答案】①L10 void save(char *name, int n)
②L28 if ((fp = fopen(name, "rb")) == NULL)
③L34 fread(&score[i], sizeof(struct student_score), 1, fp);
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
编写说明:湖南省普通高校对口招生专业理论考试《计算机应用类专业综合考纲百套卷》,依据《湖南省普通高校对口招生计算机应用类专业综合知识基本要求及考试大纲》编写。每门课程均分三层训练:基础层(具象化支架)拆解考点为微目标,紧扣考纲 “掌握”“理解” 要求编写考点训练卷;巩固层(关联性支架)强化知识交叉与场景关联,按考纲专题编专题训练卷;应用层(引导性支架)聚焦真题突破,结合知识模块与教材编写课程综合卷。
本试卷是第97卷,按《计算机编程语言——C语言》范围和要求编写。具体内容为:①C语言基础知识;②分支结构程序设计;③循环结构程序设计;④数组;⑤函数;⑥结构体和共用体;⑦指针、文件。
湖南省《计算机应用类专业综合考纲百套卷》 第97卷
《计算机编程语言——C语言》
课程综合卷
考试时间60分钟 满分100分
班级________姓名________学号________成绩________
一、单项选择题(本大题共10小题,每题2分,共20分)
1.设有语句:int x=12; x &= ~(1<<1); printf("%d",x);输出结果( )
A. 10 B. 12 C. 8 D. 14
2.关于 getchar () 函数说法正确的是( )
A. 返回值类型为 char B. 输入回车时返回值为 10
C. 无法读取空格、换行符 D. EOF 的 ASCII 码为 0
3.使用 scanf("%d%c",&a,&ch),输入 56#,ch 中存储的字符是( )
A. '5' B. '6' C. '#' D. 换行符
4.设有语句:int a=7,b=14,c=2; printf("%d", (c=a+b,a-5)); 输出结果为( )
A. 9 B. 16 C. 21 D. 2
5.关于 putchar 与 getchar 说法错误的是( )
A. getchar 每次读取单个字符,包含空格、换行
B. putchar 参数只能是字符或对应 ASCII 整型
C. putchar(getchar()) 实现读取一个字符并原样输出
D. getchar 读取数字字符可直接参与整数四则运算
6.下列关于算法 “可行性” 描述正确的是( )
A. 只要逻辑正确,超出硬件运算范围也算可行
B. 每一步操作都能通过有限次基础运算完成
C. 算法可以包含无限循环语句
D. 复杂数学公式无需拆解直接作为算法步骤
7.下列关于 C 语言程序结构,说法正确的是( )
A. 一个 C 程序可以包含多个 main 函数
B. C 语言程序最小执行单元是语句
C. 所有可执行代码必须写在函数内部
D. 函数外可以定义 if 分支语句
8.设有语句:int x=15,y=4,z; z = 2.8 + x / y; 执行后 z 的值为( )
A. 6 B. 5 C. 5.8 D. 6.8
9.设有定义int a=2,b=3; int res = a>1 || ++b; 执行后 b、res 的值为( )
A. b=3,res=1 B. b=4,res=1
C. b=3,res=0 D. b=4,res=0
10.摄氏转换公式 C=5/9*(F-32),float C,F; 正确无精度丢失的表达式( )
A. C=5/9*(F-32) B. C=(5.0/9)(F-32)
C. C=5/(9(F-32)) D. C=5*F-32/9
二、阅读程序,写出运行结果(本大题共10小题。每空2分,合计20分)
1.下列程序的运行结果是__________________。
#include <stdio.h>
int findTarget(int *arr, int len, int *val)
{ int *p = arr + 1;
while (p < arr + len - 1)
{ if (*p > *(p - 1) && *p < *(p + 1))
{ *val = *p;
return 1; }
p++;
}
return 0;
}
int main()
{ int arr[13]={9,3,7,2,8,13,5,4,6,2,7,3,9};
int i, num, flag;
flag = findTarget(arr, 13, &num);
if (flag == 1)
printf("目标元素:%d
", num);
else
printf("未找到符合条件的元素
");
return 0; }
2.下列程序的运行结果是__________________。
#include <stdio.h>
int *reverseArr(int *arr, int n)
{ int i = 0, j = n - 1 ,t;
while(i < j)
{ t = arr[i];
arr[i] = arr[j];
arr[j] = t;
i++;
j--;
}
return arr;
}
int main()
{ int data[] = {8, 1, 9, 3, 6};
int *p = reverseArr(data, 5);
printf("%d %d", *(p+1), *(p+3));
return 0; }
3.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{ FILE *fp;
int data[3] = {9,18,27};
int res;
fp = fopen("file19.dat", "wb+");
fwrite(data, sizeof(int), 3, fp);
fseek(fp, sizeof(int), SEEK_SET);
fread(&res, sizeof(int), 1, fp);
printf("%d ", res);
rewind(fp);
fread(&res, sizeof(int), 1, fp);
printf("%d", res);
fclose(fp);
return 0;}
4.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{
int year,leap,num;
year = 2300;
leap = year%4==0 && year%100!=0 || year%400==0;
switch(leap)
{
case 1:
if(year > 2000)
num = year / 400;
else
num = year / 100;
break;
case 0:
num = year % 100;
break;
}
printf("year=%d,leap=%d,num=%d",year,leap,num);
return 0;
}
5.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{
int num, i;
num = 0;
i = -4;
do
{
if (i % 2 == 0)
num += i * 3;
else
num -= i * 2;
i++;
} while (i <= 4);
printf("num=%d,i=%d", num, i);
return 0; }
6.下列程序的运行结果是__________________。
#include <stdio.h>
static int tri[10];
int triNum(int n)
{
int val;
if(n == 0)
return 0;
val = triNum(n - 1) + n;
tri[n - 1] = val;
return val;
}
int main(void)
{
int i;
triNum(6);
for(i = 0; i < 6; i++)
printf("%d ", tri[i]);
return 0;
}
7.下列程序的运行结果是__________________。
#include <stdio.h>
int getFactor(int n, int fac[], int pos)
{
if(n == 1)
return pos;
if(6 % n == 0 && n != 6)
{
fac[pos] = n;
pos = pos + 1;
}
pos = getFactor(n - 1, fac, pos);
return pos;
}
int sumFac(int f[], int len)
{
int i, s;
s = 0;
for(i = 0; i < len; i++)
s = s + f[i];
return s;
}
int main(void)
{
int factor[20];
int count, total,i;
count = getFactor(5, factor, 0);
for(i = 0; i < count; i++)
printf("%d ", factor[i]);
total = sumFac(factor, count);
printf("%d", total);
return 0;
}
8.下列程序的运行结果是__________________。
#include <stdio.h>
#include <stdlib.h>
struct Node{int x;struct Node *next;};
void swapV(struct Node *a,struct Node *b)
{int t=a->x;
a->x=b->x;
b->x=t;}
int main(void)
{ struct Node *n1,*n2;FILE *fp,*fr;char buf[30];
n1=(struct Node*)malloc(sizeof(struct Node));
n2=(struct Node*)malloc(sizeof(struct Node));
n1->x=36;
n2->x=58;
n1->next=n2;
n2->next=NULL;
swapV(n1,n2);
fp=fopen("swap.txt","w");
fprintf(fp,"X%dY%d",n1->x,n2->x);
fclose(fp);
fr=fopen("swap.txt","r");
fgets(buf,30,fr);
printf("%s",buf);
free(n1);free(n2);
return 0; }
9.下列程序的运行结果是__________________。
#include <stdio.h>
int getMax(int *arr, int l, int r)
{
int mid, leftMax, rightMax, m;
if(l == r)
return arr[l];
mid = (l + r) / 2;
leftMax = getMax(arr, l, mid);
rightMax = getMax(arr, mid + 1, r);
m = leftMax > rightMax ? leftMax : rightMax;
return m;
}
int main(void)
{
int a1[4] = {3, 9, 2, 7};
int a2[3] = {12, 4, 15};
int a3[5] = {6, 11, 8, 19, 5};
int *ptrArr[3] = {a1, a2, a3};
int len[3] = {4, 3, 5};
int total = 0, i, j;
for(i = 0; i < 3; i++)
{
for(j = 0; j < len[i]; j++)
{
int s;
for(s = j; s < len[i]; s++)
{
int val = getMax(ptrArr[i], j, s);
total += val;
}
}
}
printf("%d", total);
return 0;
}
10.下列程序的运行结果是__________________。
#include <stdio.h>
#include <stdlib.h>
void rotateRight(int *arr, int n, int k)
{
int i, j, tmp;
k = k % n;
for(i = 0; i < k; i++)
{
tmp = *(arr + n - 1);
for(j = n - 1; j > 0; j--)
*(arr + j) = *(arr + j - 1);
*arr = tmp;
}
}
int main(void)
{
int buf[6] = {2, 5, 9, 1, 7, 4};
int mod[3] = {10, -3, 6};
FILE *fp;
int sum = 0, i;
fp = fopen("tmp.dat", "wb");
fwrite(buf, sizeof(int), 6, fp);
fclose(fp);
fp = fopen("tmp.dat", "rb+");
fwrite(mod, sizeof(int), 3, fp);
fseek(fp, 0, SEEK_SET);
fread(buf, sizeof(int), 6, fp);
fclose(fp);
rotateRight(buf, 6, 2);
rotateRight(buf, 6, 4);
for(i = 0; i < 6; i++)
sum += buf[i];
printf("%d", sum);
remove("tmp.dat");
return 0;
}
三、程序填空。按照题目要求,将正确内容填入答题卡相应位置,使程序完整(每空2分,共计40分)
1.下列程序的功能是:自定义函数计算一个整数各位数字之和,再遍历数组,将数组每个元素替换为其各位数字之和,输出最终数组。
#include <stdio.h>
int digitSum(int n)
{ ________①_________
while (n != 0)
{ s += n % 10;
n =_________②_______ }
return s;
}
void transArr(int *arr, int len)
{ int *p = arr;
while (_________③________)
{ *p = ________④________
p++;}
}
int main()
{ int arr[6];
int i;
for (i = 0; i < 6; i++)
scanf("%d", &arr[i]);
________⑤________
for (i = 0; i < 6; i++)
printf("%d ", arr[i]);
return 0; }
2.输入 6 位生日数字,再输入 8 个随机数字;自定义函数拆分生日每一位存入数组,第二个函数统计随机数组中和生日任意数位相同的数字,第三个函数输出匹配星级:匹配≥4 颗★,2~3 颗☆,0~1 颗△。输出生日各位、原始随机数组、匹配数字列表、匹配星级评价。
输入6位生日数字:200805
输入8个随机整数:5 13 28 35 80 59 17 42
生日拆分各位:5 0 8 0 0 2
随机数字数组:5 13 28 35 80 59 17 42
包含生日数字的幸运数字:5 28 35 80 59 42
匹配总数:6
匹配幸运星级:★★★★ 本命超契合!
#include <stdio.h>
void splitBirth(int birth, int digit[], int len[])
{
int i = 0;
while(birth > 0)
{
digit[i] = __________①________
i++;
birth = birth / 10;
}
len[0] = ________②_______;
}
void matchNum(int src[], int n, int birthDig[], int digLen, int res[], int resLen[])
{
int i,j,cnt=0;
int flag,temp;
for(i=0;i<n;i++)
{
flag = 0;
temp = src[i];
while(temp>0)
{
int d = temp % 10;
for(j=0;j<digLen;j++)
{
if(__________③_________)
flag = 1;
}
temp /= 10;
}
if(flag == 1)
{
__________④__________
cnt++;
}
}
resLen[0] = _________⑤________
}
void showStar(int cnt)
{
printf("匹配幸运星级:");
if(cnt >= 4)
printf("★★★★ 本命超契合!");
else if(cnt >= 2)
printf("☆☆ 小有缘分");
else
printf("△ 缘分很浅");
}
int main(void)
{
int birth, random[8], birDig[6], matchBuf[8];
int i, birLen[1], matchCount[1];
printf("输入6位生日数字:");
scanf("%d", &birth);
printf("输入8个随机整数:");
for(i=0;i<8;i++)
scanf("%d", &random[i]);
splitBirth(birth, birDig, birLen);
matchNum(random,8,birDig,birLen[0],matchBuf,matchCount);
printf("生日拆分各位:");
for(i=0;i<birLen[0];i++)
printf("%d ", birDig[i]);
printf("
随机数字数组:");
for(i=0;i<8;i++)
printf("%d ", random[i]);
printf("
包含生日数字的幸运数字:");
for(i=0;i<matchCount[0];i++)
printf("%d ", matchBuf[i]);
printf("
匹配总数:%d
", matchCount[0]);
showStar(matchCount[0]);
return 0;
}
3.自守数:数字平方后末尾几位和自身完全相等(5、6、25、76 等)
内置链表[3,5,12,25,34,76,91],删除链表中非自守数节点,打印剩余链表,统计剩余节点数量。
#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(ListNode* head)
{
while (head != NULL)
{
printf("%d ", head->val);
___________①___________
}
printf("
");
}
int isAutomorphic(int n)
{
long powVal;
int mod, tmp;
powVal = (long)n * n;
mod = 10;
tmp = n;
while (tmp / 10 > 0)
{
mod *= 10;
________②________
}
return ___________③__________
}
ListNode* filterAuto(ListNode* head)
{
ListNode dummy;
ListNode *prev, *tmp;
dummy.next = head;
prev = &dummy;
while (head != NULL)
{
if (!isAutomorphic(head->val))
{
tmp = head;
head = head->next;
free(tmp);
___________④__________
}
else
{
prev = head;
___________⑤__________
}
}
return dummy.next;
}
int main(void)
{
int arr[] = {3,5,12,25,34,76,91};
int len = 7;
ListNode *head, *p;
int count = 0;
head = createList(arr, len);
p = filterAuto(head);
printList(p);
while (p != NULL)
{
count++;
p = p->next;
}
printf("剩余节点个数:%d", count);
return 0; }
4.用户分别输入两条链表长度与所有升序节点数值,将其合并为一条升序链表;
最后输出合并完成后的整条链表。
#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 = &dummy;
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);
head = head->next;
}
printf("
");
}
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2)
{
ListNode dummy;
ListNode *cur;
dummy.next = NULL;
cur = &dummy;
while (_____________①____________)
{
if (l1->val < l2->val)
{
cur->next = l1;
__________②__________
}
else
{
cur->next = l2;
l2 = l2->next;
}
___________③__________
}
if (l1 != NULL) cur->next = l1;
if (l2 != NULL) ________④_______
return dummy.next;
}
int main(void)
{
int n1, n2;
ListNode *l1, *l2, *merge, *p, *del;
printf("输入第一条链表长度:");
scanf("%d", &n1);
printf("依次输入第一条升序链表数据
");
l1 = createList(n1);
printf("输入第二条链表长度:");
scanf("%d", &n2);
printf("依次输入第二条升序链表数据
");
l2 = createList(n2);
printf("链表1:"); printList(l1);
printf("链表2:"); printList(l2);
__________⑤___________
printf("合并后有序链表:");
printList(merge);
p = merge;
while (p != NULL)
{
del = p;
p = p->next;
free(del);
}
return 0;
}
四、阅读程序:修改程序中的错误,不得增行或删行,也不得更改程序结构。请在答题卡中指出错误代码所在的行号,并给出该行修改后的程序代码。(每空2分,共计20分)
1.下列程序功能是:提取字符串中的数字,并将这些数字组成一个最大的数。程序运行结果是 9821。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 #include <string.h>
L3 void sortDesc(char *arr,int len){
L4 int i,j;
L5 for(i=0;i<len-1;i++){
L6 for(j=i+1;j<len;j++){
L7 if(arr[i]<arr[j]){
L8 char temp=arr[i];
L9 arr[i]=arr[j];
L10 arr[j]=temp;
L11 }
L12 }
L13 }
L14 }
L15 int main(){
L16 char s[12]="ab12c98df",nums[13];
L17 int idx=0,i;
L18 int n=len(s);
L19 for(i=0;i<n;i++){
L20 if(s[i]>='0'&&s[i]<='9'){
L21 nums[idx++]=s[i];
L22 }
L23 }
L24 nums[idx]='\0';
L25 sortDesc(s,idx);
L26 printf("%s
",nums);
L27 return 0;
L28 }
2.下列程序的功能是:遍历 100~999 所有水仙花数,逐行写入文本文件后读取打印。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 int check(int num){
L3 int *p=num,a,b,c,sum;
L4 a=*p/100;
L5 b=(*p/10)%10;
L6 c=*p%10;
L7 sum=a*a*a+b*b*b+c*c*c;
L8 return sum==p?1:0;
L9 }
L10 int main(void){
L11 int i;char ch;
L12 FILE *fp;
L13 fp=fopen("narcissus.txt","w");
L14 for(i=100;i<=999;i++)
L15 if(check(i))
L16 fprintf(fp,"%d
",i);
L17 fclose(fp);
L18 fp=fopen("narcissus.txt","r");
L19 printf("三位数水仙花数:
");
L20 while((ch=fgetc(fp))!=EOF)
L21 putchar(ch);
L22 fclose(fp);
L23 remove("narcissus.txt");
L24 return 0;
L25 }
3.下列程序的功能是:不定数量输入整数(以 0 结束输入),动态开辟数组存储,使用指针完成快速排序分区,升序输出全部数据。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 #include <stdlib.h>
L3 int partition(int *left,int *right)
L4 {
L5 int pivot,temp;
L6 int *p,*q;
L7 pivot = *left;
L8 p = left;
L9 q = right;
L10 while(p < q)
L11 {
L12 while(p<q && *q>=pivot) q--;
L13 temp = *p;*p=*q;*q=temp;
L14 while(p<q && *p<=pivot) p++;
L15 temp = *p;*p=*q;*q=temp;
L16 }
L17 p = pivot;
L18 return p-left;
L19 }
L20 void quickSort(int *arr,int l,int r)
L21 {
L22 int mid;
L23 if(l >= r) return;
L24 mid = l + partition(arr,arr);
L25 quickSort(arr,l,mid-1);
L26 quickSort(arr,mid+1,r);
L27 }
L28 int main(void)
L29 {
L30 int buf[200],n=0,x,i;
L31 int *dynArr;
L32 printf("输入任意整数,输入0结束:");
L33 while(1)
L34 {
L35 scanf("%d",&x);
L36 if(x == 0) break;
L37 buf[n++] = x;
L38 }
L39 dynArr = (int*)malloc(n*sizeof(int));
L40 if(dynArr == NULL)
L41 {
L42 printf("内存分配失败");
L43 return -1;
L44 }
L45 for(i=0;i<n;i++) dynArr+i = buf[i];
L46 quickSort(dynArr,0,n-1);
L47 printf("升序排序结果:");
L48 for(i=0;i<n;i++) printf("%d ",*(dynArr+i));
L49 free(dynArr);
L50 return 0;
L51 }
4.下列程序的功能是实现学生成绩信息的输入与输出,通过键盘输入学生成绩信息,保存到指定磁盘文件中,输入全部信息后,将磁盘文件中保存的信息输出到屏幕。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 struct student_score
L3 {
L4 char name[10];
L5 int num;
L6 int China;
L7 int Math;
L8 int English;
L9 } score[100];
L10 void save(char name, int n)
L11 {
L12 FILE *fp;
L13 int i;
L14 if ((fp = fopen(name, "wb")) == NULL)
L15 {
L16 printf("cannot open file
");
L17 return;
L18 }
L19 for (i = 0; i < n; i++)
L20 if (fwrite(&score[i],sizeof(struct student_score),1,fp)!=1)
L21 printf("file write error
");
L22 fclose(fp);
L23 }
L24 void show(char *name, int n)
L25 {
L26 int i;
L27 FILE *fp;
L28 if ((fopen(name, "rb")) == NULL)
L29 {
L30 printf("cannot open file
");
L31 return;
L32 } for (i = 0; i < n; i++)
L33 {
L34 fread(score[i], sizeof(struct student_score), 1, fp);
L35 printf("%-10s%4d%4d%4d%4d
",score[i].name,score[i].num,
score[i].China,score[i].Math,score[i].English);
L36 }
L37 fclose(fp);
L38 }
L39 main()
L40 {
L41 int i, n;
L42 char filename[50];
L43 printf("how many students in your class?
");
L44 scanf("%d", &n);
L45 printf("please input filename:
");
L46 scanf("%s", filename);
L47 printf("please input name,number,China,math,English:
");
L48 for (i = 0; i < n; i++)
L49 {
L50 printf("NO%d", i + 1);
L51 scanf("%s%d%d%d%d",score[i].name,&score[i].num,
&score[i].China,&score[i].Math,&score[i].English);
L52 save(filename, n);
L53 } show(filename, n);
L54 }
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$