人生就是日复一日地不断的重复,既有相同的事情,也有相似的事情,却无论如何也无法回到最初。要想在生活的每一时刻都能有新的发现,恐怕只是一个美好的愿望。
下面将会给大家介绍程序中的重复流程——循环。
do语句
C语言中提供了3中循环执行语句,首先我们来看下do循环。
do语句
输入一个整数,显示它是奇数还是偶数。然后询问是否重复同样的操作,并按要求处理。
代码如下:
#include<stdio.h> int main() { int ret = 0; do { int n = 0; printf("请输入一个整数:"); scanf("%d", &n); if (n % 2 == 0) { printf("输入的数是一个偶数\n"); } else { printf("输入的数是一个奇数\n"); } printf("要重复一次嘛?【Yes……0/No……9】"); scanf("%d", &ret); } while (ret==0); return 0; }
以上就是do语句的使用,下面是结构流程图
do是”执行“的意思,while是”在……期间“的意思。根据do语句的处理流程,只要在()中的表达式的判断结果不是0,语句就会循环执行。
另外do语句循环的对象语句称为循环体。
本程序中do语句的循环体是{和}之间的复合语句(程序块),执行流程如下图:
本程序的情况下,如果读取到的变量的值为0,那么控制表达式ret0的判断结果就为1。因为1不等于0,所以复合语句的循环体就会再次被执行。
如果读取到的变量的值不为0,那么控制表达式ret0的判断结果就为0,do语句就结束了。
复合语句(程序块)中的声明
上述例子中的n是在do语句中的复合语句部分进行声明的。需要注意的是,仅在复合语句中使用的变量通常要再复合语句中声明。
注意:
仅仅在复合语句中使用变量要在该复合语句中进行声明。
读取一定范围内的值
使用do语句的话,从键盘读取的数值是有限制的。代码如下;
#include<stdio.h> int main() { int hand = 0; do { printf("请选择出什么拳【0……石头/1……剪刀/2……布】"); scanf("%d", &hand); } while (hand<0||hand>2); printf("你选择了"); switch (hand) { case 0: printf("石头。\n"); break; case 1: printf("剪刀。\n"); break; case 2: printf("布。\n"); break; } return 0; }
如果读取的数值是0,1,2这些”合法的值“,就会显示”石头“”剪刀“”布“。而如果输入3或者-1这样的非法的值,就会提醒再次输入。
德摩根定律
对各条件取非,然后将逻辑与变为逻辑或、逻辑或变为逻辑与,然后再取其否定,结果和原条件一样。这就是德摩根定律。表示如下图:
求多个数的和及平均值
不停地输入整数,显示其和及平均值。
代码如下:
#include<stdio.h> int main() { int sum = 0; int cnt = 0; int retry = 0; do { int t = 0; printf("请输入一个整数:"); scanf("%d", &t); sum = sum + t; cnt = cnt + 1; printf("是否继续?<Yes……0/No……9>"); scanf("%d", &ret); } while (retry==0); printf("和为%d,平均值为%.2f\n", sum, (double)sum / cnt); return 0; }
只要retry的值为0,就继续进行循环。
下面是求和的过程图:
复合赋值运算符
这样的称为复合赋值运算符。这里的@指代前面提到的各种运算符。
使用复合赋值运算符,计算输入的值的和以及平均值,代码如下:
#include<stdio.h> int main() { int sum = 0; int cnt = 0; int retry = 0; do { int t = 0; printf("请输入一个整数:"); scanf("%d", &t); sum += t; cnt++; printf("是否继续?<Yes……0/No……9>"); scanf("%d", &retry); } while (retry==0); printf("和为%d,平均值为%.2f\n", sum, (double)sum / cnt); return 0; }
后置递增运算符和后置递减运算符
上述程序中使用的++是后置运算符,使用该运算符的表达式a++,能够是操作数的值仅增加1。这种只增加1的情况,我们称为递增。
如上表,是操作符的数值减1的–运算符是后置递减运算符。
两个运算符的功能如下图:
使用复合赋值运算符和后置递增运算符、后置递减运算符,能够使程序更加简洁、更易读。
while语句
和上面介绍的do语句不同,再循环体执行之前对循环的继续条件进行判断的是while语句。
while语句
输入一个整数数值,显示它开始递减到0的每个整数的程序如下:
#include<stdio.h> int main() { int n = 0; printf("请输入一个整数:"); scanf("%d", &n); while (n>=0) { printf("%d", n); n--; } printf("\n"); return 0; }
这里为了实现递减使用了while语句,结构如下图;
while语句会在表达式达到0之前循环其中的语句。程序的流程图如下:
用递减运算符简化程序代码
#include<stdio.h> int main() { int n = 0; printf("请输入一个正整数:"); while (n>=0) { printf("%d", n--); } printf("\n"); return 0; }
数据递增
显示出从0开始递增到输入的整数的各个整数。代码如下;
#include<stdio.h> int main() { int i = 0; int n = 0; printf("请输入一个正整数:"); scanf("%d", &n); while (i<=n) { printf("%d", i++); } return 0; }
限定次数的循环操作
输入一个正数后,并排连续显示出该整数的个数*,代码如下:
#include<stdio.h> int main() { int n = 0; printf("正整数:"); scanf("%d", &n); while (n-->0) { putchar('*'); } printf("\n"); return 0; }
假设输入的值等于15为例,首先对while语句的控制表达式n–>0进行判断。–是后置递减运算符,所以会对n的值是否大于0进行判断。
字符常量和putchar函数
在while语句执行的过程中,putchar('‘);被执行;像’‘这样,使用单引号括起来的字符称为字符常量,字符常量是int类型。
字符常量’'和字符串常量""的区别如下:
do语句和while语句
在执行过程中是有区别的:
do语句的循环体至少执行一次,而while语句的循环体则有可能一个也不会执行。
另外在判断时候继续执行的时间方面,do语句和while语句也完全不相同。
逆向显示整数值
输入一个非负整数,并进行逆向显示。
代码如下:
#include<stdio.h> int main() { int n = 0; do { printf("请输入一个正整数:"); scanf("%d", &n); if (n<=0) { puts("\a请不要输入一个非正整数。"); } } while (n<=0); while (n>0) { printf("%d", n % 10); n /= 10; } return 0; }
下面是执行过程;
for语句
比起使用while语句,使用for语句实现循环会使程序更加简洁、易读。
for语句
递增显示从0到输入正整数为止的各个整数。
代码如下:
#include<stdio.h> int main() { int i = 0; int n = 0; printf("请输入一个正整数:"); scanf("%d", &n); for ( i = 0; i <= n; i++) { printf("%d ", i); } return 0; }
程序变得更加的简洁了。for语句的结构图如下;
- 作为”预处理“,判断并执行A部分。
- 如果作为”继续条件“的B部分控制表达式不为0,则执行语句(循环体)。
- 执行语句后,判断并执行作为”收尾处理“或”下一个循环的准备处理“的C部分返回到2中。
使用for语句实现固定次数的循环
输入一个整数连续显示出该整数整数个*
代码如下:
#include<stdio.h> int main() { int n = 0; int i = 0; printf("请输入一个整数:"); scanf(("%d", &n)); for ( i = 1; i <=n; i++) { putchar('*'); } putchar("\n"); return 0; }
本程序中的for语句也可以替换为如下形式:
for(i=0;i<n:i++) { putchar('*'); }
for循环和while循环的执行区别:
输入规定个数个整数并显示出它们的合计值和平均值(使用for语句)
代码如下:
#include<stdio.h> int main() { int i = 0; int sum = 0; int num = 0; int temp = 0; printf("输入多少个整数:"); scanf("%d", &num); for ( i = 0; i < num; i++) { printf("No.%d", i + 1); scanf("%d", &temp); sum += temp; } printf("合计值:%d\n", sum); printf("平均值:%.2f\n", (double)sum / num); return 0; }
偶数的枚举
下面是我编写的一段程序,实现输入一个整数值,显示该整数值以下的正偶数,代码如下:
#include<stdio.h> int main() { int i = 0; int n = 0; printf("请输入整数值:"); scanf("%d", &n); for ( i = 2; i <= n; i+=2) { printf("%d ", i); } putchar('\n'); return 0; }
for语句中的i+=2部分中使用了复合赋值运算符+=,其作用是将右操作数的值加左操作数的值。
因为是将变量i加2,所以每次循环时i的值都会加2。
约数的枚举
编写一段程序,实现输入一个整数值,显示该整数值的所有约数,代码如下:
#include<stdio.h> int main() { int i = 0; int n = 0; printf("整数值:"); scanf("%d", &n); for ( i = 1; i <= n; i++) { if (n%i==0) { printf("%d ", i); } } printf("\n"); return 0; }
for语句中,变量i的值是从1到n递增的。
如果n除以i的余数为0(即n能被i整除),则判断i是n的约数,并显示它的值。
表达式语句和空语句
请看下面的代码,感觉这段代码是要显示变量n个*
for(i=1;i<=n;i++); putchar('*');
但是,无论n是怎样的值,结果都只显示一个*。
原因在于i++)后面的分号。只包含一个分号的语句,称为空语句,执行代码的时候什么也不会发生。
循环语句
以上说到的do语句、while语句、for语句,都是循环执行流程的语句。这就是循环语句。
多重循环
将循环语句的循环体作为循环语句,就可以进行二重、三重循环。这样的循环称为多重循环。
二重循环
实际上,在一个程序中还可以嵌套另一个循环。所根据嵌套的循环的多少,有二重循环、三重循环等。它们统称为多重循环。
使用二重循环显示九九乘法表,代码如下:
#include<stdio.h> int main() { int i = 0; int j = 0; for ( i = 1; i <= 9; i++) { for ( j = 1; j <=i ; j++) { printf("%d*%d=%d ", i, j, i * j); } printf("\n"); } return 0; }
运行结果:
外侧的for语句的作用是使变量i的值从1到9递增。其中循环分别对应乘法表的第一行、第二行、……第九行。即纵方向的循环。
各行中执行的内侧的for语句的作用使变量j的值从1到9递增,这是各行中的横方向的循环。
使用break语句强制结束循环
在多重循环中执行break语句时,仅仅会跳出内侧的循环语句,而不会直接跳出所有的循环如下代码所示:
#include<stdio.h> int main() { int i = 0; int j = 0; for (i = 1; i <= 9; i++) { for (j = 1; j <= i; j++) { if (i*j>=40) { break; } printf("%d*%d=%d ", i, j, i * j); } printf("\n"); } return 0; }
代码运行;
当i*j的值大于等于40时直接跳出内层循环。
显示图形
下面我们来显示长方形,代码如下:
#include<stdio.h> int main() { int i = 0; int j = 0; int width = 0; int height = 0; printf("请输入长宽:"); scanf("%d %d", &width, &height); for ( i = 0; i < height; i++) { for ( j = 0; j < width; j++) { printf("*"); } printf("\n"); } return 0; }
程序的组成元素和格式
关键字
在C语言中,像if和else这样的标识符被赋予了特殊的意义。这种具有特殊意义的标识符称为关键字,它们是不能作为变量名使用的。
分隔符
一种有13中分隔符,就是又来分割的。
常量和字符串常量
字符常量、整数常量、浮点数常量和字符串常量都是程序的构成要素。
总结
以上就是关于C中的循环控制,其实这样看起来C也不是很难。