C语言中的分支与循环

分支语句
  • if
  • swich
循环语句
  • while
  • if
  • do while

1.什么是语句?

C语句可分为以下五类:
    表达式语句
    函数调用语句
    控制语句 
    复合语句
    空语句 
C语言是一门结构化的程序设计语言
C语言支持三种结构:顺序结构、选择结构、循环结构
                                            (选择语句)、(循环语句)
控制语句用于控制结构的执行流程,有九种控制语句:
    条件判断语句也叫分支语句:if语句、switch语句;
    循环执行语句:do while语句、while语句、for语句; 
    转向语句:break语句、goto语句、continue语句、return语句。

2.分支语句(选择结构)

2.1if语句

2.1.1if语句
//语法结构:
if(表达式)
    语句1;
C语言中,0表示假,非0表示真。
if语句,默认只能控制一条语句,如果有多条语句,需要加大括号,一对{ }代表一个代码块
else的匹配:else和与它距离最近的if匹配
2.1.2if的书写对比
比较一个变量和一个常量是否相等的时候,建议把常量放在等号左边:10==num
2.1.3 练习

1. 判断一个数是否为奇数 

2. 输出1-100之间的奇数

int main()
{
    int i=1;
    while(i<=100)
    {
        if(i%2==1)
        {
            printf("%d ",i);
        }
        i++;
    }
    return 0;
}
int main()
{
    int i=1;
    while(i<=100)
    {
        printff("%d ",i);
        i+=2;
    }
    return 0;
}

2.2switch语句

2.2.1switch语句
switch语句也是一种分支语句,常常用于多分支的情况
switch允许嵌套使用
swutch(整型表达式)
{
    语句项;
}
caae 整型常量表达式;
    语句;
int main()
{
    int day=0;
    scanf("%d",&day);
    switch(day)
    {
    case 1:
        printf("星期1\n");
        breaak;
    case 2:
        printf("星期2\n");
        breaak;
    case 3:
        printf("星期3\n");
        breaak;
    case 4:
        printf("星期4\n");
        breaak;
    case 5:
        printf("星期5\n");
        breaak;
    case 6:
        printf("星期6\n");
        breaak;
    case 7:
        printf("星期7\n");
        breaak;
    default:
        printf("选择错误\n");
        breaak;
    }
    return 0;    
}
case只决定程序入口,而break决定出口
int main()
{
    int day=0;
    scanf("%d",&day);
    switch(day)
    {
    case 1;
    case 2;
    case 3; 
    case 4;
    case 5;
        pritnf("工作日\n");
        break;
    case 6;
    case 7;
        pritnf("休息日n");
        break;
    }
    return 0;
}
2.2.2 default子句 
如果表达的值与所有的case标签的值都不匹配怎么办? 其实也没什么,结构就是所有的语句都被跳过而已。 程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。 但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢? 你可以在语句列表中增加一条default子句,把下面的标签 default: 写在任何一个 case 标签可以出现的位置。 当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。 所以,每个switch语句中只能出现一条default子句。 但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。

3.循环语句

  • while
  • for
  • do while

3.1while循环

3.1.1while循环的语法
//while 语法结构
while(表达式)
    循环语句;
#include<stdio.h> 
int main() 
    int i = 1;
    while(i<=10)
    //while后面默认跟一条语句,所以要加大括号
    { 
        printf("%d ", i); 
        i++; 
    }
    return 0;
}
3.1.2while语句中的breakcontinue
  • break在while循环中的作用: 
        其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的break是用于永久终止循环的。即当满足某种条件时break
  • continue在while循环中的作用:
        continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
#include<stdio.h> 
int main() 
    int i = 1; 
    while(i<=10) 
    {    
        i ++;
        if(i == 5) 
            continue;    
        printf("%d ", i); 
    } 
    return 0; 
}
//输出结果为1 2 3 4 6 7 8 9 10
补充:  getchar(输入一个字符)  
            putchar(输出一个字符)
