C语言第四次培训

------选择语句与循环语句

目录

------选择语句与循环语句

一.选择语句:

1.if语句:

2.switch语句:

格式:

二.循环语句:

1.while语句:

格式:

2.do while语句:

格式:

3.for语句:

格式:

4.循环语句的嵌套:

5.改变循环的状态,break与continue语句:

三.任务:

1.设计程序实现输入年份,输出是闰年还是平年;

2.设计程序实现输入整数a,b和一个算数运算符,输出它们的计算结果(不管怎么输入,在计算过程中,a必须大于b);

3.判断100到200之间所有的素数(质数),并输出所有素数;

4.用for循环语句设计程序实现输出一个三角形。每行(2n - 1)个*,共5行;


一.选择语句:

选择语句分if语句和switch语句:

1.if语句:

上次培训我们已经讲过if语句和他的衍生结构,这次培训我们讲他的升级用法“if语句的嵌套”

依然是这个问题,设计程序实现输入整数a,b,c的值,按从小到大的顺序输出,我们用if语句的嵌套该如何解决呢?

我们直接上代码:

 
#include <stdio.h>
 ​
 int main()
 {
     int a, b, c, t;
     printf("please input three int a,b,c:\n");
     scanf("%d %d %d", &a, &b, &c);
     if(a > b)
     {
         if(b > c)
             printf("three sored int :\n%d %d %d\n", c, b, a);
         else if(a > c)//不满足b>c
             printf("three sored int :\n%d %d %d\n", b, c, a);
         else//不满足b>c,a>c
             printf("three sored int :\n%d %d %d\n", b, a, c);
     }
     else
     {
         if(a > c)
             printf("three sored int :\n%d %d %d\n", c, a, b);
         else if(b > c)//不满足a>c
             printf("three sored int :\n%d %d %d\n", a, c, b);
         else//不满足a>c,b>c
             printf("three sored int :\n%d %d %d\n", a, b, c);
     }
     return 0;
 }

2.switch语句:

设想有这样一个问题,随机输入一个数字1-7,输入对应的英文星期几。我们当然可以用if语句解决这个问题,但是代码会很长,此时我们便可以采用switch语句。

格式:
 switch(表达式)
 {
     case 常量1:语句1 break;
     case 常量2:语句2 break;
     default:语句n break;
    
 }
 //break的作用是跳出整个循环(break语句:当switch语句运行时遇到break关键字时会跳出,意思就是当语句运行到break时就不再运行了,接下来剩下的case语句也不会再执行,switch语句结束。)
 #include <stdio.h>
 ​
 int main()
 {
     int n;
     scanf("%d", &n);
     switch(n)
     {
         case 1: printf("Monday\n");break;
         case 2: printf("Tuesday\n");break;
         case 3: printf("Wednesday\n");break;
         case 4: printf("Thursday\n");break;
         case 5: printf("Friday\n");break;
         case 6: printf("Saturday\n");break;
         case 7: printf("Sunday\n");break;
         default : printf("输入错误\n");break;
     }
     return 0;
 }

break可以怎么使用呢?我们通过一个程序来加深理解。

设计一个程序实现输入一个1-7的数字,输出它是工作日还是休息日。

 
#include <stdio.h>
 ​
 int main()
 {
     int n;
     scanf("%d", &n);
     switch(n)
     {
         case 1: 
         case 2: 
         case 3: 
         case 4: 
         case 5: printf("工作日\n");break;//如果元素之间有相同性质,输出同样的结果
         case 6:
         case 7: printf("休息日\n");break;
         default : printf("输入错误\n");break;
     }
     return 0;
 }

当然,如同if语句一样,stitch语句同样可以嵌套。我们通过一个程序来加深理解。

设计一个程序实现输入两个数字m,n,m=1为左转;m=2为右转;m=3为十字路口,若此时n=1左直转,n=2右直转,n=其他值加速;m=其他值直行。

 
#include <stdio.h>
 ​
 int main()
 {
     int m, n;
     scanf("%d%d", &m, &n);
     switch(m)
     {
         case 1 : printf("左转\n");break;
         case 2 : printf("右转\n");break;
         case 3 : 
         {
             switch(n)
             {
                 case 1 : printf("左直转\n");break;
                 case 2 : printf("右直转\n");break;
                 default : printf("加速\n");break;
             }
             break;
         }
         default : printf("直行\n");break;
     }
     return 0;
 }

