内容正文:
编写说明:湖南省普通高校对口招生专业理论考试《计算机应用类专业综合考纲百套卷》,依据《湖南省普通高校对口招生计算机应用类专业综合知识基本要求及考试大纲》编写。每门课程均分三层训练:基础层(具象化支架)拆解考点为微目标,紧扣考纲 “掌握”“理解” 要求编写考点训练卷;巩固层(关联性支架)强化知识交叉与场景关联,按考纲专题编专题训练卷;应用层(引导性支架)聚焦真题突破,结合知识模块与教材编写课程综合卷。
本试卷是第95卷,按《计算机编程语言——C语言》范围和要求编写。具体内容为:①认识指针并通过指针引用一维数组;②通过指针引用多维数组和遍历字符串;③指针数组、多重指针、返回指针值的函数;④指向函数的指针、动态内存分配与指向它的指针变量;⑤文件的打开、关闭、读写、定位和文件结尾标志。
湖南省《计算机应用类专业综合考纲百套卷》 第95卷
《计算机编程语言——C语言》
指针、文件
专题训练卷
考试时间60分钟 满分100分
班级________姓名________学号________成绩________
一、单项选择题(本大题共15小题,每题2分,共30分)
1.执行以下程序的输出结果是( )
#include <stdio.h>
int *getMax(int *a, int n)
{ int i, idx = 0;
for(i = 1; i < n; i++)
{ if(a[i] > a[idx]) idx = i; }
return &a[idx];}
int main()
{ int num[] = {19, 56, 23, 88, 41};
int *p = getMax(num, 5);
printf("%d", *p);
return 0; }
A. 19 B. 56 C. 88 D. 41
2.执行以下程序的输出结果是( )
#include <stdio.h>
int main(void)
{ int a[4] = {2,6,1,9};
int *p = a + 1;
int *q = p + 2;
printf("%d", *q - *p);
return 0; }
A. 3 B. 8 C. -7 D. 5
3.执行以下程序的输出结果是( )
#include <stdio.h>
int main(void)
{ int num[6] = {3,1,4,1,5,9};
int *p = num,i;
for(i=0;i<3;i++) p++;
printf("%d", *p);
return 0; }
A. 4 B. 1 C. 5 D. 9
4.设有以下程序段,则val 的值为( )
int arr[5] = {10,20,30,40,50};
int *p = arr,val;
p += 3;
val = *(p - 2);
A. 10 B. 20 C. 30 D. 40
5.执行以下程序的输出结果是( )
#include <stdio.h>
int main(void)
{ int mat[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4] = mat;
p++;
printf("%d", *(*p + 2));
return 0; }
A. 3 B. 7 C. 11 D. 6
6.关于字符指针与字符串,下列代码运行无异常的是( )
A. char *s; scanf("%s",s);
B. char s[20]; char *p = s; p = "test";
C. char *p = "abc"; p[0] = 'x';
D. char s[] = "hello"; char *p = s; p++; putchar(*p);
7.执行以下程序的输出结果是( )
#include <stdio.h>
int getLen(char *str)
{ int cnt = 0;
while(*str != '\0')
{ cnt++; str++; }
return cnt;
}
int main(void)
{ char buf[] = "C2026";
int len = getLen(buf);
printf("%d", len);
return 0; }
A. 4 B. 5 C. 6 D. 7
8.执行以下程序段的输出结果是( )
char s[] = "Program";
char *p = s + 3;
*(p - 1) = 'X';
puts(s);
A. ProXram B. PrXgram C. PXogram D. Program
9.执行以下程序段的输出结果是( )
#include <stdio.h>
int * findMin(int a[], int n)
{ int *min = a,i;
for(i=1;i<n;i++)
if(*(a+i) < *min) min = a+i;
return min;}
int main(void)
{ int num[6] = {9,2,7,1,5,3};
int *res = findMin(num,6);
printf("%d", *res);
return 0; }
A. 1 B. 2 C. 3 D. 9
10.执行以下程序段的输出结果是( )
int x[] = {5,4,3,2,1};
int *ptr[3] = {x, x+1, x+2};
int **p = ptr;
printf("%d",*(*(p+2)+1));
A. 3 B. 2 C. 1 D. 4
11.以可读可写二进制方式打开data.bin,正确 fopen 参数是( )
A. fopen("data.bin","r+") B. fopen("data.bin","wb")
C. fopen("data.bin","rb+") D. fopen("data.bin","ab")
12.设有以下程序代码,则文本文件 test.txt 内存储内容是( )
FILE *fp = fopen("test.txt","w");
int arr[3] = {10,20,30};
fprintf(fp,"%d",arr[1]);
fclose(fp);
A. 10 B. 20 C. 30 D. 20 30
13.文件指针定位函数fseek(fp, offset, origin),origin 取 SEEK_END 代表( )
A. 文件起始位置 B. 当前读写位置 C. 文件末尾 D. 随机偏移
14.执行以下程序段的输出结果是( )
#include <stdio.h>
int getMin(int *p, int len)
{ int minVal = *p,k;
for(k = 1; k < len; k++)
{ if(*(p + k) < minVal)
minVal = *(p + k);
}
return minVal;
}
int main(void)
{ int num[4] = {18, 5, 42, 13};
int res = getMin(num + 1, 3);
printf("%d", res);
return 0; }
A. 5 B. 13 C. 18 D. 42
15.执行以下程序段的输出结果是( )
#include <stdio.h>
int main(void)
{ FILE *fp = fopen("offset.txt","w+");
char str[] = "ABCDEFG",ch;
fputs(str,fp);
fseek(fp,3,SEEK_SET);
ch = fgetc(fp);
fclose(fp);
printf("%c",ch);
return 0;}
A. A B. D C. C D. E
二、阅读程序,写出运行结果(本大题共10小题。每空2分,合计20分)
1.下列程序的运行结果是__________________。
#include <stdio.h>
void swapHalf(int *arr, int len)
{ int half = len / 2;
int i, t;
for (i = 0; i < half; i++)
{ t = *(arr + i);
*(arr + i) = *(arr + half + i);
*(arr + half + i) = t;
}
}
int main()
{ int arr[8]={1,2,3,4,5,6,7,8};
int i;
swapHalf(arr, 8);
for (i = 0; i < 8; i++)
printf("%d ", arr[i]);
return 0;}
2.下列程序的运行结果是__________________。
#include <stdio.h>
void reverseRange(int *arr, int l, int r)
{ int *left = arr + l;
int *right = arr + r;
int t;
while (left < right)
{ t = *left;
*left = *right;
*right = t;
left++;
right--;
}
}
int main()
{ int arr[12];
int i, L, R;
for (i = 0; i < 12; i++)
scanf("%d", &arr[i]);
scanf("%d %d", &L, &R);
reverseRange(arr, L, R);
for (i = 0; i < 12; i++)
printf("%d ", arr[i]);
return 0; }
/*从键盘输入:
1 2 3 4 5 6 7 8 9 10 11 12
2 7 */
3.下列程序的运行结果是__________________。
#include <stdio.h>
void uniqueStr(char s[])
{
int i = 0, j, k;
while (s[i])
{
j = i + 1;
while (s[j])
{
if (s[j] == s[i])
{
for(k = j; s[k]; k++)
s[k] = s[k+1];
}
else
j++;
}
i++;
}
}
int main()
{
char str[] = "aabbccddee";
uniqueStr(str);
puts(str);
return 0;
}
4.下列程序的运行结果是__________________。
#include <stdio.h>
void statChar(char *s, int *letter, int *digit)
{
*letter = 0;
*digit = 0;
while (*s)
{
if ((*s >= 'A' && *s <= 'Z') || (*s >= 'a' && *s <= 'z'))
(*letter)++;
else if (*s >= '0' && *s <= '9')
(*digit)++;
s++;
}
}
int main()
{
char buf[] = "C99 Language 2026";
int le, di;
statChar(buf, &le, &di);
printf("%d %d", le, di);
return 0;
}
5.下列程序的运行结果是__________________。
#include <stdio.h>
int countUpper(char *s)
{ int cnt = 0;
while (*s)
{ if (*s >= 'A' && *s <= 'Z')
cnt++;
s++;
}
return cnt;
}
int main()
{ char str[] = "ProGram123LanGuAge";
printf("%d", countUpper(str));
return 0; }
6.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{ FILE *fp;
char buf[6];
fp = fopen("file17.txt", "w");
fputs("LineOne
LineTwo", fp);
fclose(fp);
fp = fopen("file17.txt", "r");
fgets(buf, 6, fp);
fgets(buf, 6, fp);
printf("%s", buf);
fclose(fp);
return 0;}
7.下列程序的运行结果是__________________。
#include <stdio.h>
#include <stdlib.h>
struct Node{
int data;
struct Node *next;};
void saveList(struct Node *head, FILE *fp)
{ struct Node *p;
p = head;
while(p != NULL)
{ fwrite(&p->data, sizeof(int), 1, fp);
p = p->next; }
}
struct Node* create()
{ struct Node *h;
struct Node *nd;
int arr[] = {13, 27, 9, 41};
int i;
h = NULL;
for(i = 3; i >= 0; i--)
{ nd = (struct Node*)malloc(sizeof(struct Node));
nd->data = arr[i];
nd->next = h;
h = nd; }
return h;
}
int main(void)
{
struct Node *head;
FILE *fp;
FILE *fr;
int val;
int sum = 0;
struct Node *t;
head = create();
fp = fopen("link.dat", "wb");
saveList(head, fp);
fclose(fp);
fr = fopen("link.dat", "rb");
fseek(fr, sizeof(int)*2, SEEK_SET);
while(fread(&val, sizeof(int), 1, fr) == 1)
{ sum += val; }
fclose(fr);
while(head)
{ t = head;
head = head->next;
free(t); }
printf("%d", sum);
return 0; }
8.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{ char str[4][8] = {"Tower","Gate7","Sky9X","Box3"};
char (*row)[8];
char *p;
int cnt = 0;
row = str;
p = *(row + 1);
while(*p != '\0')
{ if(*p >= '0' && *p <= '9')
cnt += (*p - '0');
p++; }
printf("%d", cnt);
return 0; }
9.下列程序的运行结果是__________________。
#include <stdio.h>
#include <stdlib.h>
struct Node{int data;struct Node *next;};
int add5(int x){return x+5;}
int mul2(int x){return x*2;}
int main(void)
{
struct Node *n1,*n2;
int (*f[2])(int)={add5,mul2};
FILE *fp,*fr;char buf[32];
n1=(struct Node *)malloc(sizeof(struct Node));
n2=(struct Node *)malloc(sizeof(struct Node));
n1->data=6;
n2->data=11;
n1->next=n2;n2->next=NULL;
fp=fopen("f1.txt","w");
fprintf(fp,"%d%d",f[0](n1->data),f[1](n2->data));
fclose(fp);
fr=fopen("f1.txt","r");fgets(buf,32,fr);
printf("%s",buf);
free(n1);free(n2);
return 0; }
10.下列程序的运行结果是__________________。
#include <stdio.h>
#include <stdlib.h>
struct Link{int id;struct Link *next;};
int main(void)
{ struct Link *h,*cur,*del,*nd;
FILE *fp,*fr;
int arr[5]={12,4,36,19,52},i,a,b;
h=(struct Link *)malloc(sizeof(struct Link));
h->next=NULL;
for(i=0;i<5;i++){
nd=(struct Link *)malloc(sizeof(struct Link));
nd->id=arr[i];
nd->next=NULL;
cur=h;
while(cur->next)
cur=cur->next;
cur->next=nd;
}
fp=fopen("link.dat","wb");
cur=h->next;
while(cur)
{ fwrite(&cur->id,4,1,fp);
cur=cur->next;}
fclose(fp);
fr=fopen("link.dat","rb");
fseek(fr,8,SEEK_SET);
fread(&a,4,1,fr);
fread(&b,4,1,fr);
printf("%d%d",a,b);
while(h)
{ del=h;h=h->next;
free(del);}
return 0; }
三、程序填空。按照题目要求,将正确内容填入答题卡相应位置,使程序完整(每空2分,共计30分)
1.下列程序的功能是:输入一句英文(单词以空格分隔),利用字符指针实现:句子整体顺序不变,每个独立单词内部字符逆序。例:I love C → I evol C。
#include <stdio.h>
void reverseWord(char *start, char *end)
{
char temp;
while (start < end)
{
temp = *start;
*start = *end;
*end = temp;
start++;
end--;
}
}
void wordReverse(char *s)
{
char *wordStart = s;
while (________①________)
{
if (*s == ' ')
{
____________②___________
wordStart =________③________
}
s++;
}
reverseWord(wordStart, s - 1);
}
int main()
{
char sentence[250];
printf("请输入英文句子:");
gets(sentence);
wordReverse(sentence);
printf("单词反转后:%s
", sentence);
return 0; }
2.下列程序的功能是:尾插链表数据{12,7,15,4,21,8},删除能被 3 整除的节点,剩余数字求和输出。
#include <stdio.h>
#include <stdlib.h>
struct Node{int val;struct Node *next;};
struct Node* delMul3(struct Node *head)
{
struct Node *p,*pre,*tmp;
p = head;
pre = NULL;
while(p != NULL)
{
if(__________①_________)
{
tmp = p;
if(pre == NULL) head = p->next;
else _________②_________
p = p->next;
free(tmp);
}
else
{
pre = p;
_________③________
}
}
return head;
}
int main(void)
{
struct Node *h,*cur,*nd,*del;
int arr[6]={12,7,15,4,21,8},i,sum=0;
h = ____________④____________
h->next = NULL;
for(i=0;i<6;i++)
{
nd = (struct Node*)malloc(sizeof(struct Node));
nd->val = arr[i];
nd->next = NULL;
cur = h;
while(cur->next) cur = cur->next;
__________⑤_________
}
h = delMul3(h->next);
cur = h;
while(cur != NULL)
{
sum += cur->val;
cur = cur->next;
}
while(h != NULL)
{
del = h;
h = h->next;
free(del);
}
printf("%d",sum);
return 0;
}
3.下列程序的功能是:递归创建链表,计算链表元素的阶乘累加。
#include <stdio.h>
#include <stdlib.h>
struct Node{int num;struct Node *next;};
struct Node* recBuild(int n)
{
struct Node *nd;
if(n == 0) return NULL;
nd = (struct Node*)malloc(sizeof(struct Node));
nd->num = n;
nd->next = _________①________
return nd;
}
int fact(int x)
{
int res=1,i;
for(i=1;i<=x;i++) res *= i;
return res;
}
int main(void)
{
struct Node *h,*p,*del;
int sum=0;
h = recBuild(4);
p = h;
while(p != NULL)
{
sum += ________②_______;
________③________
}
while(h != NULL)
{
del = h;
h = h->next;
free(del);
}
printf("%d",sum);
return 0;
}
4.下列程序的功能是:创建链表[2,2,3,5,5,7],删除所有重复出现的数字(只要出现≥2 次,全部节点删除),输出处理后链表数字。
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
ListNode* deleteAllDup(ListNode* head)
{
ListNode dummy;
ListNode *prev;
int target;
ListNode *tmp;
dummy.next = head;
prev = &dummy;
while (head != NULL)
{
if (head->next != NULL && __________①_________)
{
target = head->val;
while (head != NULL && head->val == target)
{
tmp = head;
_________②________
free(tmp);
}
prev->next = head;
}
else
{
prev = head;
head = head->next;
}
}
return dummy.next;
}
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;
}
void printList(ListNode* head)
{
while (head != NULL)
{
printf("%d ", head->val);
head = head->next;
}
}
int main(void)
{
int arr[] = {2,2,3,5,5,7};
int len = 6;
ListNode *head;
ListNode *res;
head = createList(arr, len);
res = deleteAllDup(head);
printList(res);
return 0;
}
四、阅读程序:修改程序中的错误,不得增行或删行,也不得更改程序结构。请在答题卡中指出错误代码所在的行号,并给出该行修改后的程序代码。(每空2分,共计20分)
1.下列程序的功能是:二进制数组存储数字,删除重复数值后写入新文件,读取输出剩余数字和。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 int main(void)
L3 { int src[7] = {1,3,3,6,8,8,9};
L4 int dst[7];
L5 int i,j,idx=0,sum=0,tmp;
L6 file *fp1,*fp2,*fr;
L7 fp1 = fopen("src.bin","wb");
L8 fwrite(src,sizeof(int),7,fp1);
L9 fclose(fp1);
L10 for(i=0;i<7;i++)
L11 {
L12 int flag = 1;
L13 for(j=0;j<idx;j++)
L14 if(src[i]==dst[j]) flag=0;
L15 if(!flag) dst[idx++] = src[i];
L16 }
L17 fp2 = fopen("dst.bin","wb");
L18 fwrite(dst,sizeof(int),idx,fp2);
L19 fclose(fp2);
L20 fr = fopen("dst.bin","rb");
L21 while(fread(tmp,sizeof(int),1,fr)=1) sum+=tmp;
L22 fclose(fr);
L23 printf("%d",sum);
L24 return 0;
L25 }
2.下列程序的功能是:文本存储多组数字,筛掉合数,输出质数累加和。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 int isPrime(int n)
L3 {
L4 int i;
L5 if(n<=1)return 0;
L6 for(i=2;i*i<=n;i++) if(n%i!=0)return 0;
L7 return 1;
L8 }
L9 int main(void)
L10 {
L11 FILE *fp,*fr;
L12 int x,sum=0;
L13 fp = fopen("num.txt","r+");
L14 fprintf(fp,"4 5 8 11 14 17");
L15 fclose(fp);
L16 fr = fopen("num.txt","r");
L17 while(fscanf(fr,"%d",&x)==1)
L18 if(isPrime(x)) sum+=x;
L19 fclose(fr);
L20 printf("%d",sum);
L21 return 0;
L22 }
3.下列程序的功能是:fseek 跳跃读取二进制,两两交换数值,计算立方和。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 int cubeSum(int n)
L3 {
L4 int g=n%10,s=n/10;
L5 return s*s*s+g*g*g;
L6 }
L7 int main(void)
L8 {
L9 int arr[4]={12,25,31,46},tmp;
L10 FILE *fp,*fr;
L11 int total=0;
L12 fp=fopen("swap.bin","wb");
L13 fread(arr,sizeof(int),4,fp);
L14 fclose(fp);
L15 fr=fopen("swap.bin","rb+");
L16 fread(&tmp,4,1,fr);
L17 fseek(fr,4,SEEK_SET);
L18 fwrite(&arr[0],4,1,fr);
L19 fseek(fr,0,SEEK_SET);
L20 fwrite(&tmp,4,1,fr);
L21 fread(&tmp,4,1,fr);
L22 fseek(fr,12,SEEK_SET);
L23 fwrite(&arr[2],4,1,fr);
L24 fseek(fr,8,SEEK_SET);
L25 fwrite(&tmp,4,1,fr);
L26 fseek(fr,0,SEEK_SET);
L27 while(fread(&tmp,4,1,fr)==1)
L28 total=cubeSum(tmp);
L29 fclose(fr);
L30 printf("%d",total);
L31 return 0;
L32 }
4.下列程序的功能是:二进制存储平方数,筛选立方数输出总和。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 int isCube(int n)
L3 {
L4 int i;
L5 for(i=1;i*i*i<=n;i++)
L6 if(i*3==n)
L7 return 1;
L8 return 0;
L9 }
L10 int main(void)
L11 {
L12 int arr[6]={4,9,16,27,36,64},tmp,sum=0;
L13 FILE *fp,*fr;
L14 *fp=fopen("cube.bin","wb");
L15 fwrite(arr,sizeof(int),6,fp);
L16 fclose(fp);
L17 fr=fopen("cube.bin","rb");
L18 while(fwrite(tmp,4,1,fr)==1)
L19 if(isCube(tmp))
L20 sum+=tmp;
L21 fclose(fr);
L22 printf("%d",sum);
L23 return 0;
L24 }
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
编写说明:湖南省普通高校对口招生专业理论考试《计算机应用类专业综合考纲百套卷》,依据《湖南省普通高校对口招生计算机应用类专业综合知识基本要求及考试大纲》编写。每门课程均分三层训练:基础层(具象化支架)拆解考点为微目标,紧扣考纲 “掌握”“理解” 要求编写考点训练卷;巩固层(关联性支架)强化知识交叉与场景关联,按考纲专题编专题训练卷;应用层(引导性支架)聚焦真题突破,结合知识模块与教材编写课程综合卷。
本试卷是第95卷,按《计算机编程语言——C语言》范围和要求编写。具体内容为:①认识指针并通过指针引用一维数组;②通过指针引用多维数组和遍历字符串;③指针数组、多重指针、返回指针值的函数;④指向函数的指针、动态内存分配与指向它的指针变量;⑤文件的打开、关闭、读写、定位和文件结尾标志。
湖南省《计算机应用类专业综合考纲百套卷》 第95卷
《计算机编程语言——C语言》
指针、文件
专题训练卷
考试时间60分钟 满分100分
班级________姓名________学号________成绩________
一、单项选择题(本大题共15小题,每题2分,共30分)
1.执行以下程序的输出结果是( )
#include <stdio.h>
int *getMax(int *a, int n)
{ int i, idx = 0;
for(i = 1; i < n; i++)
{ if(a[i] > a[idx]) idx = i; }
return &a[idx];}
int main()
{ int num[] = {19, 56, 23, 88, 41};
int *p = getMax(num, 5);
printf("%d", *p);
return 0; }
A. 19 B. 56 C. 88 D. 41
【答案】C
【解析】返回指针的函数实现查找数组最大值地址,数组最大值为 88,解引用指针输出结果。
2.执行以下程序的输出结果是( )
#include <stdio.h>
int main(void)
{ int a[4] = {2,6,1,9};
int *p = a + 1;
int *q = p + 2;
printf("%d", *q - *p);
return 0; }
A. 3 B. 8 C. -7 D. 5
【答案】A
【解析】p=a+1→a [1]=6;q=p+2→a [3]=9;9-6=3。
3.执行以下程序的输出结果是( )
#include <stdio.h>
int main(void)
{ int num[6] = {3,1,4,1,5,9};
int *p = num,i;
for(i=0;i<3;i++) p++;
printf("%d", *p);
return 0; }
A. 4 B. 1 C. 5 D. 9
【答案】B
【解析】p 初始指向 num [0],循环 3 次自增后指向 num [3]=1。
4.设有以下程序段,则val 的值为( )
int arr[5] = {10,20,30,40,50};
int *p = arr,val;
p += 3;
val = *(p - 2);
A. 10 B. 20 C. 30 D. 40
【答案】B
【解析】p 指向 arr [3],p-2 回退两个元素,指向 arr [1]=20。
5.执行以下程序的输出结果是( )
#include <stdio.h>
int main(void)
{ int mat[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4] = mat;
p++;
printf("%d", *(*p + 2));
return 0; }
A. 3 B. 7 C. 11 D. 6
【答案】B
【解析】p 是行指针,p++ 指向第二行首地址;*p 取第二行一维数组指针,+2 偏移两列,mat [1][2]=7。
6.关于字符指针与字符串,下列代码运行无异常的是( )
A. char *s; scanf("%s",s);
B. char s[20]; char *p = s; p = "test";
C. char *p = "abc"; p[0] = 'x';
D. char s[] = "hello"; char *p = s; p++; putchar(*p);
【答案】D
【解析】A 野指针;B 数组名不可赋值;C 字符串常量不可修改;D 字符数组存储字符串,指针可偏移读取。
7.执行以下程序的输出结果是( )
#include <stdio.h>
int getLen(char *str)
{ int cnt = 0;
while(*str != '\0')
{ cnt++; str++; }
return cnt;
}
int main(void)
{ char buf[] = "C2026";
int len = getLen(buf);
printf("%d", len);
return 0; }
A. 4 B. 5 C. 6 D. 7
【答案】B
【解析】字符串"C2026"有效字符 5 个,不含结束符。
8.执行以下程序段的输出结果是( )
char s[] = "Program";
char *p = s + 3;
*(p - 1) = 'X';
puts(s);
A. ProXram B. PrXgram C. PXogram D. Program
【答案】B
【解析】p 指向 s [3]='g',p-1 指向 s [2]='o',修改为 X,字符串变为 PrXgram。
9.执行以下程序段的输出结果是( )
#include <stdio.h>
int * findMin(int a[], int n)
{ int *min = a,i;
for(i=1;i<n;i++)
if(*(a+i) < *min) min = a+i;
return min;}
int main(void)
{ int num[6] = {9,2,7,1,5,3};
int *res = findMin(num,6);
printf("%d", *res);
return 0; }
A. 1 B. 2 C. 3 D. 9
【答案】A
【解析】函数返回最小值元素的指针,最小值 1。
10.执行以下程序段的输出结果是( )
int x[] = {5,4,3,2,1};
int *ptr[3] = {x, x+1, x+2};
int **p = ptr;
printf("%d",*(*(p+2)+1));
A. 3 B. 2 C. 1 D. 4
【答案】B
【解析】p+2 取 ptr [2]=x+2;*(ptr [2]+1)=x [3]=2。
11.以可读可写二进制方式打开data.bin,正确 fopen 参数是( )
A. fopen("data.bin","r+") B. fopen("data.bin","wb")
C. fopen("data.bin","rb+") D. fopen("data.bin","ab")
【答案】C
【解析】rb+:二进制、可读可写;r + 是文本模式;wb 只写清空;ab 追加写。
12.设有以下程序代码,则文本文件 test.txt 内存储内容是( )
FILE *fp = fopen("test.txt","w");
int arr[3] = {10,20,30};
fprintf(fp,"%d",arr[1]);
fclose(fp);
A. 10 B. 20 C. 30 D. 20 30
【答案】B
【解析】arr [1]=20,格式化写入文本文件,仅保存字符 "20"。
13.文件指针定位函数fseek(fp, offset, origin),origin 取 SEEK_END 代表( )
A. 文件起始位置 B. 当前读写位置 C. 文件末尾 D. 随机偏移
【答案】C
【解析】SEEK_SET 文件头、SEEK_CUR 当前位置、SEEK_END 文件末尾。
14.执行以下程序段的输出结果是( )
#include <stdio.h>
int getMin(int *p, int len)
{ int minVal = *p,k;
for(k = 1; k < len; k++)
{ if(*(p + k) < minVal)
minVal = *(p + k);
}
return minVal;
}
int main(void)
{ int num[4] = {18, 5, 42, 13};
int res = getMin(num + 1, 3);
printf("%d", res);
return 0; }
A. 5 B. 13 C. 18 D. 42
【答案】A
【解析】传入起始指针为 num [1],遍历元素 5、42、13,最小值为 5。
15.执行以下程序段的输出结果是( )
#include <stdio.h>
int main(void)
{ FILE *fp = fopen("offset.txt","w+");
char str[] = "ABCDEFG",ch;
fputs(str,fp);
fseek(fp,3,SEEK_SET);
ch = fgetc(fp);
fclose(fp);
printf("%c",ch);
return 0;}
A. A B. D C. C D. E
【答案】B
【解析】SEEK_SET 从文件头偏移 3 字节,第 0 位 A、1B、2C、3D,读取字符 D。
二、阅读程序,写出运行结果(本大题共10小题。每空2分,合计20分)
1.下列程序的运行结果是__________________。
#include <stdio.h>
void swapHalf(int *arr, int len)
{ int half = len / 2;
int i, t;
for (i = 0; i < half; i++)
{ t = *(arr + i);
*(arr + i) = *(arr + half + i);
*(arr + half + i) = t;
}
}
int main()
{ int arr[8]={1,2,3,4,5,6,7,8};
int i;
swapHalf(arr, 8);
for (i = 0; i < 8; i++)
printf("%d ", arr[i]);
return 0;}
【答案】5 6 7 8 1 2 3 4
2.下列程序的运行结果是__________________。
#include <stdio.h>
void reverseRange(int *arr, int l, int r)
{ int *left = arr + l;
int *right = arr + r;
int t;
while (left < right)
{ t = *left;
*left = *right;
*right = t;
left++;
right--;
}
}
int main()
{ int arr[12];
int i, L, R;
for (i = 0; i < 12; i++)
scanf("%d", &arr[i]);
scanf("%d %d", &L, &R);
reverseRange(arr, L, R);
for (i = 0; i < 12; i++)
printf("%d ", arr[i]);
return 0; }
/*从键盘输入:
1 2 3 4 5 6 7 8 9 10 11 12
2 7 */
【答案】1 2 8 7 6 5 4 3 9 10 11 12
3.下列程序的运行结果是__________________。
#include <stdio.h>
void uniqueStr(char s[])
{
int i = 0, j, k;
while (s[i])
{
j = i + 1;
while (s[j])
{
if (s[j] == s[i])
{
for(k = j; s[k]; k++)
s[k] = s[k+1];
}
else
j++;
}
i++;
}
}
int main()
{
char str[] = "aabbccddee";
uniqueStr(str);
puts(str);
return 0;
}
【答案】abcde
4.下列程序的运行结果是__________________。
#include <stdio.h>
void statChar(char *s, int *letter, int *digit)
{
*letter = 0;
*digit = 0;
while (*s)
{
if ((*s >= 'A' && *s <= 'Z') || (*s >= 'a' && *s <= 'z'))
(*letter)++;
else if (*s >= '0' && *s <= '9')
(*digit)++;
s++;
}
}
int main()
{
char buf[] = "C99 Language 2026";
int le, di;
statChar(buf, &le, &di);
printf("%d %d", le, di);
return 0;
}
【答案】9 6
5.下列程序的运行结果是__________________。
#include <stdio.h>
int countUpper(char *s)
{ int cnt = 0;
while (*s)
{ if (*s >= 'A' && *s <= 'Z')
cnt++;
s++;
}
return cnt;
}
int main()
{ char str[] = "ProGram123LanGuAge";
printf("%d", countUpper(str));
return 0; }
【答案】5
6.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{ FILE *fp;
char buf[6];
fp = fopen("file17.txt", "w");
fputs("LineOne
LineTwo", fp);
fclose(fp);
fp = fopen("file17.txt", "r");
fgets(buf, 6, fp);
fgets(buf, 6, fp);
printf("%s", buf);
fclose(fp);
return 0;}
【答案】ne
7.下列程序的运行结果是__________________。
#include <stdio.h>
#include <stdlib.h>
struct Node{
int data;
struct Node *next;};
void saveList(struct Node *head, FILE *fp)
{ struct Node *p;
p = head;
while(p != NULL)
{ fwrite(&p->data, sizeof(int), 1, fp);
p = p->next; }
}
struct Node* create()
{ struct Node *h;
struct Node *nd;
int arr[] = {13, 27, 9, 41};
int i;
h = NULL;
for(i = 3; i >= 0; i--)
{ nd = (struct Node*)malloc(sizeof(struct Node));
nd->data = arr[i];
nd->next = h;
h = nd; }
return h;
}
int main(void)
{
struct Node *head;
FILE *fp;
FILE *fr;
int val;
int sum = 0;
struct Node *t;
head = create();
fp = fopen("link.dat", "wb");
saveList(head, fp);
fclose(fp);
fr = fopen("link.dat", "rb");
fseek(fr, sizeof(int)*2, SEEK_SET);
while(fread(&val, sizeof(int), 1, fr) == 1)
{ sum += val; }
fclose(fr);
while(head)
{ t = head;
head = head->next;
free(t); }
printf("%d", sum);
return 0; }
【答案】50
8.下列程序的运行结果是__________________。
#include <stdio.h>
int main(void)
{ char str[4][8] = {"Tower","Gate7","Sky9X","Box3"};
char (*row)[8];
char *p;
int cnt = 0;
row = str;
p = *(row + 1);
while(*p != '\0')
{ if(*p >= '0' && *p <= '9')
cnt += (*p - '0');
p++; }
printf("%d", cnt);
return 0; }
【答案】7
9.下列程序的运行结果是__________________。
#include <stdio.h>
#include <stdlib.h>
struct Node{int data;struct Node *next;};
int add5(int x){return x+5;}
int mul2(int x){return x*2;}
int main(void)
{
struct Node *n1,*n2;
int (*f[2])(int)={add5,mul2};
FILE *fp,*fr;char buf[32];
n1=(struct Node *)malloc(sizeof(struct Node));
n2=(struct Node *)malloc(sizeof(struct Node));
n1->data=6;
n2->data=11;
n1->next=n2;n2->next=NULL;
fp=fopen("f1.txt","w");
fprintf(fp,"%d%d",f[0](n1->data),f[1](n2->data));
fclose(fp);
fr=fopen("f1.txt","r");fgets(buf,32,fr);
printf("%s",buf);
free(n1);free(n2);
return 0; }
【答案】1122
10.下列程序的运行结果是__________________。
#include <stdio.h>
#include <stdlib.h>
struct Link{int id;struct Link *next;};
int main(void)
{ struct Link *h,*cur,*del,*nd;
FILE *fp,*fr;
int arr[5]={12,4,36,19,52},i,a,b;
h=(struct Link *)malloc(sizeof(struct Link));
h->next=NULL;
for(i=0;i<5;i++){
nd=(struct Link *)malloc(sizeof(struct Link));
nd->id=arr[i];
nd->next=NULL;
cur=h;
while(cur->next)
cur=cur->next;
cur->next=nd;
}
fp=fopen("link.dat","wb");
cur=h->next;
while(cur)
{ fwrite(&cur->id,4,1,fp);
cur=cur->next;}
fclose(fp);
fr=fopen("link.dat","rb");
fseek(fr,8,SEEK_SET);
fread(&a,4,1,fr);
fread(&b,4,1,fr);
printf("%d%d",a,b);
while(h)
{ del=h;h=h->next;
free(del);}
return 0; }
【答案】3619
三、程序填空。按照题目要求,将正确内容填入答题卡相应位置,使程序完整(每空2分,共计30分)
1.下列程序的功能是:输入一句英文(单词以空格分隔),利用字符指针实现:句子整体顺序不变,每个独立单词内部字符逆序。例:I love C → I evol C。
#include <stdio.h>
void reverseWord(char *start, char *end)
{
char temp;
while (start < end)
{
temp = *start;
*start = *end;
*end = temp;
start++;
end--;
}
}
void wordReverse(char *s)
{
char *wordStart = s;
while (________①________)
{
if (*s == ' ')
{
____________②___________
wordStart =________③________
}
s++;
}
reverseWord(wordStart, s - 1);
}
int main()
{
char sentence[250];
printf("请输入英文句子:");
gets(sentence);
wordReverse(sentence);
printf("单词反转后:%s
", sentence);
return 0; }
【答案】①*s != '\0' ②reverseWord(wordStart, s - 1);
③ s + 1;
2.下列程序的功能是:尾插链表数据{12,7,15,4,21,8},删除能被 3 整除的节点,剩余数字求和输出。
#include <stdio.h>
#include <stdlib.h>
struct Node{int val;struct Node *next;};
struct Node* delMul3(struct Node *head)
{
struct Node *p,*pre,*tmp;
p = head;
pre = NULL;
while(p != NULL)
{
if(__________①_________)
{
tmp = p;
if(pre == NULL) head = p->next;
else _________②_________
p = p->next;
free(tmp);
}
else
{
pre = p;
_________③________
}
}
return head;
}
int main(void)
{
struct Node *h,*cur,*nd,*del;
int arr[6]={12,7,15,4,21,8},i,sum=0;
h = ____________④____________
h->next = NULL;
for(i=0;i<6;i++)
{
nd = (struct Node*)malloc(sizeof(struct Node));
nd->val = arr[i];
nd->next = NULL;
cur = h;
while(cur->next) cur = cur->next;
__________⑤_________
}
h = delMul3(h->next);
cur = h;
while(cur != NULL)
{
sum += cur->val;
cur = cur->next;
}
while(h != NULL)
{
del = h;
h = h->next;
free(del);
}
printf("%d",sum);
return 0;
}
【答案】①p->val % 3 == 0 ②pre->next = p->next;
③p = p->next; ④(struct Node*)malloc(sizeof(struct Node));
⑤cur->next = nd;
3.下列程序的功能是:递归创建链表,计算链表元素的阶乘累加。
#include <stdio.h>
#include <stdlib.h>
struct Node{int num;struct Node *next;};
struct Node* recBuild(int n)
{
struct Node *nd;
if(n == 0) return NULL;
nd = (struct Node*)malloc(sizeof(struct Node));
nd->num = n;
nd->next = _________①________
return nd;
}
int fact(int x)
{
int res=1,i;
for(i=1;i<=x;i++) res *= i;
return res;
}
int main(void)
{
struct Node *h,*p,*del;
int sum=0;
h = recBuild(4);
p = h;
while(p != NULL)
{
sum += ________②_______;
________③________
}
while(h != NULL)
{
del = h;
h = h->next;
free(del);
}
printf("%d",sum);
return 0;
}
【答案】①recBuild(n-1); ②fact(p->num) ③p = p->next;
4.下列程序的功能是:创建链表[2,2,3,5,5,7],删除所有重复出现的数字(只要出现≥2 次,全部节点删除),输出处理后链表数字。
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
ListNode* deleteAllDup(ListNode* head)
{
ListNode dummy;
ListNode *prev;
int target;
ListNode *tmp;
dummy.next = head;
prev = &dummy;
while (head != NULL)
{
if (head->next != NULL && __________①_________)
{
target = head->val;
while (head != NULL && head->val == target)
{
tmp = head;
_________②________
free(tmp);
}
prev->next = head;
}
else
{
prev = head;
head = head->next;
}
}
return dummy.next;
}
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;
}
void printList(ListNode* head)
{
while (head != NULL)
{
printf("%d ", head->val);
head = head->next;
}
}
int main(void)
{
int arr[] = {2,2,3,5,5,7};
int len = 6;
ListNode *head;
ListNode *res;
head = createList(arr, len);
res = deleteAllDup(head);
printList(res);
return 0;
}
【答案】①head->val == head->next->val
②head = head->next; ③(ListNode*)malloc(sizeof(ListNode));
④tail->next = NULL;
四、阅读程序:修改程序中的错误,不得增行或删行,也不得更改程序结构。请在答题卡中指出错误代码所在的行号,并给出该行修改后的程序代码。(每空2分,共计20分)
1.下列程序的功能是:二进制数组存储数字,删除重复数值后写入新文件,读取输出剩余数字和。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 int main(void)
L3 { int src[7] = {1,3,3,6,8,8,9};
L4 int dst[7];
L5 int i,j,idx=0,sum=0,tmp;
L6 file *fp1,*fp2,*fr;
L7 fp1 = fopen("src.bin","wb");
L8 fwrite(src,sizeof(int),7,fp1);
L9 fclose(fp1);
L10 for(i=0;i<7;i++)
L11 {
L12 int flag = 1;
L13 for(j=0;j<idx;j++)
L14 if(src[i]==dst[j]) flag=0;
L15 if(!flag) dst[idx++] = src[i];
L16 }
L17 fp2 = fopen("dst.bin","wb");
L18 fwrite(dst,sizeof(int),idx,fp2);
L19 fclose(fp2);
L20 fr = fopen("dst.bin","rb");
L21 while(fread(tmp,sizeof(int),1,fr)=1) sum+=tmp;
L22 fclose(fr);
L23 printf("%d",sum);
L24 return 0;
L25 }
【答案】①L6 FILE *fp1,*fp2,*fr;
②L15 if(flag) dst[idx++] = src[i];
③L21 while(fread(&tmp,sizeof(int),1,fr)==1) sum+=tmp;
2.下列程序的功能是:文本存储多组数字,筛掉合数,输出质数累加和。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 int isPrime(int n)
L3 {
L4 int i;
L5 if(n<=1)return 0;
L6 for(i=2;i*i<=n;i++) if(n%i!=0)return 0;
L7 return 1;
L8 }
L9 int main(void)
L10 {
L11 FILE *fp,*fr;
L12 int x,sum=0;
L13 fp = fopen("num.txt","r+");
L14 fprintf(fp,"4 5 8 11 14 17");
L15 fclose(fp);
L16 fr = fopen("num.txt","r");
L17 while(fscanf(fr,"%d",&x)==1)
L18 if(isPrime(x)) sum+=x;
L19 fclose(fr);
L20 printf("%d",sum);
L21 return 0;
L22 }
【答案】①L6 for(i=2;i*i<=n;i++) if(n%i==0)return 0;
②L13 fp = fopen("num.txt","w");
3.下列程序的功能是:fseek 跳跃读取二进制,两两交换数值,计算立方和。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 int cubeSum(int n)
L3 {
L4 int g=n%10,s=n/10;
L5 return s*s*s+g*g*g;
L6 }
L7 int main(void)
L8 {
L9 int arr[4]={12,25,31,46},tmp;
L10 FILE *fp,*fr;
L11 int total=0;
L12 fp=fopen("swap.bin","wb");
L13 fread(arr,sizeof(int),4,fp);
L14 fclose(fp);
L15 fr=fopen("swap.bin","rb+");
L16 fread(&tmp,4,1,fr);
L17 fseek(fr,4,SEEK_SET);
L18 fwrite(&arr[0],4,1,fr);
L19 fseek(fr,0,SEEK_SET);
L20 fwrite(&tmp,4,1,fr);
L21 fread(&tmp,4,1,fr);
L22 fseek(fr,12,SEEK_SET);
L23 fwrite(&arr[2],4,1,fr);
L24 fseek(fr,8,SEEK_SET);
L25 fwrite(&tmp,4,1,fr);
L26 fseek(fr,0,SEEK_SET);
L27 while(fread(&tmp,4,1,fr)==1)
L28 total=cubeSum(tmp);
L29 fclose(fr);
L30 printf("%d",total);
L31 return 0;
L32 }
【答案】①L13 fwrite(arr,sizeof(int),4,fp);
②L28 total+=cubeSum(tmp);
4.下列程序的功能是:二进制存储平方数,筛选立方数输出总和。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 int isCube(int n)
L3 {
L4 int i;
L5 for(i=1;i*i*i<=n;i++)
L6 if(i*3==n)
L7 return 1;
L8 return 0;
L9 }
L10 int main(void)
L11 {
L12 int arr[6]={4,9,16,27,36,64},tmp,sum=0;
L13 FILE *fp,*fr;
L14 *fp=fopen("cube.bin","wb");
L15 fwrite(arr,sizeof(int),6,fp);
L16 fclose(fp);
L17 fr=fopen("cube.bin","rb");
L18 while(fwrite(tmp,4,1,fr)==1)
L19 if(isCube(tmp))
L20 sum+=tmp;
L21 fclose(fr);
L22 printf("%d",sum);
L23 return 0;
L24 }
【答案】①L6 if(i*i*i==n)
②L14 fp=fopen("cube.bin","wb");
③L18 while(fread(&tmp,4,1,fr)==1)
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$