• 【C语言_C语言语句_复习篇】


    目录

    一、C语言的语句有哪些

            1.1 空语句

            1.2 表达式语句

            1.3 函数调用语句

            1.4 复合语句

            1.5 控制语句

     二、分支语句(两种)

            1.1 if语句

                    1.1.1  普通分支语句(if、if_else)

                    1.1.2  嵌套if语句

                    1.1.3  else嵌套if两种写法的比较

                    1.1.4  else悬空问题

                    1.1.5  if语句的代码可读性

            1.2  switch语句(不常用)

    三、循环语句 

             3.1 while循环

             3.2 do_while循环(不常用)

             3.3 for循环

             3.4 循环嵌套的练习

     四、转向语句

            4.1 break 语句

            4.2 continue 语句

            4.3 goto 语句

            4.4 return 语句

    五、选择语句_例题

    六、循环控制_例题

    七、循环打印二维图形_例题


    一、C语言的语句有哪些

    1. C语言代码由一条条语句构成,每条语句的结束标志是封号

    2. C语言的语句有5大类分别是空语句表达式语句函数调用语句复合语句控制语句

    1.1 空语句

    1. 概念:封号前面什么都不写的一条语句称为空语句。

    2. 用法:这里需要一条语句,但不希望这条语句其任何作用。

    1. int main()
    2. {
    3. ;//空语句
    4. return 0;
    5. }

     1.2 表达式语句

    1. 问:编程语言中表达式可以由什么构成?

        答:一个操作数、一个操作数和一个运算符、两个操作数和一个操作符,多个操作数和多  个操作符,例如:1,i++,1+2,1+2*3,c=a+b。

    2. 概念:封号前面是表达式的一条语句称为表达式语句。

    1. int main()
    2. {
    3. int i = 0;
    4. int a = 0, b = 0, c = 0;
    5. 1;//表达式语句
    6. i++;//表达式语句
    7. 1 + 2;//表达式语句
    8. 1 + 2 * 3;//表达式语句
    9. c = a + b;表达式语句
    10. return 0;
    11. }

    1.3 函数调用语句

    1. 概念:封号前面是函数调用的一条语句称为函数调用语句。

    2. 用法:在函数中需要利用具有某功能的函数时使用。

    1. int Add(int a, int b)
    2. {
    3. return a + b;
    4. }
    5. int main()
    6. {
    7. int a = 1;
    8. int b = 2;
    9. int sum = Add(a, b);//自定义函数的函数调用
    10. printf("%d\n", sum);//库函数的函数调用
    11. return 0;
    12. }

    1.4 复合语句

    1. 概念:被{ }包裹起来的所有语句整体被称为复合语句。

    2. 补充:一个{ }被称为一个代码块。

    1. //在屏幕上打印用*组成的金字塔,行高列宽均为4
    2. int main()//复合语句1
    3. {
    4. int i = 0
    5. for (i = 0; i < 4; i++)//复合语句2
    6. {
    7. int j = 0;
    8. //空白
    9. for (j = 0; j < 4 - 1 - i; j++)//复合语句3
    10. {
    11. printf(" ");
    12. }
    13. //星星
    14. for (j = 0; j <= i; j++)//复合语句4
    15. {
    16. printf("*");
    17. }
    18. //换行
    19. printf("\n");
    20. }
    21. return 0;
    22. }

     1.5 控制语句

    1. 概念:控制语句共9种,用于控制程序的执行流程,实现顺序、选择和循环结构

        ① 选择语句:if_else语句、switch语句

        ② 循环语句:while语句、do_while语句、for语句

        ③ 转向语句:break语句、continue语句、goto语句、return语句

     二、分支语句(两种)

    1.1 if语句

    1.1.1  普通分支语句(if、if_else)

    1. 如果表达式成立就执行...否则就执行...。

    2. if 和 else 默认只能控制一条语句,相同时控制多条语句需使用{ }括起来。

    1.1.2  嵌套if语句

    1. 如果表达式1成立并且表达式2成立就执行...否则就执行...。

    2. 如果表达式1不成立的基础上表达式2成立就执行...否则就执行...。

    3. if_else if _else 适用于将主线直接分成几部分的情况。

    4.   总之,if语句的嵌套,其实就是将分支单元划分为更小的分支单元。if中直接嵌套if表示条件的条件,eles中嵌套if,普通写法表示将上一个条件不满足的部分划分为更小的分支单元,而 if_else if _else 写法常用于题目中有明显想将主线划分为多个并列分支单元的意向。

    1.1.3  else嵌套if两种写法的比较

    1. //else嵌套if两种写法的比较:
    2. //两种写法本质是一个意思,只是在于使用者喜欢怎样去使用
    3. //题目:判断整型n是正数、负数还是0
    4. //写法一:
    5. int main()
    6. {
    7. int n = 0;
    8. scanf("%d", &n);
    9. //判断
    10. if(n > 0)
    11. {
    12. printf("%d是正数\n", n);
    13. }
    14. else//else部分就只剩下<=0的情况了
    15. {
    16. //理解成剩余部分再划分的写法
    17. if(n < 0)
    18. {
    19. printf("%d是负数\n", n);
    20. }
    21. else
    22. {
    23. printf("%d是0\n", n);
    24. }
    25. }
    26. return 0;
    27. }
    28. //写法二:
    29. int main()
    30. {
    31. int n = 0;
    32. scanf("%d", &n);
    33. //判断
    34. if(n > 0)
    35. {
    36. printf("%d是正数\n", n);
    37. }
    38. else if(n < 0)//理解成主线划分的多个并列的分支写法
    39. {
    40. printf("%d是负数\n", n);
    41. }
    42. else
    43. {
    44. printf("%d是0\n", n);
    45. }
    46. return 0;
    47. }

    1.1.4  else悬空问题

    1. 问题起源:在写C语言题目或读别人的代码时,由于代码可读性差导致我们无法准确判断if语句中的else到底是跟着哪个if,因而造成了else悬空问题。

    2. 解决方法:代码从上往下读,只要遇到else就根据else总是与最近的未配对的if配对原则进行匹配即可。

    1. int main()
    2. {
    3. int a = 1;
    4. int b = 2;
    5. if ( a == 0 )
    6. if ( b == 2 )
    7. printf("123\n");
    8. else
    9. printf("abc\n");
    10. return 0;
    11. }
    12. //这段代码在屏幕上什么都不会打印
    13. //是因为该代码中的else与第二个if配对,而不是与第一个if配对

    1.1.5  if语句的代码可读性

    1. //示例1:比较变量a和常数3是否相等,相等就在屏幕上打印hehe
    2. int main()
    3. {
    4. int a = 0;
    5. if (a = 3)//手误写法,最终会造成表达逻辑有误
    6. {
    7. printf("hehe\n");
    8. }
    9. }
    10. //启示:
    11. //变量和常数比较是否相等时,把常数写在左边,变量写在右边
    12. //这样当我们粗心把==写成=时编译器会报警告,而不是继续编译
    13. //示例2:虽节省空间,但可读性差
    14. int main(){
    15. int a = 0;
    16. if (a == 0){
    17. printf("hehe\n");
    18. }else{
    19. printf("haha\n");
    20. }
    21. //启示:
    22. //不能省的空间不要省,无论控制1条还是控制多条语句都写上代码块
    23. //示例3:可读性好
    24. int main()
    25. {
    26. int arr[] = { 1,2,3 };
    27. int sz = sizeof(arr) / sizeof(arr[0]);//定义数字后立即计算数组大小
    28. int i = 0;
    29. for (i = 0; i < sz; i++)
    30. {
    31. if (2 == arr[i])//比较常量和变量是否相等时,常量在左,变量在右
    32. {
    33. printf("hehe");//不管控制几条语句,都采用代码块括起来
    34. }
    35. }
    36. return 0;
    37. }

    1.2  switch语句(不常用)

    1. switch语句可实现多分支,由于使用条件苛刻所以在特定情况下才主动使用switch语句。

    2. 苛刻条件:

    ①switch后面的表达式必须是整型表达式。

    ②case后面的值必须是整型常量表达式(字符是特殊的整型类型,枚举类型也可以)。

    3. 需要理解:

    ①case和default相当于每个分支的入口,而break相当于每个分支的出口,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执⾏,直到遇到break语句或者来到switch语句的结尾才会跳出switch语句。

    ②当所有case都不满足时,才执行default分支,default分支可依据具体情况选择写还是不写

    ③每个switch语句只能有一个default分支。

    ④case和default分支没有顺序要求,但dafault通常写在最后面。

    ⑤switch语句的最后一个分支可以不写break,但最好是写上。

    1. switch(表达式)
    2. {
    3. case1
    4. 语句1;
    5. 语句2;
    6. ...
    7. break;
    8. case2
    9. 语句1;
    10. 语句2;
    11. ...
    12. break;
    13. case3
    14. 语句1;
    15. 语句2;
    16. ...
    17. break;
    18. ...
    19. default:
    20. 语句1;
    21. 语句2;
    22. ...
    23. break;
    24. }

    三、循环语句 

     3.1 while循环

    1. 特点:循环条件总是比循环体多执行一次,且循环变量需在循环体内部调整。

    2. 补充:想要一直循环可以将表达式写成恒真的形式,例如:while(1)。

    3. 运行过程:先判断while后面的表达式是否为真,如果为真就执行一次循环体的内容,执行完后,程序又会来到while循环的第一行,继续判断while后面的表达式是否为真;如果为假,程序将跳过整个循环体的代码块,不会执行循环体的任何内容。

     3.2 do_while循环(不常用)

    1. 特点:循环体至少执行一次,且循环变量需在循环体内部调整。

    2. 注意:do_while中while后面的封号别忘记写了。

    3. 运行过程:先执行do后面代码块内的所有内容,执行完后来到while所在行,判断while后面的表达式是否为真,如果为真将继续执行一次循环体内的所有内容;如果为假,将跳出循环来到while(表达式)的下一行。

     3.3 for循环

    1. 表达式1:循环变量初始化部分

        表达式2:循环是否继续的条件

        表达式3:循环变量的调整

    2. 特点:表达式1至执行一次,表达式2总是比循环体多执行一次。

    3. 注意:①表达式之间是用封号隔开的 ②表达式1、2、3均可以省略,但并不建议省略 ③for循环的循环条件所含的循环变量不一定要写在表达式3的位置,例如,《国王发金币问题》[NOIP2015]金币_牛客题霸_牛客网 (nowcoder.com)

    4. 运行过程:先执行表达式1,再就表达式2的真假判断是否要执行循环体的内容,如果表达式2为真,那么将执行一次循环体内的内容,执行完后,程序将回到for循环的第一行,执行表达式3,执行完后,再次执行表达式2,判断是否要继续执行循环体的内容;如果表达式2为假,程序将跳过整个循环体的代码块,不会执行循环体的任何内容,包括表达式3。

     

    1. //《国王发金币问题》
    2. 解法一:
    3. int main()
    4. {
    5. int k = 0;
    6. scanf("%d", &k);
    7. int day = 0;//已计算的天数
    8. int sum = 0;//发放的金币总和
    9. for(int money = 1; day < k; money++)
    10. {
    11. for(int i = 0; i < money; i++)
    12. {
    13. sum += money;
    14. day++;
    15. if(day == k)
    16. {
    17. break;
    18. }
    19. }
    20. }
    21. //输出
    22. printf("%d\n", sum);
    23. return 0;
    24. }
    25. //解法二:
    26. int main()
    27. {
    28. int k = 0;
    29. scanf("%d", &k);
    30. int day = 0;//已发金币的天数
    31. int money = 1;
    32. int sum = 0;
    33. while (money)
    34. {
    35. int i = 0;
    36. for (i = 0; i < money; i++)
    37. {
    38. sum += money;
    39. day++;
    40. if (day == k)
    41. {
    42. goto next;
    43. }
    44. }
    45. money++;
    46. }
    47. next:
    48. //输出结果
    49. printf("%d\n", sum);
    50. return 0;
    51. }

     3.4 循环嵌套的练习

    1. //【打印100~200之间的素数】
    2. int main()
    3. {
    4. int i = 0;
    5. //循环产⽣100~200的数字
    6. for(i=101; i<=200; i += 2)
    7. {
    8. int flag = 1;//假设每次得到的i是素数
    9. int j = 0;
    10. for(j=2; j<=(int)sqrt((double)i); j++)
    11. {
    12. if(i % j == 0)
    13. {
    14. flag = 0;
    15. break;
    16. }
    17. }
    18. //
    19. if(flag == 1)
    20. {
    21. printf("%d ", i);
    22. }
    23. }
    24. return 0;
    25. }

     四、转向语句

    4.1 break 语句

    1. 关键字break的作用:只要break在循环体中被执行,就会直接跳出当前所在的一层循环。

    4.2 continue 语句

    1. 关键字continue的作用:跳过本次循环体中后面的代码。

    4.3 goto 语句

    1. C语⾔提供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号,goto 语句可以实现在同⼀个函数内跳转到设置好的标号处,标号一定要顶格写。

    2. goto 语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以建议能不⽤尽量不去使⽤;但是 goto 语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出使⽤ goto 就⾮常的⽅便了。

    4.4 return 语句

    1. return后边可以是⼀个数值,也可以是⼀个表达式,如果是表达式则先执⾏表达式,再返回表达式的结果。

    2. return后边也可以什么都没有,直接写 return; 这种写法适合函数返回类型是void的情况。

    3. return返回的值和函数返回类型不⼀致,系统会⾃动将返回的值隐式转换为函数的返回类型。

    4. return语句执⾏后,函数就彻底返回,后边的代码不再执⾏,如下方图片代码。

    5. 如果函数中存在if等分⽀的语句,则要保证每种情况下都有return,否则会出现编译错误。

    五、选择语句_例题

    [NOIP2008]ISBN号码_牛客题霸_牛客网 (nowcoder.com)

    1. //18.ISBN号码
    2. //打印数组
    3. void Print(char arr[], int sz)
    4. {
    5. int i = 0;//循环变量
    6. for (i = 0; i < sz; i++)
    7. {
    8. printf("%c", arr[i]);
    9. }
    10. }
    11. int main()
    12. {
    13. char arr[13] = { '0' };
    14. int sz = sizeof(arr) / sizeof(arr[0]);
    15. int sum = 0;
    16. int j = 1;
    17. int i = 0;//循环变量
    18. for (i = 0; i < sz; i++)
    19. {
    20. scanf("%c", &arr[i]);
    21. if (i != 1 && i != 5 && i != 11 && i != 12)
    22. {
    23. sum += (arr[i] - 48) * (j++);
    24. }
    25. }
    26. //
    27. if (sum % 11 == 10)
    28. {
    29. if (arr[sz - 1] == 'X')
    30. {
    31. printf("Right\n");
    32. }
    33. else
    34. {
    35. arr[sz - 1] = 'X';
    36. Print(arr, sz);
    37. }
    38. }
    39. else
    40. {
    41. if (arr[sz - 1] == sum % 11 + 48)
    42. {
    43. printf("Right\n");
    44. }
    45. else
    46. {
    47. arr[sz - 1] = sum % 11 + 48;
    48. Print(arr, sz);
    49. }
    50. }
    51. return 0;
    52. }

    六、循环控制_例题

    包含数字9的数_牛客题霸_牛客网 (nowcoder.com)

    水仙花数_牛客题霸_牛客网 (nowcoder.com)

    变种水仙花_牛客题霸_牛客网 (nowcoder.com)

    小乐乐与进制转换_牛客题霸_牛客网 (nowcoder.com)

    [NOIP2015]金币_牛客题霸_牛客网 (nowcoder.com)

    回文对称数_牛客题霸_牛客网 (nowcoder.com)

    1. //5.求1~2019之间含有数字9的数有几个
    2. int main()
    3. {
    4. int i = 0;//循环变量
    5. int count = 0;//计数器
    6. for (i = 1; i < 2020; i++)
    7. {
    8. int i2 = i;//替身
    9. while (i2)
    10. {
    11. if (i2 % 10 == 9)
    12. {
    13. count++;
    14. break;
    15. }
    16. i2 /= 10;
    17. }
    18. }
    19. //输出
    20. printf("%d\n", count);
    21. return 0;
    22. }
    1. //7.求整数m~n之间的水仙花数
    2. #include
    3. int main()
    4. {
    5. int m = 0, n = 0;
    6. while (~scanf("%d %d", &m, &n))
    7. {
    8. int flag = 1;//如果这组中没有水仙花数
    9. for (; m <= n; m++)
    10. {
    11. int sum = 0;
    12. int m2 = m;
    13. while (m2)
    14. {
    15. sum += (int)pow(m2 % 10, 3.0);
    16. //调整
    17. m2 /= 10;
    18. }
    19. if (m == sum)
    20. {
    21. flag = 0;
    22. printf("%d ", m);
    23. }
    24. }
    25. 换行
    26. //printf("\n");//但题目的意思是不用换行
    27. //
    28. if (flag)
    29. {
    30. printf("no\n");
    31. }
    32. }
    33. return 0;
    34. }
    1. //8.求5位数中的所有变种水仙花数
    2. int main()
    3. {
    4. int i = 0;//循环变量
    5. for (i = 10000; i < 100000; i++)
    6. {
    7. int j = 0;//被除数
    8. int sum = 0;
    9. for (j = 10; j < 100000; j *= 10)
    10. {
    11. sum += (i % j) * (i / j);
    12. }
    13. if (i == sum)
    14. {
    15. printf("%d ", i);
    16. }
    17. 换行
    18. //printf("\n");//但题目的意思是不用换行
    19. }
    20. return 0;
    21. }
    1. //10.将一个10进制数转化成6进制数并输出
    2. int main()
    3. {
    4. int n = 0;
    5. int arr[20] = { 0 };
    6. int i = 0;
    7. scanf("%d", &n);
    8. while (n)
    9. {
    10. arr[i++] = n % 6;
    11. n /= 6;
    12. }
    13. //
    14. for (i--; i >= 0; i--)
    15. {
    16. printf("%d", arr[i]);//数组元素里面存的数字仍然是10进制的
    17. }
    18. return 0;
    19. }
    1. //11.国王发金币*
    2. int main()
    3. {
    4. int k = 0;
    5. scanf("%d", &k);
    6. int day = 0;//已发金币的天数
    7. int money = 1;
    8. int sum = 0;
    9. while (money)
    10. {
    11. int i = 0;
    12. for (i = 0; i < money; i++)
    13. {
    14. sum += money;
    15. day++;
    16. if (day == k)
    17. {
    18. goto next;
    19. }
    20. }
    21. money++;
    22. }
    23. next:
    24. //输出结果
    25. printf("%d\n", sum);
    26. return 0;
    27. }
    1. //12.回文对称数
    2. int main()
    3. {
    4. int n = 0;
    5. int i = 0;//循环变量
    6. scanf("%d", &n);
    7. for (i = 1; i <= n; i++)
    8. {
    9. int i2 = i;
    10. int sum = 0;
    11. while (i2)
    12. {
    13. sum = sum * 10 + i2 % 10;
    14. //调整
    15. i2 /= 10;
    16. }
    17. if (i == sum)
    18. {
    19. printf("%d\n", i);
    20. }
    21. }
    22. return 0;
    23. }

    七、循环打印二维图形_例题

    菱形图案_牛客题霸_牛客网 (nowcoder.com)

    K形图案_牛客题霸_牛客网 (nowcoder.com)

    1. //8.菱形图案*
    2. int main()
    3. {
    4. int n = 0;
    5. while (~scanf("%d", &n))
    6. {
    7. int i = 0;//行
    8. int j = 0;//列
    9. //上三角
    10. for (i = 0; i < n; i++)
    11. {
    12. //空格
    13. for (j = 0; j < n - i; j++)
    14. {
    15. printf(" ");
    16. }
    17. //星星
    18. for (j = 0; j <= i; j++)
    19. {
    20. printf("* ");
    21. }
    22. //换行
    23. printf("\n");
    24. }
    25. //下三角
    26. for (i = (n + 1); i > 0; i--)
    27. {
    28. //空格
    29. for (j = 0; j < (n + 1) - i; j++)
    30. {
    31. printf(" ");
    32. }
    33. //星星
    34. for (j = i; j > 0; j--)
    35. {
    36. printf("* ");
    37. }
    38. //换行
    39. printf("\n");
    40. }
    41. }
    42. return 0;
    43. }
    1. //9.K形图案*
    2. int main()
    3. {
    4. int n = 0;
    5. while (~scanf("%d", &n))
    6. {
    7. int i = 0;//行
    8. int j = 0;//列
    9. //上三角
    10. for (i = n; i > 0; i--)
    11. {
    12. for (j = i + 1; j > 0; j--)
    13. {
    14. printf("* ");
    15. }
    16. //换行
    17. printf("\n");
    18. }
    19. //下三角
    20. for (i = 0; i < n + 1; i++)
    21. {
    22. for (j = 0; j <= i; j++)
    23. {
    24. printf("* ");
    25. }
    26. //换行
    27. printf("\n");
    28. }
    29. }
    30. return 0;
    31. }

    八、图片

     

    本篇已完结。。。。。。 

  • 相关阅读:
    深入了解 XXE 注射
    数字化助力生产管理:计件工资管理系统
    Qt 窗口的坐标体系
    苹果5G芯片研发失败:继续依赖高通,还要担心被起诉?
    javaweb JAVA JSP零食销售系统购物系统ssm购物系统购物商城系统源码(ssm电子商务系统)网上零食在线销售
    在 Python 中将 Unicode 转换为 ASCII
    浅谈C++|STL之map篇
    未来十年世界数字化与机器智能展望
    机试(2017 cs se)
    【计算机网络】 TCP协议头相关知识点
  • 原文地址:https://blog.csdn.net/YX54201/article/details/136718221