头歌:《C语言程序设计编程实践任务》教学团队:祁文青:选择结构程序设计

选择结构结构

输入一个学生的某门课成绩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 个整数abcd,用交换法求 4 个整数中的最大值的解题思路如下:

  1. 如果 a>bab交换,bab中的大者。
  2. 如果 b>cbc交换,ca,b,c中最大者。
  3. 如果 c>dcd交换,da,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 个整数中的最大值。

image-20230121171940566

	/********** 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 **********/

第三关

任务:根据提示,在右侧编辑器补充代码,用擂台赛法输出最大值。

image-20230121175340406

 /********** Begin **********/
        max = a;
    if(b > max)
        max = b;
    if(c > max)
        max = c;
    if(d > max)
        max = d;
 /********** End **********/

输入一个字符,判断该字符是大写英文字母,小写英文字母,空格,还是其它字符

任务:image-20230121181044122

/********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 %dn",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语句实现求分段函数值

任务:

有一分段函数:

image-20230125184808354

编写程序,用嵌套的if-else语句实现,要求输入x的值,输出y的值。

	/********** Begin **********/
	if(x>1)
    printf("y=%.2fn",exp(sqrt(x))-1);
    else
    {
    if(x<-1)
        printf("y=%.2fn",sin(x*x));
    else
        printf("y=%.2fn",fabs(x)+2); 
    }
    /********** End **********/

输入一元二次方程的三个系数求方程的根

任务:已知一元二次方程的三个系数,编程求ax2+bx+c=0方程的根,系数abc的值由键盘输入,构建一个一元二次方程的实例,其中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=%.5lfnx2=%.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+%.5lfinx2=%.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位的正整数,要求如下:①求出它是几位数②分别输出每一位数字③按逆序输出各位数字。

相关知识:

image-20230128132748815

#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("顺序输出为:%dn",num);
        printf("逆序输出为:%dn",num);
        break;
        case 2:
        printf("%d为2位数n",num);
        printf("顺序输出为:%d,%dn",x2,x1);
        printf("逆序输出为:%d,%dn",x1,x2);break;
        case 3:
        printf("%d为3位数n",num);
        printf("顺序输出为:%d,%d,%dn",x3,x2,x1);
        printf("逆序输出为:%d,%d,%dn",x1,x2,x3);
        break;
        case 4:
        printf("%d为4位数n",num);
        printf("顺序输出为:%d,%d,%d,%dn",x4,x3,x2,x1);
        printf("逆序输出为:%d,%d,%d,%dn",x1,x2,x3,x4);
        break;
        case 5:
        printf("%d为5位数n",num);
        printf("顺序输出为:%d,%d,%d,%d,%dn",x5,x4,x3,x2,x1);
        printf("逆序输出为:%d,%d,%d,%d,%dn",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("An");break;
        case 8: 
        if(score>=85)
        printf("An");
        else
        printf("Bn");
        break;
        case 7: printf("Cn");break; 
        case 6: printf("Dn");break;
        default: printf("En");
    }
	/********** End **********/
	return 0;
}

注:

  • switch里面要求用整形变量,所以将score定义为int类型,如果用float需要强制类型转换。
  • 因为A等为85~100,B等为80~84,所以在case8里面再设置一个if条件判断即可。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>