分支语句(选择结构)

if语句

1. 关于语句

C语言中由 ; 隔开的语句就是一条语句。

2.语法结构

if 和 else 后面的语句只能执行一条,若想执行多条语句,应该用{ }括起来,组成一个代码块。

  1. if(表达式)
  2. 语句;
  3. /*C语言中如何表示真假?*/
  4. /*真:非0就是真。假:0就是假*/
  1. if (表达式)
  2. 语句1;
  3. else
  4. 语句2;
  1. if (表达式1)
  2. 语句1;
  3. else if (表达式2)
  4. 语句2;
  5. else
  6. 语句3;

3.使用案例

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int age=20;
  5. if(age>=18)
  6. printf("成年!\n");
  7. else
  8. printf("未成年!\n");
  9. return 0;
  10. }
  1. #include<stdio.h>
  2. int main()
  3. {
  4. int age = 99;
  5. if (age < 18)
  6. printf("少年\n");
  7. else if (age >= 18 && age <= 26)
  8. printf("青年\n");
  9. else if (age > 26 && age <= 40)
  10. printf("中年\n");
  11. else if (age > 40 && age <= 60)
  12. printf("壮年\n");
  13. else (age > 60 && age <= 100);
  14. printf("老年");
  15. return 0;
  16. }
  1. #include<stdio.h>
  2. int main()
  3. {
  4. int a = 0;
  5. int b = 2;
  6. if (a == 1)
  7. if (b == 2)
  8. printf("牛蛙\n");
  9. else
  10. printf("牛啊\n");
  11. return 0;
  12. }
  13. /*打印结果是什么也没打印,为什么??*/
  14. /*else就近原则:else会与离与它最近的if进行匹配。*/
  1. #include<stdio.h>
  2. int main()
  3. {
  4. int num = 15;
  5. if (num % 2 == 1)/*任何一个数除以2的余数为1则为奇数,余数为0则为偶数*/
  6. printf("奇数\n");
  7. else
  8. printf("偶数\n");
  9. return 0;
  10. }
  1. /*方法一*/
  2. #include<stdio.h>
  3. int main()
  4. {
  5. int i = 0;
  6. for (i = 1; i <= 100; i++)
  7. {
  8. if (1==i%2)
  9. printf("%d\n", i);
  10. }
  11. return 0;
  12. }
  13. /*方法2*/
  14. #include<stdio.h>
  15. int main()
  16. {
  17. int i = 0;
  18. for (i = 1; i <= 100; i+=2)
  19. {
  20. printf("%d\n", i);
  21. }
  22. return 0;
  23. }

switch语句

1.使用情况

常用于多分支的场景。

2.语法结构

  1. switch(整型表达式)
  2. {
  3. 语句项;
  4. }
  5. /*语句项是一般是什么?*/
  6. 语句项一般都是一些case语句:
  7. case 整型常量表达式;
  8. 语句1break;
  9. //break语句的作用:在程序完成一个switch语句后跳出switch语句的作用
  10. //defalut语句的作用:所有case不能匹配的情况下使用

3.使用案例

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int day = 0;
  5. scanf("%d", &day);
  6. switch (day)
  7. {
  8. case 1:
  9. printf("星期一\n"); break;
  10. case 2:
  11. printf("星期二\n"); break;
  12. case 3:
  13. printf("星期三\n"); break;
  14. case 4:
  15. printf("星期四\n"); break;
  16. case 5:
  17. printf("星期五\n"); break;
  18. case 6:
  19. printf("星期六\n"); break;
  20. case 7:
  21. printf("星期日\n"); break;
  22. default:
  23. printf("请输入1至7的数字。\n"); break;
  24. }
  25. return 0;
  26. }
  1. #include<stdio.h>
  2. int main()
  3. {
  4. int day;
  5. scanf("%d", &day);
  6. switch (day)
  7. {
  8. case 1:
  9. case 2:
  10. case 3:
  11. case 4:
  12. case 5:
  13. printf("工作日"); break;
  14. case 6:
  15. case 7:
  16. printf("休息日"); break;
  17. default:
  18. printf("请输入1至7的数字。\n"); break;
  19. }
  20. return 0;
  21. }
  1. //计算出m与n的值;m=5;n=3
  2. #include<stdio.h>
  3. int main()
  4. {
  5. int n = 1;
  6. int m = 2;
  7. switch (n)
  8. {
  9. case 1:
  10. m++;
  11. case 2:
  12. n++;
  13. case 3:
  14. switch (n)
  15. {
  16. case 1:
  17. n++;
  18. case 2:
  19. m++; n++; break;
  20. }
  21. case 4:
  22. m++; break;
  23. default:
  24. break;
  25. }
  26. printf("m=%d,n=%d\n", m, n);
  27. return 0;
  28. }
  29. //switch允许进行嵌套使用;

