6.7逗号运算符

逗号运算符的作用:

在本例中,for 循环包含了值的初始化,以及自增减,相对于三个主要条件语句,初始化,条件,自增减,增加了一些功能,比如值的运算,对变量的赋值。两个值之间的相互赋值;

存在多个语句,而语句之间有相关性,前面的语句可能作为后面语句的运算单元,所以使用逗号来隔开多个语句

所以我们可以推到逗号运算符的作用,它可以指定程序执行语句的顺序,从左到右,按照符号先后运算;其次逗号前面的语句会作为逗号后面语句的条件,或者值,他们之间存在着联系,因为这层联系,不必使用分号隔开。

  1. /*postage.c -- 一类邮政资费*/
  2. //逗号的作用:作为运算符,1,制定顺序(相当于一个序列点),从左到右走运算;2,作为右侧的赋值
  3. #include <stdio.h>
  4. int main(void)
  5. {
  6. const int FIRST_OZ = 46;
  7. const int NEXT_OZ = 20;
  8. int ounces, cost;
  9. printf(" ounces cost\n"); //表头
  10. for (ounces = 1, cost = FIRST_OZ; ounces <= 16; ounces++, cost += NEXT_OZ)
  11. printf("%5d $%4.2f\n", ounces, cost / 100.0);
  12. return 0;
  13. }

image.png

程序清单6.7.1当Zeno遇到for循环
这份代码主要说明代码可以用来计算序列
image.png

6.8出口循环条件: do while

该语句相当于until to直到 ……才,而while语句是那个循环控制条件,do控制的是需要循环的部分;

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. const int secret_code = 13;
  5. int code_entered;
  6. do
  7. {
  8. printf("To enter the triskaidekaphobia therapy club,\n");
  9. printf("please enter the secret code number: ");
  10. scanf_s("%d", &code_entered);
  11. } while (code_entered != secret_code);
  12. printf("Congratulations! You are cured!\n");
  13. return 0;
  14. }

image.png

小结

入口循环和出口循环,该如何循环?

一般入口循环比较多,原因有两点:1,条件放在控制语句最前面,可读性高,关键信息就在显眼处;2,在循环之前就测试条件,这样出问题的概率更低;

二者引用场景的比较:

do while适合必须循环一次的语句,for语句适合需要初始化,以及变量自增减的多语句情况,虽然while也可以,但自增减一般写在代码块内部的最后一条,直观性差一些;条件判断式各有优劣,如果需要循环判断输入结果,那么显然while更合适,因为该控制语句条件控制语句的代码量小,能够直取要义;

6.10嵌套循环

代码解析:外层循环控制循环次数,内层循环控制打印的字符个数,这里明显是四个,也就是外层循环每运行一次就打印四个字符;

这里面需要注意:循环的起止条件,全局变量,以及控制换行的printf()语句;

  1. #include <stdio.h>
  2. #define ROW 6
  3. #define CHARS 10
  4. int main(void)
  5. {
  6. int row;
  7. char ch;
  8. for (row = 0; row < ROW; row++)
  9. {
  10. for (ch = 'A'; ch < ('A' + CHARS); ch++)
  11. printf("%c", ch);
  12. printf("\n");
  13. }
  14. return 0;
  15. }

image.png

两次嵌套循环的比较

const限定变量为只读;
#define是宏定义;语法格式:#define 标识符 替换列表(替换列表可以是数,字符串字面量,标点符号,运算符,标识符,关键字,字符常量。注意:替换列表是可以为空的)

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. const int ROWS = 6;
  5. const int CHARS = 6;
  6. int row;
  7. char ch;
  8. for (row = 0; row < ROWS; row++)
  9. {
  10. for (ch = ('A' + row); ch < ('A' + CHARS); ch++)
  11. printf("%c", ch);
  12. printf("\n");
  13. }
  14. return 0;
  15. }

俩次嵌套循环的比较.png