char ch=0;
ch=getchar( ); 
putchar(ch);
int main( )
{
    char pasword[20]={0};
    int ch=0;
    printf("请输入密码“};
    scanf("%s",pasword);
    //数组名本身就是一个地址
    //消除\n(清理缓冲区)
    getchar( );
    printf("请确认密码(Y\N)");
    ch=getchar( );
    if(ch=='Y')
        printf("确认成功");
    else
        printf("确认失败");
    
    return 0;
}
scanf与getchar读取数据的不同
scanf [123456]    <—缓冲区[123456\n]<—键盘[123456\n]
         [           ]     <—缓冲区[\n             ]<—键盘[               ]scanf读到"\n"或者" "就停止
getchar[123456] <—缓冲区[123456\n]<—键盘[123456\n]
             [123456]<—缓冲区[\n             ]<—键盘[               ]
             [\n        ]<—缓冲区[\n             ]<—键盘[               ]\n是上次剩下的,getchar会读取\n
当出现下面这种情况:”输入123456   xxx"
scanf [123456]    <—缓冲区[123456   xxx\n]<—键盘[123456   xxx\n]
          [           ]    <—缓冲区[   xxx\n            ]<—键盘[                        ]
getchar [            ]<—缓冲区[   xxx\n            ]<—键盘[                        ]
              [           ]<—缓冲区[  xxx\n             ]<—键盘[                         ]
              [           ]<—缓冲区[ xxx\n              ]<—键盘[                         ]
              [           ]<—缓冲区[xxx\n               ]<—键盘[                         ]
             [x           ]<—缓冲区[xx\n               ]<—键盘[                         ]
             [x           ]<—缓冲区[x\n                 ]<—键盘[                         ]
             [x           ]<—缓冲区[\n                   ]<—键盘[                         ]
             [\n         ]<—缓冲区[                       ]<—键盘[                         ]
int main( )
{
    char pasword[20]={0};
    int ch=0;
    printf("请输入密码“};
    scanf("%s",pasword);
    //数组名本身就是一个地址
    //消除\n(清理缓冲区)
    while(getchar( )!='\n')
    {
        ;
    }
    printf("请确认密码(Y\N)");
    ch=getchar( );
    if(ch=='Y')
        printf("确认成功");
    else
        printf("确认失败");
    
    return 0;
}
//这个代码的作用是:只打印数字字符,跳过其他字符的
#include<stdio.h>
int main( ) 
{    
    char ch = '\0';     
    while ((ch = getchar()) != EOF) 
    {     
        if (ch < ‘0’ || ch > ‘9’)
            continue;     
        putchar(ch);     
    } 
    return 0;
}
%c-字符
%s-字符串
%d-整型
%f-float浮点数
%lf-double浮点数
%p-打印地址
%x-以十六进制的形式进行打印
float f=0.0f;
scanf:按照一定格式输入数据
printf:按照指定的格式输出数据

3.2for循环

#include<stdio.h>
int main()
{
    int i = 1;                //初始化
    while(i<=10)              //判断
    {    
        printf("%d ", i);    
        i++;                 //调整
    }
    return 0;
}
//输出结果为1 2 3 4 5 6 7 8 9 10
3.2.1for循环的语法
for(表达式1; 表达式2; 表达式3)
    循环语句;
  • 表达式1 表达式1为初始化部分,用于初始化循环变量的。 
  • 表达式2 表达式2为条件判断部分,用于判断循环时候终止。 
  • 表达式3 表达式3为调整部分,用于循环条件的调整。
#include<stdio.h>
int main() 
    int i = 0; 
    //for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/) 
    for(i=1; i<=10; i++) 
    { 
        printf("%d ", i); 
    } 
    return 0; 
}
3.2.2 break和continue在for循环中 
我们发现在for循环中也可以出现break和continue,他们的意义和在while循环中是几乎一样的。
  • break在for循环中的作用: 
        其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:for中的break是用于永久终止循环的。即当满足某种条件时break
  • continue在for循环中的作用:
        continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到for语句的调整部分。进行下一次循环的入口判断。
    区别:在for循环中,continue使得程序跳过循环语句直接进入调整阶段,即执行表达式三;而while循环中,continue使得程序直接跳转到while语句的判断部分,不会执行continue后面的语句。
3.2.3 for语句的循环控制变量 
  • 建议不可在for 循环体内修改循环变量,防止 for 循环失去控制。 
  • 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
3.2.4 一些for循环的变种
for循环的初始化,判断和调整三部分都可以省略,但是省略掉判断部分,循环为死循环。,即判断部分恒为真
#include<stdio.h>
int main()
//代码1
{
    int i = 0;    
    int j = 0;    
    //这里打印多少个hehe?   
    for(i=0; i<10; i++)   
    {        
        for(j=0; j<10; j++)       
        {
             printf("hehe\n");           
        }
    retunrn 0;   
}        
//代码2    
{
    int i = 0;    
    int j = 0;    
    //如果省略掉初始化部分,这里打印多少个hehe?    
    for(; i<10; i++)   
    {        
        for(; j<10; j++)
        { 
            printf("hehe\n");       
        }   
    return 0;
}
3.2.5 一道笔试题:
//请问循环要循环多少次? 
#include <stdio.h>
int main() 
    int i = 0; 
    int k = 0; 
    for(i =0,k=0; k=0; i++,k++)            
        k++; 
    return 0; 
}
//for循环中的表达式二k=0,是指给k赋值为零,即表达式k=0的值为0,且0表示假,所以不会进入循环

3.3 do...while()循环 

3.3.1 do语句的语法:
do 
    循环语句; 
while(表达式);
3.3.2 do语句的特点 
循环至少执行一次,使用的场景有限,所以不是经常使用。
#include<stido.h>
int main() 
    int i = 10; 
    do 
    { 
        printf("%d\n", i); 
        i++;
    }while(i<=10); 
    return 0; 
}
3.3.3 do while循环中的breakcontinue
#include<stdio.h> 
int main() 
    int i = 10;     
    do 
    {   
        printf("%d\n", i);    
        if(5 == i)            
            break;
        i++;
    }while(i<10);    
    return 0; 
//1 2 3 4 5
#include<stdio.h>
int main()
{
    int i = 10;     
    do
    {   
        printf("%d\n", i);    
        if(5 == i)            
            continue;
        i++;
    }while(i<10);    
    return 0;
}
//1 2 3 4 5 5 5 5 5 5 ...

3.4 练习 

  • 计算 n的阶乘。 
  • 计算 1!+2!+3!+……+10! 
  • 在一个有序数组中查找具体的某个数字n。(二分查找) 
  • 编写代码,演示多个字符从两端移动,向中间汇聚。 
  • 写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则 提示登录成,如果三次均输入错误,则退出程序。
#include<stdio.h>
int main()
{
       int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
       int k = 7;//查找7
       int left = 0;
       int right = 9;
       int flag = 0;
       while (left <= right)
       {
              int mid = (left + right) / 2;
              if (arr[mid] > k)
              {
                      right = mid - 1;
              }
              else if (arr[mid] < k)
              {
                      left = mid + 1;
              }
              else
              {
                      printf("找到了,下标是:%d\n", mid);
                      flag = 1;
                      break;
              }
       }
       if (flag == 0)
              printf("找不到\n");
       return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值