文章目录
- 选择结构结构
- 输入一个学生的某门课成绩score,判断学生的这门课成绩是否及格
- 输入一个某年的纪年数,输出该年是否是闰年
- 输入4个整数,要求输出4个数中的最大值
- 输入一个字符,判断该字符是大写英文字母,小写英文字母,空格,还是其它字符
- 输入4个整数,要求按由小到大顺序输出这4个数
- 输入一元二次方程的三个系数求方程的根
- 输入一个字符,判断该字符是否为小写英文字母,如果是输出其小写英文字母循环排序后的第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);
else
printf("不是小写英文字母");
/**********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条件判断即可。