一.为什么需要循环控制
1.用顺序语句效率太低
#include <stdio.h>
int main()
{
float score1, score2, score3, aver;
scanf("%f%f%f", &score1, &score2, &score3);
aver = (score1 + score2 + score3) / 3;
printf("aver = %7.2f", aver);
return 0;
}
2.while 循环结构,更高效
#include <stdio.h>
int main()
{
float score1, score2, score3,aver;
int i = 1;
while (i < 4)
{
scanf("%f%f%f", &score1, &score2, &score3);
aver = (score1 + score2 + score3) / 3;
printf("aver = %7.2f", aver);
i++; // i = i + 1;
}
return 0;
}
例:求1+2+3+......+100的结果
#include <stdio.h>
int main()
{
int i = 1; //初始化
int sum = 0;
while (i <= 100) //条件 条件成立,进入循环体
{
sum = sum + i;
i++; //迭代表达式 反复循环,直至条件不成立。循环结束
}
printf("sum = %d", sum);
return 0;
}
注:
1.循环体如果包含一个以上的语句,应该用花括号括起来,作为复合语句出现。
2.如果不加花括号,while语句的范围只到while后面第一个分号处。
3.do...while 循环
#include <stdio.h>
int main()
{
int i = 1;
int sum = 0;
do
{
sum = sum + i;
i++;
}while (i <= 100);
printf("%d\n", sum);
return 0;
}
4.while和do...while循环区别如图:
注:
1.while先判断条件,再执行循环体
2.do...while先执行循环体,再判断条件
5.for循环
#include <stdio.h>
int main()
{
int i = 0;
int sum = 0;
for (i = 1, sum = 0; i <= 100; i++) //for (初始化; 条件; 迭代表达式)
{
sum += i; // 将i的值加到sum上
}
printf("%d\n", sum);
return 0;
}
6.循环语句的嵌套
7.用break语句提前终止循环
在1000名学生中举行慈善募捐,当募捐金额达到10万元时就结束,统计捐款的人数,以及平均每人捐款的金额。
#include <stdio.h>
int main()
{
int i = 0;
int num = 0;
float money = 0.0;
float aver = 0.0;
float total = 0.0;
for (i = 0; i < 1000; i++)
{
printf("请输入募捐的金额:");
scanf("%f", &money);
total += money; //将money加到total上
num = num + 1;
aver = total / num;
if (total >= 1e+5)
{
break; //满足total >= 1e+5,立刻跳出循环
}
}
if(total >= 1e+5)
{
printf("募捐成功\n");
printf("总共捐款:%f\n", total);
printf("捐款人数:%d\n", num);
printf("平均每人捐款金额:%f\n", aver);
}
else
{
printf("募捐失败\n");
printf("总共捐款:%f\n", total);
printf("捐款人数:%d\n", num);
printf("平均每人捐款金额:%f\n", aver);
}
return 0;
}
运行结果:
8.用continue语句提前结束本次循环
输出100~200之间不能被3整除的数
#include <stdio.h>
int main()
{
int i = 0;
for (i = 100; i <= 200; i++)
{
if (i % 3 == 0) //‘%’取余符号
{
continue;
// 跳过当前迭代,不执行后面的printf语句,直接进入下一次for循环
}
printf("%d\n", i);
}
return 0;
}
9.输出一个4 *5的矩阵
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 1; i <= 4; i++)
{
for(j = 1;j <=5; j++)
{
printf("%d\t", i * j); //\t是一个制表符,用于在打印的输出中插入一个水平制表符
}
printf("\n");
}
return 0;
}
注:
\t是一个制表符,用于在打印的输出中插入一个水平制表符
运行结果:
9.1当i = 3,j = 5时,break跳出内层循环
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 1; i <= 4; i++)
{
for(j = 1;j <=5; j++)
{
if (i == 3 && j == 1) //满足条件,执行break语句
{
break;
}
printf("%d\t", i * j);
}
printf("\n");
}
return 0;
}
运行结果:
9.2当i = 3,j = 5时,continue跳出内层循环的其中一次结果的打印
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 1; i <= 4; i++)
{
for(j = 1;j <=5; j++)
{
if (i == 3 && j == 1)
{
continue;
}
printf("%d\t", i * j);
}
printf("\n");
}
return 0;
}
运行结果:
注:
1.第三行第一列 i * j = 3 被continue跳过了,同一列的数向前补充
2.continue
和break
在嵌套循环中的主要区别在于它们对循环流程的控制方式
continue
只是跳过当前迭代,而break
则是完全终止循环(或至少是当前层级的循环)。
例5.7 求π的近似值
#include <stdio.h>
#include <math.h>
int main()
{
int i = 1;
int flag = 1;
double sum = 0.0;
double pi = 0.0;
while (1) //直接进入循环体
{
if(fabs(flag * (1.0 / i)) < 1e-6)
break;
sum += flag * (1.0 / i);
i += 2;
flag = -flag;
}
pi = 4 * sum;
printf("π的近似值为:%lf\n", pi);
return 0;
}
注:
1.if
语句后直接放置一个分号(;
)
当在C语言的if
语句后直接放置一个分号(;
),这会导致if
语句本身只包含其后的分号作为“空操作”(即什么也不做)。紧随其后的任何语句(如break
、continue
、赋值语句等)将不再属于if
语句的一部分,而是无条件地执行。
2.while (1)
是一种常见的编程结构,用于创建一个无限循环。这里的 1
总是被评估为真(true)
3.fabs()函数
fabs()
函数用于计算一个浮点数的绝对值 //在#include<math.h>库中
例5.8 兔子的繁殖问题
斐波那契数列:1、1、2、3、5、8、13、21、34……
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
// 对于n为1或2的情况,直接输出1
if (n == 1 || n == 2)
{
printf("%d", 1);
}
else
{
// 对于n > 2的情况,初始化前两个数并使用循环计算第n个数
int f1 = 1;
int f2 = 1;
int f3 = 0;
for (int i = 3; i <= n; i++)
{
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
printf("%d", f3);
}
return 0;
}
代码逻辑:
1.前两个月兔子不繁殖。所以当n = 1或n = 2时,直接输出1。 //减少了不必要的内存使用
2. int f1 = 1; f3 = f1 + f2;
int f2 = 1; f1 = f2;
int f3 = 0; f2 = f3
先给f1、f2赋初值为1,当n>3时,进入for循环,i++,f3的值会被覆盖
f1 = f2;
f2 = f3;
然后将f1
更新为f2
的值,将f2
更新为f3
的值(即刚刚计算出的新值),为下一次迭代做准备。
3.循环结束后用printf
函数输出斐波那契数列的第n
个数。
例5.9 输入一个大于3的整数n,判断它是否为素数
#include <stdio.h>
int main()
{
int n = 0;
int i = 0;
printf("请输入一个大于1的整数:");
scanf("%d", &n);
// 检查 n 是否大于 1
if (n <= 1)
{
printf("这个整数不是素数:\n");
return 0;
}
for (i = 2; i < n; i++)
{
if (n % i == 0)
break;
}
if (i < n)
printf("这个整数不是素数\n");
else
printf("这个整数是素数\n");
return 0;
}
例5.11 译密码
#include <stdio.h>
int main()
{
char c;
c = getchar(); //读取用户输入的单个字符,并将其存储在变量 c 中
while (c != '\n') //只要变量 c 的值不等于换行符 '\n',就继续执行循环体内的代码
{
if (c >= 'a' && c <= 'v' || c >= 'A' && c <= 'V')
{
c = c + 4;
}
else if(c >= 'w' && c <= 'z' || c >= 'W' && c <= 'Z')
{
c = c + 4 - 26;
}
printf("%c", c);
c = getchar(); //再次调用 getchar() 读取下一个字符,继续循环
}
putchar('\n'); //结束循环
return 0;
}
注:
putchar('\n'); //输出一个换行符
putchar
函数用来输出单个字符