第一篇:安徽大学C语言实验平台作业答案
实验三 C基本数据类型及运算
1.编程:根据需要定义相关变量,键盘输入10.0、20.6、5.0三个实数分别赋给相关三个变量,输出该3个变量的和s、乘积p和平均值a。
2.编程:输入球的半径,计算球体表面积和球体积。
3.编程:定义6个变量,通过键盘将“10,-10,40000,a,3.14,hello”这六个值分别赋给相应变量,然后在屏幕上输出变量的值(每行输出一个变量)。
4.编程:从键盘接收1个字符给变量s1,1个字符串(允许带有空格)给字符数组s2,输出字符变量s1的ASCII码值及字符数组s2中的字符串。
5.编程:从键盘输入二个整数分别赋给整型变量a、b,将它们按由小到大的顺序输出。6.编程:调用标准库函数sin(x)计算6800的正弦值(此题为选做)。
7.编程:键盘输入一个实数赋给变量x,计算 y=x*x*x+x*x+x 的值,分别输出y值、y值的整数部分和小数部分(此题为选做)。
8.编程:键盘输入四个整数分别赋给整型变量a、b、c、d,用三目运算方法将它们按由大到小的顺序输出(此题为选做)。
1.#include
2.#include
main(){float r,s,v;printf(“input r”);scanf(“%f”,&r);s=4*3.14*r*r;v=4/3*3.14*r*r*r;printf(“s=%f,v=%f”,s,v);}
3.#include
4.#include
5.#include printf(“b=%da=%d”,b,a);} 6.#include 7.#include {float x,y,b;int a;scanf(“%f”,&x);y=x*x*x+x*x+x;a=(int)y;b=y-a;printf(“%fn%dn%fn”,y,a,b);} 实验四 C分支结构程序设计 1.编程:从键盘输入一个字符,如是大写字母,则输出相应小写字母;如是小写字母,则原样输出;其它字符输出“Not letter!”。 2.编程:判断输入的正整数是否既是3又是5的整数倍。若是,输出Yes,否则输出No。3.编程:从键盘输入三个整数,分别赋给变量a,b,c,输出其中的最大值(要求不改变a、b、c的值)。 4.编程:用scanf输入任意两个数分别赋给变量a、b,若a大于等于b,则直接输出a、b,否则将a、b的值交换(即a的原值放入b中,b的原值放入a中)后再输出。 5.编程:输入整数a和b,若a+ b大于100,则输出a+ b百位以上的数字,否则输出两数之和。6.编程:从键盘输入三个整数,分别赋给变量a,b,c,请按从小到大的顺序依次输出a、b、c(要求不改变a、b、c的值)。 7.编程:从键盘输入三个整数,分别赋给变量a,b,c,请按从小到大的顺序依次将这三个数存放于a、b、c中,最后输出a、b、c。 8.编程:由系统生成一个10以内的随机整数,用户从键盘上输入一个10以内的整数,如果两者相等输出“OK”,否则输出“ERROR”。 注:随机数的生成必须包含头文件#include {char x;scanf(“%c”,&x);if(x>='a'&&x<='z') printf(“%c”,x);else if(x>='A'&&x<='Z') printf(“%c”,x+32); else printf(“Not letter!”);} 2.#include printf(“Yesn”); else printf(“Non”);} else printf(“Error!”);} 3.#include 4.#include b=a-b; a=a-b;};printf(“a=%f,b=%fn”,a,b);} 5.#include s=a+b;r=a*a+b*b;t=r/100;if(r>100)printf(“%d”,t);else printf(“%d”,s);} 6.#include else {max=b;min=a;} if(c>=max)max=c;if(c<=min) min=c;d=a+b+c-min-max;printf(“%d %d %dn”,min,d,max);} 7.#include if(a>=b){d = a; a = b; b = d;} else if(b>=c){ d = b; b = c; c = d;} printf(“a=%d b=%d c=%d”,a,b,c);} 8.#include main(){int a,b;srand((unsigned)time(NULL));b=rand()%10+1;scanf(“%d”,&a);printf(“a=%d,随机数b=%dn”,a,b);if(a==b)printf(“OK!n”);else printf(“ERROR!n”);} 实验五 C多分支结构程序设计* 1.编程:计算奖学金ss的值,已知奖学金ss与成绩s的关系为: 具体要求: (1)用 if 语句实现分支结构的编程。 (2)s为整型,ss要求精确到小数点后二位。 (3)用scanf函数给s赋值,且输入前有相应提示。 (4)结果输出时采用以下形式: 成绩s=具体值,奖学金ss=具体值 2.设函数f(x)如下,求函数函数法f(x)的值。 具体要求: (1)用条件表达式编程。 (2)用if语句编程。 (3)用scanf函数给自变量赋值,且输入前有相应提示。 (4)结果输出时采用以下形式: x=具体值,f(x)=具体值 (5)给出你所使用的测试用例。 提示: 按C的语法规则,标识符由字母、数字、下划线组成,不能将f(x)作为变量名,本题中,函数名可起为 f 或 y 等。但作为非格式控制字符,f(x)完全可以出现在printf函数的双引号内。 3.编程:输入一个整数,判断它能否被3,5,7整除,并输出以下信息之一: (1)能同时被3,5,7整除。 (2)能被其中两数整除(指出是哪两个数)。 (3)能被其中一个数(指出是哪一个数)整除。 (4)不能被3,5,7任一个数整除。 4.编程:用switch 语句编写一个简单的计算器程序,输入格式为:data1 op data2。其中data1和data2为参加运算的两个数;op为运算符,取值只能是+、-、*、/。5.编程:计算你的出生日期是星期几。 (1)通过键盘输入你出生那一年的元旦是星期几 (2)通过键盘输入你的出生日期 (3)输出结果 1.#include ss=0; else if(s>=80&&s<90) ss=100+s; else if(s>=90&&s<=100) ss=200+s*3/2;printf(“成绩s=%d,奖学金ss=%0.2fn”,s,ss); } } 2.#include f=0;else f=(x>0)?1:-1;printf(“x=%f,f(x)=%dn”,x,f);} 3.#include if(a==0&&b==0&&c==0) printf(“%d能同时被3,5,7整除n”,x);else if(a==0 && b==0)printf(“%d能被3,5整除n”,x); else if(a==0 && c==0)printf(“%d能被3,7整除n”,x); } 4.#include {case '+': printf(“%g+%g=%gn”,d1,d2,d1+d2);break; case '-': printf(“%g-%g=%gn”,d1,d2,d1-d2);break; case '*': printf(“%g*%g=%gn”,d1,d2,d1*d2);break; case '/': printf(“%g/%g=%gn”,d1,d2,d1/d2);break; else if(b==0 && c==0)printf(“%d能被5,7整除n”,x); else if(a==0)printf(“%d能被3整除n”,x); else if(b==0)printf(“%d能被5整除n”,x); else if(c==0)printf(“%d能被7整除n”,x); else printf(“%d不能被3,5,7任意一个数整除n”,x); } } 5.#include 实验六 C循环结构程序设计 1.编程:输出200以内所有能被7整除的数。 2.编程:求出1 ~ 1000之间能被13整除的最大的那个数。3.编程:找出若干个非零数中的最小值m以及它们的平均值a。 要求:若干个数由键盘输入,每次输入一个赋给变量x,x为零时,结束输入。4.编程:求两个正整数m、n之间所有奇数之和x与偶数之和y。 要求: (1)m、n的值由键盘输入。 (2)输入时,允许用户随意先输入大的或小的整数。 5.编程:计算函数y的值。要求键盘接收自变量x的值,若x的值不为零,计算函数y的值并输出,再从键盘接收下一个x的值,„„,直到x的值为零,显示“Thank You,Bye!”,尔后结束程序,已知函数y与自变量x的关系为: 6.编程:计算π的近似值,π的计算公式为: 要求: (1)n值由键盘输入。 (2)分别输出当n 为10、100、1000时的计算结果。 (3)输出时要求每行显示一组n、π的值,每行形式如下: n=具体值,π = 具体值 7.我国现有人口13亿,设年增长率为1%,编写程序,计算多少年后增加到20亿。 8.求解爱因斯坦数学题。有一条长阶梯,若每步跨2阶,则最后剩余1阶;若每步跨3阶,则最后剩2阶;若每步跨5阶,则最后剩4阶;若每步跨6阶,则最后剩5阶;若每步跨7阶,最后才正好一阶不剩。请问,这条阶梯最少共有多少阶? 9.每个苹果0.8 元,第一天买2 个苹果,第二天开始,每天买前一天的2 倍,直至购买的苹果个数达到不超过100 的最大值。编程:求每天平均花多少钱?(此题为选做) 1.#include {int i;for(i=1;i<=200;i++){if(i%7!=0)continue;printf(“%d ”,i);} } 2.#include max=i;} printf(“max=%dn”,max);} 3.#include if(x!=0){m=x;s=x;} for(i=1;;i++){scanf(“%f”,&x);if(x==0)break;s=s+x;if(m>x)m=x;} a=s/i;printf(“最小值m=%f,平均值a=%f”,m,a);} 4.#include x+=i;else y+=i; printf(“x=%dn”,x);printf(“y=%dn”,y);} 5.#include else {printf(“thank you bey!”);break;} scanf(“%f”,&x);} } 6.#include t=t*(2*i)*(2*i)/(2*i-1)/(2*i+1); i=i+1; } printf(“n=%d,π=%fn”,n,t); } 7.#include printf(“%dn”,x);} 9.#include { d++; n=n*2; p=p+n; } while(p+n*2<=100);s=p*0.8/d;printf(“每天平均花%g元钱!n”,s);} 实验七 C多重循环结构程序设计 1.编程:输出100以内个位数为6且能被3整除的所有数。 2.编程:键盘输入6 位学生的5门课成绩,分别统计出每个学生的平均成绩。 3.编程:输入一个正整数,统计该数的各位数字中零的个数,并求各位数字中的最大者。4.编程:分别用do while、while、for三种循环结构求: 1!+2!+3!+...+n!,要求n的值由键盘输入。 5.编程:计算100至1000之间有多少个数其各位数字之和是5。 6.编程:从键盘输入的10个整数中,找出第一个能被7整除的数。若找到,输出此数后退出;若未找到,输出“not exist”。 7.编程:输出1至100之间满足如下条件的数:各位数的乘积大于各位数的和。8.编程:将整数316表示为两个加数的和,使这两个加数分别能被13和11整除。 9.编程:打印出所有的“水仙花数”。所谓的“水仙花数”是指一个3位数,其各位数字的立方和等于该数本身。例如,153是一个“水仙花数”,因为有153=1*1*1+5*5*5+3*3*3。10.编程:一条有10个车站的铁路线,共需要准备多少种车票? 1.#include {printf(“请输入第%d个学生的第%d门成绩”,i+1,j+1);scanf(“%d”,&a[i][j]);s=s+a[i][j];} s=s/5;printf(“第%d个学生平均成绩为%fn”,i+1,s);} } 3.#include printf(“i=%d,max=%d”,i,max);} 4.#include s=s+a;i++;} print(“s=%d”,s);} #include for(i=100;i<1000;i++){ s=0;k=i;while(k){ s=s+k%10;k=k/10;} if(s!=5)continue;else count++;} printf(“%dn”,count);} 6.#include {scanf(“%d”,&x);if(x%7==0) {printf(“first number is %d”,x);break;} } if(i>10)printf(“not exist!”);} 7.#include for(n=1;n<=100;n++){k=1;s=0;m=n; while(m>=1){k*=m%10;s+=m%10; m=m/10;} if(k>s) } printf(“%dn”,n); } 8.#include for(n=100;n<1000;n++){ i=n/100;j=(n-i*100)/10; k=n%10; if(i*i*i+j*j*j+k*k*k==n) printf(“%dn”,n); } } 实验八 C程序控制结构综合应用 1.编程计算: s=1+12+123+1234+12345+123456+1234567。 2.编程: 找出1至99之间的全部同构数。所谓同构数是这样一组数:它出现在其平方数的右边。例如:5是25右边的数,25是625右边的数,5和25都是同构数。 3.若用0至9之间不同的三个数构成一个三位数,编程统计共有多少种方法。4.编程:键盘输入一个不多于5位的正整数,要求:(此题为选做)(1)求它是几位数 (2)逆序打印出各位数字。如原数为123,输出则为321。5.编程:找出以下疑案的作案人(此题为选做)已知该案涉及6个嫌疑人A、B、C、D、E、F,并且:(1)A、B至少有一人作案。 (2)A、E、F这3人中至少有2人参与作案。(3)A、D不可能是同案犯。 (4)B、C或同时作案,或与本案无关。(5)C、D中有且仅有一人作案。 (6)如果D没有作案,则E也不可能参与作案。 6.编程:输出下列形式的杨辉三角形的前10行(此题为选做)1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 „„ 1.#include while(i<10){t=t*10+i;s+=t;i++;} printf(“s=%dn”,s);} 2.#include if(i*i%10==i||i*i%100==i) printf(“%dn”,i);} 3.#include for(i=1;i<=9;i++)for(j=0;j<=9;j++) if(i==j)continue;else for(k=0;k<=9;k++)if(k!=i&&k!=j)count++; } printf(“%dn”,count); 实验九 C的数组 1.编程实现:输入一个正整数n(1 例如:输入5,再输入三个数8、23、1、7、19,则输出为:19、7、1、23、8。 2.编程实现:输入10个正整数,将它们中的最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的10个数。 3.编程实现:已知二次等差数列的前4项为2,5,10,17,请定义一维整型数组存储该数列的前20项,并每5个数为一行输出该数列的前20项。 4.已知一组整型数据已按从小到大排列好,现任意输入一个整数,请按原来排序的规律将它插入到数组中(例如:原来的一组整数为1,3,5,8,9,若输入的整数是7,则最终的结果为: 1,3,5,7,8,9),请编程实现。 5.编程:将一个4×4的整型矩阵元素按副对角线(右上到左下)互换。 要求: (1)键盘输入矩阵各元素的值。 (2)互换前,按矩阵形式输出矩阵。 (3)互换后,按矩阵形式输出矩阵。 6.求一个4×4的整数矩阵的副对角线(右上到左下)上所有奇数的和sum及偶数的平均值ave。 要求:结果保留2位小数 7.通过循环按行顺序为一个5×5的二维数组a赋1到25的自然数,然后输出该数组的左下半角元素的值和它们之和。 8.定义一个实数型数组,将10个实数输入到数组中,编程实现任一块区间所有元素的平均值,即输入两整数m,n,计算出数组中第m个元素开始的后n个元素的平均值,包括第m个元素(若n值过大,即个数太多,超过数组的最后一个元素,则统计到最后一个元素)。 例如:数组元素为1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,输入3,5,则输出5.0。9.一个整型数组有10个元素,编写程序删除所有值为n的元素。如:数组中为1,3,2,4,2,7,9,0,2,5,n的值为2,删除后输出数组元素应该为1,3,4,7,9,0,5。(此题为选做) 10.定义两个N行N列的二维数组a、b,编写程序,将a数组最后一行放到b数组的第0列中,把a数组中的第0行放到b数组的最后一列中,b所指二维数组中其他元素的数据不变。(此题为选做) 11.试编程实现如下功能:先定义一个4行5列的数组(矩阵),调用库函数rand()随机产生20-50之间的整数给数组元素赋值,再将矩阵中第二列与第四列的元素互换。要求先输出原数组,再输出交换后的数组(rand函数的使用请参阅教材259页)。(此题为选做) 1.#include {a[i]=i*i+1; printf(“%d ”,a[i]); if(i%5==0) } } 4.#include {for(j=9;j>i;j--)a[j]=a[j-1]; a[i]=n; break; } printf(“n”); if(n>=a[8])a[9]=n;for(i=0;i<10;i++)printf(“%d ”,a[i]);printf(“n ”);} 6.#include { for(j=0;j<=3;j++) {printf(“input 16 ints:”);scanf(“%d”,&a[i][j]);} } for(i=0;i<=3;i++){ for(j=3;j>=0;j--){ if(i+j==3){if(a[i][j]%2!=0){s1=s1+a[i][j]; } else { t++;s2=s2+a[i][j];ave=s2/t;} } } } printf(“s=%0.2fnave=%0.2fn”,s1,ave);} 7.#include for(j=0;j<5;j++) { a[i][j]=k; k++; } } putchar(10);for(i=0;i<5;i++){ for(j=0;j<5;j++) printf(“%dt”,a[i][j]); printf(“n”);} putchar(10);for(i=0;i<5;i++){ for(j=0;j<=i;j++) printf(“%dt”,a[i][j]); printf(“n”); s=s+a[i][j];} printf(“s=%d”,s);} 实验十 C字符数组和字符串函数* 1.编写字符串拷贝程序,并要求拷贝过程中将字符串中的小写字母转换成大写字母。 2.从键盘输入两个字符串a和b,要求不使用库函数strcat,把串b的前5个字符连接到串a中;如果b中的长度小于5,则把b的所有元素都连接到a中。 3.输入一个以回车结束的字符串(少于80个字符),再输入一个字符,统计并输出该字符在字符串中出现的次数,然后输出该字符串。 4.编程: 输入一个字符串,输出该字符串中出现次数最多的字符以及出现的次数。5.编程: 键盘接收一个字符串(只含大、小写英文字母),将该字符串加密后输出。 加密规则为:若为小写字母则不变,若为大写字母则将其转换为小写后再后移一个字母,例如“A”应转换为“b”,“B”应转换为“c”,“Y”应转换为“z”,而“Z”应转换为“a”。 6.编程:输入一个以回车结束的字符串a(少于80个字符),再输入一个字符串b,统计并输出b在a中出现的次数,然后再输出这两个字符串。 7.编程:输入一个以回车结束的字符串(少于80个字符),将该字符串倒序存放后按顺序输出。 例如:如数组中开始时元素为“abcd”,程序执行后数组中为“dcba”,并输出“dcba” 8.编程: 实现对字符串的加密,要求从键盘输入一个字符串,输出加密之后的字符串。(此题为选做) 加密规则为: 对于串中第奇数个字符,若是字母,则把该字母变为它后面的字母(若为Z则变为A),不是字母则不变; 对于串中第偶数个字符,若是字母,则把该字母变为它前面的字母(若为A则变为Z),不是字母则不变; 大小写字母都遵循此规则。 例如: 若原字符串是:AbbaZG Ha-MnnK Yzx 加密字符串为:BaczAF Gb-Nmoj Xaw 9.编程:输入一行英文字符串,统计单词的个数(单词和单词以空格分隔)。(此题为选做) 1.#include int i,k;printf(“请输入第一个字符串n”);scanf(“%s”,str1);printf(“请输入第二个字符串n”);scanf(“%s”,str2);for(i=0;str1[i]!=' ';i++);for(k=0;str2[k]!=' ';k++){ str1[i]=str2[k];i++;} str1[i]=' ';for(i=0;str1[i]!=' ';i++){ if(str1[i]>='a' && str1[i]<='z'){ str1[i]=str1[i]-32;} } printf(“%sn”,str1);} 2.#include “stdio.h” main(){char a[80],b[40],*q=a,*p=b;int i=0;printf(“字符串a:”);gets(a);printf(“字符串b:”);gets(b);while(*q++);q--;while(*p++)i++;p=b;if(i<5)while(i--)*q++=*p++;else for(i=0;i<5;i++)*q++=b[i];*q=' ';puts(a);} 3.#include printf(“请输入字符串及字符:”);gets(c);ch=getchar();for(i=0;c[i]!=' ';i++)if(c[i]==ch)num++;printf(“num(%c)=%dn”,ch,num);puts(c);} 4.#include char str[100],str_sort[100],c; int i,j,len,m; printf(“请输入字符串:”);gets(str); strcpy(str_sort,str); len=strlen(str_sort); for(i=0;i for(j=0;j if(str_sort[j]>str_sort[j+1]){c=str_sort[j]; str_sort[j]=str_sort[j+1]; str_sort[j+1]=c; } for(i=1,j=1,m=0;i if(str_sort[i]!=str_sort[i-1]) { if(j>m) { m=j; c=str_sort[i-1]; } j=1; } else j++; printf(“出现最多的是:%c %dn”,c,m); getch(); } 5.#include } 7.{ } { if('a'<=i&&i<='z')printf(“%c ”,i);if('A'<=i&&i<='Y')i=i+33,printf(“%c ”,i);if(i=='Z')i=i+32-25,printf(“%c ”,i);scanf(“%c”,&i); printf(“n”);} #include {ch=c[i];c[i]=c[l-i-1];c[l-i-1]=ch; } puts(c);} 实验十一 C排序算法* 1.编程实现:输入n(n<10)个整数,按从大到小的顺序对其排序并输出。2.编程实现:输入一个字符串,按字符从小到大的顺序对其排序输出。 3.编程实现:键盘输入同寝室n位同学的姓名(用汉语拼音表示),将这n位同学的姓名按字母顺序排序后输出。(此题为选做) 1.#include } printf(“请输入这%d个数:”,n);for(i=0;i else printf(“ERROE!n”); { } for(i=0;i } } } for(i=0;i for(j=0;j { if(a[j] { c=a[j]; a[j]=a[j+1]; a[j+1]=c; scanf(“%d”,&a[i]);printf(“n”);} 2.#include { char str1[500]={0},str2[256]={0};int i;gets(str1);for(i=0;str1[i];i++){ str2[str1[i]]=1;} for(i=0;i!=256;i++)if(str2[i]==1)printf(“%c”,i);putchar('n');return 0;} 实验十二 C函数的基本操作 1.编写函数:计算三角形的面积。已知三角形三条边长,公式为: 其中x、y、z为边长,c=(x+y+z)/2。 2.编写函数:用来判断一个整数是否满足“用4除余1,用5除余3,用7除余4”,满足则返回1,不满足返回0,然后编写main函数,通过调用该函数显示出200~500之间满足该条件的数。 3.编写函数isprime(),用来判断一个整数a是否为素数。再编写main函数,通过调用该函数打印出100~300之间所有的素数,要求一行打印10个。 4.编写函数:判断一个整数是否为水仙花数,并编写主程序调用该函数求出所有的水仙花数。 5.用迭代法求 。迭代公式为: 迭代到为止,为方程的近似解。 6.所谓完数就是它所有因子的和等于其自身自然数,如6=1+2+3,6就是一个完数。编写两个函数:函数factor(n)用来判断n是否是完数,函数PriFac(n)用来显示完数n的所有因子,在主函数中调用这两个函数,显示1~30000间的所有完数。 7.以下函数p的功能是用递归方法计算x的n阶勒让德多项式的值。已有调用语句p(n,x);请编写p函数。递归公式如下:(此题为选做) float p(int n, int x){ } 1.#include s = sqrt(p *(pb)*(p-c)); printf(“此三角形的面积为:%lfn”, s);return 0;} 2.#include for(y=x-1;y>=1;y--){ if(x%y==0) {return y;break;} } } main(){int i,j=0,m;for(i=100;i<=300;i++){m=isprime(i);if(m==1){printf(“%5d ”,i);j++;if(j%10==0)printf(“n”);} } } 4.#include {int a,b,c; for(x=100;x<1000;x++) { a=(x/100)%10;b=(x/10)%10; c=x%10; if(x==a*a*a+b*b*b+c*c*c) printf(“%dn”,x); } } main() {int y;fun(y);} 5.#include { double a, b, c, d, e; printf(“Enter a number: ”); scanf(“%lf”, &a);b = a; e = pow(a, 1.0/3); do { c = b * 2/3 + a /(3 * b * b); d = c-b; while((d <=-0.00001)||(d >= 0.00001)); printf(“The result is %lf.n”, e);} 6.b = c; } #include int m,n; for(n=2;n<=3000;n++) } int factor(int n){int s,i;k=-1;s=n;for(i=1;i } if(s==0)return 1;else return 0;} void prifac(int n){int i;printf(“%d是完数n”,n);} 实验十三 C函数调用中的数据传递 1.编程实现:在主程序main()中输入2个整数,通过调用函数将两者的值互换(要求分别用地址传递方式、全局外部变量传递方式编程)。 2.编写函数:功能是删除字符串s中的所有数字字符。 3.编写函数:功能是返回字符串s中的指定字符c的出现次数。 4.在main函数中,定义一个含N个元素的数组,其中N是符号常量,然后编写下列各子函数完成相应的功能: (1)编写函数sr:为该数组各元素赋值(要求调用随机函数为各数组元素赋值)。 (2)编写函数sc:打印该数组各元素,要求每行打印m个数,其中m作为形参传递。 (3)编写函数js:求该数组元素的最大值和最小值,最大值和最小值通过参数传递返回主调函数。 (4)编写函数px:实现对数组的排序。 各个函数编写完成后,请编写main函数,并在main中分别调用以上四个函数,以验证各子函数的功能。 1.#include void swap(int *,int *);main(){ int a,b;printf(“input 2 number:a,bn”);scanf(“%d,%d”,&a,&b);swap(&a,&b);printf(“交换后:a=%d,b=%dn”,a,b);} void swap(int *p1,int *p2){ int t;t=*p1,*p1=*p2,*p2=t;} 2.#include 厦门大学公共课 《C语言程序设计》 教材习题答案 第三章 结构化程序设计 一、思考题 1、顺序结构的语句有哪些? 表达式语句,空语句,复合语句 2、从程序控制的角度看,复合语句是单一的语句吗? 是 3、C语言中的语句有哪几类?C语句与其他语言中的语句有哪些异同? 表达式语句,空语句,复合语句,控制语句。C语言与其他语言的语句类型基本相同,只是语法有所区别。 4、怎样区分表达式和表达式语句?C语言为什么要设表达式语句?什么时候用表达式,什么时候用表达式语句? 在C语言中,只要在任何表达式的结尾加上分号“;”就构成了表达式语句。表达式语句使C语言更加灵活。当我们使用表达式语句时一般只关心它的作用而不关心该表达式的值。如puts(“hello”);这个表达式语句,我们关心的是输出hello这个结果而不是puts函数的返回值。 5、C语言的输入输出功能是表达式语句吗,为什么? 是,因为输入输出功能是函数调用语句。 二、选择题 1、以下符合C语言语法的赋值表达式是B)d=9+e,f=d+9 2、下面程序运行时的输出结果是D)a=8 main(){ int a=5; printf(“a=%dn”,++a+2);} 3、putchar函数可以向终端输出一个D)字符或字符变量值 4、运行以下程序时,从键盘输入25,13,10(回车),则输出结果是A)a1+a2+a3=48 main(){ int a1,a2,a3; scanf(“%d,%d,%d”,&a1,&a2,&a3);} 5、若有以下定义和语句 char c1=‟b‟,c2=‟e‟;printf(“%d,%cn”,c2-c1,c2-„a‟+‟A‟);则输出结果是B)3,E 6、下面程序的执行结果是A)10 main(){ int a,b; a=20;b=10; a+=a+b; a-=a-b; printf(“%dn”,a);} 7、使下列程序输出”123,456,78”,由键盘输出数据,正确的输入是C)123,45678 int i,j,k; scanf(“%d,%3d%d”,&i,&j,&k);主讲教师:林子雨 E-mail:ziyulin@xmu.edu.cn 第1页/共4页 厦门大学公共课 《C语言程序设计》 教材习题答案 第三章 结构化程序设计 printf(“%d,%d,%dn”,i,j,k); 三、编程题 1、若a=3,b=4,c=5,x=1.2,y=2.4,z=-3.6,u=51274,n=128765,c1=’a’,c2=’b’,想得到以下的输出格式和结果,请写出程序(包括定义变量类型和设计输出)。要求输出结果如下: a=3 b=4 c=5 x=1.200000,y=2.400000,z=-3.600000 x+y=3.60 y+z=-1.20 z+x=-2.40 u=51274 n=128765 c1=’a’or 97(ascii)c2=’b’or 98(ascii)#include void main(){ int a=3,b=4,c=5;double x=1.2,y=2.4,z=-3.6;long u=51274,n=128765;char c1='a',c2='b';printf(“a=%d b=%d c=%dn”,a,b,c);printf(“x=%lf,y=%lf,z=%lfn”,x,y,z);printf(“x+y=%.2f y+z=%.2f z+x=%.2fn”,x+y,y+z,z+x);printf(“u=%ld n=%ldn”,u,n);printf(“c1='%c'or%d(ascii)n”,c1,c1);printf(“c2='%c'or%d(ascii)n”,c2,c2);} 2、请写出下面程序的输出结果 main(){ int a=5,b=7;float x=67.8564,y=-789.124;char c=’a’;long n=1234567;unsigned u=65535;printf(“%d%dn”,a,b);printf(“%3d%3dn”,a,b);printf(“%f,%fn”,x,y);printf(“%-10f,%10fn”,x,y);printf(“8.2f,%8.2f,%.4f,%.4f,%3f,%3fn”,x,y,x,y,x,y);printf(“%e,%10.2en”,x,y);printf(“%c,%d,%o,%xn”,c,c,c,c);printf(“%ld,%lo,%xn”,n,n,n);printf(“%u,%o,%x,%dn”,u,u,u,u);printf(“%s,%5.3sn”,”computer”,”computer”);} 57 主讲教师:林子雨 E-mail:ziyulin@xmu.edu.cn 第2页/共4页 厦门大学公共课 《C语言程序设计》 教材习题答案 第三章 结构化程序设计 7 67.856400,-789.124023 67.856400 ,-789.124023 8.2f,67.86,-789.1240,67.8564,-789.124023,67.856400 6.785640e+001,-7.89e+002 a,97,141,61 1234567,4553207,12d687 65535,177777,ffff,65535 computer, com 3、用下面的scanf函数输入数据,使a=10,b=20,c1=’a’,c2='a',x=1.5.,y=-3.75,z=67.8,请问在键盘上如何输入数据? scanf(“%5d%5d%c%c%f%f%*f,%f”,&a,&b,&c1,&c2,&x,&y,&z);0001000020aa1.5-3.75 1,67.8 4.设圆球半径为r=2.5,求圆球表面积、圆球体积。用scanf输入数据,输出计算结果,输出时要求有文字说明,取小数点后两位数字。请编程序。#include E-mail:ziyulin@xmu.edu.cn 第3页/共4页 厦门大学公共课 《C语言程序设计》 教材习题答案 第三章 结构化程序设计 } 7.编写一个能引起short型变量溢出的程序。#include s=1.0/2*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c));printf(“面积是:%f”,area);} else printf(“该三角形不存在!”);主讲教师:林子雨 E-mail:ziyulin@xmu.edu.cn 第4页/共4页 #include r=p; p=q; q=r;} r=p%q;while(r!=0){p=q;q=r;r=p%q;} cout<<“the maximun common divisor is”< #include } cin>>a>>b;c=a+b;cout< #include cin>>name1;cout< #include } double a,b;double h;double sum;int n;int i;a=0.0;b=1.0;n=1000;h=(b-a)/n;sum=(sin(a)+sin(b))/2;for(i=1;i #include cout<<“x1=”< cout<<“x1=”< cout< #include #include ch=ch-'A'+'a';cout<<“将大写转换为小写后,该字母为:”< #include cout<<“please input an array with seven elements:”< cin>>a[i];int big=a[0];for(int j=0;j<7;j++) if(a[j]>big) big=a[j]; cout<<“max=”< return 0;} #include for(j=0;j<5;j++) cout< cout< #include len=len+1;return len;} int main(){ char string[100];cout<<“please input a string(within 99 characters):”< } str4=str1+str2;cout< #include } cout<<“矩阵a和矩阵b的和矩阵c为:”< c[i][j]=a[i][j]+b[i][j]; cout< #include for(int j=0;j { c[i*N+j]=a[i*N+j]+b[i*N+j]; cout< } } cout< #include 503,87,512,61,908,170,897,275,653,426,154,509,612,677,765,703 };for(int i=0;i for(int j=COUNT-1;j if(list[j-1]>list[j]) { int tmp=list[j-1]; list[j-1]=list[j]; list[j]=tmp; } cout<<“the result is:”< for(int k=0;k<16;k++) cout< cout< #include array[i]=0;array[i]=1;for(i=2;i<=n;i++){ sc=0; for(j=0;j { sum=array[j]*i+sc; sc=sum/10; array[j]=sum%10; } } cout< #include } { if(str[i]>='a'&&str[i]<='z') str[i]=str[i]-'a'+'A';i=i+1;} cout<<“after transform:”< #include #include if(list[j-1]>list[j]) { int tmp=list[j-1]; list[j-1]=list[j]; list[j]=tmp; } } int main(){ int i;int array[16]= { 503,87,521,61,908,170,897,275,653,426,154,509,612,677,765,703 };cout<<“brfore the class:”< cout< cout< } cout< #include return 0;} int max(int x,int y){ return x>y?x:y;} #include cout< #include for(j=0;j { c[i*n+j]=0; for(k=0;k c[i*n+j]=c[i*n+j]+a[i*m+k]*b[k*n+j]; } } int main(){ double a[20]= { 1.0,3.0,-2.0,0.0,4.0,-2.0,-1.0,5.0,-7.0,2.0,0.0,8.0,4.0,1.0,-5.0,3.0,-3.0,2.0,-4.0,1.0 };double b[15]= { 4.0,5.0,-1.0,2.0,-2.0,6.0,7.0,8.0,1.0,0.0,3.0,-5.0,9.0,8.0,-6.0 };double c[12];matrix_multi(a,b,c,4,5,3);cout<<“the result is c=”< for(int j=0;j<3;j++) cout< cout< #include cout<<“error!”< cout<<*p; p--;} cout< int k=i; for(int j=i+1;j if(*(list+j)<*(list+k))k=j; if(k!=i) { int tmp=*(list+i); *(list+i)=*(list+k); *(list+k)=tmp; } } } int main(){ int arry[6]={2,7,2,2,3,1}; selectsort(arry,6); cout<<“the result is:”< } for(int i=0;i<6;i++)cout< #include move(p1,p3);else { hanoi(n-1,p1,p3,p2); move(p1,p3); hanoi(n-1,p2,p1,p3);} } int main(){ hanoi(N,'A','B','C'); return 0;} #include #include cout<<“Error!!”< cout<<“Usage:ProgramName return 1;} cout<<“Hello”< #include #include hanoi(n-1,p1,p3,p2); move(p1,p3); hanoi(n-1,p2,p1,p3);} } int main(){ cout<<“Simulation of hanoi tower.”< #include #include #include #include #include Age=0; Sex='m';} ~Person(){ cout<<“Now destroying the instance of Person”< Age=age; Sex=(sex=='m'?'m':'f');} void Person::ShowMe(){ cout< cout<<“person:t”; person1.ShowMe(); person1.Register(“Zhang3”,19,'m'); cout<<“person1:t”; person1.ShowMe(); cout<<“person2:t”; person2.ShowMe(); person2=person1; cout<<“person2t”; person2.ShowMe(); return 0;} #include public: Date();void init(int,int,int);void print_ymd();void print_mdy();};Date::Date(){ year=1900;month=1;day=1;} void Date::init(int yy,int mm,int dd){ month=(mm>=1&&mm<=12)?mm:1;year=(yy>=1900&&yy<=2100)?yy:1900;day=(dd>=1&&dd<=31)?dd:1;} void Date::print_ymd(){ cout< #include public: Date();Date(int,int,int);void init(int,int,int);void print_ymd();void print_mdy();};Date::Date(){ year=1900;month=1;day=1;} Date::Date(int yy,int mm,int dd){ init(yy,mm,dd);} void Date::init(int yy,int mm,int dd){ month=(mm>=1&&mm<=12)?mm:1; year=(yy>=1900&&yy<=2100)?yy:1900; day=(dd>=1&&dd<=31)?dd:1;} void Date::print_ymd(){ cout< date2.init(2006,4,8);date2.print_ymd();date2.print_mdy();return 0;} #include return 0;} #include Age=0; Sex='m';} ~Person(){ cout<<“Now destroying the instance of Person”< Age=age; Sex=(sex=='m'?'m':'f');} void Person::ShowMe(){ cout< cout<<“person:t”; person1.ShowMe(); person1.Register(“Zhang3”,19,'m'); cout<<“person1:t”; person1.ShowMe(); cout<<“person2:t”; person2.ShowMe(); person2=person1; cout<<“person2t”; person2.ShowMe(); return 0;} #include Age=0; Sex='m';} ~Person(){ cout<<“Now destroying the instance of Person”< Age=age; Sex=(sex=='m'?'m':'f');} void Person::ShowMe(){ cout< cout<<“person:t”; person1.ShowMe(); person1.Register(“Zhang3”,19,'m'); cout<<“person1:t”; person1.ShowMe(); cout<<“person2:t”; person2.ShowMe(); person2=person1; cout<<“person2t”; person2.ShowMe(); return 0;} #include #include void init(int,int,int);void print_ymd(); };void Date::init(int yy,int mm,int dd){ year=yy;month=mm;day=dd;} void Date::print_ymd(){cout< #include x=“< Age=age; Sex=(sex=='m'?'m':'f');} void ShowMe(){cout< Number=number; Register(name,age,sex);} void ShowStu(){ cout< ShowMe();} };int main(){ Student stu;stu.RegisterStu(”计算机51“,85071011,”张弓长“,18,'m');stu.ShowStu();stu.ShowMe();return 0;} #include Age=age; Sex=(sex=='m'?'m':'f');} void ShowMe(){cout< Number=number; strcpy(Name,name); Age=age; Sex=(sex=='m'?'m':'f');} void ShowStu(){ cout< ShowMe();} };int main(){ Student stu;stu.Register(”计算机51“,85071011,”张弓长“,18,'m');stu.ShowStu();//stu.ShowMe();return 0;} #include Age=age; cout<<”constructor of person“< :Person(name,age),Monitor(name1,age1){ strcpy(ClassName,classname); cout<<”constructor of Student“< C语言实验 实验一:C语言程序调试基础 一、实验目的 1.掌握C语言源程序的编写方法和调试方法 2.学会使用VC6开发工具及调试过程的查错纠错能力。 二、任务 调试课本例子:例2.19、例3.5、例5.9 三、实验过程及结果 1.鼠标左键双击VC,打开程序;单击打开的New的页面中,单击 键,选择键,选择,在新,最后单击键,就可以建立一个新的页面。 2.在界面中输入例2.19的内容,单击 键进行调试,底下的对话框出现 一句话时,说明我们编写的程序无错,就可以单击键,来运行程序。运行结果及编写程序内容如图: 4.关闭这两个窗口,再单击 实验二:顺序程序设计 一、实验目的: 1.掌握顺序程序的设计方法; 键,选择 ; 2.掌握输入输出控制语句。 二、实验任务与要求 1.第3章课后习题T2 2.第3章课后习题T7 三、实验过程及结果 实验三:分支程序设计 一、目的 1.掌握分支程序控制语句的语法格式及纷争程序设计方法。2.了解分支程序的条件表达式及运算规则; 3.掌握分支程序控制语句的嵌套使用方法。 二、任务 1.第4章课后习题T6 2.第4章课后习题T8 3.第4章课后习题T12 三、实验过程及结果 实验四:循环程序设计 一、目的 1.掌握循环程序的控制语句的语法规则; 2.掌握循环程序的编写方法; 3.掌握循环程序的嵌套与退出控制方法。 二、任务 1.求100~200间的全部素数。2.第5章课后习题T8 3.第5章课后习题T10 三、实验过程及结果 实验五:数组 一、目的 1.掌握数组的定义及使用方法 2.掌握字符数组的相关操作函数。 二、任务 1.用数组求Fibonacci数列的钱40项,每5个一行。2.将一个3行8列的数组A转置为数组B。3.已知字符串str1=”abcde”,str2=”hijklm”,比阿尼写程序分别实现str1与str2的连接、求长度、比较等操作。 三、实验过程及结果 实验六:函数 一、目的 1.掌握函数的定义与调用方法。2.掌握函数参数的专递方式。 3.掌握函数的嵌套调用和递归调用方法。 二、任务 1.编写一函数,用冒泡排序法实现对数组A的排序。2.编写一函数,用选择排序法实现对数组A的排序。3.编写一函数,实现对给定年year是不是闰年。4.编写一函数,实现对给定整数m是不是素数。 5.利用递归算法,编写一函数,求Fibonacci数列的第n项。 三、实验过程及结果 实验七:变量作用域 一、目的 1.了解变量的存储类型及生命周期、作用域的性质。2.准确使用局部变量和全局变量。 二、任务 1.根据变量作用域知识,分析下列程序的运行效果。2.调试程序,分析个变量的作用范围和生命期。 #include Printf(“i=%dn”,i); int i=40; printf(“i=%dn”,i); fun1(); fun1();} 三、实验过程及结果 实验八:结构体 一、目的 1.掌握结构体的定义方法和使用。 二、任务 定义一日期(年、月、日)结构体,编程实现日期的输入、日期的输出、日期加上一个整型天数、两个日期数据相减等功能。 三、实验过程及结果 Problem B: 算术基本运算 Description 计算两整数x和y(0 printf(”x * y : %dn“,x*y); printf(”x / y quotient: %d, remainder: %dn“,x/y,x%y); printf(”x ^ 2 : %dn“,x*x); printf(”y ^ 3 : %dn“,y*y*y); return 0;} Problem C: 求圆的面积和周长 Description 从键盘输入圆的半径,求圆的面积和周长,圆周率取3.14。Input 输入一个浮点型数据,有效数字不会超过十进制的6位。Output 输出为两行。 第一行为圆的面积,第二行为圆的周长,格式见sample。Sample Input Sample Output Area: 28.260000 Perimeter: 18.840000 HINT 了解浮点类型的输入、输出和算术运算符 #include double Area,Perimeter,r,p=3.14; scanf(”%lf“,&r); Area=p*r*r,Perimeter=2*p*r; printf(”Area: %lfn“,Area); printf(”Perimeter: %lfn“,Perimeter); return 0;} Problem D:平均值 Description 求3个数的平均值。Input 输入只有一行,为3个较小的整数。Output 输出为这3个整数的平均值,保留3位小数。Sample Input 1 2 3 Sample Output 2.000 HINT 注意除法运算对整型数据和浮点型数据是不一样的。#include int x,y,z; float ave; scanf(”%d %d %d“,&x,&y,&z); ave=(x+y+z)/3.0; printf(”%.3f“,ave); return 0;} Problem E: 货币兑换 Description 给出人民币对美元、欧元、日元的当日汇率,求给定金额的人民币能兑换成外币的金额,求给定金额的外币能兑换成人民币的金额。要计算的外币有三种:美元、欧元、日元。Input 输入有三行。 第一行依次为美元、欧元、日元外币汇率,用空格分开。汇率用100外币为单位,精确到小数点后4位,如668.5200表示“100美元=668.5200人民币”。汇率浮动范围为(0,10000)。 第二行为外币金额x,第三行为人民币金额y。x,y均为整数,且0 第一行为金额为x的美元、欧元、日元兑换成人民币的金额,用空格分开。第二行为金额为y的人民币兑换成美元、欧元、日元的金额,用空格分开。所有金额精确到小数点后两位。Sample Input 668.5200 908.0685 7.9852 1500 1500 Sample Output 10027.80 13621.03 119.78 224.38 165.19 18784.75 HINT 了解浮点数据类型的精确度和输出控制。 #include return 0; } Problem F: 求字符的值 Description 从键盘输入3个字符(不含双字节字符),分别输出每个字符的十进制值(ASCII码)、八进制值和十六进制值。Input 输入为3个字符。Output 输出为3行。 每一行为每个字符(对应输入顺序)的十进制、八进制和十六进制值,用空格分隔开。每个输出的值占3个字符,不足3个字符前面补0。Sample Input 0 A Sample Output 048 060 030 032 040 020 065 101 041 HINT 了解字符值的存储和整型的关系。#include Problem G: 奇数还是偶数? Description 输入一个整数,判读它是奇数还是偶数。Input 输入只有一行,为一个100以内的正整数。Output 输出为一行。 若输入为偶数则输出“even”,奇数输出“odd”。Sample Input 30 Sample Output even HINT 用整数运算可以解决,练习“?:”表达式。#include int x; scanf(”%d“,&x); if(x%2==0) printf(”even“); else printf(”odd“); return 0;} Problem H: 绝对值 Description 求整型数据和浮点型数据的绝对值。Input 输入两个数,第一个是整数,第二个是浮点数。Output 输出为两行,第一行为整数的绝对值,第二行为浮点数的绝对值,注意浮点数的绝对值不输出无意义的0。Sample Input-1 1 Sample Output 1 1 HINT 求绝对值可以用标准库函数来完成,也可以自己判断。注意浮点数的输出格式。求绝对值的函数在哪个头文件?貌似很多人会搞错,包括很多编书的人!#include int x; float y; scanf(”%d“,&x); scanf(”%f“,&y); printf(”%dn“,abs(x)); printf(”%gn“,fabs(y)); return 0;} Problem I: 简单的打折计算 Description 商店规定:消费满n元,可以打八八折。设某件商品标价m元,输入购买的件数x,计算出需要支付的金额(单位:元),精确到分。Input 输入只有一行,三个整数m、n和x,且0 300 4 Sample Output 334.40 HINT 了解浮点型的输出控制,注意整型和浮点型混合运算过程中的数据类型转换。#include int m,n,x; double y; scanf(”%d%d%d“,&m,&n,&x); y=m*x; if(y>n) y=y*0.88; else y=y; printf(”%.2lfn“,y); return 0;} Description 输入一个正整数的年份,判断是否为闰年。Input 输入只有一行,为一个10000以内的正整数。Output 输出为一行。 若输入为闰年偶数则输出“Yes”,否则输出“No”。Sample Input 2010 Sample Output No HINT 了解逻辑运算符和关系运算符。#include int a; scanf(”%d“,&a); if(a%4==0&&a%100!=0||a%400==0) printf(”Yes“); else printf(”No“); return 0;} Problem K: GHacker的解谜过关游戏 Description GHacker最近痴迷于一个新上市的解谜游戏,其中一关的过关是破解一个字符串S。经过3天的冥思苦想,GHacker成功的搞明白了这其中的奥秘,把串S中的整数取出来求和,就可以过关了。但是GHacker的数学实在糟糕。他无法在短暂的时间内算出来,只好求助Jackie。Jackie观察到虽然每次出现的数字不同,但是其它的符号并不会变化。于是Jackie编写了一个非常短的程序,帮助GHacker把这一关过了。Input 输入为串S,只有一行。Output 串S中用非数字(0~9)分隔开的非负整数之和,不会超出int类型的数据范围。Sample Input `13?:[7514],54.487==”(438922x159??392)%032n111cdef120$95;Sample Output 447899 HINT scanf()可以解决这个问题,注意转义字符和格式控制字符。#include int i,sum,num; char str[1000]; while(scanf(“%s”,str)!=EOF) { num=sum=0; for(i=0;;i++) { if(str[i]>='0' && str[i]<='9') num=num*10+str[i]-'0'; else { sum=sum+num;num=0; if(str[i]==' ')break; } } printf(“%dn”,sum); } return 0;} Problem L: 水仙花数 Description 如果一个三位十进制数等于其各位数字的立方和,则称这个数为水仙花数。如:13+53+33=153。Input 一个整数x,100<=x<=999。Output x是水仙花数,则输出“YES”,否则为“NO”。Sample Input 153 Sample Output YES #include int x,a,b,c,sum; scanf(“%d”,&x); a=x/100; b=(x-a*100)/10; c=(x-a*100-b*10); sum=a*a*a+b*b*b+c*c*c; if(x==sum) printf(“YES”); else printf(“NO”); return 0;} Problem M: 求1+2+...+n=? Description 给定一个n,求出s = 1+2+3+...+n的值。Input 输入只有一行,包含一个正整数n(n<=232)。Output 输出一行,为1+2+...+n的值。Sample Input 10 Sample Output 55 HINT n的数据范围大,需注意数据类型的选择和计算次序,以避免数据溢出。#include unsigned long long n,s,a; scanf(“%llu”,&n); a=n%2; if(a==0){ s=n/2*(n+1); printf(“%llu”,s);} else if(a!=0) {s=n*((n+1)/2);printf(“%llu”,s);} return 0;} Problem N: 2的多少次幂 Description 从键盘输入一个数x,x是2的整数次幂(x=2y),请编程求出y的值。Input 一个非负有理数x,x在[0,2256]范围内。Output 一个整数y。Sample Input 1 Sample Output 0 HINT 看起来数据很大,但是用double完全可以存储。为什么?请研究下IEEE-754标准的浮点数存储格式。这里要用到C语言标准库的数学函数。#include double x; scanf(“%lf”,&x); printf(“%g”,log2(x)); return 0;} Problem A: 哪一行比较长 Description 读取两行字符串,按每行的长度从长到短输出。Input 输入为两行,每行不会超过26个字符。Output 输出为两行,按每行的长度从长到短输出。Sample Input abcdefghijk abcdefghijklmnopqrstuvwxyz Sample Output abcdefghijklmnopqrstuvwxyz abcdefghijk HINT 了解字符串的存储和操作,了解gets()和scanf(“%s”)读入字符串的不同之处。#include puts(a); puts(b); return 0; } puts(b);puts(a);} Problem B: 三个数比较大小 Description 从键盘上输入0~100之间的三个数,按从小到大的顺序输出。 Input 输入只有一行,为三个整数。 Output 按从小到大输出这三个数。 Sample Input 15 10 20 Sample Output 10 15 20 HINT 用if语句判断各种情况可以解决这个问题。 include scanf(“%d%d%d”,&a,&b,&c);if(a>b){ t=a; a=b; b=t; } if(a>c) { t=a; a=c; c=t; } if(b>c){ t=b; b=c; c=t;} printf(“%d %d %dn”,a,b,c);return 0;} Problem C: 输出是m的倍数或n的倍数、但不是m和n的公倍数的数 Description 输出1~k之间是m的倍数或n的倍数、但不是m和n的公倍数的数,其中1<=m,n Input 输入三个整数,依次为k、m、n。 Output 从小到大输出符合题意的所有整数,两数之间用一个空格分开。 Sample Input 15 2 3 Sample Output 2 3 4 8 9 10 14 15 HINT 难点在于输出格式的控制:空格在数的中间,学会用循环时边界情况的特殊处理。 #include { int k,m,n,a; scanf(“%d%d%d”,&k,&m,&n); { if(m>n) { printf(“%d”,n); for(a=n+1;a<=k;a++) { if((a%m==0&&a%n!=0)||(a%m!=0&&a%n==0)) printf(“ %d”,a);} } else { printf(“%d”,m); for(a=m+1;a<=k;a++) { if((a%m==0&&a%n!=0)||(a%m!=0&&a%n==0)) printf(“ %d”,a);} } } return 0;} Problem D: A+B Problem Description 计算a+b,0<=a,b<1000。Input 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。Output 每行输出一个a+b的值,顺序与输入对应。Sample Input 1 2 10 20 Sample Output 3 30 HINT OJ系统上测试输入结束符为EOF(End Of File),其值为-1。用scanf()把文件所有内容读完后,会读到EOF,所以可以用来判断输入是否完成,测试时可以用Ctrl+Z产生EOF。本题解法参看FAQ。#include int a,b; while(scanf(“%d %dn”,&a,&b)!=EOF) printf(“%dn”,a+b);} Problem E: A+B Problem(II): Input/Output Pratice Description 计算a+b,0<=a,b<1000。 Input 输入的第一行是一个整数N,后面有N对整数a和b,每对a和b占一行,a,b用空格分开。 Output 每行输出一个a+b的和,顺序与输入对应。 Sample Input 2 1 2 10 20 Sample Output 3 30 HINT N给出了测试样例数,用for循环处理方便。 #include scanf(“%d %d”,&a,&b); printf(“%dn”,a+b);} return 0;} Problem F: A+B Problem(III): Input/Output Pratice Description 计算a+b,0<=a,b<1000。 Input 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。当测试样为0 0时表示输入结束,0 0不参与运算。 Output 每行输出一个a+b的值,顺序与输入对应。 Sample Input 1 2 10 20 0 0 Sample Output 3 30 HINT 练习break的使用。 #include int a,b; while(scanf(“%d%d”,&a,&b)) { if(a==0&&b==0) break; printf(“%dn”,a+b); } } Problem G: A+B Problem(IV): Input/Output Pratice Description 计算a+b,0<=a,b<1000。 Input 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。 Output 每行输出一个a+b的值,顺序与输入对应。每个格式样例之间用一个空行分隔开。 Sample Input 1 2 10 20 35 Sample Output 3 30 50 HINT 由于输出的和比空行多一个,所以全部计算放在一个循环里是不行的,必须要特殊处理开头或者结尾。#include int a,b,i; scanf(“%d %d”,&a,&b); printf(“%dn”,a+b); while(scanf(“%d %d”,&a,&b)!=EOF) printf(“n%dn”,a+b);} Problem H: n个数的最大值和最小值 Description 找出n个数中最大的数和最小的数,并将它们的值输出出来。 Input 输入为n+1个整数,都在int类型范围内。这些数可能用若干空格或者换行符分隔开。 输入的第1个数为n,表示后续有n个数输入。从输入的第2个数开始,求出直到第n+1个数中最大的数和最小的数。 Output 输出为两行,格式见sample。 Sample Input 3 0 1-1 Sample Output The maximum number is 1.The minimum number is-1.HINT 分隔符是空格还是回车都是空白符,对scanf(“%d”)来说没有区别;先读入n,然后用for循环就很容易控制读入n个数的过程。 #include scanf(“%d”,&y); if(min>y) min=y; if(max max=y;} printf(“The maximum number is %d.n”,max);printf(“The minimum number is %d.n”,min);return 0;} Problem I: 成绩的等级 Description 把百分制的考试成绩转换成五级制的成绩: 90~100:Excellent 80~89:Good 70~79:Average 60~69:Pass 0~59:Failing 不在0~100之间的输入是非法数据,输出“Error”。 Input 输入多行,每行一个整数。 Output 输入所对应的成绩等级。 Sample Input-1 81 92 35 68 72 100 Sample Output Error Good Excellent Failing Pass Average Excellent HINT 用switch语句解决这个问题比较方便。 #include int a,grade; while(scanf(“%d”,&grade)!=EOF) { if(grade>=0 && grade<=59) a=1; else if(grade>=60 && grade<=69) a=2; else if(grade>=70 && grade<=79) a=3; else if(grade>=80 && grade<=89) a=4; else if(grade>=90 && grade<=100) a=5; else a=6; switch(a) { case 1: printf(“Failingn”); break; case 2: printf(“Passn”); break; case 3: printf(“Averagen”); break; case 4: printf(“Goodn”); break; case 5: printf(“Excellentn”); break; case 6: printf(“Errorn”); break; } } return 0;} Problem J: 只有一个二元运算符的表达式运算 Description 编程序读入并计算只有一个二元运算符的表达式的值。用到的二元运算符有:“+”、“-”、“*”、“/”、“%”,与C语言的语法一致。 Input 每行输入一个表达式,格式为:二个整型的操作数a和b,中间用一个符号分开,这个符号就是运算符。测试样例不存在除数为0的情况。 输入以a和b为0,且用一个空格分开结束。 Output 每行对应输入的运算符为“+”、“-”、“*”、“/”、“%”,则计算a+b、a-b、a*b、a/b、a%b的值;否则输出“invalid op”。 Sample Input 33+5 8*9 2.2 1-6 17/3 9%3 0 0 Sample Output 38 72 invalid op-5 5 0 HINT 教材上有非常相似的例题可以参考。 #include int a, b; char ch; while(scanf(“%d%c%d”, &a, &ch, &b)) { if(a == 0 && b == 0 && ch == ' ')break; if (ch == '+')ch = '+'; else if(ch == '-')ch = '-'; else if(ch == '*')ch = '*'; else if(ch == '/')ch = '/'; else if(ch == '%')ch = '%'; else ch = '~'; switch(ch) { case '+' : printf(“%dn”, a + b); break; case '-' : printf(“%dn”, a2x + 1 = 0 only one real root : 1 Case 3 : 5x^22x = 0 two real roots : 0, 0.666667 Case 5 : 3x^2 + 12 = 0 two imaginary roots : 2i,-2i Case 6 : 2x^2 + 4x + 4 = 0 two imaginary roots :-1+i,-1-i HINT 输出方程格式的各种情况要想清楚,这一部分测试数据给的很全面。另一个就是浮点数的精度控制,这一部分sample给出了例子。 值得注意的是,linux下gcc编译的浮点数运算结果有-0,这是OJ系统Judge端使用的系统;而windows XP下的minGW编译器和VC6不会产生-0,只会输出0;但windows 7下的minGW编译器是能够产生-0的(确实很诡异)。因此使用windows XP的同学忽略了对结果为0的检测,程序需要对结果为0的情况进行全面考虑,确保正确的输出0。这个问题卡了好些同学好几天。 关于是否会产生-0,输出表达式0.0/-1的结果就能测试出来。浮点数从负数方向运算出结果为0,则浮点值为-0是符合C语言浮点数运算规则的,目前尚不清楚windows XP系统不能产生-0的原因。 #include int i,n=1; double a,b,c,x1,x2,p,q,m,t; char x,y; while(1) { scanf(“%lf”,&a); if(fabs(a)< eps) break; //结束条件 scanf(“%lf%lf”,&b,&c); p=(-b)/(2*a); q=b*b-4*a*c; if(fabs(q)< eps) //精度控制 q = 0; m=(sqrt(-q))/(2*a); x1 =(-b + sqrt(q))/(2*a); x2 =(-bxx-y; if(a * x + b * y +(c * 1.0)/(d * 1.0)* z == m) printf(“%ld,%ld,%ldn”,x,y,z); } } printf(“n”); } } return 0;} Problem I: 神棍的纯真愿望 Description 问题背景: 神棍队的神棍童鞋很喜欢和女盆友逛街。神棍节这天,他们照例去逛街,亲昵过程中忽然发现路边上围了好一圈人。好奇心大盛的神棍于是凑过去围观。原来那里有一个棍神,他出了一道题目,如果有人能够答对的话,他就会实现那个人的一个愿望。神棍心想,有个女盆友多么幸福,要是大家都有女盆友该有多好。于是神棍想要答出这个问题,然后许一个让大家都可以很快拥有自己的女盆友的愿望,顺便在女盆友的面前臭美一番。神棍扫了一眼题目,拿出贴身小电脑,巴拉巴拉几下就敲出了代码,解决了那个问题。大家都在为神棍欢呼。这是什么问题 呢?你是否也有兴趣看看?如果AC了的话就可以跟魔法少女签订契约,成为魔法少女的奴隶喔! 问题描述: 某个数的立方如果以111结尾的话,我们就称其为“神棍数”,现在要你求第k大的“神棍数”是多少。 Input 多组case,以EOF结尾。 每个case一行,只包含一个整数k(1<=k<=***0000)。 Output 一个整数表示第k大的“神棍数” Sample Input 1 Sample Output 471 #include unsigned long long k; while(scanf(“%llu”,&k)!=EOF) { if(k>1) printf(“%llu471n”,k-1); else printf(“471n”,k); } return 0;} Problem J: 魔方阵 Description 所谓N阶魔方阵,是一个N*N的方阵,其元素由1到N^2组成,且方阵每行每列以及对角线的元素和相等。如三阶魔方阵: 8 1 6 3 5 7 4 9 2 魔方阵的规律如下: 从1~N*N的 各个数依次如下规则存放: (1)1在第一行中间一列; (2)每一个数存放的行比前一个数的行数减一,列数加一(如上的三阶方阵5在4的上一行,后一列); (3)如果上一个数在第一行,则下一个数在最后一行,列数加一; (4)如果上一个数在最后一列,则下一个数在第一列,行数减一; (5)如果按上述规则确定的位置已经有数,或上一个数在第一行第N列,则下一个数放在上一个数的正下方。 Input 输入包含多组数据,每组为一个小于100的正奇数。 Output 对于每个输入的N,输出N阶魔方阵;两组数据之间用一个空行分隔。方阵中每行每两个数之间有一个空格,行首和行末没有多余的空格。 Sample Input 3 Sample Output 8 1 6 3 5 7 4 9 2 HINT #include int i, j, k, n, a[200][200]; while(scanf(“%d”, &n)!=EOF) { for(i = 1;i <= n;i++) for(j = 1;j <= n;j++) a[i][j] = 0; j = n / 2 + 1; a[1][j] = 1; for(k = 2;k <= n * n;k++) { i=i-1; j=j+1; if(i < 1 && j > n) { i=i+2; j=j-1; } else { if(i < 1)i = n; if(j > n)j = 1; } if(a[i][j] == 0)a[i][j] = k; else { j=j-1; i=i+2; a[i][j] = k; } } for(i = 1;i <= n;i++) { printf(“%d”, a[i][1]); for(j = 2;j <= n;j++) printf(“ %d”, a[i][j]); printf(“n”); //for(j=1;j<=n;j++) //printf(“%5d”,a[i][j]); //printf(“n”); } printf(“n”); } return 0;}第二篇:C语言作业答案
第三篇:C语言课后实验答案
第四篇:C语言实验
第五篇:C语言作业