C语言程序设计(何钦铭)课后习题作业
- 格式:doc
- 大小:99.00 KB
- 文档页数:30
P173习题8 第一题#include<stdio.h>int main(void){char ch;int a[10];int i,j,m;printf("请输入10个整数:\n");for(i=0;i<10;i++){printf("请输入%d第个数:",i+1);scanf("%d",&a[i]);}printf("请输入A或D:");scanf(" %c",&ch);if(ch=='A'){for(i=0;i<9;i++){for(j=i+1;j<10;j++){if(a[i]>a[j]){m=a[i];a[i]=a[j];a[j]=m;}}}}else if(ch=='D'){for(i=0;i<9;i++){for(j=i+1;j<10;j++){if(a[i]<a[j]){m=a[i];a[i]=a[j];a[j]=m;}}}}for(i=0;i<10;i++){printf("%d ",a[i]);}return 0;}第二题#include<stdio.h>int main(void){int a[10];int i,j,x;int search(int list[],int i,int x);printf("输入10个整数:");for(i=0;i<10;i++)scanf("%d",&a[i]);printf("输入一个整数x:");scanf("%d",&x);j=0;for(i=0;i<10;i++){if(search(a,i,x)!=-1){j++;printf("%d",search(a,i,x));}else;}if(j==0)printf("-1");return 0;}int search(int list[],int i,int x){int j;j=0;if(x==list[i])j++;else;if(j==0)return -1;elsereturn i;}第三题#include<stdio.h>void houyi(int a[],int *p,int n,int m);int main(void){int a[20];int i,m,n;printf("请输入整数n:");scanf("%d",&n);printf("请输入%d个整数:",n);for(i=0;i<n;i++)scanf("%d",&a[i]);printf("请输入您要后移的位数m:"); scanf("%d",&m);houyi(a,a,n,m);for(i=0;i<n;i++)printf("%d",a[i]);printf("\n");return 0;}void houyi(int a[],int *p,int n,int m) {int i;int b[20];for(i=0;i<n;i++)b[i]=a[i];for(i=0;i<n;i++){if(i<=n-m-1)*(p+i+m)=b[i];else*(p+(i+m)%n)=b[i];}}第四题#include<stdio.h>void swap2(int *,int *);void bubble(int a[],int n);int main(void){int n,a[8];int i;printf("Enter n(n<=8):");scanf("%d",&n);printf("Enter a[%d]:",n);for(i=0;i<n;i++)scanf("%d",&a[i]);bubble(a,n);printf("After sorted,a[%d]=",n);for(i=0;i<n;i++)printf("%3d",a[i]);return 0;}void bubble(int a[],int n){int i,j,m;static int b[8];for(i=1;i<n;i++){for(j=0;j<n-i;j++){if(a[j]>a[j+1])swap2(&a[j],&a[j+1]);for(m=0;m<n;m++){if(a[m]<=a[m+1])b[m]++;}}if(b[m]==n-1)break;}}void swap2(int *px,int *py){int t;t=*px;*px=*py;*py=t;}第五题#include<stdio.h>#include<string.h>void mcopy(char *s,int m);int main(void){int i,m,l;char str[100];printf("请输入您要输入的字符串:");gets(str);printf("您将从原字符串的第m位复制新字符串,请输入m:\n");scanf("%d",&m);printf("复制后,新的字符串为:");mcopy(str,m);return 0;}void mcopy(char *s,int m){printf("%s\n",s+m-1);}第六题#include<stdio.h>#include<string.h>void delchar(char *,char c);int main(void){char str[80];char ch;printf("Enter a string:");gets(str);printf("Enter delete char:");scanf("%c",&ch);delchar(str,ch);printf("%s\n",str);return 0;}void delchar(char *s,char c){int i,j;char str1[80];j=0;for(i=0;s[i]!='\0';i++){if(s[i]!=c){str1[j]=s[i];j++;}}str1[j]='\0';for(i=0;str1[i]!='\0';i++,s++){*s=str1[i];}*s='\0';}第七题#include<stdio.h>#include<string.h>struct zfc{char str[80];};int main(void){int i,j;char str[80],str1[80];struct zfc s[5];for(i=0;i<5;i++){printf("请输入第%d个字符串:",i+1);scanf("%s",s[i].str);}for(i=0;i<=3;i++){for(j=i+1;j<=4;j++){if(strcmp(s[i].str,s[j].str)>0){strcpy(str1,s[i].str);strcpy(s[i].str,s[j].str);strcpy(s[j].str,str1);}}}for(i=0;i<5;i++){puts(s[i].str);}return 0;}第八题#include<stdio.h>#include<string.h>int main(void){int l,i;char str[80],str1[80];char *p,*q;p=str;q=str1;printf("请输入一串字符:");scanf("%s",str);l=strlen(str);for(i=0;*p!='\0';p++,i++){*(q+l-1-i)=*p;}*(q+l)='\0';if(strcmp(str,str1)==0)printf("输入的字符串是“回文”!\n");elseprintf("输入的字符串不是“回文”!\n");return 0;}第九题#include<stdio.h>#include<string.h>int main(void){char str[80];char *p;p=str;int n1,n2,n3,n4,n5;printf("输入一行文字:");gets(str);n1=n2=n3=n4=n5=0;for(;*p!='\0';p++){if((*p>='A')&&(*p<='Z'))n1++;else if((*p>='a')&&(*p<='z'))n2++;else if(*p==' ')n3++;else if((*p>='0')&&(*p<='9'))n4++;elsen5++;}printf("大写字母字符的个数为:%d\n",n1);printf("小写字母字符的个数为:%d\n",n2);printf("空格字符的个数为: %d\n",n3);printf("数字字符的个数为: %d\n",n4);printf("其他字符的个数为: %d\n",n5);return 0;}第十题#include<stdio.h>#include<string.h>int strcomp(char s1[80],char s2[80]);int main(void){int m;char str1[80],str2[80];printf("请输入第一个字符串:");scanf("%s",str1);printf("请输入第二个字符串:");scanf("%s",str2);m=strcomp(str1,str2);if(m==1)printf("str1>str2\n");else if(m==0)printf("str1=str2\n");elseprintf("str1<str2\n");return 0;}int strcomp(char s1[80],char s2[80]){int a;if(strcmp(s1,s2)>0)a=1;else if(strcmp(s1,s2)==0)a=0;elsea=-1;return a;}第十一题#include<stdio.h>#include<string.h>void fushu(char *p);int main(void){char str[80];printf("请输入一个英语名词单词:");scanf("%s",str);fushu(str);puts(str);return 0;}void fushu(char *p){int i,l;l=0;for(i=0;*(p+i)!='\0';i++){l++;}if(*(p+l-1)=='y'){*(p+l)='e';*(p+l+1)='s';*(p+l+2)='\0';}elseif((*(p+l-1)=='s')||(*(p+l-1)=='x')||((*(p+l-2)=='c')&&(*(p+l-1)=='h'))||((*(p+l-2)=='s')&&(*(p+l-1 )=='h'))){*(p+l)='e';*(p+l+1)='s';*(p+l+2)='\0';}else if(*(p+l-1)=='o'){*(p+l)='e';*(p+l+1)='s';*(p+l+2)='\0';}else{*(p+l)='s';*(p+l+1)='\0';}}第十二题#include<stdio.h>#include<stdlib.h>int main(void){int i,j,a,n,sum,average;int *p;printf("Enter n:");scanf("%d",&n);if((p=(int*)calloc(n,sizeof(int)))==NULL){printf("Not able to allocate memory.\n");exit(1);}printf("您将输入%d个学生的成绩!\n",n);for(i=0;i<n;i++){printf("请输入第%d个学生的成绩:",i+1);scanf("%d",p+i);}sum=0;for(i=0;i<n;i++)sum=sum+*(p+i);average=sum/n;for(i=0;i<n-1;i++){for(j=i+1;j<n;j++){if(*(p+i)>*(p+j)){a=*(p+i);*(p+i)=*(p+j);*(p+j)=a;}}}printf("学生的平均成绩是:%d\n",average);printf("学生的最高成绩是:%d\n",*(p+n-1));printf("学生的最低成绩是:%d\n",*p);return 0;}。
第3章分支结构【练习3-1】例3-4中使用else-if 语句求解多分段函数,为了检查else-if 语句的三个分支是否正确,已经设计了三组测试用例,请问还需要增加测试用例吗?为什么?如果要增加,请给出具体的测试用例并运行程序。
解答:最好再增加两组测试用例,因为尚未对分段函数参数的边界值进行测试。
可再给出x=0和x=15时的两种情况。
【练习3-2】计算符号函数的值:输入一个整数x ,计算并输出下列分段函数sign(x)的值。
-1 x<0 ry=sig n( x)= 0 x=01 x>0 I解答:#i nclude <stdio.h>int main(v oid){int x, y;prin tf("E nter x:");sca nf("%d", &x); if(x>0) y=1;else if (x==0) y=0;else y=-1;printf("sign( %d ) = %d\n",x,y);return 0;}【练习3-3】统计学生平均成绩与及格人数:输入一个正整数n,再输入n个学生的成绩,计算平均成绩,并统计所有及格学生的人数。
试编写相应程序。
解答:# in elude <stdio.h>int main(v oid){int coun t, i, n;double grade, total;printf("Enter n:"); sca nf("%d", &n); total = 0;count = 0;for(i = 1; i <= n; i++){ printf("Enter grade #%d: ", i);scanf ("%lf", &grade);total = total + grade; if(grade >= 60) count++;} printf("Grade average = %.2f\n", total / n); printf("Number of pass= %d\n", count);return 0;}【练习3-4 】统计字符:输入10 个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。
习题参考答案 习题一 1./*在C语言中,下列标识符中哪些是合法的,哪些不合法?”*/合法:total, _debug, Counter1, begin_不合法:Large&Tall2. /*写出流程图,求1~100中能被6整除的所有整数之和*/3./*写出源程序,求1~100中能被6整除的所有整数之和”。
*/#include<stdio.h>void main(){int sum=0, i;for(i=1; i<=100; i++)if( i%6==0) sum =sum+i;sum);printf(“sum=%d”,}4./*画流程图,判别整数n是否是素数*/习题参考答案 习题十1.选择题(1) A(2) C(由于p指向x, 等式p≡&x, *p≡x成立. 故&*p≡&x≡p)(3) B (int c[]={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()中无效。
第一章习题1、对C语言来说,下列标示符中哪些是合法的,哪些是不合法的Total, _debug, Large&Tall, Counter1, begin_答:合法的:_debug、Counter1、begin_。
不合法的:Total、Large&Tall。
2、改写节中的流程图,求1—100中能被6整除的所有整数的和。
3、改写节中的程序,求1—100中能被6整除的所有整数的和,并在编程环境中验证该程序的运行结果。
答:程序为:#include<>int main(void){int i,sum=0;for(i=1;i<=100;i++)!if(i%6==0)sum=sum+i;printf("sum=%d\n",sum);return 0;}4、对于给定的整数n(n>1),请设计一个流程图判别n是否为一个素数(只能被1和自己整除的整数),并分析该流程图中哪些是顺序结构、哪些是分支结构和循环结构。
@第二章作业1.编写程序,输入两个整数num和num2,计算并输出她们的和、差、积、商。
答:程序:#include<>void main(){int num1,num2,y1,y2,y3,y5;double y4;。
printf("请输入两个数:num1,num2\n");scanf("%d%d",&num1,&num2);y1=num1+num2;y2=num1-num2;y3=num1*num2;y4=num1*num2;y5=num1%num2;printf("num1,num2和y1=%d\nnum1,num2差y2=%d\nnum1,num2积y3=%d\nnum1,num2商y4=%lf\nnum1,num2余y5=%d\n",y1,y2,y3,y4,y5);。
}2.为了倡导居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时以内的,电价为元/千瓦时;超出50千瓦时的用电量,电价上调元/千瓦时。
编写程序,输入用户的月用电量(千瓦时),计算并输出该用户应支付的电费(元)。
答:程序:#include<>void main(){double x,y;《printf("请输入月用电量:x\n");scanf("%lf",&x);if(x<=50){y=*x;printf("电费y=%lf\n",y);}else {y=*x;`printf("应支付电费y=%lf\n",y);}}3.编写程序,输入实数x和正整数n,计算x n,,不允许调用pow()函数求幂。
答:程序:#include<>void main()({double x,power;int i,n;printf("请输入:x,n\n");scanf("%lf%d",&x,&n);power=;for(i=1;i<=n;i++)power=power*x;^printf("power(x,n)=%lf\n",power);}4.编写程序,输入两个正整数m和n,求∑(i2+1/i)(i从m到n。
)答:程序:#include<>void main(){int i,m,n;(double sum;sum=0;printf("input:m,n\n");scanf("%d%d",&m,&n);for(i=m;i<=n;i++)sum=sum+(i*i+i);printf("sum=%lf\n",sum);},5.编写程序,输入一个正整数n,计算1-2/3+3/5-4/7+5/9-6/11+…的前n项之和。
答:程序:#include<>void main(){int i,n;double sum,item,flag;flag=1;sum=0;~printf("input:n\n");scanf("%d",&n);for(i=1;i<=n;i++){item=(flag*i)/(2*i-1);flag=-flag;sum=sum+item; }printf("sum=%lf\n",sum);}`6.某用户为购房办理商业贷款,选择了按月等额本息还款法,计算公式如下,在贷款本金(loan)和月利率(rate)一定的情况下,住房贷款的月还款(money)取决于还款月数(month)。
客户打算在5—30年的范围内选择还清贷款的年限,想得到一张“还款年限—月还款额表”以供参考。
编写程序,输入贷款本金loan和月利率rate,输出“还款年限—月还款额表”,还款年限的范围是5—30年,输出时分别精确到年和元。
Money=loan*rate(1+rate)month/[(1+rate)month-1]答:程序:#include<>#include<>void main()`{int lower,upper,month,year,loan;double money,rate;lower=5;upper=30;printf("请输入贷款本金:loan\n");scanf("%d",&loan);printf("请输入月利率:rate\n");scanf("%lf",&rate);】printf("还款年限\t月还款额\n");for(year=lower;year<=upper;year++){month=year*12;money=(loan*rate*pow((1+rate),month))/(pow((1+rate),month)-1);printf("%d\t\t%lf\n",year,money);}}>7.编写程序,输入一个正整数n,求∑2i(i从1到n),可调用pow()函数求幂。
答:程序:#include<>#include<>void main(){int i,n;double sum,item;|sum=0;printf("input:n\n");scanf("%d",&n);for(i=0;i<=n;i++){item=pow(2,i);sum=sum+item;}printf("sum=%lf\n",sum);*}8.编写程序,输入一个正整数n,求e=∑i!(i从0到n)。
要求定义和调用函数fact(n)计算n!,函数类型是double.答:程序:#include<>double fact(int n);void main(){;int i,n;double sum;sum=0;printf("input:n\n");scanf("%d",&n);for(i=0;i<=n;i++){sum=sum+fact(i);}》printf("sun=%lf\n",sum);}double fact(int n){int i;double product;product=;for(i=1;i<=n;i++){】product=product*i;}return product;}第三章作业1.#include<>#include<>~void main(){int a,b,c;double s,area,perimeter;printf("请输入三角形三条边:a,b,c\n");scanf("%d%d%d",&a,&b,&c);if(a+b>c&&a+c>b&&b+c>a){]perimeter=a+b+c;s=(a+b+c)/;area=sqrt(s*(s-a)*(s-b)*(s-c));printf("三角形的周长perimeter=%.2lf\n三角形的面积area=%.2lf\n",perimeter,area);}}2、#include<>~#include<>void main(){double salary,tax,rate;printf("请输入职工的月薪:salary\n");scanf("%lf",&salary);if(salary<=850) rate=0;else if(salary<=1350) rate=5;!else if(salary<=2850) rate=10;else if(salary<=5850) rate=15;else rate=20;tax=rate*(salary-850)/100;printf("职工应缴个人所得税tax=%.2lf\n",tax);}3、#include<>~void main(){double m,n,y;printf("请输入行驶里程(公里):m\n等待时间(分钟):n\n");scanf("%lf%lf",&m,&n);if((m+n/<=3) y=10;else if((m+n/<=10) y=2*(m+n/;else y=2*10+3*(m+n/;;[printf("乘客应付车费y=%d\n",(int)((y*10+/);}4、#include<>void main(){int i,n,A,B,C,D,E;)double score,total;printf("请输入一个数n:\n");scanf("%d",&n);total=0;A=0;B=0;C=0;D=0;E=0;for(i=1;i<=n;i++){printf("请输入第#%d个学生成绩:\n",i);scanf("%lf",&score);}total=total+score;if(score>=90)A++;else if(score>=80)B++;else if(score>=70)—C++;else if(score>=60)D++;elseE++;}<printf("平均成绩=%lf\n",total/n);printf("等级成绩个数:\nA=%d\nB=%d\nC=%d\nD=%d\nE=%d\n",A,B,C,D,E); }5、#include<>void main(){int year;^printf("21世纪所有的闰年:\n");for(year=2000;year<3000;year++)if(year%4==0&&year%100!=0||year%400==0)printf("%d\n",year);}第四章作业2、!#include""#include""double fact(int n);void main(){int i,n;double x,s;printf("请输入一个实数x:\n");scanf("%lf",&x);《s=0;i=1;while((pow(x,i)/fact(i))>={s=pow(x,i)*fact(i)+s;i++;}printf("s=%.2lf\n",s);}…double fact(int n){int i;double result;result=1;for(i=1;i<=n;i++)result=result*i;【return result;}3、#include""int main(void){【int x,a,count,sum;printf("请输入一个整数x:\n");scanf("%d",&x);sum=0;count=0;if(x<0) x=-x;do{a=x%10;&sum=sum+a;x=x/10;count++;}while(x!=0);printf("位数=%d\n",count);printf("各个位数之和为:%d\n",sum);return 0;}|5、#include""void main(){int a,n,i=1,s=0,t=0;printf("请输入两个正整数a,n=:\n");scanf("%d%d",&a,&n);while(i<=n){"t=t+a;s=s+t;a=a*10;++i;}printf("a+aa+aaa+…+aa…a=%d\n",s);}7、|#include""void main(){int i,j,k,l,n;printf("1-10000之间的水仙花数有:\n");for(n=10;n<10000;n++){i=n/1000;>j=n/100%10;k=n/10%10;l=n%10;if(i*1000+j*100+k*10+l==i*i*i+j*j*j+k*k*k+l*l*l){printf("%-5d",n);}}.printf("\n");}9、#include""#include""void main(){】int i,n,m,j,k;i=0;printf("请输入一个多位整数:\n");scanf("%d",&n);k=n;while(k!=0){i++;\k=k/10;}k=n;m=pow(10,i-1);printf("逐位输出:%d",n/m%10);printf(",");for(j=m/10;j>0;j=j/10){[n=k/j;printf("%d",n%10);if(j!=1)printf(",");}}11、#include""void main(){int p,r,n,m,temp;printf("请输入两个正整数:\n");scanf("%d%d",&n,&m);if(n<m){temp=n;\n=m;m=temp;}p=n*m;while(m!=0){r=n%m;n=m;[m=r;}printf("最大公约数为:%d\n",n);printf("最小公倍数为:%d\n",p/n); }13、#include""(void main(){int i,j;for(i=0;i<=3;i++){for(j=0;j<=2-i;j++)printf(" ");for(j=0;j<=2*i;j++)printf("*");]printf("\n");}for(i=0;i<=2;i++){for(j=0;j<=i;j++)printf(" ");for(j=0;j<=4-2*i;j++)printf("*");printf("\n");)}}第五章1.#include<>#include <>long fac(int n,int a)@{long sum;if(n==1)sum=a;elsesum=(long)(pow(10,n-1)*a)+fac(n-1,a);return(sum);}^main()int a,n,i;long temp,sum=0;printf("请输入一个数a,n\n");scanf("%d%d",&a,&n);for(i=1;i<=n;i++)]{temp=fac(i,a);sum+=temp;}printf("它们的和是=%ld",sum);return 0;}、2.#include<>int countdight(int number,int dight); int main(void){int number;printf("输入一个数:");—scanf("%d",&number);countdight(number,2);return 0;}countdight(int number,int dight){.int a,count;count=0;while(number!=0){a=number%10;number=number/10;if(a==dight)count++;.}printf("%d\n",count);return count;}3.#include<>(int fib(int n);int main(void){int m,n,num1;num1=1;printf("请输入两个正整数m和n(m>=1,n<=10000)\n");scanf("%d%d",&m,&n);if(num1>=m&&num1<=n)、fib(n);return 0;}int fib(int n){:int i,x1,x2,x,t;x1=1;x2=1;for(i=0;i<n;i++){x=x1+x2;printf("%5d",x);t=x;;x1=x2;x2=t;}printf("\n");return x;}5.#include<>。