二.循环语句:

1.while语句:

设想如果设计程序让你计算1到100的所有整数的和你该怎么解决?

如果我们这样解决:

 int a = 1, b = 2, ......;
 int sum = a + b + ......;
 printf("%d", sum);

代码太过冗长,所以我们使用while语句来使这种单一的操作简单化;

格式:
 while(条件)
 {
     执行语句;
     执行语句;
 }
 #include <stdio.h>
 ​
 int main()
 {
     int x = 1, sum = 0;
     while(x != 101)//等价于while(x<101),while(x<=100)
     {
         sum = sum + x;
         x++;
     }
     printf("sum = %d\n", sum);
     return 0;
 }
 ​
 /*代码输出:
 sum = 5050
 ​
 */

2.do while语句:

do while 语句与whle语句的区别是:

while:先判断再执行

do while:先执行再判断

格式:
 
do
 {
     执行语句;
     执行语句;
 }while(条件);
 #include <stdio.h>
 ​
 int main()
 {
     int x = 1, sum = 0;
     do
     {
         sum = sum + x;
         x++;
     }while(x < 101);
     printf("sum = %d\n", sum);
     return 0;
 }
 ​
 /*代码输出:
 sum = 5050
 ​
 */

虽然结果都一样,但我们怎么理解它们的区别呢?

 
#include <stdio.h>
 ​
 int main()
 {
     int m = 1, n = 1, sum_m = 0, sum_n = 0;
     do
     {
         sum_m = sum_m + m;
         m++;
     }while(m < 1);
     printf("sum_m = %d\n", sum_m);
     printf("m = %d", m);
     putchar('\n');
     while(n < 1)
     {
         sum_n = sum_n + n;
         n++;
     }
     printf("sum_n = %d\n", sum_n);
     printf("n = %d", n);
     return 0;
 }
 ​
 /*代码输出:
 sum_m = 1
 m = 2
 sum_n = 0
 n = 1
 */

如果一次代码都不执行,我们便会发现端倪。

3.for语句:
格式:
 for(表达式1;表达式2;表达式3)
 {
     执行语句;
     执行语句;
 }
 //表达式1:设置初始条件,只会执行一次
 //表达式2:设置循环条件,用来判断是否继续循环
 //表达式3:设置循环调整

同样是计算1-100之间所有整数的和,我们还可以采用for语句:

 #include <stdio.h>
 ​
 int main()
 {
     int i, sum = 0;
     for(i = 1; i < 101; i++)
     {
         sum = sum + i;
     }
     printf("sum = %d\n", sum);
     return 0;
 }

4.循环语句的嵌套:

循环语句之间是可以相互嵌套的。

我们讲最常用的for语句的嵌套

设想有这样一个题第一行输出1到5,用水平制表符隔开,第二行输出第一行的两倍,第三行输出第一行的三倍,以此类推输出五行。

 /*代码讲解*/
 #include<stdio.h>
 ​
 int main()
 {
     int i, j, n = 0;
     for(i = 1; i <= 5; i++)//限定行数5
         for(j = 1; j <= 5; j++, n++)//限定每行5个数据 
         {
             if(n % 5 == 0 && n != 0)
                 printf("\n");//控制每行5个数据;换行 
             printf("%d\t",i*j);//输出每行的数据;
         }
     printf("\n");
     return 0;
 }
 ​
 /*代码输出:
 1       2       3       4       5
 2       4       6       8       10
 3       6       9       12      15
 4       8       12      16      20
 5       10      15      20      25
 ​
 */

如果很难理解,我们可以换一个例子:

 
#include <stdio.h>
 ​
 int main()
 {
     int i;
     for(i = 1; i <= 5; i++)
         printf("*");
     return 0;
 }
 ​
 /*代码输出:
 *****
 */

 #include <stdio.h>
 ​
 int main()
 {
     int i, j;
     for(i = 1; i <= 5; i++)
         for(j = 1; j <= 5; j++)
         {
             printf("*");
             if(j == 5 && i != 5)
                 putchar('\n');  
         }
     return 0;
 }
 /*代码输出:
 *****
 *****
 *****
 *****
 *****
 */
 ​

5.改变循环的状态,break与continue语句:

