程序设计基础习题集 25
putchar('\\0') ; } }
⑶ 输入一个字符串(串长不超过60),将字符串中连续的空格符保留1个。如输入字符串为 \,输出字符串为 \。 #include
for(i=1; b[i]!='\\0' ;i++) if(b[i-1]==' '&&b[i]==' ') {
strcpy (b+i-1,b+i); i--; /* 提示: 此处填入正确的函数名 */ }
puts(b) ; } 6. 输入2个数组,每个数组不超过10个元素,将只在其中一个数组出现的数输出。
解答: #include
{ float a[10],b[10]; int m,n,i,j; scanf(\ for(i=0;i for(j=0;j putchar(\ for(i=0;i for(j=0;j putchar('\\n'); } 7. 输入10个数到数组a[10],用插入法按值从大到小排序(第1个数直接存入a[0],在输入 第i个数之前,先将已输入的i-1个数在a[1]至a[i-1]中按值从大到小排序)。 解答:#include { float a[10],x; int i,j,k,n; for(i=0;i<10;i++) { scanf(\ if(i==0) { a[0]=x; n=0; } 26 C程序设计基础习题集 else { for(j=0;j<=n;j++) if(x>a[j]) {for(k=n;k>=j;k--)a[k+1]=a[k];break;} a[j]=x; n++; } } for(i=0; i<10; i++) printf(\ putchar('\\n'); } 8. 输入4行字符,每行不超过60个字符。将其中所有的字符 '$' 改作 'S'。 解答: #include { char s[4][61]; int i,j,k; for(i=0;i<4;i++) gets(s[i]); for(i=0;i<4;i++) for(j=0;j 解答: #include { char s[4][61]; int i,j,k; for(i=0;i<4;i++) gets(s[i]); for(i=0;i<4;i++) for(j=0;j<=strlen(s[i]);j++) if(s[i][j]=='$') strcpy(s[i]+j,s[i]+j+1); for(i=0;i<4;i++) puts(s[i]); } 10. 输入4行字符,每行不超过60个字符。将空格符后的第1个英文字母改为大写(原为大写 字母则不变)。 解答:#include { char s[4][61]; int i,j,flag; for(i=0;i<4;i++) gets(s[i]); for(i=0;i<4;i++) { flag=1; for(j=0;j<=strlen(s[i]);j++) { if(flag==1 && slower(s[i][j])) { flag=0; s[i][j]-=32; } else if(s[i][j]==' ') flag=1; else flag=0; } 程序设计基础习题集 27 } for(i=0;i<4;i++) puts(s[i]); } 习 题 八 ⒈ 单项选择题 ⑴ 下列语句定义px为指向int类型变量x的指针,正确的是【D】 A、int *px=x,x; B、int *px=&x,x; C、int x,*px=x; D、int *px,x;p=&x; ⑵ 指针变量p1、p2类型相同,要使p2、p2指向同一变量,正确的是【A】 A、p2=*&p1; B、p2=**p1; C、p2=&p1; D、p2=*p1; ⑶ 声明语句为“char a='%',*b=&a,**c=&b”,下列表达式中错误的是【 】 A、a==**c B、b==*c C、**c=='%' D、&a=*&b ⑷ 数组定义为“int a[4][5];”,下列哪一个引用是错误的【D】 A、*a B、*(*(a+2)+3) C、&a[2][3] D、++a ⑸ 表达式“c=*p++”的执行过程是【A】 A、复制*p的值给c后再执行p++ B、复制*p的值给c后再执行*p++ C、复制 p的值给c后再执行p++ D、执行p++后将*p的值复制给c ⑹ 声明语句为“char s[4][15],*p1,**p2; int x,*y;”,下列语句中正确的是【D】 A、p2=s; B、y=*s; C、*p2=s; D、y=&x; 2. 填空题 ⑴ 声明flaot类型变量x和指向x的指针变量px的语句是 float x,*px=&x 。 ⑵ 声明语句为“char a[5][9],*pa[5];”。为指针数组pa各元素顺序赋值a数组各行首地址值的循环结构可以写作 for(i=0;i<5;i++) pa[i]=a[i]; 。 ⑶ 声明fg为指向返回值为float类型、形参依次为 float**、int、int类型变量的函数的指针,声明语句为 float (*fg)(float**,int,int); 。 ⑷ 编制函数find_ch,在一个字符串中查找字符ch第一次出现的位置,返回值为所找到字符的地址,函数find_ch的原型应为 char* find_ch(char *s,char ch) 。 ⑸ 动态分配n个int类型数据的存储空间,并将该存储空间的首地址返回给指向int类型数据的指针变量p,写作语句 p=(int*)malloc(n*sizeof(int)) 。 3. 阅读下列程序,指出程序中的错误并说明错误的原因。 程序 ⑴ 程序 ⑵ #include { char *p; char s[80]; { float x,y; int *p; p=s[0]; scanf(\ printf(\ } } 程序 ⑶ 程序 ⑷ #include 28 C程序设计基础习题集 { int x,*p; { int *p=&a; *p=x; int a; printf(\ } } 解答:⑴ 语句p=s[0]错误,应赋地址常量 ⑵ 语句y=*p错误,p为悬挂指针 ⑶ 语句*p=x错误,p为悬挂指针 ⑷ 语句int *p=&a;错误,a此时未分配存储空间 4. 声明语句为“int a[3][5]={{1,3,5,7,9},{11,13,15,17,19},{21,23,25,27,29}}”,数组a在内存中一维、连续存放且首地址为63fdf8,已知表达式sizeof(int)值为4,写出下列表达式的值并说明它们的含义(指针常量的级、指向或数组元素)。 a(第1行行地址) *a(第1行第1个元素地址) a+2(第3行行地址) &a[0](第1行行地址) a[0]+3(第1行第4个元素地址) *(a+1)(第2行第1个元素地址) *(a+2)+1(第3行第2个元素地址) *(a[1]+2)(等价于a[1][2]) &a[0][2] (第1行第3个元素地址) *(*(a+2)+3)(等价于a[2][3]) a[2][3] &**a(第1行第1个元素地址) 5. 按照下列各题题意编程 ⑴ 编程,输入10个数,按绝对值从小到大排序后输出。 解答: #include { float *p,temp; int i,j,k;p=(float*)malloc(10); for(i=0;i<10;i++)scanf(\ for(i=0;i<9;i++){ k=i; for(j=i+1;j<10;j++) if(fabs(p[j]) for(i=0;i<10;i++) printf(\ printf(\ } ⑵ 编程,对n个输入数按绝对值从小到大排序后输出(运行时先输入n的值,然后用malloc函数为数组动态分配存储单元)。 解答: #include { float *p,temp,int i,j,k,n; scanf(\ for(i=0;i ⑶ 编制函数,接受从主调函数传入的、有n个元素的一维数组首地址,对该数组按绝对值从小到大排序。 解答: #include void sort(float *p, int n) { float temp; int i,j,k; 程序设计基础习题集 29 for(i=0; i for(j=i+1;j void main() { float *a; int i,n; scanf(\ for(i=0;i sort(a,n); for(i=0;i 6. 有n个人围成一圈,顺序排号,从第1个人开始报数,从1报到m,凡报到m的人退出圈子,问最后留下的是原来第几号的人?下列函数完成上述处理,其中m、n(m int del_n(int n,int m) { int *p,i,del=0,k=0; p= (int*) malloc(n*sizeof(int)); for(i=0;i if( k==m ) { del++; p[i]=0; k=0;} } } for(i=0;i 7. 编制函数,在主调函数的一维数组中查找最大值及该元素下标、最小值及该元素下标。请适当选择参数,使所求结果能传递到主调函数。 解答: void find(float *a,int n,float *max,int *k1,float *min,int *k2) { int i; *max=*min=*a; *k1=*k2=0; for(i=1;i if(a[i]>*max) { *max=a[i]; *k1=i; } else if(a[i]<*min) { *min=a[i]; *k2=i; } } 8. 编制函数,将一个字符串中的所有大写字母转换为相应的小写字母。 解答: char *utol(char *str)