C语言实验题及参考答案.doc
实验一1、计算整数各位数字之和 (2.1) (10 分)输入一个3位正整数,将其每一位的数字相加,输出和。输入格式:输入一个3位正整数。 变量数据类型为unsigned。输出格式:输出整数每一位相加后的整数和。输入样例:123输出样例:6【参考答案】#include "stdio.h"int main() unsigned int a,ge,shi,bai,sum; scanf("%d",&a); ge=a%10; shi=a/10%10; bai=a/100; sum=ge+shi+bai; printf("%dn",sum); return 0;2、计算代数表达式 (2.2) (10 分)求: 输入格式:输入角度x。变量数据类型为double。为3.14159。输出格式:输出y的值,精确到小数点后2位。输入样例:12.3输出样例:1.69【参考答案】#include <stdio.h>#include <math.h>#define PI 3.14159int main()double x,y;scanf("%lf",&x);y=sqrt(sin(60*PI/180)+1)*(sin(30*PI/180)+1)/cos(x*PI/180); printf("%.2lf",y); return 0;3、逆序的三位数 (10 分)程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。输入格式:每个测试是一个3位的正整数。输出格式:输出按位逆序的数。输入样例:123输出样例:321【参考答案】#include "stdio.h"int main() int a,ge,shi,bai,b; scanf("%d",&a); ge=a%10; shi=a/10%10; bai=a/100; b=ge*100+10*shi+bai; printf("%dn",b); return 0;4、求整数均值 (10 分)本题要求编写程序,计算4个整数的和与平均值。题目保证输入与输出均在整型范围内。输入格式:输入在一行中给出4个整数,其间以空格分隔。 输出格式:在一行中按照格式“Sum = 和; Average = 平均值”顺序输出和与平均值,其中平均值精确到小数点后一位。 输入样例:1 2 3 4输出样例:Sum = 10; Average = 2.5【参考答案】#include "stdio.h"int main()int a,b,c,d,sum; float ave; scanf("%d %d %d %d",&a,&b,&c,&d); sum=a+b+c+d; ave=sum/4.0; printf("Sum = %d; Average = %.1fn",sum,ave); return 0;5、是不是太胖了 (10 分)据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤是公斤的两倍。现给定某人身高,请你计算其标准体重应该是多少?(顺便也悄悄给自己算一下吧)输入格式:输入第一行给出一个正整数H(100 < H 300),为某人身高。输出格式:在一行中输出对应的标准体重,单位为市斤,保留小数点后1位。输入样例:169输出样例:124.2【参考答案】#include <stdio.h>int main() int h;float w; scanf("%d",&h); w=(h-100)*0.9*2; printf("%.1fn", w); return 0;6、日期格式化 (10 分)世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。输入格式:输入在一行中按照“mm-dd-yyyy”的格式给出月、日、年。题目保证给出的日期是1900年元旦至今合法的日期。输出格式:在一行中按照“yyyy-mm-dd”的格式给出年、月、日。输入样例:03-15-2017输出样例:2017-03-15【参考答案】#include <stdio.h>int main() int year,month,day; scanf("%d-%d-%d",&month,&day,&year); printf("%d-%02d-%02dn",year,month,day); return 0; 7、整数四则运算 (10 分)本题要求编写程序,计算2个正整数的和、差、积、商并输出。题目保证输入和输出全部在整型范围内。输入格式:输入在一行中给出2个正整数A和B。 输出格式:在4行中按照格式“A 运算符 B = 结果”顺序输出和、差、积、商。 输入样例:3 2输出样例:3 + 2 = 53 - 2 = 13 * 2 = 63 / 2 = 1【参考答案】#include "stdio.h"int main() int a,b; scanf("%d %d",&a,&b); printf("%d + %d = %dn",a,b,a+b); printf("%d - %d = %dn",a,b,a-b); printf("%d * %d = %dn",a,b,a*b); printf("%d / %d = %dn",a,b,a/b); return 0;8、计算存款利息 (10 分)本题目要求计算存款利息,计算公式为interest=money×(1+rate)yearmoney,其中interest为存款到期时的利息(税前),money是存款金额,year是存期,rate是年利率。输入格式:输入在一行中顺序给出三个正实数money、year和rate,以空格分隔。输出格式:在一行中按“interest = 利息”的格式输出,其中利息保留两位小数。输入样例:1000 3 0.025输出样例:interest = 76.89【参考答案】#include <stdio.h>#include <math.h>int main() float money,rate,year,interest; scanf("%f %f %f",&money,&year,&rate); interest=money*pow(1+rate),year)-money; printf("interest = %.2fn", interest); return 0;实验二1、比较大小 (15 分)本题要求将输入的任意3个整数从小到大输出。输入格式:输入在一行中给出3个整数,其间以空格分隔。输出格式:在一行中将3个整数从小到大输出,其间以“->”相连。 输入样例:4 2 8输出样例:2->4->8【参考答案】#include <stdio.h>int main() int a,b,c,t; 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; 2、计算运费 (3.4) (15 分)运输公司对用户计算运费。路程(s)越远,每千米运费就越低。标准如下:· s250km ,没有折扣;· 250kms500km, 2%的折扣;· 500kms1000km, 5%的折扣;· 1000kms2000km,8的折扣;· 2000kms3000km,10的折扣;· 3000kms,15的折扣。设每千米每吨货物的基本运费为p,货物重为 w,距离为s,折扣为d,则总运费f的计算公式为: fp×w×s×(d)输入格式:在一行中以小数形式输入基本运费、货重和距离,以空格作为分隔符。输出格式:在一行输出计算出来的运费,精确到小数点后位的值。输入样例:在这里给出一组输入。例如:100 20 300输出样例:在这里给出相应的输出。例如:freight=588000.00【参考答案】#include <stdio.h>int main() int c,s; float p,w,d,f; scanf ("%f %f %d",&p,&w,&s); if (s>=3000) c=12; else c=s/250; switch(c) case 0: d=0;break; case 1: d=2;break; case 2: case 3: d=5;break; case 4: case 5: case 6: case 7: d=8;break; case 8: case 9: case 10: case 11: d=10;break; case 12: d=15;break; f=p*w*s*(1-d/100.0); printf("freight=%.2fn",f); return 0; 3、三天打鱼两天晒网 (15 分)中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?输入格式:输入在一行中给出一个不超过1000的正整数N。输出格式:在一行中输出此人在第N天中是“Fishing”(即“打鱼”)还是“Drying”(即“晒网”),并且输出“in day N”。输入样例1:103输出样例1:Fishing in day 103输入样例2:34输出样例2:Drying in day 34【参考答案】#include "stdio.h"int main() int N,x; scanf("%d",&N); x=N%5; if(x>=1&&x<=3)printf("Fishing in day %dn",N); else printf("Drying in day %dn",N); return 0;4、计算分段函数2 (15 分)本题目要求计算下列分段函数f(x)的值:注:可在头文件中包含math.h,并调用sqrt函数求平方根,调用pow函数求幂。 输入格式:输入在一行中给出实数x。输出格式:在一行中按“f(x) = result”的格式输出,其中x与result都保留两位小数。输入样例1:10输出样例1:f(10.00) = 3.16输入样例2:-0.5输出样例2:f(-0.50) = -2.75【参考答案】#include <stdio.h>#include "math.h"int main()float x,y; scanf("%f",&x);if(x>=0) y=sqrt(x); else y=(x+1)*(x+1)+2*x+1/x; printf("f(%.2f) = %.2fn", x,y); return 0;5、判断输入的字符是哪种类型 (3.3) (15 分)通过键盘输入一个字符,编程判断并输出用户输入的是什么类型的字符。输入格式:输入一个字符。输出格式:在一行中输出该字符是哪种类型的字符。· 若用户输入字符为'0'和'9'之间,输出This is a digit.· 若用户输入字符在'A'和'Z'之间,输出This is a capital letter.· 若用户输入字符在'a'和'z'之间,输出This is a small letter.· 其他情况,输出Other character.输入样例:6输出样例:This is a digit.【参考答案】#include <stdio.h>int main() char c; c=getchar(); if(c>='0'&&c<='9')printf("This is a digit."); else if(c>='A'&&c<='Z')printf("This is a capital letter."); else if(c>='a'&&c<='z')printf("This is a small letter."); else printf("Other character."); return 0; 6、求一元二次方程的根 (15 分)本题目要求一元二次方程的根,结果保留2位小数。输入格式:输入在一行中给出3个浮点系数a、b、c,中间用空格分开。输出格式:根据系数情况,输出不同结果:1)如果方程有两个不相等的实数根,则每行输出一个根,先大后小;2)如果方程有两个不相等复数根,则每行按照格式“实部+虚部i”输出一个根,先输出虚部为正的,后输出虚部为负的;3)如果方程只有一个根,则直接输出此根;4)如果系数都为0,则输出"Zero Equation";5)如果a和b为0,c不为0,则输出"Not An Equation"。输入样例1:2.1 8.9 3.5输出样例1:-0.44-3.80输入样例2:1 2 3输出样例2:-1.00+1.41i-1.00-1.41i输入样例3:0 2 4输出样例3:-2.00输入样例4:0 0 0输出样例4:Zero Equation输入样例5:0 0 1输出样例5:Not An Equation【参考答案】#include <stdio.h>#include <math.h>int main() float a,b,c; float x1,x2,p,y; scanf("%f %f %f",&a,&b,&c); if(a=0&&b=0&&c=0) printf("Zero Equation");return 0; if(a=0&&b=0&&c!=0) printf("Not An Equation"); return 0; p=b*b-4*a*c; if(a=0) x1=-c/b; printf("%.2fn",x1);return 0; if(p>=0&&a!=0) if(p>0) x1=(-b+sqrt(p)/(2*a); x2=(-b-sqrt(p)/(2*a); printf("%.2fn%.2fn",x1,x2); else x1=-b/(2*a); printf("%.2fn",x1); else if(b!=0) p=sqrt(-p);x1=-b/(2*a);y=p/(2*a); printf("%.2f+%.2fin",x1,y); printf("%.2f-%.2fin",x1,y); else y=sqrt(-p)/(2*a); if(y>0)printf("0.00+%.2fin0.00-%.2fin",y,y); else printf("0.00+%.2fin0.00-%.2fin",-y,-y); return 0; 7、A除以B (15 分)真的是简单题哈 给定两个绝对值不超过100的整数A和B,要求你按照“A/B=商”的格式输出结果。输入格式:输入在第一行给出两个整数A和B(100A,B100),数字间以空格分隔。输出格式:在一行中输出结果:如果分母是正数,则输出“A/B=商”;如果分母是负数,则要用括号把分母括起来输出;如果分母为零,则输出的商应为Error。输出的商应保留小数点后2位。输入样例1:-1 2输出样例1:-1/2=-0.50输入样例2:1 -3输出样例2:1/(-3)=-0.33输入样例3:5 0输出样例3:5/0=Error【参考答案】#include <stdio.h>#include <stdlib.h>int main()int A,B; scanf("%d %d",&A,&B); if(B=0) printf("%d/%d=Errorn",A,B); else if(B<0) printf("%d/(%d)=%.2fn",A,B,(float)A/B); else printf("%d/%d=%.2fn",A,B,(float)A/B); return 0;8、计算火车运行时间 (15 分)本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。输入格式:输入在一行中给出2个4位正整数,其间以空格分隔,分别表示火车的出发时间和到达时间。每个时间的格式为2位小时数(00-23)和2位分钟数(00-59),假设出发和到达在同一天内。输出格式:在一行输出该旅途所用的时间,格式为“hh:mm”,其中hh为2位小时数、mm为2位分钟数。输入样例:1201 1530输出样例:03:29【参考答案】#include "stdio.h"int main() int h1,h2,hour1,hour2,men1,men2,a,b; scanf("%d %d",&h1,&h2); hour1=h1/100; men1=h1%100; hour2=h2/100; men2=h2%100; if(men2<men1) men2=men2+60; hour2-; a=hour2-hour1; b=men2-men1; printf("%02d:%02dn",a,b); return 0;实验三1、求交错序列前N项和 (15 分)本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+. 的前N项之和。输入格式:输入在一行中给出一个正整数N。输出格式:在一行中输出部分和的值,结果保留三位小数。输入样例:5输出样例:0.917【参考答案】#include <stdio.h>int main() int i,N,s=1; float a,b,t,sum=0; a=1; b=1; scanf("%d",&N); for(i=1;i<=N;i+) t=a/b; sum+=s*t; s=-s; a+; b=b+2; printf("%.3fn",sum); return 0; 2、统计整数的位数 (4.1) (15 分)从键盘读入一个整数,统计该数的位数。例如,输入12534,输出5;输入-99,输出2;输入0,输出1。输入格式:输入一个整数N(105N105)。输出格式:在一行中按如下格式输出该数的位数。It contains 位数 digits.输入样例:12534输出样例:It contains 5 digits.【参考答案】#include <stdio.h>int main() int N,s=0; scanf("%d",&N); if(N=0) printf("It contains %d digits.n",+s); else if(N<0) N=-N; while(N!=0) s+; N=N/10; printf("It contains %d digits.n",s); return 0; 3、最大公约数和最小公倍数 (15 分)本题要求两个给定正整数的最大公约数和最小公倍数。输入格式:输入在一行中给出两个正整数M和N(1000)。输出格式:在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。输入样例:511 292输出样例:73 2044【参考答案】#include <stdio.h>int main() int M, N, gys, gbs;int t;scanf("%d %d", &M, &N);if (M > N)t = M; M = N; N = t;for (gys = N; gys-)if (M%gys = 0 && N%gys = 0) break;gbs = M*N / gys;printf("%d %d", gys, gbs);return 0;4、统计字符 (15 分)本题要求编写程序,输入10个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。输入格式:输入为10个字符。最后一个回车表示输入结束,不算在内。输出格式:在一行内按照letter = 英文字母个数, blank = 空格或回车个数, digit = 数字字符个数, other = 其他字符个数的格式输出。输入样例:aZ &09 Az输出样例:letter = 4, blank = 3, digit = 2, other = 1【参考答案】#include <stdio.h>int main() int i,letter,blank,digit,other; char c; letter=blank=digit=other=0; for(i=0;i<10;i+) scanf("%c",&c); if(c>='a'&&c<='z')|(c>='A'&&c<='Z') letter+; else if(c>='0'&&c<='9') digit+; else if(c=' '|c='n') blank+; else other+; printf("letter = %d, blank = %d, digit = %d, other = %dn",letter,blank,digit,other); return 0; 5、简写转全称 (15 分)在一行中输入若干个字符作为简写字符,字符之间没有空格间隔,并按如下规则产生输出:· 每个简写字母对应一行输出· 若字符为C或c,则该行输出"BEIJING OLYMPIC GAMES"· 若字符为J或j,则该行输出"JAPAN WORLD CUP"· 若字符为K或k,则该行输出"KOREA WORLD CUP"· 若为其他字符,则该行原样输出该字符。输入格式:输入在一行中输入若干个字符,字符之间没有空格间隔,以回车结束。输出格式:按题目要求产生若干行输出。输入样例:kijckj输出样例:KOREA WORLD CUPiJAPAN WORLD CUPBEIJING OLYMPIC GAMESKOREA WORLD CUPJAPAN WORLD CUP【参考答案】#include <stdio.h>int main() char ch; ch=getchar(); while(ch!='n') if(ch='c'|ch='C')printf("BEIJING OLYMPIC GAMESn"); else if(ch='j'|ch='J')printf("JAPAN WORLD CUPn"); else if(ch='k'|ch='K')printf("KOREA WORLD CUPn"); else printf("%cn",ch); ch=getchar() ; return 0; 实验四1、穷举法搬运砖块问题 (4.3) (15 分)这是中国古典算术问题,某工地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬1块。有多少种搬法用N人正好搬N块砖?输入格式:在一行内输出正整数N(N<500)输出格式:输出所有满足条件的搬法,每种搬法占一行。每行按如下格式依次输出该搬法中男人、女人、小孩的人数(中间用空格间隔,=前后没有多余的空格)。men=男人数 women=女人数 child=小孩数若没有满足条件的搬法,则输出"No solution!"输入样例1:45输出样例1:men=0 women=15 child=30men=3 women=10 child=32men=6 women=5 child=34men=9 women=0 child=36输入样例2:1输出样例2:No solution!【参考答案】#include <stdio.h>int main() int n,men,women,child,flag=0; scanf("%d",&n); for(men=0;men<=n/3;men+) for(women=0;women<=n/2;women+) child=n-men-women; if(men*3+women*2+child/2=n&&child%2=0) printf("men=%d women=%d child=%dn",men,women,child); flag=1; if(flag=0)printf("No solution!"); return 0; 2、输出N以内的所有素数 (4.5) (15 分)编程找出N(2N500)以内(即小于等于N)的所有素数。输入格式:输入整数N(2N500)。输出格式:每8个一行输出N以内的所有素数。注意每个数据均占5列,且采用右对齐。输入样例1:50输出样例: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47【参考答案】#include <stdio.h>int main() int n,i,j,m=0; scanf("%d",&n); if(n=2) printf("%5d",n); return 0; for(i=2;i<=n;i+) if(i=2)printf("%5d",i+);m+; for(j=2;j<i;j+) if(i%j=0)break; if(j>=i) if(m%8=0)printf("n"); printf("%5d",i); m+; return 0; 3、求特殊方程的正整数解 (15 分)本题要求对任意给定的正整数N,求方程X2+Y2=N的全部正整数解。输入格式:输入在一行中给出正整数N(10000)。输出格式:输出方程X2+Y2=N的全部正整数解,其中XY。每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。如果没有解,则输出No Solution。输入样例1:884输出样例1:10 2820 22输入样例2:11输出样例2:No Solution【参考答案】#include <stdio.h>int main() int n,x,y,flag=0; scanf("%d",&n); for(x=1;x*x<n;x+) for(y=x;y*y<=n-x;y+) if(x*x+y*y=n) flag=1; printf("%d %dn",x,y); ; if(flag=0) printf("No Solutionn"); return 0; 4、打印菱形图案 (15 分)本题要求编写程序,打印一个高度为n的、由“*”组成的正菱形图案。输入格式:输入在一行中给出一个正的奇数n。 输出格式:输出由n行星号“*”组成的菱形,如样例所示。每个星号后跟一个空格。输入样例:7输出样例: * * * * * * * * * * * * * * * * * * * * * * * * * 【参考答案】#include "stdio.h"int main() int n, n1;int i, j;scanf("%d", &n);n1=(n + 1) / 2;for (i = 1; i <= n1; i+) for (j = 1; j <= (2 * n1 - 2 * i); j+)printf(" ");for (j = 1; j <= (2 * i - 1); j+)printf("* ");printf("n");for (i = n1 + 1; i <= n; i+)for (j = 1; j <= (2 * i - 2 * n1); j+)printf(" ");for (j = 1; j <= (4 * n1 - 2 * i - 1); j+)printf("* ");printf("n");return 0;5、跟奥巴马一起画方块 (15 分)美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!输入格式:输入在一行中给出正方形边长N(3N21)和组成正方形边的某种字符C,间隔一个空格。输出格式:输出由给定字符C画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的50%(四舍五入取整)。输入样例:10 a输出样例:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa【参考答案】#include <stdio.h>int main()char c; int n,l,i,j; scanf("%d %c",&n,&c); l=(float)n/2+0.5; for(i=1;i<=l;i+) for(j=1;j<=n;j+) putchar(c); putchar('n'); return 0;实验五1、 数字金字塔 (4.10) (20 分)输入一个正整数repeat (repeat<10),做repeat次下列运算:· 输入一个正整数n(n<10),输出n行数字金字塔。输出时使用以下语句:· printf(" ");· printf("%d ", i);· printf("n");输入格式:输入在第1行中给出1个正整数repeat(repeat<10)接下来repeat行,每行给出一个正整数n(n<10)输出格式:按照对应顺序的n值,依次输出repeat个数字金字塔 (n行数字金字塔的格式如样例所示,注意:每个数字后面跟一个空格。)输入样例:252输出样例: 1 2 2 2 3 3 3 3 3 4 4