C语言基础练习题及代码.docx
- 文档编号:10197214
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:46
- 大小:26.51KB
C语言基础练习题及代码.docx
《C语言基础练习题及代码.docx》由会员分享,可在线阅读,更多相关《C语言基础练习题及代码.docx(46页珍藏版)》请在冰豆网上搜索。
C语言基础练习题及代码
读前须知:
1.此文档为UP主在为期11周的c语言学习课程中做过的在线测评练习题,题目和UP主自己写的代码都在这里。
2.由于水平有限,所用的算法并不是很简洁,部分题目是暴力循环破解的。
精益求精者请自行思考或XX。
3.由于课业紧张,写的时候几乎没有写注释,排版也比较紧凑,这些可能会给读者的理解带来困难,在此先说一声抱歉。
4.由于老师教的不好,学习过程中不大愉悦,因此用了一些恶趣味的单词作为变量名泄愤,恳请不要在意这些细节…
5.由于学校以在线测评的方式考核,UP主并没有考虑各种人性化的细节例如输入范围限制,输入提示等。
如果程序是写给人用的,请务必考虑这些人性化设置。
6.本文档仅供各位网友参考学习c语言之用,读者擅自用作他途所造成的一切不良后果与UP主无关。
身高预测
【问题描述】
父母都关心自己孩子成人后的身高,据有关生理卫生知识与数理统计分析表明,影响小孩成人后的身高因素包括遗传、饮食习惯与体育锻炼等。
小孩成人后的身高与其父母的身高和自身的性别密切相关设fatH为其父身高,motH为其母身高,身高预测公式为
男性成人时身高=(fatH+motH)*0.54cm
女性成人时身高=(fatH*0.923+motH)/2cm
此外,如果喜爱体育锻炼,那么可增加身高2%;如果有良好的卫生习惯,那么可增加身高1.5%。
请编程利用给定公式和身高预测方法对身高进行预测。
【输入】
输入由键盘输入,共5行。
第一行有一个字符sex,代表用户的性别(F或f代表女性,M或m代表男性)
第二行有一个实数fatH,代表父亲身高
第三行有一个实数motH,代表母亲身高
第四行有一个字符spor,代表是否喜爱体育锻炼(Y或y代表喜爱锻炼,N或n代表不喜爱锻炼)
第五行有一个字符diet,代表是否有良好的饮食习惯(Y或y代表饮食习惯良好,N或n代表饮食习惯不好)
【输出】
输出只有1行,为所预测的身高hei(不保留小数),输出格式为Yourfutureheightwillbehei(cm)
【样例输入】
f
176
160
y
y
【样例输出】
Yourfutureheightwillbe167(cm)
【数据范围】
对于fatH,motH,hei,保证100%的数据不超过double类型的范围
对于sex,spor,diet,保证没有非法数据
【注释】
hint1:
数据输入时请考虑\n的影响
hint2:
cms系统将所有warning均视为error
hint3:
main()函数请使用intmain(),否则会提示编译错误。
/*==================================================================*/
#include
intmain()
{
doublefatH,motH,hei,in;
charsex,spor,diet,beyond;
scanf("%c\n%lf\n%lf\n%c\n%c",&sex,&fatH,&motH,&spor,&diet);
in=1.0;
beyond='i';
if((sex=='F')||(sex=='f'))
{
hei=(fatH*0.923+motH)/2;
}
elseif((sex=='M')||(sex=='m'))
{
hei=(fatH+motH)*0.54;
}
elsebeyond='e';
if((spor=='y')||(spor=='Y'))
{
in=in+0.02;
}
elseif((spor=='n')||(spor=='N'))in=in;
elsebeyond='e';
if((diet=='y')||(diet=='Y'))
{
in=in+0.015;
}
elseif((diet=='n')||(diet=='N'))in=in;
elsebeyond='e';
hei=hei*in;
if(beyond!
='e')
printf("Yourfutureheightwillbe%.0lf(cm)",hei);
elseprintf("thedatayouinputiswrong,pleasecheckitoutandinputagain.");
return0;
}
/*==================================================================*/
猜数游戏1
【问题描述】
编程由计算机生成一个1~100之间的整数请用户猜,若猜对则结束游戏,并输出用户猜测次数(输出格式:
“Right,[猜测次数]time(s)”);若猜错则给出提示——若用户所猜数偏大,则输出“Big”,否则输出“Small”。
一次游戏最多可以猜10次,若经过10次仍未猜中的话,输出“over”,并结束游戏。
【样例过程1】
>50
Big
>25
Small
>30
Small
>40
Small
>45
Big
>42
Big
>41
Right,7time(s)
【样例过程2】
>1
Small
>2
Small
>3
Small
>4
Small
>5
Small
>6
Small
>7
Small
>8
Small
>9
Small
>10
Small
over
【注释】
hint1:
“>”行代表为用户输入
hint2:
请使用“dowhile”循环实现
hint3:
该题为离线评测,程序提交过后不会立即得到成绩,请耐心等待批改
/*=================================================================*/
#include
#include
intmain()
{
intguess,ra,times;
ra=rand()%100;
times=1;
printf("pleaseguessanumberin0~100\n");
do
{
scanf("%d",&guess);
if(guess==ra)
{
printf("Right,%dtime(s)",times);
times=12;
break;
}
elseif(guess elseprintf("Big\n"); times++; }while(times<=10); if(times! =12)printf("over"); return0; } /*==================================================================*/ 猜数游戏2 【问题描述】 编程由计算机生成一个1~100之间的整数请用户猜,若猜对则输出用户猜测次数(输出格式: “Right,[猜测次数]time(s)”);若猜错则给出提示——若用户所猜数偏大,则输出“Big”,否则输出“Small”。 一次游戏最多可以猜10次,若经过10次仍未猜中的话,输出“over”;一轮游戏结束之后,询问用户是否进行下一轮游戏(输出格式: “continue? Y||N”),并等待用户响应(若“Y”、“N”输入非法,则重复询问)。 另外,要求程序能够判断非法数据,若用户输入非法,输出“illegalinput”,然后让用户重新输入。 【样例过程1】 >50 Small >75 Small >80 Small >90 Small >95 Small >98 Right,6time(s) continue? Y||N >Y >50 Small >75 Big >60 Big >55 Small >57 Small >58 Small >59 Right,7time(s) continue? Y||N >N 【样例过程2】 >a illegalinput >1 Small >2 Small >3 Small >4 Small >5 Small >6 Small >7 Small >8 Small >9 Small >10 Small over continue? Y||N >a continue? Y||N >N 【注释】 hint1: “>”行代表为用户输入 hint2: 该题为离线评测,程序提交过后不会立即得到成绩,请耐心等待批改 /*===================================================================*/ #include #include intmain() { intguess,ra,times,mark; charc,d; c='y'; while((c=='y')||(c=='Y')) { ra=rand()%100; times=1; for(mark=1;mark<=10;mark++) { if(scanf("%d",&guess)! =0) { if(guess==ra) { printf("Right,%dtime(s)",times); mark=15; break; } elseif((guess>=0)&&(guess { printf("Small\n"); getchar(); times++; } elseif((guess<=100)&&(guess>ra)) { printf("Big\n"); getchar(); times++; } else { printf("illegalinput\n"); getchar(); mark=times-1; } } else { printf("illegalinput\n"); getchar(); mark=times-1; } } if(mark! =15)printf("over\n"); do { printf("continue? Y||N\n"); scanf("%c",&c); if((c=='n')||(c=='N')||(c=='y')||(c=='Y')) d='a'; else { printf("illegalinput\n"); d='i'; } } while(d=='i'); } return0; } /*==================================================================*/ 无重复数字的三位数 【问题描述】 有0、1、2...9十个数字,编程计算这10个数字能组成多少个互不相同且无重复数字的三位数(如: 123,124,125...),并列举所组成的三位数。 【输出】 输出共两行: 第一行为符合条件的三位数个数 第二行从小到大依次输出这些满足条件的三位数,相邻两个数之间用1个空格隔开。 【注释】 hint1: 关注所输出的最后一个满足条件的三位数 /*================================================================*/ #include intmain() { inti,j,k,n,s; printf("%d\n",10*9*8-9*8); n=0; for(i=1;i<=9;i++) { for(j=0;j<=9;j++) { if(i! =j) for(k=0;k<=9;k++) { if(i! =k&&j! =k&&n==647) { s=100*i+10*j+k; printf("%d",s); n++; } elseif(i! =k&&j! =k&&n! =647) { s=100*i+10*j+k; printf("%d",s); n++; } } } } /*printf("xx\n%d",n);*/ return0; } /*==================================================================*/ 求最大公约数,从大到小试探法 【问题描述】 编程用试探法(要求从大到小试探)实现函数gcd(m,n),其功能为求解正整数m、n的最大公约数。 【输入】 输入由键盘输入,只有1行 这一行有两个正整数m,n,代表待求最大公约数的两个数,输入格式为“[m],[n]” 【输出】 输出共1行,为m和n的最大公约数,输出格式为“Theresultis[所求最大公约数]! ” 【样例输入】 2,1 【样例输出】 Theresultis1! 【数据范围】 保证100%的数据在int范围内 【注释】 hint1: 请严格按照题目要求完成任务 /*=============================================================*/ #include intgcd(intm,intn) { inti,s,f; f=m; if(f for(i=f;i>=1;i--)if(m%i==0&&n%i==0){s=i;break;} returns; } intmain() { intmm,nn,lzsb; scanf("%d,%d",&mm,&nn); lzsb=gcd(mm,nn); printf("Theresultis%d! ",lzsb); } /*==============================================================*/ 求最大公约数,辗转相除法 【问题描述】 编程用辗转相除法(不使用递归)实现函数gcd(m,n),其功能为求解正整数m、n的最大公约数。 【输入】 输入由键盘输入,只有1行 这一行有两个正整数m,n,代表待求最大公约数的两个数,输入格式为“[m],[n]” 【输出】 输出共1行,为m和n的最大公约数,输出格式为“Theresultis[所求最大公约数]! ” 【样例输入】 2,1 【样例输出】 Theresultis1! 【数据范围】 保证100%的数据在int范围内 【注释】 hint1: 请严格按照题目要求完成任务 /*==================================================================*/ #include intgcd(intm,intn) { intillness,kill,death,shit; illness=m; if(illness elsekill=n; do { shit=kill%illness; kill=illness; illness=shit; }while(shit! =0); returnkill; } intmain() { intmm,nn,doubi; scanf("%d,%d",&mm,&nn); doubi=gcd(mm,nn); printf("Theresultis%d! ",doubi); } /*=============================================================*/ 求最大公约数,递归 【问题描述】 编程用辗转相除法(使用递归调用)实现函数gcd(m,n),其功能为求解正整数m、n的最大公约数。 【输入】 输入由键盘输入,只有1行 这一行有两个正整数m,n,代表待求最大公约数的两个数,输入格式为“[m],[n]” 【输出】 输出共1行,为m和n的最大公约数,输出格式为“Theresultis[所求最大公约数]! ” 【样例输入】 2,1 【样例输出】 Theresultis1! 【数据范围】 保证100%的数据在int范围内 【注释】 hint1: 请严格按照题目要求完成任务 /*==================================================================*/ #include intgcd(intm,intn) { intdawa,erwa,shit; dawa=m; if(dawa elseerwa=n; shit=dawa%erwa; if(shit! =0)erwa=gcd(erwa,shit); returnerwa; } intmain() { intdou,bi,doubi; scanf("%d,%d",&dou,&bi); doubi=gcd(dou,bi); printf("Theresultis%d! ",doubi); return0; } /*==================================================================*/ 猴子分桃 [UP主吐槽: 这些天生神力的猴子能一次搬上亿只桃子,请考虑数据超限的问题,题目所说的数据范围不够用。 ] 【问题描述】有1堆桃子共m个,由n只猴子分配这些桃子。 每次到达桃子堆放地的猴子只有1只,而且每个猴子都会平均分1次桃子。 第1只到达的猴子将桃子平均分成n等份,但发现多k(k 第2只猴子同样将剩余的桃子又分成n等份,也发现多k个,并同样将多余的k个扔掉,然后拿走其中1份。 之后的每只猴子都这样(将剩余的桃子又分成n等份,也发现多k个,并将多余的k个扔掉,然后拿走其中1份)。 现在假设最后一只猴子分配后至少可以拿走1个桃子,请根据输入的n和k值,编程计算最小的m。 (比如,n=3,k=1,则最小的m是25,最后一只猴子分得3个) 【输入】输入由键盘输入,共1行这一行由两个整数n和k组成,分别代表n只猴子和多余的k个桃子 【输出】输出只有一行,为所计算的m 【样例输入】 31 【样例输出】 25 【数据范围】保证100%数据不超过int范围 /*================================================================*/ #include intmain() { longm,n,k,i,st,ma,ml; scanf("%ld%ld",&n,&k); ma=2147483647; for(st=1;st<=1000000;st++) { m=st*n+k; ml=0; for(i=2;i<=n;i++) { ml=m%(n-1); if(ml==0) m=m*n/(n-1)+k; else{ m=2147483647; break; } } /*printf("%d\n",m);*/ if(m } printf("%d",ma); return0; } /*=============================================================*/ 约瑟夫问题 【问题描述】 n个人围成一圈,顺序编号。 从第一个人开始从1到3报数,凡报到3的人退出圈子,编程求解最后留下的人的初始编号。 【输入】 输入由键盘输入,只有一行 这一行有一个正整数n,代表n个人围成一圈 【输出】 输出共一行,为最后留下来的那个人的编号 【样例输入】 5 【样例输出】 4 【数据范围】 保证100%数据2<=n<=200 /*==============================================================*/ #include intmain() { intidiot[201]; inti,san,left,db; scanf("%d",&db); for(i=0;i i=-1; left=db; san=0; while(left! =1) { i++; if(i==db)i=0; if(idiot[i]==0) { san++; if(san==3) { san=0; idiot[i]=1; left--; } } } for(i=0;i if(idiot[i]==0)printf("%d",i+1); return0; } /*=================================================================*/ 约瑟夫问题,链表法 【问题描述】 n个人围成一圈,顺序编号。 从第一个人开始从1到3报数,凡报到3的人退出圈子,编程求解最后留下的人的初始编号。 (要求用链表法) 【输入】 输入由键盘输入,只有一行 这一行有一个正整数n,代表n个人围成一圈 【输出】 输出共一行,为最后留下来的那个人的编号 【样例输入】 5 【样例输出】 4 【数据范围】 保证100%数据2<=n<=200 /*=================================================================*/ #include #include inthollyshit=0; structfucklb { intdata; structfucklb*nxx; }; structfucklb*App(structfucklb*head) { structfucklb*ppp=NULL,*ppr=hea
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 基础 练习题 代码