习题参考答案习题一1./*在C语言中,下列标识符中哪些是合法的,哪些不合法?”*/合法:total,_debug,Counter1,begin_不合法:Large&Tall2./*写出流程图,求1~100中能被6整除的所有整数之和*/3./*写出源程序,求1~100中能被6整除的所有整数之和”。*/#includestdio.hvoidmain(){intsum=0,i;for(i=1;i=100;i++)if(i%6==0)sum=sum+i;printf(“sum=%d”,sum);}4./*画流程图,判别整数n是否是素数*/习题参考答案习题十1.选择题(1)A(2)C(由于p指向x,等式p≡&x,*p≡x成立.故&*p≡&x≡p)(3)B(intc[]={1,7,12};c[0]=1,c[1]=7,c[2]=12.而k=c,即k指向数组c的首元素c[0]。printf(“…”,*++k);输出参数*(++k)的值是*(k+1),即c[1])(4)D(对字符数组只能在定义的同时赋初值,但不能在定义之后再用‘=’赋值)(5)D(*p[3]是由3个整型指针组成的数组,p是数组名,代表该数组的基地址,是地址常量,不能对p赋值,故A,C错。*p代表p[0]这个指针,a[0]是普通整型变量,两者不应互相赋值,故B错。p[0]=&a[0]或p[0]=a,都是正确的,作用是令p[0]这个指针指向数组a的首元素a[0])(6)D(指针数组元素p[3]是一个指针,指向a[3*3]=a[9],即*p[3]==a[9]而二维数组元素p[3][2]=*(p[3]+2)=*(&a[9]+2)=*(&a[11])=a[11])2./*写输出结果*/(1)3,2,5#3,3,4#注:z是全局变量,它在p()中有效,但在main()中另有与它同名的局部变量,所以在main()中无效。main()和p()中分别定义了各自的局部变量x,y。在voidp(int*x,inty)中x是指针形式,表示按地址传递,则p中的*x就是main()中的x;另一形参y是普通变量形式,p对y的修改不影响main()中的y的值。变量在函数p()中的取值在main()中的取值x23(++*x)3(受p()影响)y32(y--)3(不受p()影响)z45(z=*x+y=3+2)4(不受p()影响)(2)udent注:s+2=&s[2],当作为printf()中对应“%s”的输出参数时,表示从s[2]开始输出,直到字符串结束)(3)HappyNewYear注:1.for(s=pa,n=0;*s!='\0';++s,++n);//求字符串pa的有效长度n,相当于:n=0;for(s=pa;*s!=’\0’;++s)++n;//n=122.for(s=pa,i=0;in;putchar(*s++),++i);//逐个输出指针s所指向字符串pa的各字符,相当于s=pa;for(i=0;in;i++){putchar(*s);s++;//指针后移一位}(4)our注:char*st[]={one,two,three,four};定义了长度为4的字符指针数组,如下:s[][0]st[][1]st[][2]st[][3]st[][4]s[][5]st[0]one\0st[1]two\0st[2]three\0st[3]four\0st[3]+1表达式:*(st+3)+1=st[3]+1,这是一个地址值,即指向st[3]字符串”four”的第1号字符’o’由于输出格式是字符串‘%s’,所以输出的字符串是从st[3]+1这个地址开始,到遇见’\0’为止(5)略,不做要求3./*填空题*/(1)for(i=0;s[i]!=’\0’;i++)(2)voidf(char*s或chars[]){inti=0;while(s[i])i++;//令i指向字符串的最后一个有效字符,即while(s[i]!=’\0’)i++;for(;i=0;i--)printf(%c,s[i]);//逆序输出}4.定义函数search(intlist[],intn,intx),在长度为n的数组list中查找元素x,并返回x在list中的下标。如果x在list中不存在,则返回-1.解法1:使用break语句intsearch(intlist[],intn,intx){inti,index=-1;//index:x在list中的下标,目前尚未找到,因此初始化为-1for(i=0;in;i++)//逐个对比list[i]与x,相等则跳出循环,否则继续往下比较,直到整个数组比完if(list[i]==x){index=i;break;}returnindex;//返回x在list中的下标}解法2:使用return语句—当程序执行到return语句,将提前结束循环,并结束函数search(),返回主函数main()intsearch(intlist[],intn,intx){inti;for(i=0;in;i++)//逐个对比list[i]与x,相等则跳出循环,否则继续往下查找,直到找遍整个数组if(list[i]==x)returni;return-1;//当for循环正常结束,说明找遍整个数组都找不到x,返回-1}5.定义函数voidsort(inta[],intn),用选择法对a排序(升序)。自定义主函数main().voidsort(inta[],intn)//a数组名,n数组长度{inti,j,index,t;for(i=0;in-1;i++){index=i;for(j=i+1;jn;j++)if(a[index]a[j])index=j;t=a[i];a[i]=a[index];a[index]=t;}#includestdio.hvoidmain(){inta[10],i;printf(“Input10integers:”);for(i=0;i10;i++)scanf(“%d”,&a[i]);sort(a,10);printf(“Aftersorted:”);for(i=0;i10;i++)printf(“%d“,a[i]);putchar(‘\n’);}6.编写程序:输入5个字符,输出其中最长的字符串voidsort(inta[],intn)//a数组名,n数组长度#includestdio.h#includestring.hvoidmain(){inti,len,max_len;chars[80],max_s[80];printf(“Input5strings:”);gets(max_s);//输入第1个字符串,暂作最长字符串max_len=strlen(max_s);for(i=1;i5;i++){//输入剩余的4个字符串,并与当前的最长字符串做比较gets(s);len=strlen(s);if(lenmax_len){strcpy(max_s,s);//注意:不能写成max_s=s;max_len=len;}}printf(“Themax_sis:”);puts(max_s);}7./*编写函数delchar(s,c).删除字符串s中出现的所有c字符。请同时编写主函数*/实例:s=”welcome!”c=’e’s初始值welcome!\0welcome!\0当s[i]==c,它后面的字符从’l’开始到’\0’为止,各前进一位删1次后wlcome!\0i继续前进,直到遇见下一个c,将后面的字符各前进1位删2次后wlcom!\0i继续前进,直到遇见结束字符’\0’,结束整个循环iii分析:1.循环条件是s[i]!=’\0’2.如何将i后面若干字符各前进一位?--利用字符串复制函数和字符子串s代表完整的字符串,而s+i代表从s[i]开始、到’\0’结束的子串。将子串s+i+1复制给子串s+i,即实现i后各字符前进一位strcpy(s+i,s+i+1)#includestdio.hvoiddelchar(char*s,charc);voidmain(){chars[80],c;printf(Inputstrings:\n);gets(s);printf(Inputcharc:\n);c=getchar();delchar(s,c);printf(Afterdelete:\n);puts(s);}#includestring.hvoiddelchar(chars[],charc){inti;for(i=0;s[i]!=’\0’;i++){if(s[i]==c)strcpy(s+i,s+i+1);}}8./*分别用字符数组和字符指针实现自定义函数strcpy(s,t,m).将字符串t中从第m(m=0)个字符开始的子串复制给字符串s。*/实例:s=”welcome”t=”friend”,m=3,调用自定义函数strcpy(s,t,m)后,s=”end”,t保持不变,仍为”friend”注意:不能使用10.2节中介绍的C语言提供的字符串处理函数,而是从底层做起,自己编写这个函数。该函数不要求返回任何值,因此函数类型是void;形参有三个,分别是两个字符串s和t,一个整型参数m.解法1(字符数组)voidstrcpy(chars[],chart[],intm){inti,j;//i:s的下标;j:t的下标for(i=0,j=m;t[j]!=’\0’;i++,j++)s[i]=t[j];}解法2(字符指针)voidstrcpy(char*s,char*t,intm){char*p=t+m;//p指向t的第m个字符for(;*p!=’\0’;s++,p++)while(*p!=’\0’){*s++=*p++;}while(*p){*s++=*p++;}*s=*p;}9./*分别用字符数组和字符指针实现自定义函数strcat(s,t).将字符串t连接到s之后,要求返回字符串s的首地址*/实例:s=”welcome”t=”friend”,m=3,调用自定义函数strcpy(s,t,m)后,s=”welcomefriend”,t保持不变,仍为”friend”该函数要求返回s的首地址,即首字符的地址,因此函数返回值的类型是字符指针(详见10.4节),因此函数类型是char*;形参有2个,分别是两个字符串s和t.解法1(字符数组)char*strcpy(chars[],chart[]){inti,j;//i:s的下标;j:t的下标//先把i移到s的末尾,即结束字符’\0’处for(i=0;s[i]!=’\0’;i++);//再把t中的字符逐个复制到s的后端for(j=0;t[j]!=’\0’;i++,j++)s[i]=t[j];//返回s的首地址returns;}解法2(字符指针)char*strcpy(char*s,char*t){char*p;//p指向s的末尾,即结束字符’\0’处for(p=s;*p!=’\0’;p++);//再把t中的字符逐个复制到s的后端for(;*t!=’\0’;p++,t++)while(*t!=’\0’){*p++=*t++;}while(*t!=’\0’){*p++=*t++;}while(*t){*p++=*t++;}*p=*t;//返回s的首地址returns;}10./*编写程序:将5个字符串从大到小排序后输出*/#includestdio.h#includestring.hvoidmain(){char*t,*s[5]={“Apple”,“Pear”,“Orange”,“Mango”,“Melon”};//s:字符指针数组,共5个字符串inti,j;//冒泡排序,降序for(i=0;i5-1;i++)for(j=5-1;ji;j--)if(strcmp(s[j-1],s[j])0){t=s[j-1];s[j-1]=s[j];s[j]=t;}//输出排序后的字符串for(i=0;i5;i++)puts(s[