循环语句(循环结构)

while循环

1.执行流程

分支语句和循环语句 - 图1

2.语法结构

while(表达式)
    循环语句;
//在while循环中,break用于永久的终止循环。
//在while循环中,continue用于跳过本次循环continue后面的代码,直接去判断部分。

3.使用案例

#include<stdio.h>
int main()
{
    int i=1;
    while (i < 100)
    {
        printf("%d  ", i);
        i++;
    }
    return 0;
}
#include<stdio.h>
int main ()
{
    int ch = 0;
    while ((ch = getchar() ) != EOF )
    {
        putchar(ch);
    }
return 0;
}    
//getchar的作用是从键盘上获取一个字符
//putchar的作用是输入一个字符        
//EOF 是文件结束的标志
//ctrl+z 回车就能让getchar结束

getchar的作用是从键盘上获取一个字符
putchar的作用是输入一个字符
EOF 是文件结束的标志
ctrl+z 回车就能让getchar结束

#include<stdio.h>
int main()
{
    int ch = 0;
    while ((ch = getchar()) != EOF)
    {
        if (ch < '0' || ch>'9')
            continue;
        putchar(ch);
    }
    return 0;
}
#include<stdio.h>
int main()
{
    char password[20] = { 0 };
    printf("请输入密码:");
    scanf("%s", password);
    printf("请确认密码(y/n)");
    //scanf拿走了前面的数据,但没拿走回车键带来的\n,此时缓冲区中还存在数据
    //清理缓冲区内的多个字符
    int tmp = 0;
    while ((tmp = getchar()) != '\n')
    {
        ;
    }
    int ch = getchar();
    if (ch == 'y')
    {
        printf("确认成功\n");
    }
    else
    {
        printf("确认失败\n");
    }
    return 0;
}

getchar和scanf都被称为输入函数,如果缓冲区中有数据,输入函数会直接在中间的输入缓冲区拿数据,如果缓冲区没有数据,输入函数会等待你从键盘中向缓冲区输入数据,而回车会在缓冲区中放入 \n 。
可以使用while循环清理掉缓冲区里面的所有内容:

    int tmp = 0;
    while ((tmp = getchar()) != '\n')
    {
        ;
    }

for循环

1.执行流程

分支语句和循环语句 - 图2

2.语法结构

for(表达式1;表达式2;表达式3)
    循环语句;
//表达式1:初始化
//表达式2:条件判断
//表达式3:调整部分

for循环内部改变循环变量不可取!
for语句的循环控制变量的取值建议采用“前闭后开区间”写法 !

3.使用案例

#include<stdio.h>
int main()
{
    int i = 0;
    for (i = 1; i <= 10; i++)
    {
        printf("%d  ", i);
    }
    return 0;
}
#include<stdio.h>
int main()
{
    int arr[10] = {0};
    int i = 0;
    for (i = 1; i < 10; i++)/*左闭右开区间*/
    {
        printf("%d  ", arr[i]);
    }
    return 0;
}
#include<stdio.h>
int main()
{
    int i = 0;
    int k = 0;
    for (i = 0, k = 0; k = 0; i++, k++)
        k++;
    return 0;
}

//答案:一次都没有;因为是= 而 = 是赋值,并非是判断。

do while循环

1.执行流程

do while 循环体至少要执行一次!!

分支语句和循环语句 - 图3

2.语法结构

do
    循环语句;
while (表达式);

3.使用案例

#include<stdio.h>
int main()
{
    int i = 1;
    do
    {
        printf("%d  ", i);
        i++;
    } while (i <= 10);
    return 0;
}

循环训练

1.计算n的阶乘

#include<stdio.h>
int main()
{
    int i = 0;
    int n = 0;
    int sum = 1;
    scanf("%d", &n);
    for (i = 1; i <= n; i++)
    {
        sum *= i;
        //sum*=i与sum=sum*i相同
    }
    printf("%d", sum);
    return 0;
}

2.计算1!+ 2!+ 3!+…….+10!

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

3.在一个有序数组中查找具体的某个数字n

#include<stdio.h>
int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int k = 7;//要查找的数字 7
    //在arr这个有序数组中查找k的值7
    int sz = sizeof(arr) / sizeof(arr[0]);//数组的元素个数
    int left = 0;
    int right = sz - 1;
    while (left<=right)
    {
        int mid = (left + right) / 2;
        if (arr[mid] < k)
        {
            left = mid + 1;
        }
        else if (arr[mid] > k)
        {
            right = mid - 1;
        }
        else
        {
            printf("找到了下标为:%d\n", mid);
            break;
        }
    }
    if (left > right)
    {
        printf("找不到!\n");
    }
    return 0;
}