6.7逗号运算符
逗号运算符的作用:
在本例中,for 循环包含了值的初始化,以及自增减,相对于三个主要条件语句,初始化,条件,自增减,增加了一些功能,比如值的运算,对变量的赋值。两个值之间的相互赋值;
存在多个语句,而语句之间有相关性,前面的语句可能作为后面语句的运算单元,所以使用逗号来隔开多个语句
所以我们可以推到逗号运算符的作用,它可以指定程序执行语句的顺序,从左到右,按照符号先后运算;其次逗号前面的语句会作为逗号后面语句的条件,或者值,他们之间存在着联系,因为这层联系,不必使用分号隔开。
/*postage.c -- 一类邮政资费*/
//逗号的作用:作为运算符,1,制定顺序(相当于一个序列点),从左到右走运算;2,作为右侧的赋值
#include <stdio.h>
int main(void)
{
const int FIRST_OZ = 46;
const int NEXT_OZ = 20;
int ounces, cost;
printf(" ounces cost\n"); //表头
for (ounces = 1, cost = FIRST_OZ; ounces <= 16; ounces++, cost += NEXT_OZ)
printf("%5d $%4.2f\n", ounces, cost / 100.0);
return 0;
}
程序清单6.7.1当Zeno遇到for循环
这份代码主要说明代码可以用来计算序列
6.8出口循环条件: do while
该语句相当于until to直到 ……才,而while语句是那个循环控制条件,do控制的是需要循环的部分;
#include <stdio.h>
int main(void)
{
const int secret_code = 13;
int code_entered;
do
{
printf("To enter the triskaidekaphobia therapy club,\n");
printf("please enter the secret code number: ");
scanf_s("%d", &code_entered);
} while (code_entered != secret_code);
printf("Congratulations! You are cured!\n");
return 0;
}
小结
入口循环和出口循环,该如何循环?
一般入口循环比较多,原因有两点:1,条件放在控制语句最前面,可读性高,关键信息就在显眼处;2,在循环之前就测试条件,这样出问题的概率更低;
二者引用场景的比较:
do while适合必须循环一次的语句,for语句适合需要初始化,以及变量自增减的多语句情况,虽然while也可以,但自增减一般写在代码块内部的最后一条,直观性差一些;条件判断式各有优劣,如果需要循环判断输入结果,那么显然while更合适,因为该控制语句条件控制语句的代码量小,能够直取要义;
6.10嵌套循环
代码解析:外层循环控制循环次数,内层循环控制打印的字符个数,这里明显是四个,也就是外层循环每运行一次就打印四个字符;
这里面需要注意:循环的起止条件,全局变量,以及控制换行的printf()语句;
#include <stdio.h>
#define ROW 6
#define CHARS 10
int main(void)
{
int row;
char ch;
for (row = 0; row < ROW; row++)
{
for (ch = 'A'; ch < ('A' + CHARS); ch++)
printf("%c", ch);
printf("\n");
}
return 0;
}
两次嵌套循环的比较
const限定变量为只读;
#define是宏定义;语法格式:#define 标识符 替换列表(替换列表可以是数,字符串字面量,标点符号,运算符,标识符,关键字,字符常量。注意:替换列表是可以为空的)
#include <stdio.h>
int main(void)
{
const int ROWS = 6;
const int CHARS = 6;
int row;
char ch;
for (row = 0; row < ROWS; row++)
{
for (ch = ('A' + row); ch < ('A' + CHARS); ch++)
printf("%c", ch);
printf("\n");
}
return 0;
}
6.11 数组简介
数组的概念:
计算机内连续存储,使用下标确定元素的相对位置;元素的数据类型是多样的;如果字符数组末尾有\0,则其成为了字符串数组;小技巧:编译器不会检验索引值是否越界;
6.11.1在for循环中使用数组
涉及到数组的知识:高尔夫成绩是如何填入数组而又如何读出来的?,还是按照索引的方法,由scanf语句负责链接,在python中需要一个变量接收input语句输入的值,数值计算还需要数据类型转换,这里直接声明,只需要索引值自增减。而在python中使用append语句可以直接在填充末尾填充,如果是队列,就可以在队头填充,队尾读出并且删除。
有一个小细节需要注意:我认为应该说明一下高尔夫成绩是百分计数还是十分计数。但我认为是百分,不然后面的做差的结果直接就是负数。在现实生活中很少用负数来表示什么(温度除外);
/*socres_in.c -- 使用循环处理数组*/
#include <stdio.h>
#define SIZE 10
#define PAR 72
int main(void)
{
int index, score[SIZE];
int sum = 0;
float average;
// 循环获取用户输入的十杆高尔夫成绩
printf("Enter %d golf socres:\n", SIZE);
for (index = 0; index < SIZE; index++)
scanf_s("%d", &score[index]);
// 循环打印之前输入的十杆高尔夫成绩
printf("The scores read in are as follows: \n");
for (index = 0; index < SIZE; index++)
printf("%5d", score[index]);
printf("\n");
// 求十杆成绩的平均
for (index = 0; index < SIZE; index++)
sum += score[index];
average = (float)sum / SIZE;
printf("Sum of scores = %d, average = %.2f\n", sum, average);
printf("That's a handicap of %.0f.\n", average - PAR);
return 0;
}
小结
1,第三行的明示常量,使得我们修改数组长度,从而计算多个成绩变得简单快捷;
2,该代码使用三个循环语句,使得代码的模块化能力增强,各自负责一块功能,那么程序的可读性也很强悍,缺点就是代码量优点大;
3,在模块的设计上,会使用for循环打印之前输入的值,这样有助于检验运算过程;
4,使用SIZE来控制数组的边界;
6.12使用函数返回值的循环示例
涉及到的知识点 —- ANSI函数原型
ANSI函数原型声明是必须的,这是一个前置声明,因为编译器还没有识别到main函数后的power函数,需要提前声明;
该标准的要求是声明函数名称,返回值类型,参数类型
注意:函数声明是一个完整语句,需要分号。而函数定义末尾是没有分号的,因为它仅仅标识着函数的开始,分号会在代码块的结束,也就是右花括号哪里出现;
#include <stdio.h>
double power(double n, int p); // ANSI函数原型声明
int main()
{
double x, xpow;
int exp;
printf("Enter a number and the positive integer power");
printf("to which\n the number will be raised. Enter q");
printf("to quit .\n");
while (scanf_s("%lf%d", &x, &exp) == 2)
{
xpow = power(x, exp);
printf("%.3g to the power %d is %.5g\n", x, exp, xpow);
printf("Enter next pair of numbers or q to quit.\n");
}
printf("Hope you enjoyed this power trip -- bye!\n");
return 0;
}
double power(double n, int p)
{
double pow = 1;
int i;
for (i = 1; i <= p; i++)
pow *= n;
return pow;
}
第六章知识点总结和梳理
三种循环,俩种入口循环,一种出口循环;
函数原型;
函数的声明和调用