6.11 数组简介

数组的概念:

计算机内连续存储,使用下标确定元素的相对位置;元素的数据类型是多样的;如果字符数组末尾有\0,则其成为了字符串数组;小技巧:编译器不会检验索引值是否越界;

6.11.1在for循环中使用数组

涉及到数组的知识:高尔夫成绩是如何填入数组而又如何读出来的?,还是按照索引的方法,由scanf语句负责链接,在python中需要一个变量接收input语句输入的值,数值计算还需要数据类型转换,这里直接声明,只需要索引值自增减。而在python中使用append语句可以直接在填充末尾填充,如果是队列,就可以在队头填充,队尾读出并且删除。

有一个小细节需要注意:我认为应该说明一下高尔夫成绩是百分计数还是十分计数。但我认为是百分,不然后面的做差的结果直接就是负数。在现实生活中很少用负数来表示什么(温度除外);

  1. /*socres_in.c -- 使用循环处理数组*/
  2. #include <stdio.h>
  3. #define SIZE 10
  4. #define PAR 72
  5. int main(void)
  6. {
  7. int index, score[SIZE];
  8. int sum = 0;
  9. float average;
  10. // 循环获取用户输入的十杆高尔夫成绩
  11. printf("Enter %d golf socres:\n", SIZE);
  12. for (index = 0; index < SIZE; index++)
  13. scanf_s("%d", &score[index]);
  14. // 循环打印之前输入的十杆高尔夫成绩
  15. printf("The scores read in are as follows: \n");
  16. for (index = 0; index < SIZE; index++)
  17. printf("%5d", score[index]);
  18. printf("\n");
  19. // 求十杆成绩的平均
  20. for (index = 0; index < SIZE; index++)
  21. sum += score[index];
  22. average = (float)sum / SIZE;
  23. printf("Sum of scores = %d, average = %.2f\n", sum, average);
  24. printf("That's a handicap of %.0f.\n", average - PAR);
  25. return 0;
  26. }

image.png

小结

1,第三行的明示常量,使得我们修改数组长度,从而计算多个成绩变得简单快捷;

2,该代码使用三个循环语句,使得代码的模块化能力增强,各自负责一块功能,那么程序的可读性也很强悍,缺点就是代码量优点大;

3,在模块的设计上,会使用for循环打印之前输入的值,这样有助于检验运算过程;

4,使用SIZE来控制数组的边界;

6.12使用函数返回值的循环示例

涉及到的知识点 —- ANSI函数原型

ANSI函数原型声明是必须的,这是一个前置声明,因为编译器还没有识别到main函数后的power函数,需要提前声明;

该标准的要求是声明函数名称,返回值类型,参数类型

注意:函数声明是一个完整语句,需要分号。而函数定义末尾是没有分号的,因为它仅仅标识着函数的开始,分号会在代码块的结束,也就是右花括号哪里出现;

  1. #include <stdio.h>
  2. double power(double n, int p); // ANSI函数原型声明
  3. int main()
  4. {
  5. double x, xpow;
  6. int exp;
  7. printf("Enter a number and the positive integer power");
  8. printf("to which\n the number will be raised. Enter q");
  9. printf("to quit .\n");
  10. while (scanf_s("%lf%d", &x, &exp) == 2)
  11. {
  12. xpow = power(x, exp);
  13. printf("%.3g to the power %d is %.5g\n", x, exp, xpow);
  14. printf("Enter next pair of numbers or q to quit.\n");
  15. }
  16. printf("Hope you enjoyed this power trip -- bye!\n");
  17. return 0;
  18. }
  19. double power(double n, int p)
  20. {
  21. double pow = 1;
  22. int i;
  23. for (i = 1; i <= p; i++)
  24. pow *= n;
  25. return pow;
  26. }

image.png

第六章知识点总结和梳理

三种循环,俩种入口循环,一种出口循环;

函数原型;

函数的声明和调用