一、while循环
1.while循环的通用格式
while(expression)
statement
说明: 1) statement部分可以是以分号结尾的简单语句,也可以是用花括号括起来的复合语句
2) expression部分都使用关系表达式(expression为真,执行statement部分;在判断expression,为假循环终止)
3) 每次循环都被称为一次迭代
4) 使用循环必须设计循环出口(及循环终止条件),避免出现死循环
2.入口条件循环及循环出口
1) while循环是使用入口条件的有条件循环,必须满足条件才能进入循环体
注:“有条件”指的是语句部分的执行取决于测试表达式描述的条件
2) 只有在对测试条件求值时,才决定是终止还是继续循环
3.用关系运算符和表达式比较大小
1) while循环经常以来测试表达式作比较,这样的表达式被称为关系表达式,出现在关系表达式中间的运算符叫作关系运算符
运算符 | 含义 |
---|---|
< | 小于 |
<= | 小于或等于 |
== | 等于 |
>= | 大于或等于 |
> | 大于 |
!= | 不等于 |
2) 浮点数的比较: 浮点数的舍入误差会导致在逻辑上应该相等的两数却不相等
注:使用fabs()函数(声明在math.h头文件中),该函数返回一个浮点值的绝对值
#include<stdio.h>
#include<math.h>
int main()
{
const double PI = 3.14159;
double number;
printf("请输入一个数: ");
scanf("%lf",&number);
while(fabs(number-PI)>0.0001)
{
printf("请再次输入: ");
scanf("%lf",&number);
}
printf("输入的数和PI误差小于0.0001.\n");
return 0;
}
4.表达式的真假
1) 对C语言而言,表达式为真的值为1,表达式为假的值为0
2) 如果测试条件非零(即真),则循环会一直进行
3) 一般而言,所有的非零值都视为真,只有0被视为假
4) 赋值运算符把一个值赋给它左侧的变量;而关系相等运算符检查它左侧和右侧的值是否相等,不会改变左侧变量的值
举例: num = 5; //把5赋值给num
num == 5; //检测num的值是否为5
如上举例如果形式使用错误,编译器不会检查出错误;可做以下改进,有助有编译器捕获错误
5 == num; //即使错误使用‘=’,编译器也会识别这种语法错误
5._Bool类型
1) 在编程中,表示真或假的变量被称为布尔变量
2) _Bool类型的变量只能储存1或0(如果把其他非零数值赋给_Bool类型的变量,该变量会被设置为1)
6.优先级和关系运算符
关系运算符的优先级比算术运算符低,比赋值运算符高
运算符(优先级从高至低) | 结合律 |
---|---|
() | 从左往右 |
- + ++ -- sizeof | 从右往左 |
* / % | 从左往右 |
+ - | 从左往右 |
< > <= >= | 从左往右 |
== != | 从左往右 |
= | 从右往左 |
二、不确定循环和计数循环
1) 不确定循环: 在测试表达式为假之前,预先不知道要执行多少次循环
2) 计数循环: 在进行循环之前就知道要重复执行多少次
#include<stdio.h>
int main()
{
const int number = 10;
int count = 1;
while(count <= number)
{
printf("%d ",count);
count++;
}
return 0;
}
三、for循环
for循环的通用格式:
for(initialize,;test;update)
statement
1) 关键字for后面的圆括号中有三个表达式,分别用两个分号隔开
2) 第一个表达式是初始化,只会在for循环开始时执行一次
3) 第二个表达式是测试条件,在执行循环之前对表达式求值
4) 第三个表达式是执行更新,在每次循环结束时求值
5) 可以省略一个或多个表达式(但是不能省略分号),只要在循环中包含能结束循环的语句即可
6) statement部分可以是一条简单语句或复合语句
7) for循环是一种入口条件循环,即在执行循环之前就决定了是否执行循环(可能一次都不执行)
举例: 打印1~6及其对应的立方
#include<stdio.h>
int main()
{
int num;
for(num = 1;num<=6;num++)
{
printf("%d %4d\n",num,num*num*num);
}
return 0;
}
逗号运算符
举例: 邮费超重问题
#include<stdio.h>
int main()
{
const int First = 46; //首重
const int Next = 20; //续重
int ounces, cost;
for (ounces = 1, cost = First; ounces <= 16; ounces++, cost += Next)
{
printf("%-4d $%.2f\n", ounces, cost / 100.0);
}
return 0;
}
1) 逗号表达式保证了被它分隔的表达式从左往右求值(保证最左边的表达式最先求值)
2) 整个逗号表达式的值是右侧项的值
举例(1): x=(y=3,(z=++y+2)+5);
说明: 先把3赋值给y,然后y递增为4,然后+2得6赋值给z,最后+5得11赋值给x
举例(2): a = 250,500;
说明: a=500是逗号左侧的子表达式,500是右侧的子表达式,左侧的赋值表达式将250赋值给a,即等同于a=250;
举例(3): a = (250,500)
说明: 赋给a的值是逗号右侧子表达式的值即500
3) 逗号也可用作分隔符(int a,b;)
四、其他赋值运算符: +=、-=、*=、/=、%=
举例: a += 5; 与 a = a + 5; 相同
a -= 5; 与 a = a - 5; 相同
a *= 5; 与 a = a * 5; 相同
a /= 5; 与 a = a / 5; 相同
a %= 5; 与 a = a % 5; 相同
以上提到的赋值运算符与=的优先级相同
五、出口条件循环:do while
do while循环的通用格式:
do
statement
while(expression);
1) do while循环在执行完循环体后才执行测试条件,适用于至少执行一次的循环
2) for循环和while循环都是在执行循环体之前先执行测试条件,可能一次也不执行
3) 一般当循环涉及初始化和更新变量时,用for循环比较合适
举例:
const int a = 13;
int b;
do
{
printf("请输入数字: ");
scanf("%d", &b);
} while (a != b);
printf("输入正确!\n");
六、嵌套循环
1) 嵌套循环指在一个循环内包含另一个循环
2) 嵌套循环常用于按行和列显示数据,一个循环处理一行中的所有列,一个循环处理所有的行
3) 嵌套循环中的内层循环在每次外层循环迭代时都执行完所有的循环
举例(1): 普通嵌套循环
#include<stdio.h>
#define ROWS 6
#define CHARS 10
int main()
{
int row;
char ch;
for(row = 0;row < ROWS;row++)
{
for(ch = 'A';ch<('A'+CHARS);ch++)
printf("%c",ch);
printf("\n");
}
return 0;
}
举例(2): 通过外层循环控制内层循环
#include<stdio.h>
#define ROWS 6
#define CHARS 10
int main()
{
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;
}
七、使用嵌套循环对数组的简单处理示例
#include<stdio.h>
#define SIZE 10
#define PAR 75
int main()
{
int score[SIZE];
int i, sum = 0;
int j = 0;
float average;
printf("请输入%d位同学的成绩: ", SIZE);
for (i = 0; i < SIZE; i++)
{
scanf("%d", &score[i]);
sum = sum + score[i];
while (i == 9&&j==0)
{
printf("输入的成绩为: ");
for (j = 0; j < SIZE; j++)
{
printf("%d ", score[j]);
}
printf("\n");
}
}
average = (float)sum / SIZE;
printf("总成绩为: %d, 平均分为: %.2f, 分差为: %.2f", sum, average, average - PAR);
return 0;
}
八、使用函数返回值的循环示例
设计power()函数使用for循环计算n的p次幂,并将结果返回并打印
#include<stdio.h>
double power(double n,int p);
int main()
{
double x,z;
int y;
printf("请输入底数和指数: ");
while (scanf("%lf %d", &x, &y) == 2)
{
z = power(x, y);
printf("%lf 的 %d 次方为 %lf\n", x, y, z);
printf("请输入底数和指数: ");
}
printf("正确退出!\n");
return 0;
}
double power(double n, int p)
{
double pow = 1.00;
int i = 1;
for (i = 1; i <= p; i++)
pow = pow * n;
return pow;
}