全国计算机等级考试二级C语言上机编程题参考答案

发布时间:2024-11-08

(1)将两个两位的正整数a、b合并形成一个整数放

c中:将a的十位和个位数放在c的千位和十位,的十位和个位数放在

c的百位和个位。例如:若,使c = 4152。 void fun(int a, int b, int *c)

// c是指针 {

*c = a/10*1000+b/10*100+a%10*10+b%10; (7)求3到n之间所有素数的平方根之和,并返回。 double fun(int n) { int i, k; double s = 0; for (i = 3; i <= n; i++) {

}

(2)判断整数x是否是同构数(规定x是不大于100的正整数)。若是,函数返回1,否则返回0。如果某个整数能够在它的平方数的最右边出现,就是“同构数”。例如:5的平方数是25,5是25右边的数,所以5是同构数。 int fun(int x) { return (x < 10 && x*x%10 == x) || (x >= 10 && x*x%100 == x); }

(3)w是大于10的无符号整数,求w后n-1位的数作为函数值返回。例如:若w是234,则返回34。 unsigned fun(unsigned w) {

unsigned t = w, m = 1; while (t)

{ t /= 10; m *= 10; } return w % (m / 10); }

(4)对变量x中的值保留2位小数,并对第3位进行四舍五入(规定x中的值为正数)。 double fun(double x) {

return (int)(x * 100 + 0.5) / 100.0; }

(5)求n以内(不包括n)同时能被3和7整除的所 double fun(int n) {

int i;

double s = 0;

for (i = 1; i < n; i++)

if (i % 3 == 0 && i % 7 == 0)

s += i;

return sqrt(s); //平方根 }

(6)求1到m之内(含m)能被7或11整除的所有整数放在数组a中,通过函数返回这些数的个数。 int fun(int *a, int m) {

int i, j = 0;

for (i = 1; i <= m; i++)

if (i % 7 == 0 || i % 11 == 0) a[j++] = i; // j++模式 return j; }

for (k = 2; k < i; k++) //判断素数 if (i % k == 0) break; //整除中止 if (i == k) s += sqrt(i); //是素数 } return s; }

(8)求出小于或等于lim的所有素数并放在a数组中,该函数返回所求的素数的个数。 int fun(int lim, int a[MAX]) {

int i, k, j = 0;

for (i = 2; i <= lim; i++) {

for (k = 2; k < i; k++) if (i % k == 0) break; if (k == i) a[j++] = i; // j++模式 }

return j; }

(9)将大于整数m且紧靠m的n个素数存入x所指的数组中。

void fun(int m, int n, int x[ ]) {

int i, k, j = 0;

for (i = m + 1; j < n; i++) {

for (k = 2; k < i; k++) if (i % k == 0) break; if (k == i) x[j++] = i; // j++模式 } }

(10)求数组前n个数的小数部分的和,并返回。 double fun(int n, double a[ ]) { int i; double s = 0; for (i = 0; i < n; i++)

s += a[i] - (int)a[i]; //原数-整数 return s; }

(11)把a数组的n个数的平方值,与b数组中逆序的n个数的平方值一一对应相加,存放在c数组中。 void fun(int a[ ], int b[ ], int c[ ], int n) { int i; for (i = 0; i < n; i++) c[i] = a[i] * a[i] + b[n-1-i] * b[n-1-i]; }

(12)计算并返回a数组中n门课程的平均分。 double fun(int *a, int n) {

int i;

double s = 0;

for (i = 0; i < n; i++) s += a[i]; return s / n; }

(13)返回a数组n个学生中低于平均分的人数,并将低于平均分的分数放在b所指的数组中。 int fun(int a[ ], int n, int b[ ]) { int i, j = 0; double s = 0;

for (i = 0; i < n; i++) s += 1.0 * a[i] / n; //平均分 for (i = 0; i < n; i++)

if (a[i] < s) b[j++] = a[i]; // j++模式 return j; }

(14)求N×N的二维数组周边元素的平均值并作为函数值返回给主函数。 double fun(int a[N][N]) {

int i, k;

double s = 0;

for (i = 0; i < N; i++)

for (k = 0; k < N; k++) if (i==0 || k==0 || i==N-1 || k==N-1) s += a[i][k]; return s / (4*N-4); //除以个数 }

(15)求出s数组t个元素中最大元素在数组中的下标,并存放在k所指的存储单元中。 void fun(int *s, int t, int *k) {

int i, m = 0;

for (i = 1; i < t; i++) if (s[i] > s[m]) m = i; *k = m; }

(16)求出数组a[M][N]里每列中的最小元素,并依次放入b[N]数组中。

void fun(int a[M][N], int b[N]) { int i, k, m;

for (k = 0; k < N; k++) //共N列 { m = a[0][k];

for (i = 0; i < M; i++) //每列M行 if (a[i][k] < m) m = a[i][k]; b[k] = m; } }

(17)求Fibonacci数列中大于t的最小的一个数,

果由函数返回。其中数列f(n)的定义为: f(0) = 0,f(1) = 1,f(n) = f(n-1) + f(n-2) int fun(int t) {

int a = 0, b = 1, c = 0;

while (c <= t)

{

c = a + b; a = b; b = c; }

return c; }

(18)根据以下公式求P的值,结果由函数值带回。

float fun(int m, int n) { int i; float x = 1, y = 1, z = 1;

for (i = 1; i <= m; i++) x *= i; // m! for (i = 1; i <= n; i++) y *= i; // n! for (i = 1; i <= m-n; i++) z *= i; // (m-n)! return x / y / z; }

(19)根据以下公式计算s,结果由函数值返回。 double fun(int m) { int i; double s = 0; for (i = 1; i <= m; i++) s += log(i); return sqrt(s); //平方根 }

(20)计算下列级数和,结果由函数值返回。 若x = 0.3,n = 10,则函数值为

1.349859。 double fun(double x, int n) { int i; double s = 1, z = 1, m = 1; for (i = 1; i <= n; i++) s += (z *= x) / (m *= i); return s; }

(21)根据以下公式计算s,结果由函数值返回。

float fun(int n) {

int i, t = 0; // t作分母

float s = 0;

for (i = 1; i <= n; i++) { t += i; s += 1.0 / t; } return s; }

(22)根据以下公式计算x的值,某项小于e时停止迭代:

若e的值是0.0005,则返回3.14

double fun(double e) {

double n = 1, v = 1, s = 0; while (v >= e) {

s += v;

v *= n++ / (2*n+1); }

return s * 2; }

(23)求给定10个数的方差,结果作为函数值返回:

其中X'是10个数的平均值。 double fun(double x[10]) { int i; double v = 0, s = 0; for (i = 0; i < 10; i++) v += x[i] / 10; // v是平均值 for (i = 0; i < 10; i++) s += (x[i] - v) * (x[i] - v); return sqrt(s / 10); }

(24)求方程cos(x)-x=0的一个实根。步骤:①x1初值0.0;②x0=x1;③x1=cos(x0);④若x0-x1的绝对值小于0.000001,执行步骤5,否则执行步骤2;⑤x1就是实根,作为函数值返回。 double fun() {

double x1 = 0.0, x0; do {

x0 = x1; x1 = cos(x0); } while (fabs(x0-x1) >= 1e-6); return x1; }

(25)把二维数组左下角元素全置为0。 如:原来值为:4 9 2 则返回:0 9 2 3 5 7 0 0 7 8 1 6 0 0 0 void fun(int a[N][N]) {

int i, k;

for (i = 0; i < N; i++)

for (k = 0; k <= i; k++) //循环至i列 a[i][k] = 0; }

(26)矩阵转置,如:输入 10 20 30 输出 10 40 70 (即行列互换) 40 50 60 20 50 80 70 80 90 30 60 90 void fun(int a[N][N]) {

int i, k, t;

for (i = 0; i < N; i++) for (k = 0; k < i; k++) //至i-1列 {

t = a[i][k]; a[i][k] = a[k][i]; a[k][i] = t; } }

(27)将M行N列的二维数组中的字符数据,按列的

则a中应保存"AEBFCGDH"。 void fun(char s[M][N], char *a) {

int i, k, j = 0;

for (k = 0; k < N - 1; k++) //跳过'\0'列 for (i = 0; i < M; i++) a[j++] = s[i][k]; // j++模式 a[j] = '\0'; //串尾添'\0' }

(28)一维数组a中有n个整数,把下标从0到p(p小于等于n-1)的数组元素平移到数组的最后。 void fun(int a[ ], int p, int n)

{

int i, k, t; for (k = 0; k <= p; k++) { t = a[0];

for (i = 1; i < n; i++) a[i-1] = a[i]; //数据前移 a[n-1] = t; }

}

(29)假定输入的字符串中只包含字母和*号,将字符

串中的前导*号全部移到字符串的尾部。 void fun(char *a) { int i, n = strlen(a); while (a[0] == '*') {

for (i = 1; i < n; i++) a[i-1] = a[i];

a[n-1] = '*'; //尾部添*号

} }

(30)统计一个长度为2的字符串a在另一个字符串

中出现的次数。

int fun(char *a, char *b) {

int i, n = 0; //计数器置0

存到b[5]中。

void fun(char *a, int b[ ]) { int i; b[0] = b[1] = b[2] = b[3] = b[4] = b[5] = 0;

for (i = 0; i < strlen(b); i++)

if (b[i] == a[0] && b[i+1] == a[1]) n++; return n; }

(31)统计字符串中单词的个数,作为函数值返回。字符串在主函数中输入,规定单词之间由若干空格隔开,一行的开始和结束都没有空格。 int fun(char s[ ]) {

int i, n = 0; //计数器置0 for (i = 0; i < strlen(s); i++) if (s[i] != ' ' && (s[i+1] == ' ' || s[i+1] == '\0')) n++; return n; }

(32)判断字符串是否为回文数。若是则函数返回1,否则返回0。回文是指顺读和倒读都是一样的串。 int fun(char *a) {

int i, m = strlen(a);

for (i = 0; i < m / 2; i++)

if (a[i] != a[m-1-i]) return 0; return 1; }

统计数组a中的各年龄段的人数(N个)。0~9b[0]中,10~19岁的人数放在b[1]100岁及以上的放在b[10]中。 void fun(int *a, int b[11]) {

int i;

for (i = 0; i < 11; i++) b[i] = 0; //计数器置0 for (i = 0; i < N; i++) if (a[i] >= 100) b[10]++; else b[a[i]/10]++; }

(34)统计在t字符串中26个字母'a'到'z'各自出现的次数,并依次放在p所指的数组中。 void fun(char *t, int p[ ]) {

int i;

for (i = 0; i < 26; i++) p[i] = 0; //计数器置0 for (i = 0; i < strlen(t); i++)

if (t[i] >= 'a' && t[i] <= 'z') p[t[i]-'a']++; }

(35)统计在字符串a中,以下字符出现的次数,并存到b数组中,其中:字符'+'出现的次数存到b[0]中,字符'-'出现的次数存到b[1]中,字符'*'出现的次数存到b[2]中,字符'/'出现的次数存到b[3]中,字符'&'出现的次数存到b[4]中,其它字符出现的次数

for (i = 0; i < strlen(a); i++) if (a[i] == '+') b[0]++; else if (a[i] == '-') b[1]++; else if (a[i] == '*') b[2]++; else if (a[i] == '/') b[3]++; else if (a[i] == '&') b[4]++;

else b[5]++; //其它字符

}

(36)把字符串a中的内容逆置。 void fun(char *a) { char t;

int i, m = strlen(a);

for (i = 0; i < m / 2; i++)

{ t = a[i]; a[i] = a[m-1-i]; a[m-1-i] = t; } }

(37)将s所指字符串中所有下标为奇数位置上的字母转换为大写(若该位置上不是字母,则不转换)。 void fun(char *s) {

int i;

for (i = 1; i < strlen(s); i += 2) if (s[i] >= 'a' && s[i] <= 'z')

s[i] -= 32; //转为大写

}

(38)将一个字符串转换为一个整数,例:把"456"转换为456,把"-23"转换为-23。 long fun(char *a) {

int i = 0, t = 1; long s = 0;

if (a[0] == '-') { t = -1; i = 1; } //处理负号 for ( ; i < strlen(a); i++) s = s * 10 + a[i] - '0'; return s * t; }

(39)在字符串的所有数字字符前加一个$字符。例如:输入:A1B23CD4,输出:A$1B$2$3CD$4。 void fun(char *s) { char t[N]; int i, j = 0;

for (i = 0; i <= strlen(s); i++) //含'\0' { if (s[i] >= '0' && s[i] <= '9') t[j++] = '$'; t[j++] = s[i]; // j++模式 } strcpy(s, t); }

(40)实现字符串连接:把p2所指的字符串连接到

所指的字符串后。不得使用函数strcat。 void fun(char *p1, char *p2)

{

strcpy(p1 + strlen(p1), p2); //方法1

或者:

p1 = p1 + strlen(p1); //方法2

while (*p1++ = *p2++) ; }

(41)比较两个字符串长度,返回较长的字符串。若长度相同,则返回第一个串。不得使用函数strlen。 char *fun(char *a, char *b) {

int i = 0, k = 0; while (a[i]) i++; // a串长度 while (b[k]) k++; // b串长度 return (i >= k ? a : b); }

(42)删除一个字符串中指定位置的字符。其中a存b存放删除后的字符串。例如,a串"World",n为3,则使b串为"Word"。 void fun(char a[ ], char b[ ], int n) { strcpy(b, a);

strcpy(b+n, a+n+1); }

(43)将a所指字符串中除了下标为偶数、同时ASCII值也为偶数的字符外,其余的全都删除;串中剩余字符所形成的新串放在t所指的数组中。 void fun(char *a, char *t) {

int i, j = 0, m = strlen(a); for (i = 0; i < m; i += 2)

if (a[i]%2 == 0) t[j++] = a[i]; // j++模式 t[j] = '\0'; //串尾加'\0' }

(44)删除数组中相同的数,使之只剩一个。数组已按从小到大排列,函数返回删除后数组中数据个数。若原数组是:2 2 2 3 4 4 5 5 6 6 6,删除后,数组前面元素的内容是:2 3 4 5 6,函数返回5。 int fun(int a[ ], int n) { int i, j = 0; for (i = 0; i < n-1; i++)

if (a[i] != a[i+1]) a[j++] = a[i]; // j++模式 a[j++] = a[n-1]; //最后1个数 return j; }

字符串中只包含字母和*号,删除字符串中所有*号,不得使用字符串函数。 void fun(char s[ ]) { int i, j = 0; for (i = 0; s[i]; i++)

if (s[i] != '*') s[j++] = s[i]; // j++模式

s[j] = '\0'; //串尾加'\0' }

(46)字符串中只包含字母和*号,删除字符串中的前导*号,不得使用字符串函数。 void fun(char s[ ]) { int i = 0, j = 0;

while (s[i] == '*') i++; //找第1字母 while (s[j++] = s[i++]); // j++模式 }

(47)字符串中只包含字母和*号,删除串尾部所有的*号,不得使用字符串函数。 void fun(char s[ ]) {

int i = 0;

while (s[i]) i++; //后移到'\0' while (s[--i] == '*' && i >= 0) s[i] = '\0'; //尾部置'\0' }

(48)字符串只包含字母和*号,使字符串尾部的*号不得多于n个;若多于n个,则删除多余的*号;若少于或等于n个,则什么也不做。字符串中间和前面的*号不删除。不得使用字符串函数。 void fun(char *a, int n) { int i = 0, t = 0, v; while (a[i]) i++; //后移到'\0' v = i; //存串长度 while (a[--i] == '*' && i >= 0) t++; //计*号个数 if (t > n) a[v-(t-n)] = '\0'; //截断串 }

(49)字符串只包含字母和*号,除了字符串前导的*号之外,将串中其它*号删除。不得使用字符串函数。 void fun(char *s) {

int i = 0, j;

while (s[i] == '*') i++; //找第1字母 for (j = i; s[i]; i++)

if (s[i] != '*') s[j++] = s[i]; // j++模式 s[j] = '\0'; //串尾加'\0' }

(50)字符串只包含字母和*号,除了前导和尾部*号之外,删除其它*号。指针h已指向第一个字母,p已指向最后一个字母。不得使用字符串函数。 void fun(char s[ ], char *h, char *p) { int j = h - s, i; for (i = h - s; i < p - s; i++) if (s[i] != '*') s[j++]= s[i]; // j++模式 while (s[j++] = s[i++]) ; //拷尾部*号 }

(51)从num个字符串中找出最长的一个字符串,并通过形参指针max传回该串地址。

void fun(char (*a)[81], int num, char **max) { int i; *max = a[0]; for (i = 0; i < num; i++)

if (strlen(a[i]) > strlen(*max)) *max = a[i]; }

(52)对a数组中长度为n个字符的字符串,除首尾n-2个字符按ASCII码降序排列。 void fun(char *a, int n) {

char t;

int i, k; for (i = 1; i < n - 2; i++) //冒泡排序 for (k = i + 1; k < n - 1; k++) if (a[i] < a[k])

{

t = a[i]; a[i] = a[k]; a[k] = t; }

}

(53)N名学生的学号和成绩已放入结构体数组w中,按分数从高到低排列结构体数组中N个记录。 typedef struct { char a[10]; int b; } S; void fun(S w[N]) {

S t; int i, k;

for (i = 0; i < N - 1; i++) //冒泡排序 for (k = i + 1; k < N; k++) if (w[i].b < w[k].b)

{

t = w[k]; w[k] = w[i]; w[i] = t; }

}

(54)把分数最低的学生数据放在b数组中(可能不止一个),函数返回分数最低的学生的人数。 typedef struct { char a[10]; int n; } S; int fun(S a[N], S b[N]) {

int i, j = 0, m = a[0].n; for (i = 1; i < N; i++)

if (a[i].n < m) m = a[i].n;

//最小值m for (i = 0; i < N; i++)

if (m == a[i].n) b[j++] = a[i]; // j++模式 return j; }

(55)N名学生的学号和成绩已放入结构体数组a中,请把指定分数范围内(m至n)的数据放在b所指的数组中,分数范围内的学生人数由函数值返回。 typedef struct { char num[10]; int s; } STR; int fun(STR *a, STR *b, int m, int n) { int i, j = 0;

for (i = 0; i < N; i++)

if (a[i].s >= m && a[i].s <= n) b[j++] = a[i]; // j++模式 return j; }

(56)返回指定学号的学生数据。若没有该学号,则把学号置空串、成绩置-1,作为函数值返回。 typedef struct { char a[10]; int b; } S; S fun(S *w, char *c) {

int i;

S m = {"", -1}; //空串,-1 for (i = 0; i < N; i++)

if (strcmp(w[i].a, c) == 0) //字串比较 {

m = w[i]; break; }

return m; }

(57)N名学生的成绩已放入一个带头结点的链表中,h typedef struct slist { double s;

struct slist *next;

} STREC;

double fun(STREC *h)

{

STREC *p = h->next; //跳头结点 double max = p->s; while (p) //未到链尾 { if (p->s > max) max = p->s; p = p->next; //到下1结点 } return max; }

(58)N名学生的成绩已放入一个带头结点的链表中,h指向头结点。求出平均分,由函数值返回。 typedef struct slist {

double s;

struct slist *next; } STREC;

double fun(STREC *h) { double t = 0;

STREC *p = h->next; //跳头结点 while (p) //未到链尾 {

t += p->s; //求总分 p = p->next; //到下1结点 } return t / N; }

全国计算机等级考试二级C语言上机编程题参考答案.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219