文章目录
选择结构结构输入一个学生的某门课成绩score,判断学生的这门课成绩是否及格输入一个某年的纪年数,输出该年是否是闰年输入4个整数,要求输出4个数中的最大值第一关第二关第三关 输入一个字符,判断该字符是大写英文字母,小写英文字母,空格,还是其它字符输入4个整数,要求按由小到大顺序输出这4个数第一关第二关用嵌套的if-else语句实现求分段函数值 输入一元二次方程的三个系数求方程的根输入一个字符,判断该字符是否为小写英文字母,如果是输出其小写英文字母循环排序后的第6个小写字母给一个不多于5位的正整教,要求输出它是几位数输入三个正实数,如果能构成三角形,编程求三角形的面积(选择结构)用switch语句编写一个简单的实数四则运算程序用switch语句实现输入某年某月某日,判断这一天是这一年的第几天用switch语句实现输入一个不多余5位的正整数,要求①求出它是几位数②分别输出每一位数字③按逆序输出各位数字用switch语句实现对输入的数字1~7转换成文字星期几,对其它数字不转换用switch语句实现输入一个百分制的成绩后输出它的等级
选择结构结构
输入一个学生的某门课成绩score,判断学生的这门课成绩是否及格
任务:输入一个学生的某门课成绩score
,判断学生的这门课成绩是否及格。如果大于等于60
分,则结果为“及格”;否则结果为“不及格”。
#include <stdio.h>int main(){float score;scanf("%f",&score);/********** Begin **********/if (score>=60) printf("这门课成绩及格!\n"); else printf("这门课成绩不及格!\n");/********** End **********/return 0;}
输入一个某年的纪年数,输出该年是否是闰年
任务:编写程序,输入一个某年的纪年数(如:2020),判断该年是否是闰年。
/********** Begin **********/if(year%4==0&&year%4==0||year%400==0) printf("%d年是闰年。\n",year); else printf("%d年不是闰年!\n",year);/********** End **********/
注:这里要用关系运算符==,而不能用赋值运算符,由此来进行条件判断,即是否等于0。
输入4个整数,要求输出4个数中的最大值
第一关
任务:现在有 4 个整数a
,b
,c
,d
,用交换法求 4 个整数中的最大值的解题思路如下:
a>b
,a
和b
交换,b
是a
、b
中的大者。如果 b>c
,b
和c
交换,c
是a
,b
,c
中最大者。如果 c>d
,c
和d
交换,d
是a
,b
,c
,d
中最大者。 /********** Begin **********/ if(a>b&&b>c&&c>d) { t=a; d=a; d=t; printf("max=%d",d); } if(c>a&&c>b&&(c>d||d>c)) printf("max=%d",d); if(b>a&&b>d&&d>c) { t=c; c=b; b=t; printf("max=%d",c); } if(a>b&&b>d&&d>c) { t=c; c=a; a=t; printf("max=%d",c); } if(a>c&&c>b&&a>d) { t=a; a=b; b=t; printf("max=%d",b); } /********** End **********/
注:仔细观察,列举发现,若按交换法来算只有四种情况。
假设最大是a,a一定会和b换,所以a不可能为最大值。假设最大是b,只有一种情况,首先,由2)知,b<c,否则bc交换后c最大;其次,d<a,保证ab交换后b最大;而a一定要比c大,然后与ab交换后b才为最大。假设最大是c,有二种情况,首先,由3)知,c<d,否则cd交换后d最大;其次,因为c<d要c最大只能bc交换,且b比d大;而a无论在哪个位置,对结果没有影响。但是a>b时是a的值赋给了b再给c,代码会有不同。假设最大是d,有三种情况,第一种即a>b>c>d,一直交换。第二种cd局部交换,保证c最大即可。最后一种即d本身最大。后面两种可以合并为一句代码,但是注意或运算符比与运算符优先级低,要加括号。以上仅代表个人思路,如果有更好解法,麻烦指点。
如果仅通过测试,其实漏掉很多情况也可以过,只要按着测试数据"量身定做"即可。
第二关
任务:在右侧编辑器补充代码,用比较法编写程序求这 4 个整数中的最大值。
/********** Begin **********/ if(b>a) { t=b; b=a; a=t; } if(c>a) { t=c; c=a; a=t; } if(d>a) { t=d; d=a; a=t; } printf("max=%d",a); /********** End **********/
第三关
任务:根据提示,在右侧编辑器补充代码,用擂台赛法输出最大值。
/********** Begin **********/ max = a; if(b > max) max = b; if(c > max) max = c; if(d > max) max = d; /********** End **********/
输入一个字符,判断该字符是大写英文字母,小写英文字母,空格,还是其它字符
任务:
/********begin********/if(ch>='A'&& ch<='Z' ) || (ch>='a'&& ch<='z'))printf("%c是英文字母",ch);if(ch>='1'&& ch<='9' ) )printf("%c是数字字符",ch);if(ch>='!'&& ch<='/' ) || (ch>=':'&& ch<='@'))printf("%c是其他字符",ch);/********end********/
注:||优先级没有&&高,里面小括号也可以不加。另外,其他字符有省略(因为偷懒了),但是能保证通过测试,详细可以对照ASC||表。
输入4个整数,要求按由小到大顺序输出这4个数
第一关
任务:输入4个整数,编程用交换法由小到大顺序输出这4个数。
/********** Begin **********/ if(a>b) { t=a; a=b; b=t; } if(b>c) { t=b; b=c; c=t; } if(c>d) { t=c; c=d; d=t; } if(a>b) { t=a; a=b; b=t; } if(b>c) { t=b; b=c; c=t; } if(a>b) { t=a; a=b; b=t; } printf("%d %d %d %d\n",a,b,c,d); /********** End **********/
注,通过第一轮比较,可以确定d的最大值,通过第二轮可以确定c最大值,以下同理,因为值都被交换到其他位置,所以需要多轮交换确定。
第二关
任务:输入4个整数,编程用比较法由小到大顺序输出这4个数。
/********** Begin **********/if(a>b){ t=a; a=b; b=t;} if(a>c){ t=a; a=c; c=t;} if(a>d){ t=a; a=d; d=t;}if(b>c){ t=b; b=c; c=t;} if(b>d){ t=b; b=d; d=t;}if(c>d){ t=c; c=d; d=t;}printf("%d %d %d %d",a,b,c,d); /********** End **********/
注:因为按顺序输出a,b,c,d。只要保证a,b,c,d按大小输出即可,所以a先和b,c,d比较不断交换确保a是最小值,其他同理。(感觉这两题一样一样的,非要搞这麻烦第二关还不是靠交换)
用嵌套的if-else语句实现求分段函数值
任务:
有一分段函数:
编写程序,用嵌套的if-else
语句实现,要求输入x的值,输出y的值。
/********** Begin **********/if(x>1) printf("y=%.2f\n",exp(sqrt(x))-1); else { if(x<-1) printf("y=%.2f\n",sin(x*x)); else printf("y=%.2f\n",fabs(x)+2); } /********** End **********/
输入一元二次方程的三个系数求方程的根
任务:已知一元二次方程的三个系数,编程求ax2+bx+c=0
方程的根,系数a
,b
,c
的值由键盘输入,构建一个一元二次方程的实例,其中a
不等于0。
输入说明: 输入一行,包含三个双精度浮点数a, b, c(它们之间以逗号分开),分别表示方程ax2+bx+c=0(a=0)
的系数。
输出说明: 若两个实根相等,则输出形式为: x1=x2=…
若有两个实根不等,则输出形式为: x1=… x2=…
若有两个虚根,则输出: x1=实部+虚部i x2=实部-虚部i
说明:实部为0时不可省略,所有实数部分要求精确到小数点后5位,数字、符号之间没有空格。
/**********Bigin**********/double a,b,c,d,m,n,x1,x2;scanf("%lf,%lf,%lf",&a,&b,&c);d=b*b-(4*a*c);if(d>0){x1=((-b)+sqrt(d))/(2*a);x2=((-b)-sqrt(d))/(2*a);printf("x1=%.5lf\nx2=%.5lf",x1,x2);}if(d==0){x1=(-b)/(2*a);printf("x1=x2=%.5lf",x1);}if(d<0){m=sqrt(-d)/(2*a);n=(-b)/(2*a);printf("x1=%.5lf+%.5lfi\nx2=%.5lf-%.5lfi",n,m,n,m);}/**********End**********/
注:
不能用数学中方式,如2a。条件判断不是d=0,要用==,每个相乘都要带乘号。注意运算符的优先级,分母上下都用括号分别计算完再相除。输入一个字符,判断该字符是否为小写英文字母,如果是输出其小写英文字母循环排序后的第6个小写字母
任务:输入一个字符,判断该字符是否为小写英文字母,如果是输出其小写英文字母循环排序后的第6个小写字母。
/**********Begin**********/if(ch>='a'&&ch<='t')printf("是小写英文字母,循环增加6为%c",ch+6);else if(ch>='u'&&ch<='z')printf("是小写英文字母,循环增加6为%c",ch-20);elseprintf("不是小写英文字母");/**********END**********/
注:因为循环排序,如果到了后6个英文字母,按照ASCII的表是符号,要将u后面的字母加六正好循环到a后六个,需要将ch值-26+6=-20。
给一个不多于5位的正整教,要求输出它是几位数
任务:编写程序给一个不多于5
位的正整教number
,要求输出number
是几位数。要求使用if-else嵌套。
/********** Begin **********/ if(number>=1&&number<=9) printf("%d是一位数",number); else if(number>=10&&number<=99) printf("%d是二位数",number); else if(number>=100&&number<=999) printf("%d是三位数",number); else if(number>=1000&&number<=9999) printf("%d是四位数",number); else printf("%d是五位数",number); /********** End **********/
输入三个正实数,如果能构成三角形,编程求三角形的面积(选择结构)
任务:输入三个正实数,如果能构成三角形,编程求三角形的面积。
相关知识:构成三角形的条件为:三角形任意两边之和大于第三边。求三角形面积的公式为:
area=s(s−a)(s−b)(s−c),其中s=(a+b+c)/2。
/********** Begin **********/ s = (a+b+c) / 2; area = sqrt(s*(s-a)*(s-b)*(s-c)); if(a+b>c && a+c>b && b+c>a) printf("area=%f",area); else printf("is not triangle!"); /********** End **********/
用switch语句编写一个简单的实数四则运算程序
任务:用switch
语句编写一个简单的实数四则运算程序。
/********** Begin **********/switch(c) { case '+': printf("%0.2lf%c%0.2lf=%0.2lf",a,c,b,a+b); break; case '-': printf("%.2lf%c%.2lf=%.2lf",a,c,b,a-b); break; case '/': if(b!=0) printf("%.2lf%c%lf=%.2lf",a,c,b,a/b); else printf("error"); break; case '*':printf("%.2lf%c%.2lf=%.2lf",a,c,b,a*b); break; } /********** End **********/
注:
除数不能为0,需要在case里面设置条件判断。运算符要用单引号括起来,以便检测字符,否则会报错。用switch语句实现输入某年某月某日,判断这一天是这一年的第几天
任务:输入某年某月某日,判断这一天是这一年的第几天,要考虑这一年是否是闰年。
相关知识:以10月5日为例,应该先把前 9 个月的天数加起来,然后再当月的天数5天,还要判断是否是闰年,如果是闰年且月份大于3时需考虑多加一天。
充分利用switch-case
中break
的特性,计算某月以前月份的总天数.
#include<stdio.h>int main(){ int day,month,year,num=0,leap; scanf("%d%d%d",&year,&month,&day); /*****先计算某月以前月份的总天数*****/ /********** Begin **********/ switch(month){ case 12: num +=30; case 11: num+=31; case 10: num+=30; case 9: num+=31; case 8: num+=31; case 7: num+=30; case 6: num+=31; case 5: num+=30; case 4: num+=31; case 3: num+=28; case 2: num+=31;} /********** End **********/ /*****再加上当月的天数*****/num+=day; /*****判断是不是闰年*****/ /********** Begin **********/if(year%4==0 && year%100!=0 || year%400==0) /********** End **********/ /*****如果是闰年且月份大于2,总天数应该加一天*****/ /********** Begin **********/if(month>2){ num+=1;} /********** End **********/ printf("这一天是这一年的第%d天",num); return 0;}
注:
根据switch特性,没有break时后面代码会执行完,所以从12月开头,输入几月,可以保证这个月份之前天数累加完。
判断是否为闰年
year%4==0 && year%100!=0 || year%400==0
用switch语句实现输入一个不多余5位的正整数,要求①求出它是几位数②分别输出每一位数字③按逆序输出各位数字
任务:给一个不多余5位的正整数,要求如下:①求出它是几位数②分别输出每一位数字③按逆序输出各位数字。
相关知识:
#include <stdio.h>#include <math.h>int main(){int num,y,x1,x2,x3,x4,x5,place;scanf("%d",&num);place=log10((double)num)+1;///********** Begin **********/ y=num; x1=y%10; y=y/10; x2=y%10; y=y/10; x3=y%10; y=y/10; x4=y%10; y=y/10; x5=y%10; switch(place) { case 1: printf("%d为1位数\n",num); printf("顺序输出为:%d\n",num); printf("逆序输出为:%d\n",num); break; case 2: printf("%d为2位数\n",num); printf("顺序输出为:%d,%d\n",x2,x1); printf("逆序输出为:%d,%d\n",x1,x2);break; case 3: printf("%d为3位数\n",num); printf("顺序输出为:%d,%d,%d\n",x3,x2,x1); printf("逆序输出为:%d,%d,%d\n",x1,x2,x3); break; case 4: printf("%d为4位数\n",num); printf("顺序输出为:%d,%d,%d,%d\n",x4,x3,x2,x1); printf("逆序输出为:%d,%d,%d,%d\n",x1,x2,x3,x4); break; case 5: printf("%d为5位数\n",num); printf("顺序输出为:%d,%d,%d,%d,%d\n",x5,x4,x3,x2,x1); printf("逆序输出为:%d,%d,%d,%d,%d\n",x1,x2,x3,x4,x5); break; }/********** End **********/return 0;}
注:
log10(num):取num的对数,相当于10的x次方,求这个x的值,例如1234是个四位数,log10(1234)=log10(1.234*1000)=log10(1.234)+3,因为log10(1.234)是个小数,所以这个数大于3小于4。拆分正整数,可以不断取余,除以10因为取除以10的余数,余数一定是个位的数,再不断给y除以10,把百位千位的数不断推往个位求得。用switch语句实现对输入的数字1~7转换成文字星期几,对其它数字不转换
任务:用switch语句实现对输入的数字1~7转换成文字星期几,对其它数字不转换
/********** Begin **********/int day;scanf("%d",&day);switch(day){ case 1:printf("Monday");break; case 2:printf("Tuesday");break; case 3:printf("Wednesday");break; case 4:printf("Thursday");break; case 5:printf("Friday");break; case 6:printf("Saturday");break; case 7:printf("Sunday");break; default:printf("error");} /********** End **********/
用switch语句实现输入一个百分制的成绩后输出它的等级
任务:编程序,输入一个百分制的成绩后, 判断该成绩为A、B、C、D、E哪一个等级,A等为85~100
,B等为80~84
,C等为70~79
,D等为60~69
,E等为0~59
,用switch语句来实现。
#include <stdio.h>int main(){int score; scanf("%d",&score);/********** Begin **********/switch(score/10) { case 10: case 9: printf("A\n");break; case 8: if(score>=85) printf("A\n"); else printf("B\n"); break; case 7: printf("C\n");break; case 6: printf("D\n");break; default: printf("E\n"); }/********** End **********/return 0;}
注:
switch里面要求用整形变量,所以将score定义为int类型,如果用float需要强制类型转换。因为A等为85~100
,B等为80~84
,所以在case8里面再设置一个if条件判断即可。