教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN: 978-7-302-13599-9, 红色封面答案制作时间 :2011 年 2 月 -5 月一 选择题 1. 以下数组定义中, 错误的是 :C)int a[3]=1,2,3,4; 2. 以下数组定义中, 正确的是 :B) int a[][2]=1,2,3,4; 3. 设有定义 int a[8][10];, 在 VC 中一个整数占用 4 字节, 设 a 的起始地址为 1000, 则 a[1][1] 的地址是 :D)1044 4. 已知有数组定义 int a[][3]=1,2,3,4,5,6,7,8,9;, 则 a[1][2] 的值是 :C)6 5. 在以下字符串定义 初始化和赋值运算中, 错误的是 :A) char str[10];str= String ; 6. 设有以下字符串定义, char s1[]= S, t, r, i, n, g ; char s2[]= String ; 则 s1 和 s2:c) 长度不同, 但内容相同 7. 设有定义 int a[10]=0;, 则说法正确的是 :A) 数组 a 有 10 个元素, 各元素的值为 0. 8. 设已定义 char str[6]= a, b, \0, c, d, \0 ;, 执行语句 printf( %s,str) 后, 输出结果为 :B)ab 9. 引用数组元素时, 数组元素下标不可以是 :C) 字符串 10. 已定义字符串 S1 和 S2, 以下错误的输入语句是 :C)gets(s1,s2); 11. 下面程序段的运行结果是 :A)123 void char a[]= abcd,b[]= 123 ; strcpy(a,b); printf( %s\n,a); 12. 下面程序段的运行结果是 :A)123 void char a[]= 123,b[]= abcd ; if(a>b)printf( %s\n,a); else printf( %s\n,b); 二 编程题 1. 一维数字 a 的值已经, 请把数组中的值按逆序存放, 然后输出数组 例如数组中原来的值为 3, 4,2,1,6, 颠倒后变成 6,1,2,4,3. int i,a[5]=2,3,45,12,5,t; printf(" 转换前 :"); for(i=0;i<5;i++) printf("%d\t",a[i]); for(i=0;i<5/2;i++) t=a[i]; a[i]=a[5-i-1]; a[5-i-1]=t; 答案整理 : 林子雨 http://www.cs.xmu.edu.cn/linziyu 第 1 页 / 共 7 页
printf("\n 转换后 :"); for(i=0;i<5;i++) printf("%d\t",a[i]); 2. 输入一个整数 ( 位数不确定 ), 从高位到低位依次输出各位数字, 其间用逗号分隔 例如输入整数为 2345, 则输出应为 2,3,4,5 int a[10],x,i; printf(" 输入一个整数 :"); scanf("%d",&x); for(i=0;x>0;i++) a[i]=x%10; x/=10; for(i--;i>=0;i--) printf("%d,",a[i]); printf("\b "); 3. 若某数的平方具有对称性质, 则称该数为回文数 例如 11 的平方 121, 则称 11 为回文数 请找出 1~999 中的所有回文数 int x,i,j,a[10],wei,p; for(i=1;i<1000;i++) p=1; x=i*i; for(j=0;x>0;j++) a[j]=x%10; x/=10; wei=j; for(j--;j>=0;j--) if(a[j]!=a[wei-1-j]) p=0; break; if(p==1) printf("%d\t",i); 答案整理 : 林子雨 http://www.cs.xmu.edu.cn/linziyu 第 2 页 / 共 7 页
4. 用选择排序法对整形数字排序 #include <stdio.h> #include <stdlib.h> void selectsort(int a[],int n) int i,j,k,num; for(i=0;i<n-1;i++) /* 外部循环实现选择排序 */ k=i; for(j=i+1;j<n;j++) /* 内部循环得到最小数 */ if(a[j]<a[k]) k=j; if(k!=i) num = a[k]; /* 交换排序最小数 */ a[k]=a[i]; a[i]=num; printf("\n\nthe sorted numbers are:\n"); for(i=0;i<n;i++) printf("%5d",a[i]); /* 显示排序的数字 */ int int i,a[20]; srand((unsigned)time(null)); for(i=0;i<20;i++) a[i]=rand()%100; /* 利用随机数给数组赋值 */ printf("the original orders are:\n"); for(i=0;i<20;i++) printf("%5d",a[i]); selectsort(a,20); /* 数组名作为函数的参数, 地址传递 */ getch(); 5. 文本加密 输入一字符串, 将其中所有的大写英文字母 +3, 小写字母 -3, 然后在输出加密后该句子的长度 #include<string.h> int i; char a[100]; puts(" 输入文本 :"); 答案整理 : 林子雨 http://www.cs.xmu.edu.cn/linziyu 第 3 页 / 共 7 页
gets(a); for(i=0;i<strlen(a);i++) if(a[i]<='z'&&a[i]>='a') a[i]+=3; else if(a[i]<='z'&&a[i]>='a') a[i]-=3; puts(" 加密后 :"); puts(a); 6. 输入一字符串, 统计出某自定字符在字符串中出现的次数 #include<string.h> char x,a[100],c=0; int i; puts(" 输入一串字符 :"); gets(a); puts(" 查哪个字符个数?"); x=getchar(); for(i=0;i<strlen(a);i++) if(a[i]==x) c++; printf(" 共 %d 个 ",c); 7. 输入一个英文句子, 如果两个单词之间对于一个空格, 则删除多余的空格 然后输出处理前后该句子的长度 char c[200]=0; int i=0, NUM=0; printf(" 请输入一段英文 :\n"); do i++; scanf("%c",&c[i]); if(' '==c[i]&&(' '==c[i-1] '\0'==c[i-1])) NUM++; c[i]='\0'; // 删除空格 答案整理 : 林子雨 http://www.cs.xmu.edu.cn/linziyu 第 4 页 / 共 7 页
while(10!=c[i]); printf(" 之前长度为 %d, 之后长度为 %d\n",i,i-num); 8. 不要调用 strcpy 函数, 把字符数组 str2 中的字符串复制到字符数组 str1 中 char str1[201]; char str2[101]; printf(" 请输入两个字符串 ( 长度不超过 100)\n"); scanf("%s%s",str1,str2); int i,j; for(i=0;str1[i]!='\0';i++) for(j=0;str2[j]!='\0';j++) str1[i++]=str2[j]; str1[i]='\0'; printf(" 复制操作之后 str1 为 :\n"); printf("%s",str1); 9. 输入一个 5*5 的整数矩阵, 计算对角线以上所有元素之和 int a[5][5]; for(int i=0;i<5;i++) scanf("%d %d %d %d %d",&a[i][0],&a[i][1],&a[i][2],&a[i][3],&a[i][4]); int s=0; for(int i=0;i<5;i++) s+=a[i][i]+a[i][4-i]; printf("s:%d\n",s); return EXIT_SUCCESS; 答案整理 : 林子雨 http://www.cs.xmu.edu.cn/linziyu 第 5 页 / 共 7 页
10. 找出二维数组的所有鞍点 所谓鞍点就是在该位置上的元素在该行上最大, 在该列上最小 数组元素由随机函数自动产生 #include <stdio.h> #include <stdlib.h> #include <time.h> int array[100][100]; while(1) srand((unsigned)time(null)); int x,y; printf(" 输入二维数组的长宽 ( 不超过 100)\n"); scanf("%d%d",&x,&y); //int array[4][4]=11,1,23,45,40,56,98,91,23,21,12,40,45,67,23,90; int i,number=0,sign,j,m,n; for(i=0;i<x;i++) for(j=0;j<y;j++) array[i][j]=rand()%100; printf(" 数组是 :\n"); for (i = 0;i <x;i++) for (j = 0; j< y;j++) printf("%10d",array[i][j]); printf("\n"); printf("\n"); for (i = 0; i < x; i++) m = i; n = 0; sign = 1; for(j = 0; j < y;j++) if (array[m][n] < array[i][j]) n = j; for(j = 0; j < y;j++) if(array[m][n] >array[j][n]) sign = 0; if (sign == 1) number++; 答案整理 : 林子雨 http://www.cs.xmu.edu.cn/linziyu 第 6 页 / 共 7 页
printf(" 第 %d 个鞍点是 %d, 位置 :%d %d\n",number,array[m][n],m+1,n+1); if (number == 0) printf(" 没有鞍点 \n"); 11. 输入一组英文单词, 按字典顺序排序后输出 #include <stdio.h> #include <string.h> int char a[100][100],b[100],c[100],d[100]; int n,i,j; scanf("%d",&n); getchar(); for(i=0;i<n;i++) gets(a[i]); for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) strcpy(c,a[i]); strcpy(d,a[j]); strlwr(a[i]); strlwr(a[j]); if(strcmp(a[i],a[j])>0) strcpy(b,c); strcpy(c,d); strcpy(d,b); strcpy(a[i],c); strcpy(a[j],d); for(i=0;i<n;i++) puts(a[i]); system("pause"); ================ 此后无内容 =============== 答案整理 : 林子雨 http://www.cs.xmu.edu.cn/linziyu 第 7 页 / 共 7 页