内容正文:
编写说明:湖南省普通高校对口招生专业理论考试《计算机应用类专业综合考纲百套卷》,依据《湖南省普通高校对口招生计算机应用类专业综合知识基本要求及考试大纲》编写。每门课程均分三层训练:基础层(具象化支架)拆解考点为微目标,紧扣考纲 “掌握”“理解” 要求编写考点训练卷;巩固层(关联性支架)强化知识交叉与场景关联,按考纲专题编专题训练卷;应用层(引导性支架)聚焦真题突破,结合知识模块与教材编写课程综合卷。
本试卷是第93卷,按《计算机编程语言——C语言》范围和要求编写。具体内容为:①函数的定义和调用;②数组作为函数参数;③变量的作用域和变量的存储类别。
湖南省《计算机应用类专业综合考纲百套卷》 第93卷
《计算机编程语言——C语言》
函数
专题训练卷
考试时间60分钟 满分100分
班级________姓名________学号________成绩________
一、单项选择题(本大题共15小题,每题2分,共30分)
1.执行以下程序段的输出结果是( )
#include <stdio.h>
void test()
{ static int a = 1;
a++;
printf("%d ", a);}
int main(void)
{ test();test();test();
return 0; }
A. 2 2 2 B. 2 3 4 C. 1 1 1 D. 随机乱数
2.执行以下程序段的输出结果是( )
#include <stdio.h>
void change(int arr[], int n)
{ arr[0] = 999;}
int main(void)
{ int num[5] = {1,2,3,4,5};
change(num,5);
printf("%d", num[0]);
return 0; }
A. 1 B. 999 C. 随机值 D. 0
3.若要将整个一维数组传递给函数,则下列说法错误的是( )
A. 传递本质是传递数组首元素地址,不会拷贝全部元素
B. 函数内修改数组元素,会影响外部实参数组
C. 形参数组长度必须和实参严格相等,否则报错
D. 形参可以写作 int arr [] 或 int *arr 两种等价形式
4.执行以下程序段的输出结果是( )
#include <stdio.h>
int count()
{ static int cnt = 0;
cnt++;
return cnt;}
int main(void)
{ int i;
for(i=0;i<3;i++)
count();
printf("%d", count());
return 0; }
A. 3 B. 4 C. 0 D. 1
5.下列有关变量作用域的叙述中,说法错误的是( )
A. 局部变量作用域仅限于定义所在大括号 {} 内部
B. 全局变量作用域整个程序所有文件(无 static 限制)
C. 两个不同函数内同名 auto 局部变量互相干扰
D. static 局部变量作用域仍仅限当前函数,仅生命周期延长
6.执行以下程序段的输出结果是( )
#include <stdio.h>
void fill(int m[][3], int row)
{ int i,j;
for(i = 0; i < row; i++)
for(j = 0; j < 3; j++)
m[i][j] = i + j;}
int main(void)
{ int arr[4][3];
fill(arr,4);
printf("%d", arr[3][2]);
return 0; }
A. 5 B. 4 C. 3 D. 2
7.执行以下程序段的输出结果是( )
#include <stdio.h>
int main(void)
{ int x = 10;
if(1)
{ int x = 20;
printf("%d ", x); }
printf("%d", x);
return 0; }
A.20 10 B.20 20 C.10 10 D.编译报错,重复定义x
8.执行以下程序段的输出结果是( )
#include <stdio.h>
int s;
int rec(int n)
{ static int s = 0;
if(n == 0) return s;
s += n;
return rec(n - 1);}
int main(void)
{ int a = rec(4),b = rec(3);
s = 0;
printf("%d", b - a);
return 0; }
A.6 B.7 C.10 D.3
9.执行以下程序段的输出结果是( )
#include <stdio.h>
int i,j;
void subTri(int arr[][5], int row)
{ for(i=0;i<row;i++)
for(j=i+1;j<5;j++)
arr[i][j] = arr[i][j] * 2;}
int main(void)
{ int mat[3][5] = {{1,2,3},{4,5},{6}};
subTri(mat,3);
printf("%d ", mat[0][2]);
return 0; }
A.3 B.6 C.0 D.2
10.执行以下程序段的输出结果是( )
#include <stdio.h>
void swapVal(int a,int b)
{ int t = a;a = b;b = t;}
void swapArr(int arr[])
{ int t = arr[0];arr[0] = arr[1];arr[1] = t;}
int main(void)
{ int x=2,y=7;
int num[2] = {2,7};
swapVal(x,y);
swapArr(num);
printf("%d %d,%d %d",x,y,num[0],num[1]);
return 0; }
A.7 2,7 2 B.2 7,7 2 C.2 7,2 7 D.7 2,2 7
11.执行以下程序段的输出结果是( )
#include <stdio.h>
int i,j;
void upperAll(char str[][12], int line)
{ for(i=0;i<line;i++)
for(j=0;str[i][j]!='\0';j++)
if(str[i][j]>='a'&&str[i][j]<='z')
str[i][j] -= 32;}
int main(void)
{ char buf[3][12] = {"Hello","cProgram","array"};
upperAll(buf,3);
printf("%s", buf[1]);
return 0; }
A.cprogram B.CPROGRAM C.Cprogram D.cPROGRAM
12.执行以下程序段的输出结果是( )
#include <stdio.h>
void antiDiag(int mat[][4], int n)
{ int i,j;
for(i=0;i<n;i++)
for(j=0;j<4;j++)
if(i + j == n - 1)
mat[i][j] *= 3;}
int main(void)
{ int data[4][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
antiDiag(data,4);
printf("%d", data[1][2]);
return 0;}
A.21 B.7 C.6 D.18
13.执行以下程序段的输出结果是( )
#include <stdio.h>
void oddIndex(int arr[], int len)
{ int i;
for(i=1;i<len;i+=2)
arr[i] -= arr[i] / 2;}
int main(void)
{ int num[6] = {10,14,16,18,20,22};
oddIndex(num,6);
printf("%d", num[3]);
return 0; }
A.18 B.9 C.10 D.8
14.执行以下程序段的输出结果是( )
#include <stdio.h>
int dfs(int n)
{ static int sum = 0;
sum += n;
if(n == 1) return sum;
return dfs(n - 1);}
int main(void)
{ printf("%d", dfs(5));
return 0; }
A.15 B.5 C.0 D.9
15.执行以下程序段的输出结果是( )
#include <stdio.h>
int delDigit(char str[])
{ int i,j;
for(i=0,j=0;str[i]!='\0';i++)
if(!(str[i]>='0'&&str[i]<='9'))
str[j++] = str[i];
str[j] = '\0';
return j;}
int main(void)
{ char s[] = "A1b2C3d4";
int len = delDigit(s);
printf("%d|%s", len, s);
return 0; }
A.4|AbCd B.8|A1b2C3d4 C.0| D.4|ABCD
二、阅读程序,写出运行结果(本大题共10小题。每空2分,合计20分)
1.下列程序的运行结果是__________________。
#include <stdio.h>
int sumArr(int arr[], int n)
{ int i;
static int total;
if(n == 0)
{ return total; }
total = total + arr[n - 1];
return sumArr(arr, n - 1);
}
int main(void)
{ int num[5] = {2, 4, 6, 8, 10};
int res1, res2;
res1 = sumArr(num, 3);
res2 = sumArr(num, 5);
printf("res1=%d total累加值=%d
", res1, res2 - res1);
return 0; }
2.下列程序的运行结果是__________________。
#include <stdio.h>
void filter(int arr[], int n);
int getJudge(int x);
int main(void)
{ int data[7] = {3, 9, 4, 12, 7, 18, 5};
int i;
filter(data, 7);
for(i = 0; i < 7; i++)
{ printf("%d ", data[i]); }
return 0;
}
void filter(int arr[], int n)
{ int i;
for(i = 0; i < n; i++)
{ if(getJudge(arr[i]) == 1)
{
arr[i] = arr[i] / 3;
}
}
}
int getJudge(int x)
{ if(x % 3 == 0)
return 1;
return 0; }
3.下列程序的运行结果是__________________。
#include <stdio.h>
int dfs(int n)
{ if(n == 1)
{
printf("n=1 ");
return 1;
}
if(n % 2 == 0)
{
printf("n=%d ", n);
return dfs(n / 2);
}
else
{
printf("n=%d ", n);
return dfs(n - 1);
}
}
int main(void)
{
int res;
res = dfs(7);
printf("%d ", res);
return 0; }
4.下列程序的运行结果是__________________。
#include <stdio.h>
int globalArr[6] = {10, 20, 30, 40, 50, 60};
void change()
{ int i;
for(i = 0; i < 6; i++)
{
if(globalArr[i] / 10 % 2 == 0)
{
globalArr[i] = globalArr[i] / 10;
}
}
}
int main(void)
{
int i;
change();
for(i = 0; i < 6; i++)
{
printf("%d ", globalArr[i]);
}
return 0; }
5.下列程序的运行结果是__________________。
#include <stdio.h>
void editMatrix(int m[][3], int row)
{
int i, j;
for(i = 0; i < row; i++)
{
if(i % 2 == 0)
{
for(j = 0; j < 3; j++)
m[i][j] = m[i][j] + 1;
}
else
{
for(j = 0; j < 3; j++)
m[i][j] = m[i][j] - 1;
}
}
}
int main(void)
{ int grid[4][3] = {1,1,1,2,2,2,3,3,3,4,4,4};
int i, j;
editMatrix(grid, 4);
for(i = 0; i < 4; i++)
{
for(j = 0; j < 3; j++)
printf("%d ", grid[i][j]);
printf("
");
}
return 0;}
6.下列程序的运行结果是__________________。
#include <stdio.h>
int judge(int x)
{
if(x < 10)
return 0;
if(x < 30)
return 1;
return 2;
}
void tagArr(int num[], int tag[], int n)
{
int i;
for(i = 0; i < n; i++)
{
tag[i] = judge(num[i]);
}
}
int main(void)
{
int data[6] = {5,15,25,35,8,40};
int mark[6];
int i;
tagArr(data, mark, 6);
for(i = 0; i < 6; i++)
printf("%d ", mark[i]);
return 0; }
7.下列程序的运行结果是__________________。
#include <stdio.h>
void squareAll(int arr[], int n)
{
int i;
for(i = 0; i < n; i++)
arr[i] = arr[i] * arr[i];
}
void filterEven(int arr[], int n)
{
int i;
for(i = 0; i < n; i++)
{
if(arr[i] % 2 != 0)
arr[i] = 0;
}
}
int main(void)
{
int a[5] = {1,2,3,4,5};
int i;
squareAll(a, 5);
filterEven(a, 5);
for(i = 0; i < 5; i++)
printf("%d ", a[i]);
return 0;
}
8.下列程序的运行结果是__________________。
#include <stdio.h>
void antiDiagMul(int mat[][4], int size)
{
int i, j;
for(i = 0; i < size; i++)
{
for(j = 0; j < 4; j++)
{
if(i + j == size - 1)
mat[i][j] = mat[i][j] * 5;
}
}
}
int main(void)
{
int m[4][4] = {1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4};
int i,j;
antiDiagMul(m,4);
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
printf("%d ", m[i][j]);
printf("
");
}
return 0;
}
9.下列程序的运行结果是__________________。
#include <stdio.h>
int dfs(int x, int res[][2], int row)
{ int r1, r2;
if(x == 1)
{ res[row][0] = 1;
res[row][1] = 0;
return 1;
}
if(x % 2 == 0)
{ r1 = dfs(x / 2, res, row + 1);
res[row][0] = x;
res[row][1] = r1;
}
else
{
r2 = dfs(x * 3 + 1, res, row + 1);
res[row][0] = x;
res[row][1] = r2;
}
return res[row][1] + res[row][0];
}
int main(void)
{ int table[20][2];
int i, len;
len = dfs(6, table, 0);
printf("len:%d", len);
return 0; }
10.下列程序的运行结果是__________________。
#include <stdio.h>
int getSquare(int arr[], int n, int pos)
{
int root, temp;
if(n == 0)
return pos;
temp = n;
root = 1;
while(root * root < temp)
root = root + 1;
if(root * root == temp)
{
arr[pos] = temp;
pos = pos + 1;
}
pos = getSquare(arr, n - 1, pos);
return pos;
}
int main(void)
{
int buf[20];
int i, count;
count = getSquare(buf, 12, 0);
printf("1~12之间完全平方数共%d个,列表:", count);
for(i = 0; i < count; i++)
printf("%d ", buf[i]);
return 0;
}
三、程序填空。按照题目要求,将正确内容填入答题卡相应位置,使程序完整(每空2分,共计30分)
1.程序接收一个上限正整数 N,计算区间 [1,N] 内所有半完全数,将所有符合条件数字存入一维数组;最终输出全部半完全数、半完全数总个数,以及所有半完全数的累加总和。半完全数定义:自身可以由自身若干个不同真因数相加得到。
请输入上限N:30
区间内半完全数:6 12 18 20 24 28 30
半完全数总个数:7
所有半完全数累加总和:138
#include <stdio.h>
int getFactor(int n, int fac[], int len)
{
int i;
for(i = 1; i < n; i++)
{
if(n % i == 0)
{
________①________
len++;
}
}
return len;
}
int isSemi(int fac[], int len, int idx, int target)
{
int res1, res2;
if(target == 0)
return 1;
if(idx >= len)
return 0;
res1 = isSemi(fac, len, idx + 1, target - fac[idx]);
res2 = _____________②_____________
return res1 || res2;
}
int main(void)
{
int N, num, i, cnt, sumAll, pos, fac[100], factorLen;
int semiArr[200];
cnt = 0;
sumAll = 0;
pos = 0;
printf("请输入上限N:");
scanf("%d", &N);
if(N < 2)
{
printf("无半完全数
");
return 0;
}
for(num = 2; num <= N; num++)
{
factorLen = getFactor(num, fac, 0);
if(____________③___________)
{
semiArr[pos] = num;
pos++;
cnt++;
sumAll += num;
}
}
printf("区间内半完全数:");
for(i = 0; i < pos; i++)
printf("%d ", semiArr[i]);
printf("
半完全数总个数:%d
", cnt);
printf("所有半完全数累加总和:%d
", sumAll);
return 0;
}
2.程序输入 8 个整数存入一维数组,通过递归分治算法将数组拆分为左右两段,分别计算两段中各位数字立方和大于 50 的数字平均值;最终完整输出原数组、左段符合条件数字平均值、右段符合条件数字平均值;若无符合条件数字则平均值输出 0。
#include <stdio.h>
int cubeSum(int x)
{
int d, s;
s = 0;
while(x > 0)
{
d = x % 10;
__________①_________
x /= 10;
}
return s;
}
int calcAvg(int arr[], int l, int r)
{
int i, total, count;
total = 0;
count = 0;
for(i = l; i <= r; i++)
{
if(____________②____________)
{
total += arr[i];
count++;
}
}
if(count == 0)
return 0;
return __________③__________
}
int main(void)
{
int arr[8];
int i, leftAvg, rightAvg;
printf("输入8个整数:");
for(i = 0; i < 8; i++)
scanf("%d", &arr[i]);
leftAvg = calcAvg(arr, 0, 3);
rightAvg = calcAvg(arr, 4, 7);
printf("原始数组:");
for(i = 0; i < 8; i++)
printf("%d ", arr[i]);
printf("
数组左半段立方和>50数字平均值:%d
", leftAvg);
printf("数组右半段立方和>50数字平均值:%d
", rightAvg);
return 0;
}
3.程序输入一个整数 M,生成长度为 M 的一维数组,数组元素为 1~M;递归遍历数组筛选出无重复数位的数字存入新数组;输出原数组、无重复数位数字列表、符合条件数字的平均数。
#include <stdio.h>
int resArr[100];
int posGlobal;
int noRepeatDigit(int x)
{
int flag[10] = {0}, d;
while(x > 0)
{
d = x % 10;
if(flag[d] == 1)
return 0;
flag[d] = 1;
_______①_______
}
return 1;
}
void filterRec(int src[], int len, int idx)
{
if(idx >= len)
return;
if(_____________②___________)
{
resArr[posGlobal] = src[idx];
posGlobal += 1;
}
____________③__________
}
int main(void)
{
int M, i, sum, avg;
int arr[100];
posGlobal = 0;
sum = 0;
printf("输入数字M:");
scanf("%d", &M);
for(i = 0; i < M; i++)
arr[i] = i + 1;
filterRec(arr, M, 0);
printf("原始1~%d数组:", M);
for(i = 0; i < M; i++)
printf("%d ", arr[i]);
printf("
无重复数位数字:");
for(i = 0; i < posGlobal; i++)
{
printf("%d ", resArr[i]);
___________④__________
}
if(posGlobal == 0)
avg = 0;
else
avg = sum / posGlobal;
printf("
无重复数位数字平均值:%d
", avg);
return 0;
}
4.程序输入 6×3 矩阵,递归遍历矩阵统计两类数据:每行最大值、整个矩阵中孪生素数对数量;输出完整矩阵、每行最大值列表、矩阵内孪生素数总对数。
#include <stdio.h>
int rowMax[6];
int pairCountGlobal;
int isPrime(int x)
{
int k;
if(x < 2)
return 0;
for(k = 2; k * k <= x; k++)
if(__________①_________)
return 0;
return 1;
}
void recScan(int mat[][3], int row, int col)
{
int cur;
if(row >= 6)
return;
if(col >= 3)
{
___________②_________
return;
}
cur = mat[row][col];
if(col == 0)
rowMax[row] = cur;
else if(cur > rowMax[row])
rowMax[row] = cur;
if(col + 1 < 3)
{
int next = __________③________
if(_________④_________&&(cur- next == 2 || next - cur == 2))
pairCountGlobal += 1;
}
recScan(__________⑤__________);
}
int main(void)
{
int mat[6][3];
int i, j;
pairCountGlobal = 0;
printf("输入6行3列矩阵:
");
for(i = 0; i < 6; i++)
for(j = 0; j < 3; j++)
scanf("%d", &mat[i][j]);
recScan(mat, 0, 0);
printf("完整6×3矩阵:
");
for(i = 0; i < 6; i++)
{
for(j = 0; j < 3; j++)
printf("%d\t", mat[i][j]);
printf("
");
}
printf("每行最大值:");
for(i = 0; i < 6; i++)
printf("%d ", rowMax[i]);
printf("
矩阵内横向相邻孪生素数对总数:%d
", pairCountGlobal);
return 0;
}
四、阅读程序:修改程序中的错误,不得增行或删行,也不得更改程序结构。请在答题卡中指出错误代码所在的行号,并给出该行修改后的程序代码。(每空2分,共计20分)
1.下列程序的功能是:输入一行纯大写英文字符串,自定义函数实现字母平移加密(向后平移 3 位,X→A、Y→B、Z→C 循环);第二个函数逐行打印原文与密文,统计加密前后 A~Z 字母出现总个数。无数字、小写、符号,仅处理大写字母。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 char text[50];
L3 char secret[50];
L4 void caesarEncrypt(char src[], int n)
L5 {
L6 int i;
L7 for(i = 0; i < n; i++)
L8 {
L9 int code = src[i] + 3;
L10 if(code > 'Z')
L11 code = 26;
L12 secret[i] = code;
L13 }
L14 }
L15 int countLetter(char s[], int n)
L16 {
L17 int i, cnt = 0;
L18 for(i = 0; i < n; i++)
L19 cnt++;
L20 return cnt;
L21 }
L22 int main(void)
L23 {
L24 int length, i;
L25 printf("输入纯大写英文串:");
L26 scanf("%s", text);
L27 length = 0;
L28 while(text[length] == '\0')
L29 length++;
L30 caesarEncrypt(text, length);
L31 printf("原文:");
L32 for(i = 0; i < length; i++)
L33 printf("%c", text[i]);
L34 printf("
密文:");
L35 for(i = 0; i < length; i++)
L36 printf("%c", secret[i]);
L37 printf("
原文字母总数:%d ", countLetter(text, length));
L38 printf("
密文字母总数:%d", countLetter(secret, length));
L39 return 0;
L40 }
2.下列程序的功能是:输入6个整数,函数判断是否为自守数(平方后末尾和原数字相同,数字分身),分离出自守数存入数组;统计分身数字数量,并打印所有分身数字与普通数字。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 int isAuto(int x)
L3 {
L4 int powX = x * x;
L5 int base = 1;
L6 int temp = x;
L7 while(temp > 0)
L8 {
L9 base *= 10;
L10 temp %= 10;
L11 }
L12 if(powX % base = x)
L13 return 1;
L14 return 0;
L15 }
L16 void splitNum(int arr[], int n, int autoBuf[], int norBuf[], int autoLen[], int norLen[])
L17 {
L18 int i, a = 0, b = 0;
L19 for(i = 0; i < n; i++)
L20 {
L21 if(isAuto(arr[i]))
L22 {
L23 autoBuf[a] = arr[i];
L24 a++;
L25 }
L26 else
L27 {
L28 norBuf[b] = arr[i];
L29 b++;
L30 }
L31 }
L32 autoLen[0] = a;
L33 norLen[0] = b;
L34 }
L35 int main(void)
L36 {
L37 int arr[6], autoArr[6], norArr[6];
L38 int i, lenA[1], lenN[1];
L39 printf("输入6个正整数:");
L40 for(i = 0; i < 6; i++)
L41 scanf("%d", &arr[i]);
L42 splitNum(arr, 6, autoArr, norArr, lenA, lenN);
L43 printf("【数字分身(自守数)】共%d个:", lenA[0]);
L44 for(i = 0; i < lenA[0]; i++)
L45 printf("%d ", autoArr[i]);
L46 printf("
【普通数字】共%d个:", lenN[0]);
L47 for(i = 0; i < lenN[0]; i++)
L48 printf("%d ", norArr[i]);
L49 return 0;
L50 }
3.下列程序的功能是:输入 7 个整数,函数判断回文数字(翻转后和原数相等),分离回文与非回文数字;输出所有回文数字,并统计回文总数。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 int reverseNum(int x)
L3 {
L4 int res = 0;
L5 while(x > 0)
L6 {
L7 res = res * 10 + x / 10;
L8 x /= 10;
L9 }
L10 return res;
L11 }
L12 int isPalin(int x)
L13 {
L14 return reverseNum(x);
L15 }
L16 void splitPalin(int arr[], int n, int pal[], int nor[], int pLen[], int nLen[])
L17 {
L18 int i, p = 0, no = 0;
L19 for(i = 0; i < n; i++)
L20 {
L21 if(isPalin(arr[i]))
L22 {
L23 pal[p] = arr[i];
L24 p++;
L25 }
L26 else
L27 {
L28 pal[p] = arr[i];
L29 no++;
L30 }
L31 }
L32 pLen[0] = p;
L33 nLen[0] = no;
L34 }
L35 int main(void)
L36 {
L37 int num[7], palinArr[7], normalArr[7];
L38 int i, pCount[1], nCount[1];
L39 printf("输入7个正整数:");
L40 for(i = 0; i < 7; i++)
L41 scanf("%d", &num[i]);
L42 splitPalin(num, 7, palinArr, normalArr, pCount, nCount);
L43 printf("回文数字共%d个:", pCount[0]);
L44 for(i = 0; i < pCount[0]; i++)
L45 printf("%d ", palinArr[i]);
L46 printf("
非回文数字:");
L47 for(i = 0; i < nCount[0]; i++)
L48 printf("%d ", normalArr[i]);
L49 return 0;
L50 }
4.程序读取15个任意整数,依次完成全套数据处理:剔除所有负数,从剩余正数里筛选同时满足数位和为质数、能被3整除的数字,最后计算这批符合条件数字的总和、平均值、最大值与最小值之差。程序完整打印原始输入数组、过滤负数后的数组、筛选出的幸运数字,以及三项统计结果。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 int digitSumPrime(int x)
L3 {
L4 int s = 0, d, k;
L5 int temp = x;
L6 while (temp < 0)
L7 {
L8 d = temp % 10;
L9 s += d;
L10 temp /= 10;
L11 }
L12 if (s < 2)
L13 return 0;
L14 for (k = 2; k * k <= s; k++)
L15 if (s % k != 0)
L16 return 0;
L17 return 1;
L18 }
L19 void filterPositive(int src[], int n, int posBuf[], int len[])
L20 {
L21 int i, cnt = 0;
L22 for (i = 0; i < n; i++)
L23 {
L24 if (src[i] > 0)
L25 {
L26 posBuf[cnt] = src[i];
L27 cnt++;
L28 }
L29 }
L30 len[0] = cnt;
L31 }
L32 void filterLucky(int src[], int n, int luckyBuf[], int len[])
L33 {
L34 int i, cnt = 0;
L35 for (i = 0; i < n; i++)
L36 {
L37 if (digitSumPrime(src[i]) == 1 || src[i] % 3 == 0)
L38 {
L39 luckyBuf[cnt] = src[i];
L40 cnt++;
L41 }
L42 }
L43 len[0] = cnt;
L44 }
L45 void calcStat(int arr[], int n, int stat[3])
L46 {
L47 int i, sum = 0, maxV, minV;
L48 if (n == 0)
L49 {
L50 stat[0] = 0; stat[1] = 0; stat[2] = 0;
L51 return;
L52 }
L53 maxV = arr[0];
L54 minV = arr[0];
L55 for (i = 0; i < n; i++)
L56 {
L57 sum += arr[i];
L58 if (arr[i] > maxV) maxV = arr[i];
L59 if (arr[i] < minV) minV = arr[i];
L60 }
L61 stat[0] = sum;
L62 stat[1] = sum / n;
L63 stat[2] = maxV - minV;
L64 }
L65 int main(void)
L66 {
L67 int raw[15], posArr[15], luckyArr[15];
L68 int i, posLen[1], luckyLen[1], resStat[3];
L69 printf("输入15个整数(可含负数):");
L70 for (i = 0; i < 15; i++)
L71 scanf("%d", &raw[i]);
L72 filterPositive(raw, 15, posArr, posLen);
L73 filterLucky(posArr, posLen[0], luckyArr, luckyLen);
L74 calcStat(luckyArr, luckyLen[0], resStat);
L75 printf("原始数组:");
L76 for (i = 0; i < 15; i++)
L77 printf("%d ", raw[i]);
L78 printf("
剔除负数后的正数数组:");
L79 for (i = 0; i < posLen[0]; i++)
L80 printf("%d ", posArr[i]);
L81 printf("
双重条件幸运数字:");
L82 for (i = 0; i < luckyLen[0]; i++)
L83 printf("%d ", luckyArr[i]);
L84 printf("
符合数字总和:%d 平均值:%d 极差:%d
",
resStat[0], resStat[1], resStat[2]);
L85 return 0;
L86 }
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
编写说明:湖南省普通高校对口招生专业理论考试《计算机应用类专业综合考纲百套卷》,依据《湖南省普通高校对口招生计算机应用类专业综合知识基本要求及考试大纲》编写。每门课程均分三层训练:基础层(具象化支架)拆解考点为微目标,紧扣考纲 “掌握”“理解” 要求编写考点训练卷;巩固层(关联性支架)强化知识交叉与场景关联,按考纲专题编专题训练卷;应用层(引导性支架)聚焦真题突破,结合知识模块与教材编写课程综合卷。
本试卷是第93卷,按《计算机编程语言——C语言》范围和要求编写。具体内容为:①函数的定义和调用;②数组作为函数参数;③变量的作用域和变量的存储类别。
湖南省《计算机应用类专业综合考纲百套卷》 第93卷
《计算机编程语言——C语言》
函数
专题训练卷
考试时间60分钟 满分100分
班级________姓名________学号________成绩________
一、单项选择题(本大题共15小题,每题2分,共30分)
1.执行以下程序段的输出结果是( )
#include <stdio.h>
void test()
{ static int a = 1;
a++;
printf("%d ", a);}
int main(void)
{ test();test();test();
return 0; }
A. 2 2 2 B. 2 3 4 C. 1 1 1 D. 随机乱数
【答案】B
【解析】static 静态局部变量仅第一次调用初始化,值会保留,每次调用自增 1,三次输出 2、3、4。
2.执行以下程序段的输出结果是( )
#include <stdio.h>
void change(int arr[], int n)
{ arr[0] = 999;}
int main(void)
{ int num[5] = {1,2,3,4,5};
change(num,5);
printf("%d", num[0]);
return 0; }
A. 1 B. 999 C. 随机值 D. 0
【答案】B
【解析】数组作函数参数退化为首元素地址,函数内直接操作原数组内存,修改会影响 main 中的数组。
3.若要将整个一维数组传递给函数,则下列说法错误的是( )
A. 传递本质是传递数组首元素地址,不会拷贝全部元素
B. 函数内修改数组元素,会影响外部实参数组
C. 形参数组长度必须和实参严格相等,否则报错
D. 形参可以写作 int arr [] 或 int *arr 两种等价形式
【答案】C
【解析】一维数组作参数长度无强制匹配要求,仅传递地址,实参数组长度可大于形参标注长度。
4.执行以下程序段的输出结果是( )
#include <stdio.h>
int count()
{ static int cnt = 0;
cnt++;
return cnt;}
int main(void)
{ int i;
for(i=0;i<3;i++)
count();
printf("%d", count());
return 0; }
A. 3 B. 4 C. 0 D. 1
【答案】B
【解析】循环调用 3 次 cnt=1、2、3;第四次调用自增到 4,输出 4。
5.下列有关变量作用域的叙述中,说法错误的是( )
A. 局部变量作用域仅限于定义所在大括号 {} 内部
B. 全局变量作用域整个程序所有文件(无 static 限制)
C. 两个不同函数内同名 auto 局部变量互相干扰
D. static 局部变量作用域仍仅限当前函数,仅生命周期延长
【答案】C
【解析】不同函数内局部变量相互独立,内存空间分开,互不干扰。
6.执行以下程序段的输出结果是( )
#include <stdio.h>
void fill(int m[][3], int row)
{ int i,j;
for(i = 0; i < row; i++)
for(j = 0; j < 3; j++)
m[i][j] = i + j;}
int main(void)
{ int arr[4][3];
fill(arr,4);
printf("%d", arr[3][2]);
return 0; }
A. 5 B. 4 C. 3 D. 2
【答案】A
【解析】i=3,j=2,i+j=5。fill 函数通过数组地址直接修改 main 内二维数组。
7.执行以下程序段的输出结果是( )
#include <stdio.h>
int main(void)
{ int x = 10;
if(1)
{ int x = 20;
printf("%d ", x); }
printf("%d", x);
return 0; }
A.20 10 B.20 20 C.10 10 D.编译报错,重复定义x
【答案】A
【解析】if 大括号内是局部作用域,内部 x 屏蔽外层 x,二者是独立变量,无重定义报错。
8.执行以下程序段的输出结果是( )
#include <stdio.h>
int s;
int rec(int n)
{ static int s = 0;
if(n == 0) return s;
s += n;
return rec(n - 1);}
int main(void)
{ int a = rec(4),b = rec(3);
s = 0;
printf("%d", b - a);
return 0; }
A.6 B.7 C.10 D.3
【答案】A
【解析】rec中使用 static int s保存累加结果:rec(4)依次累加 4+3+2+1 得 10,rec(3)在上次基础上再累加 3+2+1 得 16,全局变量 s不影响结果,b - a = 16 - 10 = 6,选 A。
9.执行以下程序段的输出结果是( )
#include <stdio.h>
int i,j;
void subTri(int arr[][5], int row)
{ for(i=0;i<row;i++)
for(j=i+1;j<5;j++)
arr[i][j] = arr[i][j] * 2;}
int main(void)
{ int mat[3][5] = {{1,2,3},{4,5},{6}};
subTri(mat,3);
printf("%d ", mat[0][2]);
return 0; }
A.3 B.6 C.0 D.2
【答案】B
【解析】subTri函数将二维数组右上三角(列号大于行号)元素乘以 2,mat[0][2]属于右上三角元素,初始值为 3,乘 2 后结果为 6,选 B。
10.执行以下程序段的输出结果是( )
#include <stdio.h>
void swapVal(int a,int b)
{ int t = a;a = b;b = t;}
void swapArr(int arr[])
{ int t = arr[0];arr[0] = arr[1];arr[1] = t;}
int main(void)
{ int x=2,y=7;
int num[2] = {2,7};
swapVal(x,y);
swapArr(num);
printf("%d %d,%d %d",x,y,num[0],num[1]);
return 0; }
A.7 2,7 2 B.2 7,7 2 C.2 7,2 7 D.7 2,2 7
【答案】B
【解析】swapVal采用值传递,交换不影响实参,x、y 仍为 2、7;swapArr通过数组名传递地址,成功交换 num[0] 与 num[1],结果为 7、2,输出 2 7,7 2,选 B。
11.执行以下程序段的输出结果是( )
#include <stdio.h>
int i,j;
void upperAll(char str[][12], int line)
{ for(i=0;i<line;i++)
for(j=0;str[i][j]!='\0';j++)
if(str[i][j]>='a'&&str[i][j]<='z')
str[i][j] -= 32;}
int main(void)
{ char buf[3][12] = {"Hello","cProgram","array"};
upperAll(buf,3);
printf("%s", buf[1]);
return 0; }
A.cprogram B.CPROGRAM C.Cprogram D.cPROGRAM
【答案】B
【解析】二维字符串数组作为函数参数,列尺寸必须固定;函数遍历全部小写字母统一转为大写,第二行完整转为大写 CPROGRAM。
12.执行以下程序段的输出结果是( )
#include <stdio.h>
void antiDiag(int mat[][4], int n)
{ int i,j;
for(i=0;i<n;i++)
for(j=0;j<4;j++)
if(i + j == n - 1)
mat[i][j] *= 3;}
int main(void)
{ int data[4][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
antiDiag(data,4);
printf("%d", data[1][2]);
return 0;}
A.21 B.7 C.6 D.18
【答案】A
【解析】4 阶方阵反对角线条件i+j=3;坐标 (1,2) 满足条件,原值 7*3=21。
13.执行以下程序段的输出结果是( )
#include <stdio.h>
void oddIndex(int arr[], int len)
{ int i;
for(i=1;i<len;i+=2)
arr[i] -= arr[i] / 2;}
int main(void)
{ int num[6] = {10,14,16,18,20,22};
oddIndex(num,6);
printf("%d", num[3]);
return 0; }
A.18 B.9 C.10 D.8
【答案】B
【解析】仅遍历奇数下标 1、3、5;下标 3 原值 18,18-9=9。
14.执行以下程序段的输出结果是( )
#include <stdio.h>
int dfs(int n)
{ static int sum = 0;
sum += n;
if(n == 1) return sum;
return dfs(n - 1);}
int main(void)
{ printf("%d", dfs(5));
return 0; }
A.15 B.5 C.0 D.9
【答案】A
【解析】递归先累加再判断终止,5+4+3+2+1=15。
15.执行以下程序段的输出结果是( )
#include <stdio.h>
int delDigit(char str[])
{ int i,j;
for(i=0,j=0;str[i]!='\0';i++)
if(!(str[i]>='0'&&str[i]<='9'))
str[j++] = str[i];
str[j] = '\0';
return j;}
int main(void)
{ char s[] = "A1b2C3d4";
int len = delDigit(s);
printf("%d|%s", len, s);
return 0; }
A.4|AbCd B.8|A1b2C3d4 C.0| D.4|ABCD
【答案】A
【解析】原地覆盖删除数字,剩余字符 A、b、C、d 共 4 个,返回长度 4。
二、阅读程序,写出运行结果(本大题共10小题。每空2分,合计20分)
1.下列程序的运行结果是__________________。
#include <stdio.h>
int sumArr(int arr[], int n)
{ int i;
static int total;
if(n == 0)
{ return total; }
total = total + arr[n - 1];
return sumArr(arr, n - 1);
}
int main(void)
{ int num[5] = {2, 4, 6, 8, 10};
int res1, res2;
res1 = sumArr(num, 3);
res2 = sumArr(num, 5);
printf("res1=%d total累加值=%d
", res1, res2 - res1);
return 0; }
【答案】res1=12 total累加值=30
2.下列程序的运行结果是__________________。
#include <stdio.h>
void filter(int arr[], int n);
int getJudge(int x);
int main(void)
{ int data[7] = {3, 9, 4, 12, 7, 18, 5};
int i;
filter(data, 7);
for(i = 0; i < 7; i++)
{ printf("%d ", data[i]); }
return 0;
}
void filter(int arr[], int n)
{ int i;
for(i = 0; i < n; i++)
{ if(getJudge(arr[i]) == 1)
{
arr[i] = arr[i] / 3;
}
}
}
int getJudge(int x)
{ if(x % 3 == 0)
return 1;
return 0; }
【答案】1 3 4 4 7 6 5
3.下列程序的运行结果是__________________。
#include <stdio.h>
int dfs(int n)
{ if(n == 1)
{
printf("n=1 ");
return 1;
}
if(n % 2 == 0)
{
printf("n=%d ", n);
return dfs(n / 2);
}
else
{
printf("n=%d ", n);
return dfs(n - 1);
}
}
int main(void)
{
int res;
res = dfs(7);
printf("%d ", res);
return 0; }
【答案】n=7 n=6 n=3 n=2 n=1 1
4.下列程序的运行结果是__________________。
#include <stdio.h>
int globalArr[6] = {10, 20, 30, 40, 50, 60};
void change()
{ int i;
for(i = 0; i < 6; i++)
{
if(globalArr[i] / 10 % 2 == 0)
{
globalArr[i] = globalArr[i] / 10;
}
}
}
int main(void)
{
int i;
change();
for(i = 0; i < 6; i++)
{
printf("%d ", globalArr[i]);
}
return 0; }
【答案】10 2 30 4 50 6
5.下列程序的运行结果是__________________。
#include <stdio.h>
void editMatrix(int m[][3], int row)
{
int i, j;
for(i = 0; i < row; i++)
{
if(i % 2 == 0)
{
for(j = 0; j < 3; j++)
m[i][j] = m[i][j] + 1;
}
else
{
for(j = 0; j < 3; j++)
m[i][j] = m[i][j] - 1;
}
}
}
int main(void)
{ int grid[4][3] = {1,1,1,2,2,2,3,3,3,4,4,4};
int i, j;
editMatrix(grid, 4);
for(i = 0; i < 4; i++)
{
for(j = 0; j < 3; j++)
printf("%d ", grid[i][j]);
printf("
");
}
return 0;}
【答案】
2 2 2
1 1 1
4 4 4
3 3 3
6.下列程序的运行结果是__________________。
#include <stdio.h>
int judge(int x)
{
if(x < 10)
return 0;
if(x < 30)
return 1;
return 2;
}
void tagArr(int num[], int tag[], int n)
{
int i;
for(i = 0; i < n; i++)
{
tag[i] = judge(num[i]);
}
}
int main(void)
{
int data[6] = {5,15,25,35,8,40};
int mark[6];
int i;
tagArr(data, mark, 6);
for(i = 0; i < 6; i++)
printf("%d ", mark[i]);
return 0; }
【答案】0 1 1 2 0 2
7.下列程序的运行结果是__________________。
#include <stdio.h>
void squareAll(int arr[], int n)
{
int i;
for(i = 0; i < n; i++)
arr[i] = arr[i] * arr[i];
}
void filterEven(int arr[], int n)
{
int i;
for(i = 0; i < n; i++)
{
if(arr[i] % 2 != 0)
arr[i] = 0;
}
}
int main(void)
{
int a[5] = {1,2,3,4,5};
int i;
squareAll(a, 5);
filterEven(a, 5);
for(i = 0; i < 5; i++)
printf("%d ", a[i]);
return 0;
}
【答案】0 4 0 16 0
8.下列程序的运行结果是__________________。
#include <stdio.h>
void antiDiagMul(int mat[][4], int size)
{
int i, j;
for(i = 0; i < size; i++)
{
for(j = 0; j < 4; j++)
{
if(i + j == size - 1)
mat[i][j] = mat[i][j] * 5;
}
}
}
int main(void)
{
int m[4][4] = {1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4};
int i,j;
antiDiagMul(m,4);
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
printf("%d ", m[i][j]);
printf("
");
}
return 0;
}
【答案】
1 1 1 5
2 2 10 2
3 15 3 3
20 4 4 4
9.下列程序的运行结果是__________________。
#include <stdio.h>
int dfs(int x, int res[][2], int row)
{ int r1, r2;
if(x == 1)
{ res[row][0] = 1;
res[row][1] = 0;
return 1;
}
if(x % 2 == 0)
{ r1 = dfs(x / 2, res, row + 1);
res[row][0] = x;
res[row][1] = r1;
}
else
{
r2 = dfs(x * 3 + 1, res, row + 1);
res[row][0] = x;
res[row][1] = r2;
}
return res[row][1] + res[row][0];
}
int main(void)
{ int table[20][2];
int i, len;
len = dfs(6, table, 0);
printf("len:%d", len);
return 0; }
【答案】len:55
10.下列程序的运行结果是__________________。
#include <stdio.h>
int getSquare(int arr[], int n, int pos)
{
int root, temp;
if(n == 0)
return pos;
temp = n;
root = 1;
while(root * root < temp)
root = root + 1;
if(root * root == temp)
{
arr[pos] = temp;
pos = pos + 1;
}
pos = getSquare(arr, n - 1, pos);
return pos;
}
int main(void)
{
int buf[20];
int i, count;
count = getSquare(buf, 12, 0);
printf("1~12之间完全平方数共%d个,列表:", count);
for(i = 0; i < count; i++)
printf("%d ", buf[i]);
return 0;
}
【答案】1~12之间完全平方数共3个,列表:9 4 1
三、程序填空。按照题目要求,将正确内容填入答题卡相应位置,使程序完整(每空2分,共计30分)
1.程序接收一个上限正整数 N,计算区间 [1,N] 内所有半完全数,将所有符合条件数字存入一维数组;最终输出全部半完全数、半完全数总个数,以及所有半完全数的累加总和。半完全数定义:自身可以由自身若干个不同真因数相加得到。
请输入上限N:30
区间内半完全数:6 12 18 20 24 28 30
半完全数总个数:7
所有半完全数累加总和:138
#include <stdio.h>
int getFactor(int n, int fac[], int len)
{
int i;
for(i = 1; i < n; i++)
{
if(n % i == 0)
{
________①________
len++;
}
}
return len;
}
int isSemi(int fac[], int len, int idx, int target)
{
int res1, res2;
if(target == 0)
return 1;
if(idx >= len)
return 0;
res1 = isSemi(fac, len, idx + 1, target - fac[idx]);
res2 = _____________②_____________
return res1 || res2;
}
int main(void)
{
int N, num, i, cnt, sumAll, pos, fac[100], factorLen;
int semiArr[200];
cnt = 0;
sumAll = 0;
pos = 0;
printf("请输入上限N:");
scanf("%d", &N);
if(N < 2)
{
printf("无半完全数
");
return 0;
}
for(num = 2; num <= N; num++)
{
factorLen = getFactor(num, fac, 0);
if(____________③___________)
{
semiArr[pos] = num;
pos++;
cnt++;
sumAll += num;
}
}
printf("区间内半完全数:");
for(i = 0; i < pos; i++)
printf("%d ", semiArr[i]);
printf("
半完全数总个数:%d
", cnt);
printf("所有半完全数累加总和:%d
", sumAll);
return 0;
}
【答案】①fac[len] = i; ②isSemi(fac, len, idx + 1, target);
③isSemi(fac, factorLen, 0, num)
2.程序输入 8 个整数存入一维数组,通过递归分治算法将数组拆分为左右两段,分别计算两段中各位数字立方和大于 50 的数字平均值;最终完整输出原数组、左段符合条件数字平均值、右段符合条件数字平均值;若无符合条件数字则平均值输出 0。
#include <stdio.h>
int cubeSum(int x)
{
int d, s;
s = 0;
while(x > 0)
{
d = x % 10;
__________①_________
x /= 10;
}
return s;
}
int calcAvg(int arr[], int l, int r)
{
int i, total, count;
total = 0;
count = 0;
for(i = l; i <= r; i++)
{
if(____________②____________)
{
total += arr[i];
count++;
}
}
if(count == 0)
return 0;
return __________③__________
}
int main(void)
{
int arr[8];
int i, leftAvg, rightAvg;
printf("输入8个整数:");
for(i = 0; i < 8; i++)
scanf("%d", &arr[i]);
leftAvg = calcAvg(arr, 0, 3);
rightAvg = calcAvg(arr, 4, 7);
printf("原始数组:");
for(i = 0; i < 8; i++)
printf("%d ", arr[i]);
printf("
数组左半段立方和>50数字平均值:%d
", leftAvg);
printf("数组右半段立方和>50数字平均值:%d
", rightAvg);
return 0;
}
【答案】①s += d * d * d; ②cubeSum(arr[i]) > 50
③total / count;
3.程序输入一个整数 M,生成长度为 M 的一维数组,数组元素为 1~M;递归遍历数组筛选出无重复数位的数字存入新数组;输出原数组、无重复数位数字列表、符合条件数字的平均数。
#include <stdio.h>
int resArr[100];
int posGlobal;
int noRepeatDigit(int x)
{
int flag[10] = {0}, d;
while(x > 0)
{
d = x % 10;
if(flag[d] == 1)
return 0;
flag[d] = 1;
_______①_______
}
return 1;
}
void filterRec(int src[], int len, int idx)
{
if(idx >= len)
return;
if(_____________②___________)
{
resArr[posGlobal] = src[idx];
posGlobal += 1;
}
____________③__________
}
int main(void)
{
int M, i, sum, avg;
int arr[100];
posGlobal = 0;
sum = 0;
printf("输入数字M:");
scanf("%d", &M);
for(i = 0; i < M; i++)
arr[i] = i + 1;
filterRec(arr, M, 0);
printf("原始1~%d数组:", M);
for(i = 0; i < M; i++)
printf("%d ", arr[i]);
printf("
无重复数位数字:");
for(i = 0; i < posGlobal; i++)
{
printf("%d ", resArr[i]);
___________④__________
}
if(posGlobal == 0)
avg = 0;
else
avg = sum / posGlobal;
printf("
无重复数位数字平均值:%d
", avg);
return 0;
}
【答案】①x /= 10; ②noRepeatDigit(src[idx])
③filterRec(src, len, idx + 1); ④sum += resArr[i];
4.程序输入 6×3 矩阵,递归遍历矩阵统计两类数据:每行最大值、整个矩阵中孪生素数对数量;输出完整矩阵、每行最大值列表、矩阵内孪生素数总对数。
#include <stdio.h>
int rowMax[6];
int pairCountGlobal;
int isPrime(int x)
{
int k;
if(x < 2)
return 0;
for(k = 2; k * k <= x; k++)
if(__________①_________)
return 0;
return 1;
}
void recScan(int mat[][3], int row, int col)
{
int cur;
if(row >= 6)
return;
if(col >= 3)
{
___________②_________
return;
}
cur = mat[row][col];
if(col == 0)
rowMax[row] = cur;
else if(cur > rowMax[row])
rowMax[row] = cur;
if(col + 1 < 3)
{
int next = __________③________
if(_________④_________&&(cur- next == 2 || next - cur == 2))
pairCountGlobal += 1;
}
recScan(__________⑤__________);
}
int main(void)
{
int mat[6][3];
int i, j;
pairCountGlobal = 0;
printf("输入6行3列矩阵:
");
for(i = 0; i < 6; i++)
for(j = 0; j < 3; j++)
scanf("%d", &mat[i][j]);
recScan(mat, 0, 0);
printf("完整6×3矩阵:
");
for(i = 0; i < 6; i++)
{
for(j = 0; j < 3; j++)
printf("%d\t", mat[i][j]);
printf("
");
}
printf("每行最大值:");
for(i = 0; i < 6; i++)
printf("%d ", rowMax[i]);
printf("
矩阵内横向相邻孪生素数对总数:%d
", pairCountGlobal);
return 0;
}
【答案】①x % k == 0 ②recScan(mat, row + 1, 0);
③mat[row][col + 1]; ④(isPrime(cur) && isPrime(next))
⑤mat, row, col + 1
四、阅读程序:修改程序中的错误,不得增行或删行,也不得更改程序结构。请在答题卡中指出错误代码所在的行号,并给出该行修改后的程序代码。(每空2分,共计20分)
1.下列程序的功能是:输入一行纯大写英文字符串,自定义函数实现字母平移加密(向后平移 3 位,X→A、Y→B、Z→C 循环);第二个函数逐行打印原文与密文,统计加密前后 A~Z 字母出现总个数。无数字、小写、符号,仅处理大写字母。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 char text[50];
L3 char secret[50];
L4 void caesarEncrypt(char src[], int n)
L5 {
L6 int i;
L7 for(i = 0; i < n; i++)
L8 {
L9 int code = src[i] + 3;
L10 if(code > 'Z')
L11 code = 26;
L12 secret[i] = code;
L13 }
L14 }
L15 int countLetter(char s[], int n)
L16 {
L17 int i, cnt = 0;
L18 for(i = 0; i < n; i++)
L19 cnt++;
L20 return cnt;
L21 }
L22 int main(void)
L23 {
L24 int length, i;
L25 printf("输入纯大写英文串:");
L26 scanf("%s", text);
L27 length = 0;
L28 while(text[length] == '\0')
L29 length++;
L30 caesarEncrypt(text, length);
L31 printf("原文:");
L32 for(i = 0; i < length; i++)
L33 printf("%c", text[i]);
L34 printf("
密文:");
L35 for(i = 0; i < length; i++)
L36 printf("%c", secret[i]);
L37 printf("
原文字母总数:%d ", countLetter(text, length));
L38 printf("
密文字母总数:%d", countLetter(secret, length));
L39 return 0;
L40 }
【答案】①L11 code -= 26;
②L28 while(text[length] != '\0')
2.下列程序的功能是:输入6个整数,函数判断是否为自守数(平方后末尾和原数字相同,数字分身),分离出自守数存入数组;统计分身数字数量,并打印所有分身数字与普通数字。以下程序只允许修改两行。
L1 #include <stdio.h>
L2 int isAuto(int x)
L3 {
L4 int powX = x * x;
L5 int base = 1;
L6 int temp = x;
L7 while(temp > 0)
L8 {
L9 base *= 10;
L10 temp %= 10;
L11 }
L12 if(powX % base = x)
L13 return 1;
L14 return 0;
L15 }
L16 void splitNum(int arr[], int n, int autoBuf[], int norBuf[], int autoLen[], int norLen[])
L17 {
L18 int i, a = 0, b = 0;
L19 for(i = 0; i < n; i++)
L20 {
L21 if(isAuto(arr[i]))
L22 {
L23 autoBuf[a] = arr[i];
L24 a++;
L25 }
L26 else
L27 {
L28 norBuf[b] = arr[i];
L29 b++;
L30 }
L31 }
L32 autoLen[0] = a;
L33 norLen[0] = b;
L34 }
L35 int main(void)
L36 {
L37 int arr[6], autoArr[6], norArr[6];
L38 int i, lenA[1], lenN[1];
L39 printf("输入6个正整数:");
L40 for(i = 0; i < 6; i++)
L41 scanf("%d", &arr[i]);
L42 splitNum(arr, 6, autoArr, norArr, lenA, lenN);
L43 printf("【数字分身(自守数)】共%d个:", lenA[0]);
L44 for(i = 0; i < lenA[0]; i++)
L45 printf("%d ", autoArr[i]);
L46 printf("
【普通数字】共%d个:", lenN[0]);
L47 for(i = 0; i < lenN[0]; i++)
L48 printf("%d ", norArr[i]);
L49 return 0;
L50 }
【答案】①L10 temp /= 10;
②L12 if(powX % base == x)
3.下列程序的功能是:输入 7 个整数,函数判断回文数字(翻转后和原数相等),分离回文与非回文数字;输出所有回文数字,并统计回文总数。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 int reverseNum(int x)
L3 {
L4 int res = 0;
L5 while(x > 0)
L6 {
L7 res = res * 10 + x / 10;
L8 x /= 10;
L9 }
L10 return res;
L11 }
L12 int isPalin(int x)
L13 {
L14 return reverseNum(x);
L15 }
L16 void splitPalin(int arr[], int n, int pal[], int nor[], int pLen[], int nLen[])
L17 {
L18 int i, p = 0, no = 0;
L19 for(i = 0; i < n; i++)
L20 {
L21 if(isPalin(arr[i]))
L22 {
L23 pal[p] = arr[i];
L24 p++;
L25 }
L26 else
L27 {
L28 pal[p] = arr[i];
L29 no++;
L30 }
L31 }
L32 pLen[0] = p;
L33 nLen[0] = no;
L34 }
L35 int main(void)
L36 {
L37 int num[7], palinArr[7], normalArr[7];
L38 int i, pCount[1], nCount[1];
L39 printf("输入7个正整数:");
L40 for(i = 0; i < 7; i++)
L41 scanf("%d", &num[i]);
L42 splitPalin(num, 7, palinArr, normalArr, pCount, nCount);
L43 printf("回文数字共%d个:", pCount[0]);
L44 for(i = 0; i < pCount[0]; i++)
L45 printf("%d ", palinArr[i]);
L46 printf("
非回文数字:");
L47 for(i = 0; i < nCount[0]; i++)
L48 printf("%d ", normalArr[i]);
L49 return 0;
L50 }
【答案】①L7 res = res * 10 + x % 10;
②L14 return reverseNum(x) == x;
③L28 nor[no] = arr[i];
4.程序读取15个任意整数,依次完成全套数据处理:剔除所有负数,从剩余正数里筛选同时满足数位和为质数、能被3整除的数字,最后计算这批符合条件数字的总和、平均值、最大值与最小值之差。程序完整打印原始输入数组、过滤负数后的数组、筛选出的幸运数字,以及三项统计结果。以下程序只允许修改三行。
L1 #include <stdio.h>
L2 int digitSumPrime(int x)
L3 {
L4 int s = 0, d, k;
L5 int temp = x;
L6 while (temp < 0)
L7 {
L8 d = temp % 10;
L9 s += d;
L10 temp /= 10;
L11 }
L12 if (s < 2)
L13 return 0;
L14 for (k = 2; k * k <= s; k++)
L15 if (s % k != 0)
L16 return 0;
L17 return 1;
L18 }
L19 void filterPositive(int src[], int n, int posBuf[], int len[])
L20 {
L21 int i, cnt = 0;
L22 for (i = 0; i < n; i++)
L23 {
L24 if (src[i] > 0)
L25 {
L26 posBuf[cnt] = src[i];
L27 cnt++;
L28 }
L29 }
L30 len[0] = cnt;
L31 }
L32 void filterLucky(int src[], int n, int luckyBuf[], int len[])
L33 {
L34 int i, cnt = 0;
L35 for (i = 0; i < n; i++)
L36 {
L37 if (digitSumPrime(src[i]) == 1 || src[i] % 3 == 0)
L38 {
L39 luckyBuf[cnt] = src[i];
L40 cnt++;
L41 }
L42 }
L43 len[0] = cnt;
L44 }
L45 void calcStat(int arr[], int n, int stat[3])
L46 {
L47 int i, sum = 0, maxV, minV;
L48 if (n == 0)
L49 {
L50 stat[0] = 0; stat[1] = 0; stat[2] = 0;
L51 return;
L52 }
L53 maxV = arr[0];
L54 minV = arr[0];
L55 for (i = 0; i < n; i++)
L56 {
L57 sum += arr[i];
L58 if (arr[i] > maxV) maxV = arr[i];
L59 if (arr[i] < minV) minV = arr[i];
L60 }
L61 stat[0] = sum;
L62 stat[1] = sum / n;
L63 stat[2] = maxV - minV;
L64 }
L65 int main(void)
L66 {
L67 int raw[15], posArr[15], luckyArr[15];
L68 int i, posLen[1], luckyLen[1], resStat[3];
L69 printf("输入15个整数(可含负数):");
L70 for (i = 0; i < 15; i++)
L71 scanf("%d", &raw[i]);
L72 filterPositive(raw, 15, posArr, posLen);
L73 filterLucky(posArr, posLen[0], luckyArr, luckyLen);
L74 calcStat(luckyArr, luckyLen[0], resStat);
L75 printf("原始数组:");
L76 for (i = 0; i < 15; i++)
L77 printf("%d ", raw[i]);
L78 printf("
剔除负数后的正数数组:");
L79 for (i = 0; i < posLen[0]; i++)
L80 printf("%d ", posArr[i]);
L81 printf("
双重条件幸运数字:");
L82 for (i = 0; i < luckyLen[0]; i++)
L83 printf("%d ", luckyArr[i]);
L84 printf("
符合数字总和:%d 平均值:%d 极差:%d
",
resStat[0], resStat[1], resStat[2]);
L85 return 0;
L86 }
【答案】①L6 while (temp > 0)
②L15 if (s % k == 0)
③L37 if (digitSumPrime(src[i]) == 1 && src[i] % 3 == 0)
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$