C语言实验题及参考答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一
1、计算整数各位数字之和(10 分)
输入一个3位正整数,将其每一位的数字相加,输出和。
输入格式:
输入一个3位正整数。
变量数据类型为unsigned。
输出格式:
输出整数每一位相加后的整数和。
输入样例:
输出样例:
【参考答案】
#include ""
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("%d\n",sum);
return 0;
}
2、计算代数表达式(10 分)
求:
输入格式:
输入角度x。
变量数据类型为double。
π为。
输出格式:
输出y的值,精确到小数点后2位。
输入样例:
输出样例:
【参考答案】
#include <>
#include <>
#define PI
int 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位的正整数。
输出格式:
输出按位逆序的数。
输入样例:
输出样例:
【参考答案】
#include ""
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("%d\n",b);
return 0;
}
4、求整数均值(10 分)
本题要求编写程序,计算4个整数的和与平均值。
题目保证输入与输出均在整型范围内。
输入格式:
输入在一行中给出4个整数,其间以空格分隔。
输出格式:
在一行中按照格式“Sum = 和; Average = 平均值”顺序输出和与平均值,其中平均值精确到小数点后一位。
输入样例:
输出样例:
【参考答案】
#include ""
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/;
printf("Sum = %d; Average = %.1f\n",sum,ave);
return 0;
}
5、是不是太胖了(10 分)
据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以所得到的公斤数。
已知市斤是公斤的两倍。
现给定某人身高,请你计算其标准体重应该是多少(顺便也悄悄给自己算一下吧……)
输入格式:
输入第一行给出一个正整数(100 < H ≤ 300),为某人身高。
输出格式:
在一行中输出对应的标准体重,单位为市斤,保留小数点后1位。
输入样例:
输出样例:
【参考答案】
#include <>
int main()
{
int h;
float w;
scanf("%d",&h);
w=(h-100)**2;
printf("%.1f\n", w);
return 0;
}
6、日期格式化(10 分)
世界上不同国家有不同的写日期的习惯。
比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。
下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。
输入格式:
输入在一行中按照“mm-dd-yyyy”的格式给出月、日、年。
题目保证给出的日期是1900年元旦至今合法的日期。
输出格式:
在一行中按照“yyyy-mm-dd”的格式给出年、月、日。
输入样例:
输出样例:
【参考答案】
#include <>
int main()
{int year,month,day;
scanf("%d-%d-%d",&month,&day,&year);
printf("%d-%02d-%02d\n",year,month,day);
return 0;
}
7、整数四则运算(10 分)
本题要求编写程序,计算2个正整数的和、差、积、商并输出。
题目保证输入和输出全部在整型范围内。
输入格式:
输入在一行中给出2个正整数A和B。
输出格式:
在4行中按照格式“A 运算符 B = 结果”顺序输出和、差、积、商。
输入样例:
输出样例:
【参考答案】
#include ""
int main()
{ int a,b;
scanf("%d %d",&a,&b);
printf("%d + %d = %d\n",a,b,a+b);
printf("%d - %d = %d\n",a,b,a-b);
printf("%d * %d = %d\n",a,b,a*b);
printf("%d / %d = %d\n",a,b,a/b);
return 0;
}
8、计算存款利息(10 分)
本题目要求计算存款利息,计算公式为
interest=money×(1+rate)year−money,其中interest为存款到期时的利息(税前),money是存款金额,year是存期,rate是年利率。
输入格式:
输入在一行中顺序给出三个正实数money、year和rate,以空格分隔。
输出格式:
在一行中按“interest = 利息”的格式输出,其中利息保留两位小数。
输入样例:
输出样例:
【参考答案】
#include <>
#include <>
int main()
{
float money,rate,year,interest;
scanf("%f %f %f",&money,&year,&rate);
interest=money*pow((1+rate),year)-money;
printf("interest = %.2f\n", interest);
return 0;
}
实验二
1、比较大小(15 分)
本题要求将输入的任意3个整数从小到大输出。
输入格式:
输入在一行中给出3个整数,其间以空格分隔。
输出格式:
在一行中将3个整数从小到大输出,其间以“->”相连。
输入样例:
输出样例:
【参考答案】
#include <>
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->%d\n",a,b,c);
return 0;
}
2、计算运费(15 分)
运输公司对用户计算运费。
路程(s)越远,每千米运费就越低。
标准如下:
s<250km ,没有折扣;
250km≤s<500km, 2%的折扣;
500km≤s<1000km, 5%的折扣;
1000km≤s<2000km,8%的折扣;
2000km≤s<3000km,10%的折扣;
3000km≤s,15%的折扣。
设每千米每吨货物的基本运费为p,货物重为 w,距离为s,折扣为d,则总运费f 的计算公式为: f=p×w×s×(1-d)
输入格式:
在一行中以小数形式输入基本运费、货重和距离,以空格作为分隔符。
输出格式:
在一行输出计算出来的运费,精确到小数点后2位的值。
输入样例:
在这里给出一组输入。
例如:
输出样例:
在这里给出相应的输出。
例如:
【参考答案】
#include <>
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/;
printf("freight=%.2f\n",f);
return 0;
}
3、三天打鱼两天晒网(15 分)
中国有句俗语叫“三天打鱼两天晒网”。
假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”
输入格式:
输入在一行中给出一个不超过1000的正整数N。
输出格式:
在一行中输出此人在第N天中是“Fishing”(即“打鱼”)还是“Drying”(即“晒网”),并且输出“in day N”。
输入样例1:
输出样例1:
输入样例2:
输出样例2:
【参考答案】
#include ""
int main()
{ int N,x;
scanf("%d",&N);
x=N%5;
if(x>=1&&x<=3)printf("Fishing in day %d\n",N);
else printf("Drying in day %d\n",N);
return 0;
}
4、计算分段函数[2] (15 分)
本题目要求计算下列分段函数f(x)的值:
注:可在头文件中包含,并调用函数求平方根,调用函数求幂。
输入格式:
输入在一行中给出实数x。
输出格式:
在一行中按“f(x) = result”的格式输出,其中x与result都保留两位小数。
输入样例1:
输出样例1:
输入样例2:
输出样例2:
【参考答案】
#include <>
#include ""
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) = %.2f\n", x,y);
return 0;
}
5、判断输入的字符是哪种类型(15 分)
通过键盘输入一个字符,编程判断并输出用户输入的是什么类型的字符。
输入格式:
输入一个字符。
输出格式:
在一行中输出该字符是哪种类型的字符。
若用户输入字符为和之间,输出
若用户输入字符在和之间,输出
若用户输入字符在和之间,输出
其他情况,输出
输入样例:
输出样例:
【参考答案】
#include <>
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:
输出样例1:
输入样例2:
输出样例2:
输入样例3:
输出样例3:
输入样例4:
输出样例4:
输入样例5:
输出样例5:
【参考答案】
#include <>
#include <>
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("%.2f\n",x1);return 0; }
if(p>=0&&a!=0)
if(p>0)
{x1=(-b+sqrt(p))/(2*a);
x2=(-b-sqrt(p))/(2*a);
printf("%.2f\n%.2f\n",x1,x2);
}
else
{x1=-b/(2*a); printf("%.2f\n",x1);}
else if(b!=0){ p=sqrt(-p);x1=-b/(2*a);y=p/(2*a);
printf("%.2f+%.2fi\n",x1,y);
printf("%.2f-%.2fi\n",x1,y);
}
else { y=sqrt(-p)/(2*a);
if(y>0)printf("+%.2fi\%.2fi\n",y,y);
else printf("+%.2fi\%.2fi\n",-y,-y);
}
return 0;
}
7、A除以B (15 分)
真的是简单题哈——给定两个绝对值不超过100的整数A和B,要求你按照“A/B=商”的格式输出结果。
输入格式:
输入在第一行给出两个整数A和B(−100≤A,B≤100),数字间以空格分隔。
输出格式:
在一行中输出结果:如果分母是正数,则输出“A/B=商”;如果分母是负数,则要用括号把分母括起来输出;如果分母为零,则输出的商应为。
输出的商应保留小数点后2位。
输入样例1:
输出样例1:
输入样例2:
输出样例2:
输入样例3:
输出样例3:
【参考答案】
#include <>
#include <>
int main()
{int A,B;
scanf("%d %d",&A,&B);
if(B==0)
printf("%d/%d=Error\n",A,B); else
if(B<0)
printf("%d/(%d)=%.2f\n",A,B,(float)A/B);
else
printf("%d/%d=%.2f\n",A,B,(float)A/B);
return 0;
}
8、计算火车运行时间(15 分)
本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。
输入格式:
输入在一行中给出2个4位正整数,其间以空格分隔,分别表示火车的出发时间和到达时间。
每个时间的格式为2位小时数(00-23)和2位分钟数(00-59),假设出发和到达在同一天内。
输出格式:
在一行输出该旅途所用的时间,格式为“hh:mm”,其中hh为2位小时数、mm 为2位分钟数。
输入样例:
输出样例:
【参考答案】
#include ""
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:%02d\n",a,b);
return 0;
}
实验三
1、求交错序列前N项和(15 分)
本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+... 的前N项之和。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,结果保留三位小数。
输入样例:
输出样例:
【参考答案】
#include <>
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("%.3f\n",sum); return 0;
}
2、统计整数的位数(15 分)
从键盘读入一个整数,统计该数的位数。
例如,输入12534,输出5;输入-99,输出2;输入0,输出1。
输入格式:
输入一个整数N(−105≤N≤105)。
输出格式:
在一行中按如下格式输出该数的位数。
输入样例:
输出样例:
【参考答案】
#include <>
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空格分隔。
输入样例:
输出样例:
【参考答案】
#include <>
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个字符。
最后一个回车表示输入结束,不算在内。
输出格式:
在一行内按照
的格式输出。
输入样例:
输出样例:
【参考答案】
#include <>
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 = %d\n",letter,blank,digit,other);
return 0;
}
5、简写转全称(15 分)
在一行中输入若干个字符作为简写字符,字符之间没有空格间隔,并按如下规则产生输出:
每个简写字母对应一行输出
若字符为或,则该行输出"BEIJING OLYMPIC GAMES"
若字符为或,则该行输出"JAPAN WORLD CUP"
若字符为或,则该行输出"KOREA WORLD CUP"
若为其他字符,则该行原样输出该字符。
输入格式:
输入在一行中输入若干个字符,字符之间没有空格间隔,以回车结束。
输出格式:
按题目要求产生若干行输出。
输入样例:
输出样例:
【参考答案】
#include <>
int main()
{
char ch;
ch=getchar();
while(ch!='\n')
{
if(ch=='c'||ch=='C')printf("BEIJING OLYMPIC GAMES\n"); else if(ch=='j'||ch=='J')printf("JAPAN WORLD CUP\n"); else if(ch=='k'||ch=='K')printf("KOREA WORLD CUP\n"); else printf("%c\n",ch);
ch=getchar() ;
}
return 0;
}
实验四
1、穷举法搬运砖块问题(15 分)
这是中国古典算术问题,某工地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬1块。
有多少种搬法用N人正好搬N块砖
输入格式:
在一行内输出正整数N(N<500)
输出格式:
输出所有满足条件的搬法,每种搬法占一行。
每行按如下格式依次输出该搬法中男人、女人、小孩的人数(中间用空格间隔,前后没有多余的空格)。
若没有满足条件的搬法,则输出"No solution!"
输入样例1:
输出样例1:
输入样例2:
输出样例2:
【参考答案】
#include <>
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=%d\n",men,women,child);
flag=1;
}
}
if(flag==0)printf("No solution!");
return 0;
}
2、输出N以内的所有素数(15 分)
编程找出N(2≤N≤500)以内(即小于等于N)的所有素数。
输入格式:
输入整数N(2≤N≤500)。
输出格式:
每8个一行输出N以内的所有素数。
注意每个数据均占5列,且采用右对齐。
输入样例1:
输出样例:
【参考答案】
#include <>
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的全部正整数解,其中X≤Y。
每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。
如果没有解,则输出。
输入样例1:
输出样例1:
输入样例2:
输出样例2:
【参考答案】
#include <>
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 %d\n",x,y); };
}
if(flag==0)
printf("No Solution\n");
return 0;
}
4、打印菱形图案(15 分)
本题要求编写程序,打印一个高度为n的、由“*”组成的正菱形图案。
输入格式:
输入在一行中给出一个正的奇数n。
输出格式:
输出由n行星号“*”组成的菱形,如样例所示。
每个星号后跟一个空格。
输入样例:
输出样例:
【参考答案】
#include ""
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(3≤N≤21)和组成正方形边的某种字符,间隔一个空格。
输出格式:
输出由给定字符画出的正方形。
但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的50%(四舍五入取整)。
输入样例:
输出样例:
【参考答案】
#include <>
int main()
{char c;
int n,l,i,j;
scanf("%d %c",&n,&c); l=(float)n/2+;
for(i=1;i<=l;i++)
{for(j=1;j<=n;j++) putchar(c);
putchar('\n'); }
return 0;
}
实验五
1、数字金字塔(20 分) (repeat<10)
(n<10)
输入格式:
(repeat<10)
n(n<10)
输出格式:
输入样例:
输出样例:
【答案】
#include <>
#include <>
int main()
{
int repeat,n,i,j,k; scanf("%d",&repeat);
for(k=1;k<=repeat;k++)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=1; j<=n-i;j++) printf(" ");
for(j=1;j<=2*i-1;j++) printf("%d ",i); printf("\n");
}
}
return 0;
}
2、分解质因数(20 分)
2≤n≤10000
输入格式:
2≤n≤10000
输出格式:
输入样例:
输出样例:
【答案1】
#include <>
int main()
{
int n,i,j,k=1;
scanf("%d",&n); printf("%d=",n); for(i=2;i<=n;i++) {
while(n%i==0)
{
if(k==1) {printf("%d",i); k++;} else printf("*%d",i);
n=n/i;
}
}
return 0;
}
【答案2】
#include <>
int main()
{
int n,i,j,k=1;
scanf("%d",&n);
printf("%d=",n);
for(i=2;i<=n;i++)
{
for(j=2;j<i;j++)
if(i%j==0) break;
if(j>=i)
while(n%i==0)
{ n=n/i;
if(k==1){printf("%d",i);k++;} else printf("*%d",i);
}
}
return 0;
}
3、龟兔赛跑(20 分)
输入格式:
输出格式:
输入样例:
输出样例:
【答案】
#include <>
int main()
{
int t,tu=0,gui=0; scanf("%d",&t); while(t>0)
{
if(t>=10)
{
tu+=9*10;
gui+=3*10;
}
else
{
tu+=t*9;
gui+=t*3;
}
t=t-10;
if(t<=0) break;
if(tu>gui)
{
if(t>=30) gui+=3*30;
else gui+=3*t;
t=t-30;
}
}
if(gui>tu)printf("@_@ %d\n",gui);。