c语言习题.docx
- 文档编号:29849683
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:28
- 大小:24.03KB
c语言习题.docx
《c语言习题.docx》由会员分享,可在线阅读,更多相关《c语言习题.docx(28页珍藏版)》请在冰豆网上搜索。
c语言习题
选择结构:
1.main()
{inta=0,b=0,c=0;
if(a=b+c)printf(“***a=%d\n”,a);
elseprintf(“$$$a=%d\n”,a);
}
2执行下列程序段后,x,y和z的值分别是:
intx=10,y=20,z=30;
if(x>y)z=x;x=y;y=z;
3main()
{floatx=2,y;
if(x<0)y=0;
elseif(x<5&&!
x)y=1/(x+2);
elseif(x<10)y=1/x;
elsey=10;
printf(“%f\n”,y);
}
4报数游戏。
ABCDEFGH共8个人站成一排,按下图所表示的方法从1开始报数,问谁先报到2008
ABCDEFGH
12345678
14131211109
1516171819202122
282726252423
2930…
从图中看到1到14是一个来回,再重复这一过程,所以只需要对2008除以14的余数加以判断即可。
#include
voidmain()
{
intn=2008,i;
i=n%14;
switch(i)
{
case1:
printf(“A”);break;
case2:
case0:
printf(“B”);break;
case3:
case13:
printf(“C”);break;
case4:
case12:
printf(“D”);break;
case5:
case11:
printf(“E”);break;
case6:
case10:
printf(“F”);break;
case7:
case9:
printf(“G”);break;
case8:
printf(“H”);break;
}
}
循环结构
1下列程序段的输出是:
x=3;
do
{y=--x;
if(!
y){printf(“x”);continue;}
printf(“#”);
}while(1<=x<=2);
2执行语句
for(i=1;i++<4;);后,i的值是:
3某人摘桃子,卖掉一半,又吃一只;第二天卖掉剩下的一半,又吃一只;第三天、第四天、第五天都如此办理,第六天一看,发现就剩下一只桃子了。
编写程序,求此人共摘了多少只桃子。
N(n)=N(n-1)-(N(n-1)/2+1)
N(n-1)=(N(n)+1)*2
#include
voidmain()
{
intn=1,i;
for(i=1;i<=5;i++)
n=(n+1)*2;
printf(“totalnumber=%d\n”,n);
}
94
逻辑问题求解:
4谁是偷盗者:
甲乙丙丁4个人为嫌疑犯,只有一个是偷盗者。
在审讯中,四个人都有可能说真话或假话。
甲:
乙没偷,丁偷的;
乙:
我没偷,丙偷的;
丙:
甲没偷,乙偷的;
丁:
我没偷。
编写程序,推断谁是偷盗者
A、B、C、D分别表示甲、乙、丙、丁是否为偷盗者。
四人要么说真话,要么说假话。
则四人说的话表示为:
甲:
乙没偷且丁偷的,或乙偷了且丁没偷((!
b&&d)||(b&&!
d))==1
乙:
乙没偷且丙偷的;或乙偷了且丙没偷((!
b&&c)||(b&&!
c))==1
丙:
甲没偷且乙偷的;或甲偷了且乙没偷((!
a&&b)||(a&&!
b))==1
丁:
丁没偷,或丁偷了。
!
d||d
又因为其中只有一个人偷了,所以a+b+c+d==1
#include
voidmain()
{
inta,b,c,d;
for(a=0;a<=1;a++)
for(b=0;b<=1;b++)
for(c=0;c<=1;c++)
for(d=0;d<=1;d++)
if(a+b+c+d==1&&((!
b&&d)||(b&&!
d))==1&&
((!
b&&c)||(b&&!
c))==1&&((!
a&&b)||(a&&!
b))==1)
{
if(a==1)
printf(“Aisthethief\n”);
elseif(b==1)
printf(“Bisthethief\n”);
elseif(c==1)
printf(“Cisthethief\n”);
elseif(d==1)
printf(“Disthethief\n”);
}
}
或者:
#include
voidmain()
{
intx;
for(x=1;x<=4;x++)
{
if(((x!
=2&&x==4)||(x==2&&x!
=4))==1&&((x!
=2&&x==3)||(x==2&&x!
=3))==1&&((x!
=1&&x==2)||(x==1&&x!
=2))==1)
if(x==1)
printf("甲是偷盗者\n");
elseif(x==2)
printf("乙是偷盗者\n");
elseif(x==3)
printf("丙是偷盗者\n");
elseif(x==4)
printf("丁是偷盗者\n");
}
}
Bisthethief
Convertanumbertoacharacterstring.
#include
#include
/*reverse:
reversestringsinplace*/
voidreverse(chars[])
{
intc,i,j;
for(i=0,j=strlen(s)-1;i { c=s[i]; s[i]=s[j]; s[j]=c; } } /*convertntocharatersins*/ voiditoa(intn,chars[]) { inti,sign; if((sign=n)<0)/*recordsign*/ n=-n;/*makenpositive*/ i=0; do/*generatedigitsinreverseorder*/ { s[i++]=n%10+'0'; /*getnextdigit*/ }while((n/=10)>0); if(sign<0) s[i++]='-'; s[i]='\0'; reverse(s); } main() { inti,n;chars[6]; printf("pleaseinputainteger: "); scanf("%d",&n); itoa(n,s); for(i=0;s[i]! ='\0';i++) printf("s[%d]=%c\n",i,s[i]); } -123 S[0]=- S[1]=1 S[2]=2 S[3]=3 数组: 1.编程求大数的阶乘 计算整数n的阶乘,要求计算结果最长可达100位的整数(十进制)提示: 一般32位系统中存储数据最大的基本数据类型double最长为20位。 #include #defineMAXLEN50 intdata[MAXLEN]; int*calcfact(intn) { inti,j; intdigit=1;//数据位数变量 for(i=1;i data[i]=0; data[1]=1;//data[1]存放n! 的个位数 for(i=1;i { for(j=1;j data[j]*=i; for(j=1;j { if(data[digit]>10)//最高位大于10,需要加长数组长度 digit++; data[j+1]+=data[j]/10;//进位 data[j]=data[j]%10; } } printf("%d! =",n); for(i=digit;i>0;i--) printf("%d",data[i]); returndata; } intmain() { intn; printf("Enterapositivenumber: "); scanf("%d",&n); calcfact(n); return0; } 计算机模拟实验: 2.猜钱游戏: 已知三本书中只有一本书里藏有钱,游戏者猜测一本,然后主持人从剩下的两本书中拿走一本没有藏钱的书,问此后游戏者是坚持原先选定的那本书还是换一本书猜到钱的机会哪个大? 应用: 问题复杂,机理不明确时,可以采用计算机模拟实验得到结论,进行设计。 #include #include #include inttrail(intchange) { //向三本书随机放钱 intbook[3]={0}; intr=rand()%3; book[r]=1; //player选1本书 inthand=rand()%3; //主持人排除1本书(不是play选的,同时没有钱的书) intopen=rand()%3; while(open==hand||book[open]==1) open=rand()%3; //player决定是否换手 if(1==change) { //hand=3-open-hand; if(hand==0&&open==1)hand=2; elseif(hand==0&&open==2)hand=1; elseif(hand==1&&open==0)hand=2; elseif(hand==1&&open==2)hand=0; elseif(hand==2&&open==0)hand=1; elseif(hand==2&&open==1)hand=0; } //揭晓是否赢 if(1==book[hand]) return1; else return0; } intmain() { srand((unsigned)time(NULL)); inti,ChangeWin=0,NoChangeWin=0; for(i=0;i<100000;i++) { if(trail(0)==1)NoChangeWin++; } for(i=0;i<100000;i++) { if(trail (1)==1)ChangeWin++; } printf("NoChangeWin=%d,ChangeWin=%d",NoChangeWin,ChangeWin); return0; } 函数: 1.分析以下程序运行结果: #include func(inta,intb) { intc; c=a+b; returnc; } voidmain() { intx=6,r; r=func(x,x+=2); printf(“%d\n”,r); } 2.下列程序的输出结果为____。 main() { inta=2,i,k; for(i=0;i<2;i++) k=f(a++); printf("%d\n",k); } f(intb) { staticinty=3; return(b+y++); } 3.#defineMUL(x,y)(x*y) main() {inta=3,b=4,c; c=MUL(a+1,b); printf(“%d\n”,c); }以上程序的输出结果是: ________ 4.鸡兔同笼,共有98个头,386只脚,编程求鸡、兔个多少。 5.求一元二次方程ax2+bx+c=0的根,用3个函数分别求当b2-4ac大于0、等于0和小于0时的根并输出结果。 从主函数输入a、b、c的值。 (函数的返回值只能有1个) #include"stdio.h" #include"math.h" voidgreater_than_zero(floata,floatb,floatdelta) { floatx1,x2; x1=(-b+sqrt(delta))/(2*a); x2=(-b-sqrt(delta))/(2*a); printf("X1=%.2f\n\X2=%.2f\n",x1,x2); } voidequal_to_zero(floata,floatb) { floatx; x=-b/(2*a); printf("X1=X2=%.2f\n",x); } voidsmaller_than_zero(floata,floatb,floatdelta) { floatp,q; p=-b/(2*a); q=sqrt(-delta)/(2*a); printf("X1=%.2f+%.2fi\n\X2=%.2f-%.2fi\n",p,q,p,q); } main() { floata,b,c,delta; scanf("%f%f%f",&a,&b,&c); printf("theequationis: %.2f*x*x+%.2f*x+%.2f=0\n",a,b,c); delta=b*b-4*a*c; printf("therootsare: \n"); if(delta>0) greater_than_zero(a,b,delta); elseif(fabs(delta)<1e-4)//实数计算有误差,不能写成delta==0 equal_to_zero(a,b); else smaller_than_zero(a,b,delta); } 以下错误: voidgreater_than_zero(floata,floatb,floatdelta) { floatx1,x2;//x1,x2局部变量,仅在定义它的函数(即函数greater_than_zero)范围内有效 x1=(-b+sqrt(delta))/(2*a); x2=(-b-sqrt(delta))/(2*a); } main() { floata,b,c,delta; scanf("%f%f%f",&a,&b,&c); printf("theequationis: %.2f*x*x+%.2f*x+%.2f=0\n",a,b,c); delta=b*b-4*a*c; printf("therootsare: \n"); if(delta>0) greater_than_zero(a,b,delta); printf("X1=%.2f\n\X2=%.2f\n",x1,x2);//x1,x2未定义 … } 6.#include intx=1; voidfun(intx); main() {fun(x); printf("x=%d\n",x); } voidfun(intx) {x=3; printf("%d\n",x); } 运行结果是: 3 x=1 蓝色全局变量,红色局部变量。 由于C语言是值传递方式,形参x拿到的是实参x的副本,形参x=3(由原先的1变为现在的3)并不会影响实参x的值, 所以在main函数中输出的x这个全局变量x仍然是1. 递归函数: 1.停车问题: 停车道长10米,假定车长1米,车辆一字排放在停车道上,问一般能停几辆车。 #include #include #include intparking(doublelow,doublehigh) { doublex; if(high-low<1) return0; else { x=(double)rand()/RAND_MAX*(high-1-low)+low;//生成一个小数在[low,high-1]内 printf("x=%f\n",x); returnparking(low,x)+1+parking(x+1,high); } } /*srand((int)time(NULL));//设定随机数种子rand()%100;产生0-99的随机数。 高级点的,假如要产生16-59之间的数,你可以这样写: rand()%44+16(这里44由59-16+1得到)。 x=(double)rand()/RAND_MAX*49+1.0;//(double)rand()/RAND_MAX产生0到1之间的随机数,乘以49,加上1.0就是1到50的随机数。 */ intmain() { inti,random_num; intnum; doubles=0; srand((unsignedint)time(NULL));//程序每次运行结果有差异 for(i=1;i<=10000;i++) { num=parking(0,10); printf("num=%d\n",num); s+=num; } s/=10000.0; printf("s=%f",s); return0; } s=7.222900 2.将十进制数转换成二进制数 intconvert(intn) { if(n==0||n==1) returnn; else returnconvert(n/2)*10+n%2 } 如n=6 convert(6)=convert(3)*10+0=11*10+0=110 convert(3)=convert (1)*10+1=1*10+1=11 convert (1)=1 想一想上面这个函数对n的取值范围是否有限制? 指针 1.Predictwhatgetsprinted: . voidswap(int*a,int*b) { int*k; k=a;a=b;b=k; } main() { inta=3,b=6,*x=&a,*y=&b; swap(x,y); printf("%d%d",a,b); } A)63B)36C)compilingerrorD)00 B 2.swap(intx,inty) {intt; t=x;x=y;y=t; } main() {inta=5,b=9; int*pointer_1,*pointer_2; pointer_1=&a;pointer_2=&b; if(a printf("\n%d,%d\n",a,b); } 5,9 strlen与sizeof的区别 #include #include voidfun(chara[10]) { inti=sizeof(a); charc=a[3]; printf("infunsizeof(a)=%d,c=%c\n",i,c); } intmain() { charb[10]="abcdefg"; inti=strlen(b),j=sizeof(b); fun(b); printf("inmainstrlen(b)=%d,sizeof(b)=%d\n",i,j); return0; } 运行结果: infunsizeof(a)=4,c=d inmainstrlen(b)=7,sizeof(b)=10 返回指针值的函数 下面的代码有什么问题 char*fun() { chara[5]=”abcd”; charb[5]; strcpy(b,a); returnb; } 这个返回有问题,因为它返回的是函数局部变量b的地址值。 当函数调用结束后,函数局部变量会释放,变成未知对象。 在return语句时,b还是有效的,但主调函数获得这个地址 时已经是无效的。 一般地,函数应返回: ►①由主调函数传递进去的有效指针值; ►②由动态分配得到的指针值 ►③0值指针,表示无效指针。 结构 结构成员分量引用与运算 #include structs {intx,*y; }*p; intdata[5]={10,20,30,40,50}; structsarray[5]={100,&data[0],200,&data[1],300,&data[2], 400,&data[3],500,&data[4]}; main() {p=array; printf("%d\n",++p->x);/*①101*/ printf("%d\n",++*p->y);/*②11*/ printf("%d\n",*++p->y);/*③*++p->y相当于*++(p->y),p指向array[0],p->y就是&data[0],++(p->y)是&data[1],*++(p->y)就是data[2],即20*/ } 扑克牌洗牌和发牌模拟 一付扑克有52张牌,分为4种花色(Suit): 黑桃(Spades)、红桃(Hearts)、草花(Clubs)、方块(Diamonds) 每种花色有13张牌面(Face): –A,2,3,4,5,6,7,8,9,10,Jack,Queen,King 数据结构: 设计一个结构体表示一张牌,由两个成分组成:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 习题