在讲switch语句时,我们已经讲过break:

回顾:break的作用是跳出整个循环(break语句:当switch语句运行时遇到break关键字时会跳出,意思就是当语句运行到break时就不再运行了,接下来剩下的case语句也不会再执行,switch语句结束。)

break:跳出整个循环;

continue:跳出本次循环。

 /*代码理解*/
 #include <stdio.h>
 ​
 int main()
 {
     int i;
     for(i = 1; i < 11; i++)
     {
         if(i % 2 == 0)
             continue;
         printf("%-3d", i);
     }
     return 0; 
 }
 ​
 /*代码输出:
 1  3  5  7  9
 */

 
/*代码理解*/
 #include <stdio.h>
 ​
 int main()
 {
     int i;
     for(i = 1; i < 11; i++)
     {
         if(i % 2 == 0)
            break;
         printf("%-3d", i);
     }
     return 0; 
 }
 ​
 /*代码输出:
 1  
 */

三.任务:

1.设计程序实现输入年份,输出是闰年还是平年;

2.设计程序实现输入整数a,b和一个算数运算符,输出它们的计算结果(不管怎么输入,在计算过程中,a必须大于b);

3.判断100到200之间所有的素数(质数),并输出所有素数;

4.用for循环语句设计程序实现输出一个三角形。每行(2n - 1)个*,共5行。

     *
    ***
   *****
  *******
 *********

(拓展1:菱形)

    *
   ***
  *****
 *******
  *****
   ***
    *

(拓展2:自定义可输入菱形)比如边长为3,符号为&

   &
  &&&
 &&&&&
  &&&
   &

1.设计程序实现输入年份,输出是闰年还是平年;
 
