1、循环读入:
sate = scanf("%d", &n) == 1; // 关系运算符== 比 赋值符= 的优先级高,所以可以不加括号;
while (sate )
{
sate = scanf("%d", &n) == 1;
}
或:
while (scanf("%d", &n) == 1)
{
}
// 跳过输入直到第一个不为空格和数字的字符
while (scanf("%d", &n) == 1)
;
2、浮点数比较:
while (fabs(pi - 3.14159) > 0.0001)
{
scanf("%lf", &pi);
}
判断是否为0:
E = 0.0001;
while (y < E && y > -E)
3、while、for、do whlie 如何选择:
- 先确定需要入口条件(while 、for)循环还是退出条件(do while)循环;
- 循环设计初始化和更新变量时,使用for较合适;
- 哪个效率更高??效率差别不大,按习惯和代码风格选取。
4、数组:
- 字符数组内包含空字符\0,则字符数组内容就构成一个字符串,空字符标志字符串的结尾;
- 在当字符串使用时,字符数组要保证数组中存在'\0'做结尾;
- 虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈;
4.1、字符数组由若干个元素组成,每个元素放一个字符;而字符指针变量中存放的是地址(字符串/字符数组的首地址),绝不是将字符串放到 字符指针变量中(是字符串首地址);4.2、赋值方式:
对字符数组只能对各个元素赋值,不能用以下方法对字符数组赋值
char str[14];str="I love China"; (但在字符数组初始化时可以,即char str[14]="I love China";)而对字符指针变量,采用下面方法赋值:char* a;a="I love China";或者是 char* a="I love China"; 都可以
4.3、对字符指针变量赋初值(初始化):
char* a="I love China";等价于:char* a;a="I love China";而对于字符数组的初始化char str[14]="I love China";不能等价于:char str[14];str="I love China"; (这种不是初始化,而是赋值,而对数组这样赋值是不对的)
4.4、如果定义了一个字符数组,那么它有确定的内存地址;而定义一个字符指针变量时,它并未指向某个确定的字符数据,并且可以多次赋值。
5、循环使用数组:
for (index = 0; index < SIZE; index++)
scanf("%d", &score[index]); // 循环输入
for (index = 0; index < SIZE; index++)
printf("%5d", score[index]); // 循环打印
for (index = 0; index < SIZE; index++)
sum += score[index]; // 计算所有元素的和
课后习题总结
1、创建[a--z]的数值:
char ch[26] = { 0 }; // 注意数组的初始化
for( char index = 'a'; index < ('a'+26); index++ ,i++)
{
ch[i] = index ;
printf("%c ",ch[i]); // 字符以整数形式存储,可直接+int;
}
14、读入一行输入,再反向打印,输入行不超过255个字符;
void main()
{
const static int MAX_CHAR_COUNT = 255;
char buf[MAX_CHAR_COUNT ] = { 0 }; // 用数组存储输入
char c = 0;
int count = 0;
while (scanf("%c", &c) == 1 && c != '\n' && count < MAX_CHAR_COUNT)
{
buf[count++] = c;
}
for (int i = count - 1; i >= 0; --i)
{
printf("%c", buf[i]);
}
printf("\n");
}