你该逆袭了
第6章:重点摘录
- 零、本章内容介绍
- 一、while 循环
- 1、程序注释
- (1)伪代码
- 2、C 风格读取循环
- 二、while 语句
- 1、终止 while 循环
- 2、语法要点
- 三、用 关系运算符 和 表达式 比较大小
- 1、fabs( ) 函数 比较 浮点数
- (1) fabs( ) 函数
- 2、什么是 真?
- 3、_Bool 类型
- 4、优先级 和 关系运算符
零、本章内容介绍
1、关键字:for、while、do while
2、运算符:<、>、>=、<=、!=、==、+=、*=、-=、/=、%=
3、函数:fabs( )
4、C 语言有 3 中循环:for、while、do while
5、使用 关系运算符 构建 控制循环 的表达式
6、其他运算符
7、循环常用的数组
8、编写有返回值的函数
一、while 循环
1、程序注释
//P137 程序清单6.1
//根据用户键入的整数求和
#include <stdio.h>
int main()
{
long num = 0;
long sum = 0;
int status = 0L; //尽管C编译器会把 0 自动转换为合适的类型,
//但是为了保持程序的一致性,我们把 sum 初始化为 0L (long 类型),而不是 0 (int 类型)
printf("please enter an integer to be summed ");
printf("(q to quit):");
status = scanf("%ld", &num);
while (status == 1)
{
sum = sum + num;
printf("please enter next integer (q to quit):"); //因为输入的字符不是数字(如,q)
//scanf( )会读取失败并返回 0 .此时,status 的值就是 0,循环结束。
//因为输入的字符 q 不是数字,所以它会被放回输入队列
//实际上,不仅仅是 q ,任何非数值的数据都会被导致循环终止
status = scanf("%ld", &num);
}
printf("those integers sum to %ld.\n", sum);
return 0;
}
(1)伪代码
优点:把注意力集中在程序的组织和逻辑上,不用再设计程序时还要分心如何用编程语言来表达自己的想法。
2、C 风格读取循环
同时使用scanf( )的两种不同的特性。
首先,如果函数调用成功,scanf( )会把一个值存入 num。
然后,利用 scanf( ) 的返回值(0或1,不是 num 的值)控制 while 循环。
while (scanf("%ld", &num) == 1)
{
/*循环行为*/
}
二、while 语句
1、终止 while 循环
#include <stdio.h>
int main()
{
int index = 1;
while (--index < 5)
{
printf("haha\n"); //会打印很多个 haha
} //index 减少到其类型到可容纳的最小负值变成最大正值时会终止循环
return 0;
}
整数溢出:P49
2、语法要点
三、用 关系运算符 和 表达式 比较大小
while (ch != '$') //可以比较单个字符,
{ //但是,不可以用关系运算符比较“字符串”,
//第十一章,会介绍如何比较字符串
count++;
scanf("%c", &ch);
}
1、fabs( ) 函数 比较 浮点数
虽然 关系运算符 可以用来 比较浮点数,但是要注意:比较 浮点数 时,尽量使用 大于号 ‘ > ’ 和 小于号 ’ < '。因为,浮点数 的 舍入误差 会导致 在逻辑上应该相等的两个数却不相等。例如:3 乘以 1/3 的积是 1.0。如果用把 1/3 表示成 小数点后面 6 位数字,乘积则是:0.999999,不等于 1 。
使用 fabs( ) 函数(声明在 math.h 头文件中)可以方便地比较浮点数,该函数返回一个浮点值地绝对值(即,没有代数符号的值)。
//P144 程序清单6.5
//浮点数的比较
#include <stdio.h>
#include <math.h> //fabs() 函数的头文件
int main()
{
const double ANSWER = 3.14159;
double response = 0;
printf("what is the value of pi?\n");
scanf("%lf", &response);
while (fabs(response - ANSWER) > 0.0001) // 比较浮点数尽量使用 > <
{ // 使用 fabs( ) 函数
printf("try again\n");
scanf("%lf", &response);
}
printf("close enough\n");
return 0;
}
(1) fabs( ) 函数
语法格式:double fabs (double x);
功能:计算绝对值
#include <stdio.h> /* printf */
#include <math.h> /* fabs */
int main()
{
printf("The absolute value of 3.1416 is %f\n", fabs(3.1416)); //3.141600
printf("The absolute value of -10.6 is %f\n", fabs(-10.6)); //10.600000
return 0;
}
2、什么是 真?
0 是 假
非0 是 真
3、_Bool 类型
布尔变量:表示 真 或 假 的变量。
_Bool 是布尔变量的 类型名。
_Bool 类型 只能读取 1 或 0。
如果把其他非零数值赋给_Bool 类型的变量,该变量被设置为 1。
//P148 程序清单6.9
//使用_Bool 类型的变量 variable
#include <stdio.h>
int main()
{
long num = 0L;
long sum = 0L;
_Bool input_is_good;
printf("please enter an integer to be summed ");
printf("(q to quit): ");
input_is_good = (scanf("%ld", &num) == 1); //(scanf("%ld",&num) == 1) 括起来(从优先级方面考虑,虽然没必要),但是可以提高代码的可读性
while (input_is_good)
{
sum = sum + num;
printf("please enter next integer (q to quit): ");
input_is_good = (scanf("%ld", &num) == 1);
}
printf("those integers sum to %ld.\n", sum);
return 0;
}
C99 提供头文件 stdbool.h ,让 bool 成为 _Bool 的别名
#include <stdio.h>
#include <stdbool.h> //C99 提供该头文件,让 bool 成为 _Bool 的别名
int main()
{
long num = 0L;
long sum = 0L;
bool input_is_good; //让 bool 成为 _Bool 的别名
printf("please enter an integer to be summed ");
printf("(q to quit): ");
input_is_good = (scanf("%ld", &num) == 1);
while (input_is_good)
{
sum = sum + num;
printf("please enter next integer (q to quit): ");
input_is_good = (scanf("%ld", &num) == 1);
}
printf("those integers sum to %ld.\n", sum);
return 0;
}
4、优先级 和 关系运算符
x = y + 2; // 相当于 x=(y+2)
x_bigger = x > y; // 相当于 x_bigger = (x > y)
ex != wye == zee; // != 和 == 的运算符 优先级 相同
// 结合律是 从左往右
// 相当于:(ex != wye) == zee