/*法一*/
 #include <stdio.h>
 ​
 int main()
  {
     int year, leap;
     printf("请输入年份:");
     scanf("%d", &year);
     if(year % 4 == 0)
     {
         if(year % 100 == 0)
         {
             if(year % 400 == 0)
                 leap = 1;
             else
                 leap = 0;
         }
         else
             leap = 1;
     }
      else
          leap = 0;
      if(leap != 0)//if(leap!=0) = if(leap) 
         printf("%d该年份是闰年。\n", year);
      else
         printf("%d该年份是平年。\n", year);
      return 0; 
 }

 /*法二*/
 #include <stdio.h>
 ​
 int main()
 {   int year, a;
     printf("请输入年份:");
     scanf("%d", &year);
     a=((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
     //printf("%d", a);
     if(a)
         printf("%d该年份是闰年。\n", year);
     else
         printf("%d该年份是平年。\n", year);
     return 0;
 }

 /*法三*/
 #include <stdio.h>
 ​
 int main()
 {
     int year, leap;
     printf("请输入年份:");
     scanf("%d", &year);
     if(year % 4 == 0 && year % 100 != 0)
         leap = 1;
     else
         leap = 0;
     if(year % 400 == 0)
         leap = 1;
     else
         leap = 0;
     if(leap)
         printf("%d该年份是闰年。", year);
     else
         printf("%d该年份是平年。", year);
     return 0;
 }

2.设计程序实现输入整数a,b和一个算数运算符,输出它们的计算结果(不管怎么输入,在计算过程中,a必须大于b);
 
/*法一*/
 #include <stdio.h>
 ​
 int main()
 {
     int a, b, t, n;
     char c;
     scanf("%d %d %c", &a, &b, &c);
     if(a < b)
     {
         t = a;
         a = b;
         b = t;
     }
     if(c == '+')
         n = 1;
     else if(c == '-')
         n = 2;
     else if(c == '*')
         n = 3;
     else if(c == '/')
         n = 4;
     else
         n = 0;
     switch(n)
     {
         case 1 : printf("%d %c %d = %d\n", a, c, b, a + b); break;
         case 2 : printf("%d %c %d = %d\n", a, c, b, a - b); break;
         case 3 : printf("%d %c %d = %d\n", a, c, b, a * b); break;
         case 4 : printf("%d %c %d = %d\n", a, c, b, a / b); break;
         default : printf("输入有误\n"); break;
     }
     return 0;
 }

 /*法二*/
 #include <stdio.h>
 ​
 int main()
 {
     int a, b, t;
     char c;
     scanf("%d %d %c", &a, &b, &c);
     if(a < b)
     {
         t = a;
         a = b;
         b = t;
     }
     if(c == '+')
         printf("%d %c %d = %d\n", a, c, b, a + b);
     else if(c == '-')
         printf("%d %c %d = %d\n", a, c, b, a - b);
     else if(c == '*')
         printf("%d %c %d = %d\n", a, c, b, a * b);
     else if(c == '/')
         printf("%d %c %d = %d\n", a, c, b, a / b);
     else
         printf("输入有误\n");
     return 0;
 }

 /*法三*/
 #include <stdio.h>
 ​
 int main()
 {
     int a, b, t;
     char c;
     scanf("%d %d %c", &a, &b, &c);
     if(a < b)
     {
         t = a;
         a = b;
         b = t;
     }
     switch(c)
     {
         case '+' : printf("%d %c %d = %d\n", a, c, b, a + b); break;
         case '-' : printf("%d %c %d = %d\n", a, c, b, a - b); break;
         case '*' : printf("%d %c %d = %d\n", a, c, b, a * b); break;
         case '/' : printf("%d %c %d = %d\n", a, c, b, a / b); break;
         default : printf("输入有误\n"); break;
     }
     return 0;
 }

3.判断100到200之间所有的素数(质数),并输出所有素数;
 #include <stdio.h>
 ​
 int main()
 {
     int i, j, p;
     for(i = 100; i <= 200; i++)
     {
         for(j = 2; j < i; j++)
         {
             if(i % j == 0)
                 break;
         }
         if(j == i)
         printf("%-5d", i);
     }
     putchar('\n');
     return 0;
 }

4.用for循环语句设计程序实现输出一个三角形。每行(2n - 1)个*,共5行;

     *
    ***
   *****
  *******
 *********

(拓展1:菱形)

    *
   ***
  *****
 *******
  *****
   ***
    *

(拓展2:自定义可输入菱形)比如边长为3,符号为&

   &
  &&&
 &&&&&
  &&&
   &

 #include <stdio.h>
 ​
 int main()
 {
     int i, m, n;
     for(i = 1; i <= 5; i++)
     {
         for(m = 1; m <= 5-i; m++)
         {
             printf(" ");
         }
         for(n = 1; n <= 2*i-1; n++)
         {
             printf("*");
         }
         if(i != 5)
             printf("\n");
     }
     return 0;
 }

 //拓展1
 #include <stdio.h>
 ​
 int main()
 {
     int i, j, k;
     for(i = 1; i <= 4; i++)
     {
         for(j = 1; j <= 4-i; j++)
         {
             printf(" ");
         }
         for(k = 1; k <= 2*i-1; k++)
         {
             printf("*");
         }
         printf("\n");
     }
     for(i = 1; i < 4; i++)
     {
         for(j = 1; j <= i; j++)
         {
             printf(" ");
         }
         for(k = 1; k <= 2*(4-i)-1; k++)
         {
             printf("*");
         }
         if(i != 3)
             printf("\n");
     }
 }

 
//拓展2
 #include <stdio.h>
 ​
 int main()
 {
     char x;
     int y, i, j, k;
     scanf("%c %d", &x, &y);
     for(i = 1; i <= y; i++)
     {
         for(k = 1; k <= y-i; k++)
             printf(" ");
         for(j = 1; j <= 2*i-1; j++)
         {
             printf("%c", x);
         }
         printf("\n");
     }
     for(i = 2; i <= y; i++)
     {
         for(k = 1; k <= i-1; k++)
             printf(" ");
         for(j = 1; j < 2*(y+1)-2*i; j++)
             printf("%c", x);
         if(i != y)
             printf("\n");
     }
     return 0;
 }

 //拓展2
 #include <stdio.h>
 #include <math.h>
 ​
 int main()
 {
     int l;//菱形的行数(奇数) 
     int cx, cy;
     int i, j;
     char c;
     scanf("%d %c", &l, &c);
     cx = cy = l / 2 + 1;
     for(i = 1; i <= l; i++)
     {
         for(j = 1; j <= l; j++)
         {
             if((abs(i - cx) + abs(j - cy)) <= l / 2)//计算出曼哈顿距离的绝对值
                 putchar(c);
             else putchar(' ');
         }
         if(i != l)
             putchar('\n');
     }
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值