内容正文:
编写说明:湖南省普通高校对口招生专业理论考试《计算机应用类专业综合考纲百套卷》,依据《湖南省普通高校对口招生计算机应用类专业综合知识基本要求及考试大纲》编写。每门课程均分三层训练:基础层(具象化支架)拆解考点为微目标,紧扣考纲 “掌握”“理解” 要求编写考点训练卷;巩固层(关联性支架)强化知识交叉与场景关联,按考纲专题编专题训练卷;应用层(引导性支架)聚焦真题突破,结合知识模块与教材编写课程综合卷。
本试卷是第84卷,按《计算机编程语言——C语言》范围和要求编写。具体内容为:①指针的概念;②指向简单变量的指针;③指针作为函数的参数;④一维数组指针的概念;⑤一维数组指针的运算;⑥一维数组指针作为函数的参数。
湖南省《计算机应用类专业综合考纲百套卷》 第84卷
《计算机编程语言——C语言》
认识指针并通过指针引用一维数组
考点训练卷
考试时间60分钟 满分100分
班级________姓名________学号________成绩________
一、单项选择题(本大题共15小题,每题2分,共30分)
1.(2022年)若“int a[9], *p=a;”,并在以后的语句中未改变p的值,则不能表示a[2]地址的是( )
A. p+2 B. a+2 C. p+=2 D. a+=2
2.已有定义 int a = 10, *p; 若要让指针p指向变量a,以下写法语法错误的是( )
A. p = &a; B. *p = a; C. int *p=&a; D. p = &a + 0;
3.执行代码片段:int x = 5, y; int *q = &x; y = *q; 则变量y的值为( )
A. 随机值 B. 5 C. x 的地址 D. 0
4.定义 int a = 3, b = 6, *p1 = &a, *p2 = &b; 执行p1 = p2;后,下列表达式结果为 3 的是( )
A. *p1 B. a C. *p2 D. b
5.编写函数实现交换两个整型变量的值,使用指针作为函数参数,下列函数能够完成实参交换功能的是( )
A.void swap(int x, int y){ int t=x;x=y;y=t; }
B.void swap(int *x, int *y){ int t=*x;*x=*y;*y=t; }
C.void swap(int *x, int *y){ int t=x;x=y;y=t; }
D.void swap(int x, int *y){ int t=x;x=*y;*y=t; }
6.执行以下程序代码段的输出结果是( )
#include <stdio.h>
void test(int *a){ *a = *a + 2; }
int main(){ int x = 8; test(&x); printf("%d",x); return 0; }
A. 8 B. 10 C. 2 D. 随机值
7.执行以下程序代码段的输出结果是( )
int a=15, b=20, *p=&a, *q=&b;
if(*p > *q) p = q;
printf("%d",*p);
A. 15 B. 20 C. 0 D. 报错
8.已知 int arr[4] = {10,20,30,40}; int *pt = &arr[1]; 则*pt的值为( )
A. 10 B. 20 C. 30 D. 40
9.定义 int nums[3] = {5,8,9}; int *p = nums; 表达式*(p+2)的结果是( )
A. 5 B. 8 C. 9 D. 随机值
10.设有代码 int arr[] = {2,4,6,8}; int *q = arr + 1; q = q + 1; 此时*q的值是( )
A. 2 B. 4 C. 6 D. 8
11.执行以下程序代码段后,s的值是( )
int s=0, i;
int b[4]={1,2,3,4};
int *p = b;
for(i=0;i<3;i++){ s += *(p+i); }
A. 6 B. 9 C. 10 D. 20
12.定义 int data[5] = {11,22,33,44,55}; int *ptr = &data[0]; 若执行ptr += 3;,则*ptr为( )
A. 22 B. 33 C. 44 D. 55
13.执行以下程序代码段的输出结果是( )
void calc(int *a){ *a = *a * 2; }
int main(){ int x[2]={3,7}; calc(x); printf("%d",x[0]); return 0; }
A. 3 B. 6 C. 7 D. 14
14.执行以下程序代码段的输出结果是( )
void add(int *p, int len){
int i;
for(i=0;i<len;i++) *(p+i) += 1; }
int main(){ int arr[3]={1,2,3}; add(arr,3);
printf("%d",arr[2]); return 0; }
A. 3 B. 4 C. 5 D. 6
15.执行以下程序代码段的输出结果是( )
#include <stdio.h>
void f(int *arr, int n){
int i;
for(i=0;i<n;i++){
if(*(arr+i) % 2 == 0)
*(arr+i) /= 2; }
}
int main(){ int t[3]={8,7,10}; f(t,3);
printf("%d",t[2]); return 0; }
A. 10 B. 5 C. 7 D. 4
二、阅读程序,写出运行结果(本大题共10小题。每空2分,合计20分)
1.(2025年)下列程序的运行结果是__________________。
#include <stdio.h>
#define N 5
int s(int n){
int t=0;
while(n){
t+=n%10;
n=n/10;
}
return t;
}
void f(int *a){
int i,j,t,si,sj;
for(i=1;i<N;i++){
si=s(a[i]);
for(j=0;j<i;j++){
sj=s(a[j]);
if(si>sj){
t=a[i],a[i]=a[j],a[j]=t;
}
}
}
}
int main(){
int a[N]={43,35,67,18,50};
int i;
f(a);
for(i=0;i<N;i++)
printf("%4d",a[i]);
printf("
");
return 0;
}
2.(2024年)下列程序的运行结果是__________________。
#include <stdio.h>
void fun(char *s)
{
char a[10]="C-STRING";
s=a;
}
int main()
{
char p[]="C-PROGRAM";
fun(p);
printf("%s
",p);
return 0;
}
3.(2024年)下列程序的运行结果是__________________。
#include <stdio.h>
int main()
{
int a[]={1,3,5,7,9};
int i,*p=a+2;
for(i=0;i<5;i++)
*p+=a[i++];
printf("*p=%d",*p);
return 0;
}
4.(2024年)下列程序的运行结果是__________________。
#include <stdio.h>
int b=2;
int fun(int *k)
{
b=*k+b;
return(b);
}
int main()
{
int a[10]={1,2,3,4,5,6,7,8},i ;
for(i=2;i<4;i++)
{
b=fun(&a[i])+b;
printf("%d+",b);
}
return 0;
}
5.(2023年)下列程序的运行结果是__________________。
#include <stdio.h>
void fun(char *s,char c)
{
int i,j,n;
for(i=0;s[i]!='\0';i++)
if(s[i]==c)
{
n=0;
while(s[i+1+n]!='\0') n++;
for(j=i+n+1;j>i;j--) s[j+1]=s[j];
s[j+1]=c;
i=i+1;
}
}
int main()
{
char s[80]="baacda",c='a';
fun(s,c);
printf("result: %s
",s);
}
6.下列程序的运行结果是__________________。
#include <stdio.h>
int getMin(int *arr, int n)
{
int i, min = *arr;
int *p = arr;
for(i = 1; i < n; i++)
{
if(*(p + i) < min)
min = *(p + i);
}
return min;
}
int main()
{
int b[5] = {9, 3, 17, 2, 10};
printf("%d", getMin(b, 5));
return 0; }
7.下列程序的运行结果是__________________。
#include <stdio.h>
void rev(int *s, int len)
{
int i, t;
int *left = s;
int *right = s + len - 1;
while(left < right)
{
t = *left;
*left = *right;
*right = t;
left++;
right--;
}
}
int main()
{
int f[4] = {6, 2, 8, 4};
rev(f, 4);
printf("%d %d", f[0], f[1]);
return 0;
}
8.下列程序的运行结果是__________________。
#include <stdio.h>
#define M 6
int judge(int x)
{
if(x > 10)
return 1;
return 0;
}
void filter(int *a)
{
int i;
for(i = 0; i < M; i++)
{
if(judge(*(a+i)))
*(a+i) /= 2;
}
}
int main()
{ int *p;
int h[M] = {9, 14, 7, 22, 11, 5};
filter(h);
p = h;
printf("%d %d", *(p+1), *(p+4));
return 0;
}
9.下列程序的运行结果是__________________。
#include <stdio.h>
void sort(int *arr, int n)
{
int i, j;
for(i = 1; i < n; i++)
{
int *p = arr + i;
for(j = 0; j < i; j++)
{
int *q = arr + j;
if(*p < *q)
{
int t = *p;
*p = *q;
*q = t;
}
}
}
}
int main()
{ int *pt;
int z[5] = {26, 14, 31, 8, 22};
sort(z, 5);
pt = z;
printf("%d %d %d", *pt, *(pt+2), *(pt+4));
return 0;
}
10.下列程序的运行结果是__________________。
#include <stdio.h>
#define LEN 5
int check(int val)
{
if(val % 3 == 0)
return 1;
return 0;
}
void sortOp(int *a)
{
int i, j;
int *p, *q;
for(i = 1; i < LEN; i++)
{
p = a + i;
for(j = 0; j < i; j++)
{
q = a + j;
if(check(*p) && !check(*q))
{
int temp = *p;
*p = *q;
*q = temp;
}
}
}
}
int main()
{ int *pt;
int x[LEN] = {7, 12, 4, 15, 8};
sortOp(x);
pt = x;
printf("%d %d %d", *pt, *(pt+2), *(pt+4));
return 0;
}
三、程序填空。按照题目要求,将正确内容填入答题卡相应位置,使程序完整(每空2分,共计30分)
1.功能描述:程序接收两个长度相同的一维整型数组,按照规则生成新数组:若对应位置两个元素之和为偶数,新数组该位置存储两数之差;若和为奇数,新数组该位置存储两数之和。最终输出生成的新数组。
#include <stdio.h>
void mergeArr(int *a, int *b, int *c, int len)
{ int *p1 = a, *p2 = b, *p3 = c;
while (p1 <_______①_____)
{ if (_________②_________)
*p3 = *p1 - *p2;
else
*p3 = ________③________
p1++;
p2++;
p3++;
}
}
int main()
{ int arr1[8], arr2[8], arr3[8];
int i, n = 8;
for (i = 0; i < n; i++)
scanf("%d", &arr1[i]);
for (i = 0; i < n; i++)
scanf("%d", &arr2[i]);
_____________④_____________
for (i = 0; i < n; i++)
printf("%d ", arr3[i]);
return 0; }
2.下列程序的功能是:将数组中所有位于最大值左侧的元素统一翻倍,最大值右侧的元素统一减半(整数除法),最大值本身保持不变,最后输出处理后的完整数组。
#include <stdio.h>
int findMaxPos(int *arr, int len)
{ int max = *arr;
int pos = 0;
int *p = arr + 1;
while (p < arr + len)
{ if (_________①________)
{
max = *p;
_________②________
}
p++;
}
_________③_________
}
void handleArr(int *arr, int len, int pos)
{ int *p = arr;
while (_________④_______)
{
if (p - arr < pos)
{ *p *= 2; }
else if (p - arr > pos)
{ *p /= 2; }
p++;
}
}
int main()
{ int data[10];
int i, n = 10, idx;
for (i = 0; i < n; i++)
scanf("%d", &data[i]);
idx = __________⑤___________;
handleArr(data, n, idx);
for (i = 0; i < n; i++)
printf("%d ", data[i]);
return 0; }
3.下列程序的功能是:实现数组整体循环左移 k 位。例如数组 {1,2,3,4,5} 左移2位后结果为 {3,4,5,1,2},程序接收原数组与移位位数,输出移位后的数组。
#include <stdio.h>
void leftMove(int *arr, int len, int k)
{ int i, j;
int temp;
for (i = 0; i < k; i++)
{
temp = _____①_____;
for (j = 0; j < len - 1; j++)
{
*(arr + j) = _______②_______;
}
_________③__________
}
}
int main()
{
int a[7];
int i, n = 7, k;
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
scanf("%d", &k);
leftMove(a, n, k);
for (i = 0; i < n; i++)
printf("%d ", a[i]);
return 0; }
4.下列程序的功能是:找出一维数组中最大值和最小值的位置,交换这两个位置上的元素,输出交换后的数组。若存在多个最值,取最先出现的最值位置。
#include <stdio.h>
void getMinMaxPos(int *arr, int len, int *minP, int *maxP)
{ int *p = arr;
*minP = 0;
*maxP = 0;
p++;
while (p < arr + len)
{
if (__________①_________)
*minP = p - arr;
if (*p > *(arr + *maxP))
*maxP = p - arr;
p++;
}
}
void swapElem(int *arr, int pos1, int pos2)
{
int t = *(arr + pos1);
_____________②_____________
*(arr + pos2) = t;
}
int main()
{ int arr[9];
int i, minIdx, maxIdx;
for (i = 0; i < 9; i++)
scanf("%d", &arr[i]);
getMinMaxPos(arr, 9, &minIdx, &maxIdx);
____________③_____________
for (i = 0; i < 9; i++)
printf("%d ", arr[i]);
return 0; }
四、阅读程序:修改程序中的错误,不得增行或删行,也不得更改程序结构。请在答题卡中指出错误代码所在的行号,并给出该行修改后的程序代码。(每空2分,共计20分)
1.功能描述:给定一个一维整型数组,程序统计数组中每一组连续递增序列的长度,并输出所有连续递增序列的最大长度。连续递增定义:后一个元素严格大于前一个元素。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 void getMaxIncLen(int *arr, int len, int *maxLen)
L3 { int cur = 1,*p;
L4 *maxLen = 1;
L5 p = arr + 1;
L6 while (p < arr + len)
L7 { if (*p > *(p - 1))
L8 cur++;
L9 else
L10 cur = 1;
L11 if (cur > maxLen)
L12 *maxLen = cur;
L13 p++;
L14 }
L15 }
L16 int main()
L17 { int arr[15];
L18 int n = 15, i, res;
L19 for (i = 0; i < n; i++)
L20 scanf("%d", &arr[i]);
L21 getMaxIncLen(arr, n, res);
L22 printf("最长严格递增序列长度:%d
", res);
L23 return 0; }
2.下列程序中,计算一维数组中所有下标为偶数的元素之和与所有下标为奇数的元素之和,并输出两个和值。。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 void calcSum(int arr, int len, int sumEven, int sumOdd)
L3 { int *p = arr;
L4 int idx = 0;
L5 *sumEven = 0;
L6 *sumOdd = 0;
L7 while (p < arr + len)
L8 {
L9 if (idx / 2 == 0)
L10 *sumEven += *p;
L11 else
L12 *sumOdd += *p;
L13 p++;
L14 idx++;
L15 }
L16 }
L17 int main()
L18 { int arr[12];
L19 int i, s1, s2;
L20 for (i = 0; i < 12; i++)
L21 scanf("%d", &arr[i]);
L22 calcSum(arr, 12, &s1, &s2);
L23 printf("偶数下标元素和:%d
", s1);
L24 printf("奇数下标元素和:%d
", s2);
L25 return 0; }
3.(2024年)下列程序功能是:利用排序算法对无序数组进行升序(从小到大)排序。算法原理是:在一轮循环中,把每个数组元素与它后面的所有元素比较,如有元素比它小,则进行交换。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 #define N 10
L3 int my_sort(int *a,int n)
L4 {
L5 int i,j,temp;
L6 for(i=0;i<n;i++)
L7 {
L8 for(j=i+1;j<n;j++)
L9 {
L10 if(a[j]>a[i])
L11 {
L12 temp=a[i];
L13 a[i]=a[j];
L14 a[j]=a[i];
L15 }
L16 }
L17 }
L18 return 0;
L19 }
L20 void main()
L21 {
L22 int d[N]={-3,14,7,9,5,45,67,189,200,180};
L23 int k=0;
L24 printf("before sort:\r
");
L25 for(;k<N;k++)
L26 printf("%d ",d[k]);
L27 my_sort(d);
L28 printf("\r
after sort:\r
");
L29 for(k=0;k<N;k++)
L30 printf("%d ",d[k]);
L31 }
4.下列程序的功能是:统计一维数组中大于数组平均值的元素个数与小于平均值(含小数位)的元素个数,等于平均值的元素不统计,最终输出两个统计结果。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 double getAverage(int *arr, int len)
L3 { int sum = 0;
L4 int *p = arr;
L5 while (p < arr + len)
L6 { sum += p;
L7 p++; }
L8 return sum / len; }
L9 void countByAvg(int *arr,int len,double avg,int *cntBig,int *cntSmall)
L10 { int *p = arr;
L11 *cntBig = 0;
L12 *cntSmall = 0;
L13 while (p < arr + len)
L14 { if (*p > avg)
L15 (*cntBig)++;
L16 else if (*p < avg)
L17 (*cntSmall)++;
L18 p++;
L19 }
L20 }
L21 int main()
L22 { int data[11];
L23 int i, big, small;
L24 double avg;
L25 for (i = 0; i < 11; i++)
L26 scanf("%d", &data[i]);
L27 avg = getAverage(data, 11);
L28 countByAvg(data, 11, avg, big, small);
L29 printf("大于平均值元素个数:%d
", big);
L30 printf("小于平均值元素个数:%d
", small);
L31 return 0; }
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
编写说明:湖南省普通高校对口招生专业理论考试《计算机应用类专业综合考纲百套卷》,依据《湖南省普通高校对口招生计算机应用类专业综合知识基本要求及考试大纲》编写。每门课程均分三层训练:基础层(具象化支架)拆解考点为微目标,紧扣考纲 “掌握”“理解” 要求编写考点训练卷;巩固层(关联性支架)强化知识交叉与场景关联,按考纲专题编专题训练卷;应用层(引导性支架)聚焦真题突破,结合知识模块与教材编写课程综合卷。
本试卷是第84卷,按《计算机编程语言——C语言》范围和要求编写。具体内容为:①指针的概念;②指向简单变量的指针;③指针作为函数的参数;④一维数组指针的概念;⑤一维数组指针的运算;⑥一维数组指针作为函数的参数。
湖南省《计算机应用类专业综合考纲百套卷》 第84卷
《计算机编程语言——C语言》
认识指针并通过指针引用一维数组
考点训练卷
考试时间60分钟 满分100分
班级________姓名________学号________成绩________
一、单项选择题(本大题共15小题,每题2分,共30分)
1.(2022年)若“int a[9], *p=a;”,并在以后的语句中未改变p的值,则不能表示a[2]地址的是( )
A. p+2 B. a+2 C. p+=2 D. a+=2
【答案】D
【解析】A、B选项:p+2 和 a+2 均为合法的指针运算,直接计算出 a[2] 的地址,且不改变原变量的值。
C选项:p 是指针变量,p+=2 语法合法,其运算结果也是 a[2] 的地址。
D选项:数组名 a 是指针常量,代表固定的首地址,不能作为左值被修改。因此 a+=2 是非法的语法错误。
2.已有定义 int a = 10, *p; 若要让指针p指向变量a,以下写法语法错误的是( )
A. p = &a; B. *p = a; C. int *p=&a; D. p = &a + 0;
【答案】B
【解析】*p表示取指针指向空间的值,此时p未初始化,指向随机内存,赋值会引发非法访问,无法实现指针指向a。
3.执行代码片段:int x = 5, y; int *q = &x; y = *q; 则变量y的值为( )
A. 随机值 B. 5 C. x 的地址 D. 0
【答案】B
【解析】q指向x,*q等价于取x的值,因此y=5。
4.定义 int a = 3, b = 6, *p1 = &a, *p2 = &b; 执行p1 = p2;后,下列表达式结果为 3 的是( )
A. *p1 B. a C. *p2 D. b
【答案】B
【解析】p1 = p2让p1指向b,*p1=6,变量a本身值仍为 3。
5.编写函数实现交换两个整型变量的值,使用指针作为函数参数,下列函数能够完成实参交换功能的是( )
A.void swap(int x, int y){ int t=x;x=y;y=t; }
B.void swap(int *x, int *y){ int t=*x;*x=*y;*y=t; }
C.void swap(int *x, int *y){ int t=x;x=y;y=t; }
D.void swap(int x, int *y){ int t=x;x=*y;*y=t; }
【答案】B
【解析】A 为值传递,无法修改实参;C 仅交换指针地址,不改变变量值;D 参数类型不匹配,逻辑错误;B 通过解引用修改实参原值。
6.执行以下程序代码段的输出结果是( )
#include <stdio.h>
void test(int *a){ *a = *a + 2; }
int main(){ int x = 8; test(&x); printf("%d",x); return 0; }
A. 8 B. 10 C. 2 D. 随机值
【答案】B
【解析】指针作参数传递x的地址,函数内修改*a即修改x,8+2=10。
7.执行以下程序代码段的输出结果是( )
int a=15, b=20, *p=&a, *q=&b;
if(*p > *q) p = q;
printf("%d",*p);
A. 15 B. 20 C. 0 D. 报错
【答案】A
【解析】*p=15,*q=20,判断条件为假,指针p保持指向a,最终输出 15。
8.已知 int arr[4] = {10,20,30,40}; int *pt = &arr[1]; 则*pt的值为( )
A. 10 B. 20 C. 30 D. 40
【答案】B
【解析】&arr[1]是数组第二个元素地址,pt指向该元素,解引用取值为 20。
9.定义 int nums[3] = {5,8,9}; int *p = nums; 表达式*(p+2)的结果是( )
A. 5 B. 8 C. 9 D. 随机值
【答案】C
【解析】p+2表示指针向后偏移 2 个 int 单元,指向数组第 3 个元素,解引用结果为 9。
10.设有代码 int arr[] = {2,4,6,8}; int *q = arr + 1; q = q + 1; 此时*q的值是( )
A. 2 B. 4 C. 6 D. 8
【答案】C
【解析】arr+1指向第二个元素 4,再q+1指向第三个元素 6,解引用为 6。
11.执行以下程序代码段后,s的值是( )
int s=0, i;
int b[4]={1,2,3,4};
int *p = b;
for(i=0;i<3;i++){ s += *(p+i); }
A. 6 B. 9 C. 10 D. 20
【答案】A
【解析】累加*(p+0)、*(p+1)、*(p+2),即 1+2+3=6。
12.定义 int data[5] = {11,22,33,44,55}; int *ptr = &data[0]; 若执行ptr += 3;,则*ptr为( )
A. 22 B. 33 C. 44 D. 55
【答案】C
【解析】ptr初始指向首元素,偏移 3 个 int 单元后指向第 4 个元素 44。
13.执行以下程序代码段的输出结果是( )
void calc(int *a){ *a = *a * 2; }
int main(){ int x[2]={3,7}; calc(x); printf("%d",x[0]); return 0; }
A. 3 B. 6 C. 7 D. 14
【答案】B
【解析】x传递数组首元素地址,函数修改首元素值,3*2=6。
14.执行以下程序代码段的输出结果是( )
void add(int *p, int len){
int i;
for(i=0;i<len;i++) *(p+i) += 1; }
int main(){ int arr[3]={1,2,3}; add(arr,3);
printf("%d",arr[2]); return 0; }
A. 3 B. 4 C. 5 D. 6
【答案】B
【解析】遍历数组每个元素自增 1,第三个元素 3+1=4。
15.执行以下程序代码段的输出结果是( )
#include <stdio.h>
void f(int *arr, int n){
int i;
for(i=0;i<n;i++){
if(*(arr+i) % 2 == 0)
*(arr+i) /= 2; }
}
int main(){ int t[3]={8,7,10}; f(t,3);
printf("%d",t[2]); return 0; }
A. 10 B. 5 C. 7 D. 4
【答案】B
【解析】遍历数组,偶数元素除以 2,第三个元素 10 是偶数,10/2=5。
二、阅读程序,写出运行结果(本大题共10小题。每空2分,合计20分)
1.(2025年)下列程序的运行结果是__________________。
#include <stdio.h>
#define N 5
int s(int n){
int t=0;
while(n){
t+=n%10;
n=n/10;
}
return t;
}
void f(int *a){
int i,j,t,si,sj;
for(i=1;i<N;i++){
si=s(a[i]);
for(j=0;j<i;j++){
sj=s(a[j]);
if(si>sj){
t=a[i],a[i]=a[j],a[j]=t;
}
}
}
}
int main(){
int a[N]={43,35,67,18,50};
int i;
f(a);
for(i=0;i<N;i++)
printf("%4d",a[i]);
printf("
");
return 0;
}
【答案】 67 18 35 43 50
2.(2024年)下列程序的运行结果是__________________。
#include <stdio.h>
void fun(char *s)
{
char a[10]="C-STRING";
s=a;
}
int main()
{
char p[]="C-PROGRAM";
fun(p);
printf("%s
",p);
return 0;
}
【答案】C-PROGRAM
3.(2024年)下列程序的运行结果是__________________。
#include <stdio.h>
int main()
{
int a[]={1,3,5,7,9};
int i,*p=a+2;
for(i=0;i<5;i++)
*p+=a[i++];
printf("*p=%d",*p);
return 0;
}
【答案】*p=21
4.(2024年)下列程序的运行结果是__________________。
#include <stdio.h>
int b=2;
int fun(int *k)
{
b=*k+b;
return(b);
}
int main()
{
int a[10]={1,2,3,4,5,6,7,8},i ;
for(i=2;i<4;i++)
{
b=fun(&a[i])+b;
printf("%d+",b);
}
return 0;
}
【答案】10+28+
5.(2023年)下列程序的运行结果是__________________。
#include <stdio.h>
void fun(char *s,char c)
{
int i,j,n;
for(i=0;s[i]!='\0';i++)
if(s[i]==c)
{
n=0;
while(s[i+1+n]!='\0') n++;
for(j=i+n+1;j>i;j--) s[j+1]=s[j];
s[j+1]=c;
i=i+1;
}
}
int main()
{
char s[80]="baacda",c='a';
fun(s,c);
printf("result: %s
",s);
}
【答案】result: baaaacdaa
6.下列程序的运行结果是__________________。
#include <stdio.h>
int getMin(int *arr, int n)
{
int i, min = *arr;
int *p = arr;
for(i = 1; i < n; i++)
{
if(*(p + i) < min)
min = *(p + i);
}
return min;
}
int main()
{
int b[5] = {9, 3, 17, 2, 10};
printf("%d", getMin(b, 5));
return 0; }
【答案】2
7.下列程序的运行结果是__________________。
#include <stdio.h>
void rev(int *s, int len)
{
int i, t;
int *left = s;
int *right = s + len - 1;
while(left < right)
{
t = *left;
*left = *right;
*right = t;
left++;
right--;
}
}
int main()
{
int f[4] = {6, 2, 8, 4};
rev(f, 4);
printf("%d %d", f[0], f[1]);
return 0;
}
【答案】4 8
8.下列程序的运行结果是__________________。
#include <stdio.h>
#define M 6
int judge(int x)
{
if(x > 10)
return 1;
return 0;
}
void filter(int *a)
{
int i;
for(i = 0; i < M; i++)
{
if(judge(*(a+i)))
*(a+i) /= 2;
}
}
int main()
{ int *p;
int h[M] = {9, 14, 7, 22, 11, 5};
filter(h);
p = h;
printf("%d %d", *(p+1), *(p+4));
return 0;
}
【答案】7 5
9.下列程序的运行结果是__________________。
#include <stdio.h>
void sort(int *arr, int n)
{
int i, j;
for(i = 1; i < n; i++)
{
int *p = arr + i;
for(j = 0; j < i; j++)
{
int *q = arr + j;
if(*p < *q)
{
int t = *p;
*p = *q;
*q = t;
}
}
}
}
int main()
{ int *pt;
int z[5] = {26, 14, 31, 8, 22};
sort(z, 5);
pt = z;
printf("%d %d %d", *pt, *(pt+2), *(pt+4));
return 0;
}
【答案】8 22 31
10.下列程序的运行结果是__________________。
#include <stdio.h>
#define LEN 5
int check(int val)
{
if(val % 3 == 0)
return 1;
return 0;
}
void sortOp(int *a)
{
int i, j;
int *p, *q;
for(i = 1; i < LEN; i++)
{
p = a + i;
for(j = 0; j < i; j++)
{
q = a + j;
if(check(*p) && !check(*q))
{
int temp = *p;
*p = *q;
*q = temp;
}
}
}
}
int main()
{ int *pt;
int x[LEN] = {7, 12, 4, 15, 8};
sortOp(x);
pt = x;
printf("%d %d %d", *pt, *(pt+2), *(pt+4));
return 0;
}
【答案】12 4 8
三、程序填空。按照题目要求,将正确内容填入答题卡相应位置,使程序完整(每空2分,共计30分)
1.功能描述:程序接收两个长度相同的一维整型数组,按照规则生成新数组:若对应位置两个元素之和为偶数,新数组该位置存储两数之差;若和为奇数,新数组该位置存储两数之和。最终输出生成的新数组。
#include <stdio.h>
void mergeArr(int *a, int *b, int *c, int len)
{ int *p1 = a, *p2 = b, *p3 = c;
while (p1 <_______①_____)
{ if (_________②_________)
*p3 = *p1 - *p2;
else
*p3 = ________③________
p1++;
p2++;
p3++;
}
}
int main()
{ int arr1[8], arr2[8], arr3[8];
int i, n = 8;
for (i = 0; i < n; i++)
scanf("%d", &arr1[i]);
for (i = 0; i < n; i++)
scanf("%d", &arr2[i]);
_____________④_____________
for (i = 0; i < n; i++)
printf("%d ", arr3[i]);
return 0; }
【答案】① a + len ②(*p1 + *p2) % 2 == 0
③*p1 + *p2; ④mergeArr(arr1, arr2, arr3, n);
2.下列程序的功能是:将数组中所有位于最大值左侧的元素统一翻倍,最大值右侧的元素统一减半(整数除法),最大值本身保持不变,最后输出处理后的完整数组。
#include <stdio.h>
int findMaxPos(int *arr, int len)
{ int max = *arr;
int pos = 0;
int *p = arr + 1;
while (p < arr + len)
{ if (_________①________)
{
max = *p;
_________②________
}
p++;
}
_________③_________
}
void handleArr(int *arr, int len, int pos)
{ int *p = arr;
while (_________④_______)
{
if (p - arr < pos)
{ *p *= 2; }
else if (p - arr > pos)
{ *p /= 2; }
p++;
}
}
int main()
{ int data[10];
int i, n = 10, idx;
for (i = 0; i < n; i++)
scanf("%d", &data[i]);
idx = __________⑤___________;
handleArr(data, n, idx);
for (i = 0; i < n; i++)
printf("%d ", data[i]);
return 0; }
【答案】①*p > max ②pos = p - arr; ③return pos;
④p < arr + len ⑤findMaxPos(data, n)
3.下列程序的功能是:实现数组整体循环左移 k 位。例如数组 {1,2,3,4,5} 左移2位后结果为 {3,4,5,1,2},程序接收原数组与移位位数,输出移位后的数组。
#include <stdio.h>
void leftMove(int *arr, int len, int k)
{ int i, j;
int temp;
for (i = 0; i < k; i++)
{
temp = _____①_____;
for (j = 0; j < len - 1; j++)
{
*(arr + j) = _______②_______;
}
_________③__________
}
}
int main()
{
int a[7];
int i, n = 7, k;
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
scanf("%d", &k);
leftMove(a, n, k);
for (i = 0; i < n; i++)
printf("%d ", a[i]);
return 0; }
【答案】①*arr ②*(arr + j + 1) ③*(arr + len - 1) = temp;
4.下列程序的功能是:找出一维数组中最大值和最小值的位置,交换这两个位置上的元素,输出交换后的数组。若存在多个最值,取最先出现的最值位置。
#include <stdio.h>
void getMinMaxPos(int *arr, int len, int *minP, int *maxP)
{ int *p = arr;
*minP = 0;
*maxP = 0;
p++;
while (p < arr + len)
{
if (__________①_________)
*minP = p - arr;
if (*p > *(arr + *maxP))
*maxP = p - arr;
p++;
}
}
void swapElem(int *arr, int pos1, int pos2)
{
int t = *(arr + pos1);
_____________②_____________
*(arr + pos2) = t;
}
int main()
{ int arr[9];
int i, minIdx, maxIdx;
for (i = 0; i < 9; i++)
scanf("%d", &arr[i]);
getMinMaxPos(arr, 9, &minIdx, &maxIdx);
____________③_____________
for (i = 0; i < 9; i++)
printf("%d ", arr[i]);
return 0; }
【答案】①*p < *(arr + *minP) ②*(arr + pos1) = *(arr + pos2);
③swapElem(arr, minIdx, maxIdx);
四、阅读程序:修改程序中的错误,不得增行或删行,也不得更改程序结构。请在答题卡中指出错误代码所在的行号,并给出该行修改后的程序代码。(每空2分,共计20分)
1.功能描述:给定一个一维整型数组,程序统计数组中每一组连续递增序列的长度,并输出所有连续递增序列的最大长度。连续递增定义:后一个元素严格大于前一个元素。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 void getMaxIncLen(int *arr, int len, int *maxLen)
L3 { int cur = 1,*p;
L4 *maxLen = 1;
L5 p = arr + 1;
L6 while (p < arr + len)
L7 { if (*p > *(p - 1))
L8 cur++;
L9 else
L10 cur = 1;
L11 if (cur > maxLen)
L12 *maxLen = cur;
L13 p++;
L14 }
L15 }
L16 int main()
L17 { int arr[15];
L18 int n = 15, i, res;
L19 for (i = 0; i < n; i++)
L20 scanf("%d", &arr[i]);
L21 getMaxIncLen(arr, n, res);
L22 printf("最长严格递增序列长度:%d
", res);
L23 return 0; }
【答案】①L11 if (cur > *maxLen)
②L21 getMaxIncLen(arr, n, &res);
2.下列程序中,计算一维数组中所有下标为偶数的元素之和与所有下标为奇数的元素之和,并输出两个和值。。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 void calcSum(int arr, int len, int sumEven, int sumOdd)
L3 { int *p = arr;
L4 int idx = 0;
L5 *sumEven = 0;
L6 *sumOdd = 0;
L7 while (p < arr + len)
L8 {
L9 if (idx / 2 == 0)
L10 *sumEven += *p;
L11 else
L12 *sumOdd += *p;
L13 p++;
L14 idx++;
L15 }
L16 }
L17 int main()
L18 { int arr[12];
L19 int i, s1, s2;
L20 for (i = 0; i < 12; i++)
L21 scanf("%d", &arr[i]);
L22 calcSum(arr, 12, &s1, &s2);
L23 printf("偶数下标元素和:%d
", s1);
L24 printf("奇数下标元素和:%d
", s2);
L25 return 0; }
【答案】①L2 void calcSum(int *arr, int len, int *sumEven, int *sumOdd)
②L9 if (idx % 2 == 0)
3.(2024年)下列程序功能是:利用排序算法对无序数组进行升序(从小到大)排序。算法原理是:在一轮循环中,把每个数组元素与它后面的所有元素比较,如有元素比它小,则进行交换。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 #define N 10
L3 int my_sort(int *a,int n)
L4 {
L5 int i,j,temp;
L6 for(i=0;i<n;i++)
L7 {
L8 for(j=i+1;j<n;j++)
L9 {
L10 if(a[j]>a[i])
L11 {
L12 temp=a[i];
L13 a[i]=a[j];
L14 a[j]=a[i];
L15 }
L16 }
L17 }
L18 return 0;
L19 }
L20 void main()
L21 {
L22 int d[N]={-3,14,7,9,5,45,67,189,200,180};
L23 int k=0;
L24 printf("before sort:\r
");
L25 for(;k<N;k++)
L26 printf("%d ",d[k]);
L27 my_sort(d);
L28 printf("\r
after sort:\r
");
L29 for(k=0;k<N;k++)
L30 printf("%d ",d[k]);
L31 }
【答案】①L10 if(a[j]<a[i])
②L14 a[j]=temp;
③L27 my_sort(d,N);
4.下列程序的功能是:统计一维数组中大于数组平均值的元素个数与小于平均值(含小数位)的元素个数,等于平均值的元素不统计,最终输出两个统计结果。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 double getAverage(int *arr, int len)
L3 { int sum = 0;
L4 int *p = arr;
L5 while (p < arr + len)
L6 { sum += p;
L7 p++; }
L8 return sum / len; }
L9 void countByAvg(int *arr,int len,double avg,int *cntBig,int *cntSmall)
L10 { int *p = arr;
L11 *cntBig = 0;
L12 *cntSmall = 0;
L13 while (p < arr + len)
L14 { if (*p > avg)
L15 (*cntBig)++;
L16 else if (*p < avg)
L17 (*cntSmall)++;
L18 p++;
L19 }
L20 }
L21 int main()
L22 { int data[11];
L23 int i, big, small;
L24 double avg;
L25 for (i = 0; i < 11; i++)
L26 scanf("%d", &data[i]);
L27 avg = getAverage(data, 11);
L28 countByAvg(data, 11, avg, big, small);
L29 printf("大于平均值元素个数:%d
", big);
L30 printf("小于平均值元素个数:%d
", small);
L31 return 0; }
【答案】①L6 { sum += *p;
②L8 return (double)sum / len; }
③L28 countByAvg(data, 11, avg, &big, &small);
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$