C语言题库2015 下载本文

Q257.(10分)输入一行字符,用函数编程统计其中有多少单词。假设单词之间以空格分开。 **输入格式要求:提示信息:\**输出格式要求:\参考答案

#include

int CountWords(char str[]); int main() {

char str[20];

printf(\ gets(str);

printf(\ return 0; }

int CountWords(char str[]) {

int i, num;

num = (str[0] != ' ') ? 1 : 0; for (i = 1; str[i] != '\\0'; i++) {

if (str[i] != ' ' && str[i - 1] == ' ') {

num++; } }

return num; }

Q1683.(10分)用二维数组作为函数参数,实现矩阵转置。按如下函数原型编程计算并输出m×n阶矩阵的转置矩阵。其中,m和n的值由用户从键盘输入。已知m和n的值都不超过10。

void Transpose(int a[][N], int at[][M], int m, int n); void InputMatrix(int a[][N], int m, int n); void PrintMatrix(int at[][M], int n, int m); 输入提示信息:\输入格式:\

输出提示信息和格式:\参考答案

#include #define M 10 #define N 10

void Transpose(int a[][N], int at[][M], int m, int n); void InputMatrix(int a[][N], int m, int n); void PrintMatrix(int at[][M], int n, int m);

int main() {

int s[M][N], st[N][M], m, n; printf(\ scanf(\ InputMatrix(s, m, n); Transpose(s, st, m, n);

printf(\ PrintMatrix(st, n, m); return 0; }

/* 函数功能:计算m*n矩阵a的转置矩阵at */ void Transpose(int a[][N], int at[][M], int m, int n) {

int i, j;

for (i = 0; i < m; i++) {

for (j = 0; j < n; j++) {

at[j][i] = a[i][j]; } } }

/* 函数功能:输入m*n矩阵a的值 */ void InputMatrix(int a[][N], int m, int n) {

int i, j;

printf(\ for (i = 0; i < m; i++) {

for (j = 0; j < n; j++) {

scanf(\ } } }

/* 函数功能:输出n*m矩阵at的值 */ void PrintMatrix(int at[][M], int n, int m) {

int i, j;

for (i = 0; i < n; i++) {

for (j = 0; j < m; j++) {

printf(\ }

printf(\ } }

Q552.(10分)如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则A和B称为亲密数。求10000以内的亲密数。

**输出格式要求:\ 程序运行示例如下: ( 220, 284) (1184,1210) (2620,2924) (5020,5564) (6232,6368)

参考答案

#include int main() {

int a, b, i, n;

for (a = 1; a < 10000; a++) {

b = 0;

for (i = 1; i <= a / 2; i++) {

if (a % i == 0) b += i; }

n = 0;

for (i = 1; i <= b / 2; i++) {

if (b % i == 0) n += i; }

if (n == a && a < b)

printf(\ }

return 0; }

Q381.(10分)*验证卡布列克运算。即:任意一个四位数,只要它们各个位上的数字是不全相

同的,就有这样的规律:

(1)将组成该四位数的四个数字由大到小排列,形成由这四个数字构成的最大的四位数; (2)将组成该四位数的四个数字由小到大排列,形成由这四个数字构成的最小的四位数(如果四个数字中含有0,则得到的数不足四位);

(3)求两个数的差,得到一个新的四位数(高位零保留)。

重复以上过程,最后得到的结果总是6174。这个数被称为卡布列克常数。请编写一个递归函数,完成以上的卡布列克运算。

**输入格式要求:\提示信息:\**输出格式要求:\程序运行示例如下: Enter number: 1234 [1]:4321-1234=3087 [2]:8730-378=8352 [3]:8532-2358=6174 参考答案

#include int count=0; main() {

int n;

printf(\ scanf(\ vr6174(n); }

vr6174(int num) {

int each[4],max,min; if(num!=6174&&num) {

parse_sort(num,each);

max_min(each,&max,&min); num=max-min;

printf(\ vr6174(num); } }

parse_sort(int num,int *each) {

int i,*j,*k,temp; for(i=0;i<=4;i++) {

j=each+3-i; *j=num;

num/=10; }

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

for(j=each,k=each+1;j*k)

{ temp=*j; *j=*k; *k=temp;} return; }

max_min(int *each,int *max,int *min) {

int *i; *min=0;

for(i=each;i

for(i=each+3;i>=each;i--) *max=*max*10+*i; return; }

Q457.(10分)从键盘输入一个长度为N(比如10)的整型数组,而后将数组中小于零的元素移动到数组的前端,大于零的元素移动到数组的后端,等于零的元素留在数组中间。比如原始数组为:2 -5 -89 75 0 -89 0 93 48 0,经过处理后的数组为:-5 -89 -89 0 0 0 75 93 48 2。由于不要求数组有序,所以不允许用排序方法。

**输入格式要求:\提示信息:\**输出格式要求:\程序运行示例如下:

Please input 10 interger number 2 -5 -89 75 0 -89 0 93 48 0

-5 -89 -89 0 0 0 75 93 48 2 参考答案

#include

#define N 10

int main() {

int a[N];

int i, p1 = 0, p2 = 9, p, temp;

printf(\ for (i = 0; i <= N - 1; i++) {

scanf(\ }

for (; p1 < p2 ; ) {

if (a[p1] == 0) {

p = p1;

while (a[p1 + 1] == 0) {

p1++; }

if (p1 + 1 < p2) {

temp = a[p1 + 1]; a[p1 + 1] = a[p]; a[p] = temp; p1 = p; continue; } else {

break; } }

if (a[p1] > 0) {

temp = a[p1]; a[p1] = a[p2]; a[p2] = temp; p2--; } else {

p1++; }

if (a[p2] == 0) {

p = p2;

while (a[p2 - 1] == 0) {

p2--; }

if (p1 < p2 - 1) {

temp = a[p2 - 1]; a[p2 - 1] = a[p];

a[p] = temp; p2 = p; continue; } else {

break; } }

if (a[p2] < 0) {

temp = a[p2]; a[p2] = a[p1]; a[p1] = temp; p1++; } else {

p2--; } }

for (i = 0; i <= N - 1; i++) {

printf(\ }

printf(\}

Q305.(10分)用100元人民币兑换10元,5元和1元的纸币(每一种都要有)共50张,请用穷举法编程计算共有几种兑换方案,每种方案各兑换多少张纸币. ****输入提示信息要求为:无 ****输出格式要求为: \ \参考答案

#include int main() {

int x, y, z, count = 0;

for (x = 0; x <= 5; x++) //1 {

for (y = 0; y <= 10; y++) //1 {

z = 50 - x - y;//1

if (10 * x + 5 * y + z == 100) //2 {

count++; //1

printf(\ } } }

printf(\ return 0; }

Q423.(10分)分数比较。比较两个分数的大小。

**输入格式要求:\提示信息:\

**输出格式要求:\程序运行示例如下: Input two FENSHU : 1 3,1 4 1/3>1/4 参考答案

#include main()

{int i,j,k,l,m,n;

printf(\scanf(\m=zxgb(j,l)/j*i; n=zxgb(j,l)/l*k; if(m>n)

printf(\else if(m==n)

printf(\ else printf(\}

zxgb(a,b) int a,b; { long int c; int d;

if(a

Q461.(10分)(附加题)编程将字符串s倒序输出,要求利用函数递归实现。 **输入格式要求:\提示信息:\

**输出格式要求:\

程序运行的输入输出样例: 屏幕先输出提示信息: input your string:

然后用户键盘输入: abcdefg

最后屏幕输出: Gfedcba

#include

void reverse(char s[]) {

int len;

len = strlen(s); if (len == 1) {

printf(\ } else {

reverse(s + 1); printf(\ } }

int main() {

char s[100];

printf(\ scanf(\ reverse(s); }

Q780.(5分)改错题:用户从键盘任意输入一个数字表示月份值n,程序显示该月份对应的英文表示,若n不在1~12之间,则输出“Illegal month”。 注意:

(1)请将修改正确后的完整源程序拷贝粘贴到答题区内。

(2)对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。 (3)当且仅当错误全部改正,且程序运行结果调试正确,才给加5分。

#include main()

{

int n;

char monthName[][20] = {\\

printf(\ scanf(\

if ((n < 12) || (n > 1)) {

printf(\

} else {

printf(\ } }

参考答案

#include main() {

int n;

char monthName[][20] = {\\

printf(\ scanf(\

if ((n <= 12) && (n >= 1)) {

printf(\

} else {

printf(\ } }

Q263.(10分)从键盘任意输入一个整型表示的月份值,用指针数组编程输出该月份的英文表示,若输入的月份值不在1~12之间,则输出“Illegal month”。 **输入格式要求:\ 提示信息:\**输出格式要求:\

\\

程序运行示例1如下: Input month number:5 month 5 is May

程序运行示例2如下: Input month number:13 Illegal month 参考答案

#include int main() {

int n;

static char *monthName[] = {\

\ \ \ }; printf(\ scanf(\

if ((n <= 12) && (n >= 1)) {

printf(\输出相应月份 */ } else {

printf(\ /* 输出错误提示信息 */ }

return 0; }

Q438.(10分)哪个大夫哪天值班

医院有A、B、C、D、E、F、G七位大夫,在一个星期内(星期一至星期天) 每天要轮流值班一天。现在已知: A大夫比C大夫晚一天值班; D大夫比E大夫晚两天值班; B大夫比G大夫早三天值班;

F大夫的值班日在B和C大夫的中间,且是星期四; 请确定每天究竟哪位大夫值班?

**输出格式要求:\程序运行示例如下:

Doctor E is on duty MONDAY. Doctor B is on duty TUESDAY. Doctor D is on duty WEDNESDAY. Doctor F is on duty THURDAY. Doctor G is on duty FRIDAY.

Doctor C is on duty STAURDAY. Doctor A is on duty SUNDAY. 参考答案

#include int a[8];

char *day[]={

\ \main() {

int i,t,j; a[4]=6;

for(i=1;i<=3;i++) {

a[i]=2; if(!a[i+3]) a[i+3]=7; else {

a[i]=0; continue; }

for(t=1;t<=3;t++) {

if(!a[t]) a[t]=5; else

continue; if(!a[t+2]) a[t+2]=4; else {

a[t]=0; continue; }

for(j=5;j<7;j++) {

if(!a[j]) a[j]=3; else

continue; if(!a[j+1]) a[j+1]=1; else

{

a[j]=0; continue; }

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

printf(\ exit(0); } } } }

Q1689.(10分)按如下函数原型用函数编程解决如下的日期转换问题(要求考虑闰年的问题): 输入某一年的第几天,计算并输出它是这一年的第几月第几日。

/* 函数功能:对给定的某一年的第几天,计算它是这一年的第几月第几日 函数入口参数:整型变量year,存储年 整型变量yearDay,存储这一年的第几天

函数出口参数:整型指针pMonth,指向存储这一年第几月的整型变量 整型指针pDay,指向存储第几日的整型变量 函数返回值:无 */

void MonthDay(int year, int yearDay, int *pMonth, int *pDay); 输入提示信息:\输入格式:\

输出提示信息和格式:\参考答案

#include

void MonthDay(int year, int yearDay, int *pMonth, int *pDay);

int dayTab[2][13] = {{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}}; int main() {

int year, month, day, yearDay;

printf(\ scanf(\

MonthDay(year, yearDay, &month, &day); printf(\ return 0; }

/* 函数功能:对给定的某一年的第几天,计算它是这一年的第几月第几日 */ void MonthDay(int year, int yearDay, int *pMonth, int *pDay) {

int i, leap;

leap = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0); for (i = 1; yearDay > dayTab[leap][i]; i++)

{

yearDay = yearDay - dayTab[leap][i]; }

*pMonth = i; /* 将计算出的月份值赋值给pMonth所指向的变量 */ *pDay = yearDay; /* 将计算出的日号赋值给pDay所指向的变量 */ }

Q1735.(10分)

编程输出如下上三角形式的九九乘法表。

**输出格式要求:\参考答案

#include

main() {

int m, n, i;

for (n = 1; n < 10; n++) //被乘数n从1变化到9 {

for (i = 1; i <= 4 * n - 4; i++) {

printf(\ //输出相应空格使数字右对齐 }

for (m = n; m < 10; m++) //乘数m从n变化到9 {

printf(\输出第n行m列中的m*n的值 }

printf(\ //输出换行符,准备打印下一行 } }

Q588.(10分)编写一个程序,求满足以下条件的最大的n:1^2 + 2^2 + 3^2 + ... + n^2 <= 1000。 x^2表示x的平方。

**输出格式要求:\参考答案

#include int main() {

int n, s; s = n = 0;

while (s <= 1000)

{

++n;

s += n * n; }

printf(\ return 0; }

Q1595.(10分)马克思手稿中有一道趣味数学题:有30个人,其中有男人、女人和小孩,在一家饭馆里吃饭共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,问男人、女人和小孩各有几人?

假设男人为x人,女人为y人,小孩为z人,则有以下方程组: {x+y+z=303x+2y+z=50

main() {

int x,y,z;

printf(\ for (x=1; x<16; x++)

for (y=1; y<25; y++) {

z = 30 – x - y;

if (3 * x + 2 * y + z = 50)

printf(\ } }

参考答案

#include main() {

int x,y,z;

printf(\ for (x=0; x<=16; x++)

for (y=0; y<=25; y++) {

z = 30 - x - y;

if (3 * x + 2 * y + z == 50)

printf(\ } }

Q1314.(10分)有一篇文章,共有三行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格、以及其它字符的个数。 程序的运行示例如下:

请输入第0行: helloworld

请输入第1行: 12345gogogo 请输入第2行: end bye bye. helloworld 12345gogogo end bye bye.

大写字母数:0 小写字母数:25 数字个数:5 空格个数:2 其它字符:1 参考答案

#include

int main() {

int i, j, uppn, lown, dign, span, othn; char text[3][80];

uppn = lown = dign = span = othn = 0;

for (i = 0; i < 3; i++) {

printf(\请输入第%d行:\\n\ gets(text[i]);

for (j = 0; j < 80 && text[i][j] != '\\0'; j++) {

if (text[i][j] >= 'A' && text[i][j] <= 'Z') {

uppn += 1; }

else if (text[i][j] >= 'a' && text[i][j] <= 'z') {

lown += 1; }

else if (text[i][j] >= '0' && text[i][j] <= '9') {

dign += 1; }

else if (text[i][j] == ' ') {

span += 1; } else {

othn += 1; } } }

for (i = 0; i < 3; i++) {

printf(\ }

printf(\大写字母数:%d\\n\ printf(\小写字母数:%d\\n\ printf(\数字个数:%d\\n\ printf(\空格个数:%d\\n\ printf(\其它字符:%d\\n\

return 0; }

Q559.(10分)一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

**输出格式要求:\程序运行示例如下:

the total of road is 299.609375 the tenth is 0.097656 meter 参考答案

#include int main() {

float sn = 100.0, hn = sn / 2; int n;

for (n = 2; n <= 10; n++) {

sn = sn + 2 * hn; hn = hn / 2; }

printf(\ printf(\ return 0; }

Q498.(20分)对输入的字符串进行长度验证,保证输入的字符串的长度在指定的范围内,如果不在指定的范围内,则一直提示用户输入,直到输入合法长度的字符串为止。 程序的示例运行如下:

请输入一个字符串(长度为[3..5]个字符):a 请输入一个字符串(长度为[3..5]个字符):ab 请输入一个字符串(长度为[3..5]个字符):abcdef 请输入一个字符串(长度为[3..5]个字符):abc 你输入的字符串为:abc 参考答案

#include

void getString(char *str, int min, int max) {

int len;

printf(\请输入一个字符串(长度为[%d..%d]个字符):\\n\ scanf(\ len = strlen(str);

while (len < min || len > max) {

printf(\请输入一个字符串(长度为[%d..%d]个字符):\\n\ scanf(\ len = strlen(str); } }

int main(int argc, char *argv[]) {

char string[100];

getString(string, 3, 5);

printf(\你输入的字符串为:%s\\n\

return 0; }

Q376.(10分)采用递归方法计算x的n次方。 **输入格式要求:\提示信息:\**输出格式要求:\程序运行示例如下: x=? n=?2 8 2**8=256

参考答案

#include main() {

int x,n;

printf(\

scanf(\

printf(\}

power(int x,int n) {

if(n==0) return 1;

else return x*power(x,n-1); }

Q567.(10分)请编写函数fuc(),函数的功能是:根据以下公式求出p的值,结果由函数值返回。m , n 是两个正整数,且 m>n. P= m!/(n!*(n-m))!

**输入格式要求:\提示信息:\请输入m,n的值( m>n ):\\n\**输出格式要求:\项之和为:%lf\\n\程序运行示例如下: 请输入m,n的值( m>n ): 5 3

n项之和为:10.000000 参考答案

#include double fac(int m, int n) {

int i;

long p = 1, q = 1, r = 1; double d = 0.0;

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

p = p * i; }

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

q = q * i; }

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

r = r * i; }

d = (double)p / (r * q); return d;

}

main() {

int n, m; double d; do {

printf(\请输入m,n的值( m>n ):\\n\ scanf(\ }

while (m < n); d = fac(m, n);

printf(\项之和为:%lf\\n\}

Q1159.(10分)

下面程序的功能是将数组元素倒置,找出其中的4处错误并改正之。 #include \#define M 5; main()

{ int a[M]={1,2,3,4,5}; int i,j,*t; i=0;j=M-1; while(i) {

t=*(a+i); *(a+i)=*(a+j); *(a+j)=t; i++;j++ }

for(i=0;i

参考答案

#include \#define M 5 main()

{ int a[M]={1,2,3,4,5}; int i,j,t; i=0;j=M-1; while(i<=j) {

t=*(a+i);

*(a+i)=*(a+j); *(a+j)=t; i++;j--; }

for(i=0;i

Q1601.(10分)按如下函数原型编写程序,输入10个整数,用函数编程将其中最大数与最小数位置互换,然后输出互换后的数组。 void MaxMinExchang(int a[], int n); int FindMaxPos(int s[], int n); int FindMinPos(int s[], int n);

输入提示信息:\输入格式:\

输出提示信息:\输出格式:\参考答案

#include

void MaxMinExchang(int a[], int n); int FindMaxPos(int s[], int n); int FindMinPos(int s[], int n); int main() {

int i, a[10];

printf(\ for (i = 0; i < 10; i++) {

scanf(\ }

MaxMinExchang(a, 10); printf(\ for (i = 0; i < 10; i++) {

printf(\ }

printf(\ return 0; }

/* 函数功能:将数组中的最大数与最小数位置互换 */ void MaxMinExchang(int a[], int n) {

int maxPos, minPos, temp; maxPos = FindMaxPos(a, n); minPos = FindMinPos(a, n);

temp = a[maxPos]; a[maxPos] = a[minPos]; a[minPos] = temp; }

/* 函数功能:计算数组中的最大值在数组中的下标位置 */ int FindMaxPos(int s[], int n) {

int maxPos = 0, max = s[0], i; for (i = 1; i < n; i++) {

if (s[i] > max) {

max = s[i]; maxPos = i; } }

return maxPos; }

/* 函数功能:计算数组中的最小值在数组中的下标位置 */ int FindMinPos(int s[], int n) {

int minPos = 0, min = s[0], i; for (i = 1; i < n; i++) {

if (s[i] < min) {

min = s[i]; minPos = i; } }

return minPos; }

Q1687.(10分)用字符指针作函数参数编程实现如下功能:在字符串中删除与某字符相同的字符。

**提示信息: \ \

**输入格式要求:\

**输出格式要求:\程序运行示例1如下: Input a string:hello,world! Input a character:o Results:hell,wrld!

参考答案

#include #include #define N 100

void Squeeze(char *s, char c); int main() {

char str[20], ch;

printf(\ gets(str);

printf(\ ch = getchar(); Squeeze(str, ch);

printf(\ return 0; }

void Squeeze(char *s, char c) {

char str[N]; char *t = str; strcpy(t, s);

for (; *t != '\\0'; t++) {

if (*t != c) {

*s = *t; s++; } }

*s = '\\0'; /* 在字符串t2的末尾添加字符串结束标志 */ }

Q1715.(10分)假设今年的工业产值为100万元,产值增长率为每年c%,请编程计算当c分别为6、8、10、12时工业产值分别过多少年可实现翻一番(即增加一倍)。 输入格式:无

输出格式:\参考答案

#include

#define CURRENT 100 #define N 4 main() {

int i;

int year; /* 产值翻番所需年数 */

int growRate[N] = {6, 8, 10, 12}; /* 工业产值的增长率 */ double output; /* 工业总产值 */ for (i = 0; i < N; i++) {

output = CURRENT; /* 当年产值为100万元 */ for (year = 0; output < 2 * CURRENT; year++) {

output = output * (1 + growRate[i] / 100.0); }

printf(\ %d years.\\n\ } }

Q297.(15分)两个正整数的最大公约数是能够整除这两个整数的最大整数。 请按如下函数原型编写计算最大公约数的函数Gcd()。 int Gcd(int a, int b);

在主函数中调用该函数计算,并输出从键盘任意输入的两整数的最大公约数。 **要求输入提示信息为: \**要求输入格式为: \**要求输出格式为

如果a或b不是正整数,输出: \否则输出: \

注:不能使用指针、结构体、共用体、文件、goto、枚举类型进行编程,主函数不能使用int main和return 0。 参考答案

#include int Gcd(int a, int b); main() {

int a, b, c;

printf(\

scanf(\ c = Gcd(a, b); //1 if (c != -1) //1 {

printf(\ } else {

printf(\ } }

int Gcd(int a, int b) //1

{

int i, t;

if (a <= 0 || b <= 0) //1 {

return -1; //1 }

t = a < b ? a : b; //2 for (i = t; i > 0; i--)//2 {

if (a % i == 0 && b % i == 0)//1 return i; //1 }

return 1; //1 }

Q320.(10分)请用循环语句,打印输出如下图所示的下三角形乘法九九表。 1 2 4 3 6 9

4 8 12 16 5 10 15 20 25 6 12 18 24 30 36 7 14 21 28 35 42 49 8 16 24 32 40 48 56 64 9 18 27 36 45 54 63 72 81 **输入提示信息格式: 无 **输入数据格式要求: 无 **输出数据格式要求: \参考答案

#include int main() {

int i, j;

for (i = 1; i < 10; i++) //2 {

for (j = 1; j <= i; j++) //2 {

printf(\ }

printf(\ //1 }

return 0; }

Q1281.(10分)

程序改错。下面程序的功能是从键盘输入一行字符,统计其中有多少单词。假设单词之间以空格分开。[提示:判断是否有新单词出现的方法是——当前被检验的字符不是空格,而前一被检验字符是空格,则表示有新单词出现。] #include #define ARR_SIZE 80; main() {

char str[ARR_SIZE]; int i, num;

gets(str);

if(str[0] != ' ' && str[0] != '\\0') {

num = 1; } else {

num = 0; }

for(i = 1 ; str[i] != '\\0'; i++) {

if(str[i] != ' ' && str[i-1] {

num++; } }

printf(\}

参考答案

#include #define ARR_SIZE 80 main() {

char str[ARR_SIZE]; int i, num;

gets(str);

if(str[0] != ' ' && str[0] != '\\0') {

num = 1; }

= ' ') else {

num = 0; }

for(i = 1 ; str[i] != '\\0'; i++) {

if(str[i] != ' ' && str[i-1] == ' ') {

num++; } }

printf(\}

Q595.(10分)编程输入一个整数m(int型),输出该整数的位数n。 **输入格式要求:\**输出格式要求:\程序运行示例1如下: 345 n=3

程序运行示例2如下: 0 n=1

参考答案

#include main() {

int m, n;

scanf(\ n = 0; do {

m = m / 10; n++; }

while (m != 0);

printf(\}

Q544.(10分)某班期末考试科目为数学(MT)、英语(EN)和物理(PH),有最多不超过40人参加考试。请编程计算:(1)每个学生的总分和平均分;(2)每门课程的总分和平均分。 **输入格式要求:\学号) 提示信息:\

\ EN PH:\\n\

**输出格式要求:\n\\\t MT \\t EN \\t PH \\t SUM \\t AVER\\n\\打印学号) \(打印每门课成绩)\(打印总分和平均分) \打印每门课的总分) \每门课的平均分) 程序的运行示例如下:

Input the total number of the students(n<=40):4 Input student’s ID and score as: MT EN PH: 070310122 97 87 92 070310123 92 91 90 070310124 90 81 82 070310125 73 65 80 Counting Result: Student’s ID MT EN PH SUM AVER 070310122 97 87 92 276 92.0 070310123 92 91 90 273 91.0 070310124 90 81 82 253 84.3 070310125 73 65 80 218 72.7 SumofCourse 352 324 344 AverofCourse 88.0 81.0 86.0 参考答案

#include

#define STUD_N 40 /* 最多学生人数 */ #define COURSE_N 3 /* 考试科目数 */ int ReadScore(int score[][COURSE_N], long num[]);

void AverforStud(int score[][COURSE_N], int sum[], float aver[], int n); void AverforCourse(int score[][COURSE_N], int sum[], float aver[], int n); void Print(int score[][COURSE_N], long num[], int sumS[], float averS[], int sumC[], float averC[], int n); int main() {

int score[STUD_N][COURSE_N], sumS[STUD_N], sumC[STUD_N], n; long num[STUD_N];

float averS[STUD_N], averC[STUD_N];

n = ReadScore(score, num); /* 读入学生成绩 */

AverforStud(score, sumS, averS, n); /* 计算每个学生的总分平均分 */ AverforCourse(score, sumC, averC, n); /* 计算每门课程的总分平均分 */ Print(score, num, sumS, averS, sumC, averC, n); /* 输出学生成绩 */ return 0; }

/* 函数功能:输入学生的学号及其三门课的成绩,当输入负值时,结束输入,返回学生人数 */

int ReadScore(int score[][COURSE_N], long num[]) {

int i, j, n;

printf(\

scanf(\ /* 输入参加考试的学生人数 */ printf(\ EN PH:\\n\

for (i = 0; i < n; i++) /* 对所有学生进行循环 */ {

scanf(\ /* 以长整型格式输入每个学生的学号 */ for (j = 0; j < COURSE_N; j++) /* 对所有课程进行循环 */ {

scanf(\ /* 输入每个学生的各门课成绩 */ } }

return i; /* 返回学生人数 */ }

/* 函数功能:计算每个学生的总分和平均分 */

void AverforStud(int score[][COURSE_N], int sum[], float aver[], int n) {

int i, j;

for (i = 0; i < n; i++) {

sum[i] = 0;

for (j = 0; j < COURSE_N; j++) /* 对所有课程进行循环 */ {

sum[i] = sum[i] + score[i][j]; /* 计算第i个学生的总分 */ }

aver[i] = (float)sum[i] / COURSE_N;/* 计算第i个学生的平均分 */ } }

/* 函数功能:计算每门课程的总分和平均分 */

void AverforCourse(int score[][COURSE_N], int sum[], float aver[], int n) {

int i, j;

for (j = 0; j < COURSE_N; j++) {

sum[j] = 0;

for (i = 0; i < n; i++) /* 对所有学生进行循环 */ {

sum[j] = sum[j] + score[i][j]; /* 计算第j门课程的总分 */ }

aver[j] = (float)sum[j] / n; /* 计算第j门课程的平均分 */ } }

/*函数功能:打印每个学生的学号、各门课成绩、总分和平均分,以及每门课的总分和平均分*/

void Print(int score[][COURSE_N], long num[], int sumS[], float averS[],

int sumC[], float averC[], int n) {

int i, j;

printf(\

printf(\\\t MT \\t EN \\t PH \\t SUM \\t AVER\\n\ for (i = 0; i < n; i++) {

printf(\ /* 以长整型格式打印学生的学号 */ for (j = 0; j < COURSE_N; j++) {

printf(\打印学生的每门课成绩 */ }

printf(\打印学生的总分平均分*/ }

printf(\

for (j = 0; j < COURSE_N; j++) /* 打印每门课的总分 */ {

printf(\ }

printf(\

for (j = 0; j < COURSE_N; j++) /* 打印每门课的平均分 */ {

printf(\ }

printf(\}

Q270.(10分)编程用链表方法实现堆栈数据结构。堆栈(Strack)是指这样一段内存,它可以理解为一个筒结构,先放进筒中的数据被后放进筒中的数据“压住”,只有后放进筒中的数据都取出后,先放进去的数据才能被取出,称为“后进先出”。堆栈的长度可随意增加。堆栈结构可用链表实现。设计一个链表结构需包含两个成员:一个存放数据,一个为指向下一个节点的指针。当每次有一个新数据要放入堆栈时,称为“压入堆栈”,这时动态建立一个链表的节点,并连接到链表的结尾;当每次从堆栈中取出一个数据时,称为“弹出堆栈”,这意味着从链表的最后一个节点中取出该节点的数据成员,同时删除该节点,释放该节点所占的内存。 参考答案

#include #include typedef struct stack {

int data;

struct stack *next; } STACK;

STACK *head, *pr;

int nodeNum = 0; /* 堆栈节点数寄存器 */

STACK *CreateNode(int num); STACK *PushStack(int num); int PopStack(void); int main() {

int pushNum[5] = {111, 222, 333, 444, 555}, popNum[5], i; for (i = 0; i < 5; i++) {

PushStack(pushNum[i]);

printf(\ }

for (i = 0; i < 5; i++) {

popNum[i] = PopStack();

printf(\ }

return 0; }

/* 函数功能:生成一个新的节点,并为该节点赋初值,返回指向新的节点的指针 */ STACK *CreateNode(int num) {

STACK *p;

p = (STACK *)malloc(sizeof(STACK)); if (p == NULL) {

printf(\ exit(0); }

p->next = NULL; /* 为新建的节点指针域赋空指针 */ p->data = num; /* 为新建的节点数据区赋值 */ return p; }

/* 函数功能:将整型变量num的值压入堆栈,返回指向链表新节点的指针 */ STACK *PushStack(int num) {

if (nodeNum == 0) /* 若为首节点,则保留该节点地址在head中*/ {

head = CreateNode(num); pr = head;

nodeNum++; /* 堆栈节点数寄存器+1 */ }

else /* 若不是首节点,则将新建节点连到链表的结尾处 */ {

pr->next = CreateNode(num);

pr = pr->next;

nodeNum++; /* 堆栈节点数寄存器+1 */ }

return pr; }

/* 函数功能:将当前栈顶的数据弹出堆栈,返回从堆栈中弹出的数据 */ int PopStack(void) {

STACK *p = head; int result; for (;;) {

if (p->next == NULL) /* 查找最后一个节点 */ {

break; } else {

pr = p; /* 记录最后一个节点的前一个节点的地址 */ p = p->next;

nodeNum--; /* 堆栈节点数寄存器-1 */ } }

pr->next = NULL; /* 将末节点的前一个节点置成末节点 */ result = p->data; free(p);

return result; }

Q1330.(50分)13个人围成一圈,从第1个人开始顺序报号1、2、3,凡报到3的人退出圈子。找出最后留在圈子里的人原来的序号。要求用结构体编程实现。 程序的运行示例如下:

出圈成员及顺序: 3 6 9 12 2 7 11 4 10 5 1 8 最后的成员是: 13 参考答案

#include

#define N 13

struct person {

int number; int nextp; } link[N + 1];

int main(void) {

int i, count, h;

/* 建立队列 */ for (i = 1; i <= N; i++) {

if (i == N) {

link[i].nextp = 1; } else {

link[i].nextp = i + 1; }

link[i].number = i; }

printf(\ count = 0; h = N;

printf(\出圈成员及顺序:\ while (count < N - 1) {

i = 0;

while (i != 3) {

h = link[h].nextp; if (link[h].number) {

i++; } }

printf(\ link[h].number = 0; count++; }

printf(\最后的成员是:\ for (i = 1; i <= N; i++) {

if (link[i].number) {

printf(\

} }

return 0; }

Q1332.(10分)创建并输出一个一维数组(含20个元素),数组元素的值分别是下标的3倍多2。

**输出格式要求:\程序的运行示例如下:

2 5 8 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 参考答案

#include

main() {

int a[20], k;

for (k = 0; k < 20; k++) {

a[k] = 3 * k + 2; printf(\ } }

Q539.(10分)从键盘输入某班学生某门课的成绩(已知每班人数最多不超过40人,具体人数由键盘输入,成绩为整数),试编程计算其平均分。

**输入格式要求:\提示信息:\ **输出格式要求:\程序的运行示例如下: Input n:3

Input score:80 100 60 Average score is 80 参考答案

#include

intmain() {

inti, result;

for(i = 1; i <= 20; i++) {

result = i * i; if(result > 100) break; else

printf(\ } }

Q1158.(10分)

下面程序的功能是读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*。找出其中的错误,并改正之。 #include \main()

{ int i,a,n=1; while(n<=7) { do {

scanf(\ }while(a<1 && a>50); for(i=1;i<=a;i++) printf(\ printf(\ n++; } }

参考答案

#include #define N 40

int Average(int score[], int n); /* Average()函数原型 */ void ReadScore(int score[], int n); /* ReadScore()函数原型 */ int main() {

int score[N], aver, n; printf(\ scanf(\

ReadScore(score, n); /* 数组名作为函数实参调用函数ReadScore() */ aver = Average(score, n); /* 数组名作为函数实参调用函数Average() */ printf(\ return 0; }

/* 函数功能:计算n个学生成绩的平均分 */

int Average(int score[], int n) /* Average()函数定义 */ {

int i, sum = 0;

for (i = 0; i < n; i++) {

sum += score[i];

}

return sum / n; }

/* 函数功能:输入n个学生的某门课成绩 */

void ReadScore(int score[], int n) /* ReadScore()函数定义 */ {

int i;

printf(\ for (i = 0; i < n; i++) {

scanf(\ } }

Q1683.(10分)用二维数组作为函数参数,实现矩阵转置。按如下函数原型编程计算并输出m×n阶矩阵的转置矩阵。其中,m和n的值由用户从键盘输入。已知m和n的值都不超过10。

void Transpose(int a[][N], int at[][M], int m, int n); void InputMatrix(int a[][N], int m, int n); void PrintMatrix(int at[][M], int n, int m);

输入提示信息:\输入格式:\

输出提示信息和格式:\参考答案

#include #define M 10 #define N 10

void Transpose(int a[][N], int at[][M], int m, int n); void InputMatrix(int a[][N], int m, int n); void PrintMatrix(int at[][M], int n, int m); int main() {

int s[M][N], st[N][M], m, n; printf(\ scanf(\ InputMatrix(s, m, n); Transpose(s, st, m, n);

printf(\ PrintMatrix(st, n, m); return 0; }

/* 函数功能:计算m*n矩阵a的转置矩阵at */ void Transpose(int a[][N], int at[][M], int m, int n) {

int i, j;

for (i = 0; i < m; i++) {

for (j = 0; j < n; j++) {

at[j][i] = a[i][j]; } } }

/* 函数功能:输入m*n矩阵a的值 */ void InputMatrix(int a[][N], int m, int n) {

int i, j;

printf(\ for (i = 0; i < m; i++) {

for (j = 0; j < n; j++) {

scanf(\ } } }

/* 函数功能:输出n*m矩阵at的值 */ void PrintMatrix(int at[][M], int n, int m) {

int i, j;

for (i = 0; i < n; i++) {

for (j = 0; j < m; j++) {

printf(\ }

printf(\ } }

Q358.(10分)有一个3*4的矩阵,求其中的最大元素的值。矩阵为: {{1,3,5,7},{2,4,6,8},{15,17,34,12}}; **输出格式要求:\程序运行示例如下: max value is 34 参考答案

#include maxvalue(array)

int array[][4]; {

int i,j,k,max; max=array[0][0]; for(i=0;i<3;i++)

for(j=0;j<4;j++)

if(array[i][j]>max) max=array[i][j]; return max; }

main() {

static int a[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}}; printf(\}

Q434.(10分)除式还原(1)

给定下列除式,其中包含5和7,其它打X的位置上是任意数字,请加以还原。 X7X -------商 -------- -------被除数 除数------XX|XXXXX

X77 -------- X7X X7X ------- XX XX ------- 0

**输出格式要求:\程序运行示例如下: 51463/53=971 参考答案

#include #include main()

{ long int i; int j,k,l;

for(i=10000;i<=99999;i++) if(i00-i0==400) for(j=10;j<=99;j++)

if(i%j==0&&(l=i/j)0>=70&&i0<80&&i!=0&&l>100&&l<=999)

if(j*(l)<100&&j*(l)>10)

if(j*70>=70&&j*70<80)

if(j*(l/100)0==77&&j*(l/100)>100) printf(\}

Q337.(10分)求1到10的阶乘。

**输出格式要求:\ -!=%ld\每行输出5个数的阶乘。 程序运行示例如下:

1!=1 2!=2 3!=6 4!=24 5!=120

6!=720 7!=5040 8!=40320 9!=362880 10!=3628800 参考答案

#include main() {

long int n=1; int i;

for(i=1;i<=10;i++) {

n=n*i;

printf(i%5==0?\ -!=%ld\\n\ -!=%ld\ } }

Q1160.(10分)

下面程序的功能是删除字符串中第一次出现的a字符。找出其中错误,并改正之。 #include #include

void fun(char *x,int n,*t); { int i,k=0;

x[n]='a';x[n+1]='\\0'; while(x*k+!=’a’) k++; if(k==n){*t=0;break;} else

{ for(i=k;i

main() {

char x[20];

int len,t; gets(x); puts(x);

len=strlen(x); fun(x,len,t);

if(t==0) printf(\ else puts(x); }

参考答案

#include #include

void fun(char *x,int n,int *t) { int i,k=0;

x[n]='a';x[n+1]='\\0'; while(x[k]!='a') k++; if(k==n){*t=0;} else

{ for(i=k;i

main() {

char x[20]; int len,t; gets(x); puts(x);

len=strlen(x); fun(x,len,&t);

if(t==0) printf(\ else puts(x); }

Q275.(20分)输入某班学生某门课的成绩(最多不超过40人), 当输入为负值时,表示输入结束,

用函数编程统计成绩不低于平均分的学生人数。 要求:

(1)按如下函数原型进行编程: int GetAboveAver(int score[], int n); (2)在主函数中: 输入学生成绩,

然后调用函数GetAboveAver计算成绩不低于平均分的学生人数,

最后输出该人数。 要求:

(1)学生成绩和平均分均定义为int类型 (2)**无输入提示信息 **输入格式为:\

**输出格式为:\参考答案

#include #define N 40

int GetAboveAver(int score[], int n); void main() {

int score[N], m, n; n = -1; //1 do{

n++;

scanf(\ }while (score[n] >= 0); //e2

m = GetAboveAver(score, n); //2

printf(\}

int GetAboveAver(int score[], int n) {

int i, sum, aver,count; count = 0;//1 sum = 0;//1 for (i=0; i

sum += score[i];//2 }

aver=sum/n;//1 for (i=0; i

if (score[i] >= aver)//2 count++;//1 }

return count;//1 }

Q432.(10分)求不超过1000的回文素数。

**输入格式要求:提示信息:\**输出格式要求:\程序运行示例如下:

Following are palindrome primes not greater than 1000:

11 101 131 151 181 191 313 353 373 383 727 757 787 797 919 929 参考答案

#include #include

int main() {

int i,j,t,k,s;

printf(\ for (i=0; i<=9;i++) for(j=0;j<=9;j++)

for(k=0;k<=9;k++) { s=i*100+j*10+k; t=k*100+j*10+i; if(i==0&&j==0) t/=100; else if(i==0) t/=10;

if(s>10&&s==t&&a(s)) printf(\

} } a(n) int n; {int i;

for (i=2;i<=(n-1)/2;i++) if(n%i==0) return(0); return(1); }

Q455.(10分)编写一个程序打印如下对称图形(行数由键盘输入1-9范围的值),例如下面是输入数字4时的情形:

4444444 33333 222 1 222 33333 4444444 参考答案

#include

int main() {

int i, j, k;

int n; /*定义变量n,表示行数*/

printf(\ scanf(\

for (i = 0; i < 2 * n - 1; i++) {

k = i; if (i >= n) {

k = 2 * n - 2 - i; /*当i >=n时,令k=2*n-2-i,打印相应对称图形*/ }

for (j = 0; j < k; j++) {

printf(\ /*打印空格*/ }

for (j = 0; j < 2 * (n - k) - 1; j++) {

printf(\ /*打印数字*/ }

printf(\ } }

Q206.(15分)编程计算2×3阶矩阵A和3×2阶矩阵B之积C。 要求:

(1)从键盘分别输入矩阵A和B, 输出乘积矩阵C (2)

**输入提示信息为:

输入矩阵A之前提示:\输入矩阵B之前提示:\**输入矩阵中每个值的格式为:\**输出格式为:

输出矩阵C之前提示:\输出矩阵C中每个值的格式:\输出矩阵C各行结束时换行 例如:

Input 2*3 matrix a: 1 2 3 0 1 2

Input 3*2 matrix b: 1 -2 2 3 1 3 Results:

8 13 4 9

注:不能使用指针、结构体、共用体、文件、goto、枚举类型进行编程,主函数不能使用int main和return 0。 参考答案

#include #define ROW 2 #define COL 3 main() {

int a[ROW][COL], b[COL][ROW], c[ROW][ROW], i, j,k;

printf(\ for (i=0; i

for (j=0; j

scanf(\ } }

printf(\ for (i=0; i

for (j=0; j

scanf(\ &b[i][j]);//1 } }

for (i=0; i

for (j=0; j

c[i][j] = 0 ;//1

for (k=0; k

c[i][j] = c[i][j]+a[i][k]*b[k][j] ;//2 } } }

printf(\ for (i=0; i

for (j=0; j

printf(\ }

printf(\ } }

Q374.(10分)产生动态数组,编写程序,输入数组大小后,通过动态分配内存函数malloc产生数组。

**输入格式要求:\提示信息:\**输出格式要求:\程序运行示例如下: Enter array size:8 array[0]=0 array[1]=10 array[2]=20 array[3]=30 array[4]=40 array[5]=50 array[6]=60 array[7]=70

参考答案

#include #include main() {

int *p,n,i;

printf(\ scanf(\

p=(int *)malloc(n*sizeof(int)); for(i=0;i

printf(\}

Q1699.(10分)根据最大公约数的如下3条性质,采用迭代法编写计算最大公约数的函数Gcd(),在主函数中调用该函数计算并输出从键盘任意输入的两整数的最大公约数。

性质1 如果a>b,则a和b与a-b和b的最大公约数相同,即Gcd(a, b) = Gcd(a-b, b) 性质2 如果b>a,则a和b与a和b-a的最大公约数相同,即Gcd(a, b) = Gcd(a, b-a)

性质3 如果a=b,则a和b的最大公约数与a值和b值相同,即Gcd(a, b) = a = b

要求如下:

(1)从键盘任意输入的两整数

主函数调用Gcd()函数,并输出两整数的最大公约数。 (2)Gcd函数原型为: int Gcd(int a, int b);

如果输入的数不是正整数,则返回-1,否则,返回两个数的最大公约数。 (3)**输入提示信息格式要求:\输入两个整数时用,号分隔 **输出提示信息要求:

如果输入的数不是正整数,则输出\,否则按如下格式输出\参考答案

#include int Gcd(int a, int b); int main() {

int a, b, c;

printf(\ scanf(\ c = Gcd(a, b); if (c != -1)

printf(\ else

printf(\ return 0; }

int Gcd(int a, int b) {

if (a <= 0 || b <= 0) return -1; while (a != b) {

if (a > b)

a = a - b; else if (b > a) b = b - a; }

return a; }

Q357.(10分)某班期终考试科目为高等数学MT,英语EN和物理PH,有5人参加考试。为评定奖学金,要求统计并输出一个表格,表格内容包括学号、各科分数、总分和平均分,并标出三门课均在90分以上者(该栏标志输出“Y”,否则输出“N”),表格形式如下: NO MT EN PH SUM V >90

------------------------------------------------------ 1 88 87 83 258 86 N 2 69 90 88 247 82 N 3 77 70 79 226 75 N 4 96 99 98 293 97 Y 5 77 88 90 255 85 N

**输入格式要求:\提示信息:\**输出格式要求:

\

\ \参考答案

#include main() {

int i, j, a[5][4], s = 0; char c;

for (i = 0; i <= 4; i++) {

printf(\ for (j = 0; j <= 3; j++)

scanf(\ }

printf(\

printf(\ for (i = 0; i <= 4; i++) {

printf(\ for (s = 0, j = 1; j <= 3; j++) {

s += a[i][j];

printf(\ }

if (a[i][1] >= 90 && a[i][2] >= 90 && a[i][3] >= 90) c = 'Y'; else c = 'N';

printf(\ } }

Q240.(10分)有5个人围坐在一起,问第5个人多大年纪,他说比第4个人大2岁;问第4个人,他说比第3个人大2岁;问第3个人,他说比第2个人大2岁;问第2个人,他说比第1个人大2岁。第1个人说自己10岁,请利用递归法编程计算并输出第5个人的年龄。 **输出格式要求:\

参考答案

#include

unsigned int ComputeAge(unsigned int n); main() {

unsigned int n = 5;

printf(\}

/* 函数功能:用递归算法计算年龄 */ unsigned int ComputeAge(unsigned int n) {

unsigned int age; if (n == 1) {

age = 10; } else {

age = ComputeAge(n - 1) + 2; }

return age; }

Q530.(10分)用函数编写计算整数n的阶乘n!。 **输入格式要求:\提示信息:\**输出格式要求:\程序运行示例如下: Input m:5 5! = 120 参考答案

#include

long Fact(int n); /* 函数原型声明 */ int main() {

int m; long ret;

printf(\ scanf(\

ret = Fact(m); /* 调用函数Fact(),并将函数的返回值存入ret */ printf(\ return 0; }

/* 函数功能:用迭代法计算n! */

long Fact(int n) /* 函数定义 */

{

int i;

long result = 1;

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

result *= i; }

return result; }

Q109.(15分)按如下函数原型,采用欧几里德算法编写计算两个整数的最大公约数的函数Gcd()。欧几里德算法,也称辗转相除法。其基本思想是:对正整数a和b,连续进行求余运算,直到余数为0为止,此时非0的除数就是最大公约数。 /* 函数功能:计算a和b的最大公约数,输入负数时返回-1 */ int Gcd(int a, int b) 要求如下:

(1)从键盘任意输入的两整数

主函数调用Gcd()函数,并输出两整数的最大公约数。 (2)Gcd函数原型为: int Gcd(int a, int b);

如果输入的数不是正整数,则返回-1, 否则,返回两个数的最大公约数。

(3)**输入提示信息格式要求:\输入两个整数时用,号分隔 **输出提示信息要求:

如果输入的数不是正整数,则输出\否则按如下格式输出\参考答案

#include int Gcd(int a, int b); main() {

int a, b, c;

printf(\

scanf(\ c = Gcd(a,b);//2 if (c != -1)//1 {

printf(\ }

else//1 {

printf(\ }

}

int Gcd(int a, int b)//1 {

int r;

if (a <= 0 || b <= 0)//2 {

return -1;//1 } do{

r = a % b;//1 a = b;//1 b = r;//1

}while (r != 0);//e2 return a; //1 }

Q224.(10分)某人在国外留学,不熟悉当地天气预报中的华氏温度值,请编程按每隔10°输出-40°到110°之间的华氏温度到摄氏温度的对照表,以方便他对照查找。已知华氏和摄氏温度的转换公式为C=5/9*(F-32),其中,C表示摄氏温度,F表示华氏温度。 **输出格式要求:\程序运行示例如下: -40 -40.0 -30 -34.4 -20 -28.9 -10 -23.3 0 -17.8 10 -12.2 20 -6.7 30 -1.1 40 4.4 50 10.0 60 15.6 70 21.1 80 26.7 90 32.2 100 37.8 110 43.3 参考答案

#include main() {

int fahr; float celsius;

for (fahr = -40; fahr <= 110; fahr = fahr + 10)