循环简介
组织程序是处理数据的另一个方面,让程序按正确的顺序执行各个步骤。C有许多语言特性,帮助你完成组织程序的任务。循环就是其中一个特性,循环能重复执行行为,让程序更有趣、更强大。
循环的分类
既然循环结构在程序中大量存在,所以为了功能的实现,程序中主要有一下四种循环语句或者结构存在。
- while 语句;
- do … while 语句;
- for 语句;
- 嵌套循环结构。
注意事项
不要让程序进入死循环,不能结束的循环会让你的程序在耗尽系统为它提供的计算资源后崩溃的。
真值问题
在C语言中,一直用int类型的变量表示真/假值。
C99专门针对这种类型的变量新增了_Bool类型该类型是以英国数学家George Boole的名字命名的,他开发了用代数表示逻辑和解决逻辑问题。_
_在编程中表示真或假的变量被称为布尔变量(Boolean variable),所以_Bool是C语言中布尔变量的类型名。
Boo类型的变量只能储存1(真)或(假) 如果把其他非零数值赋给Bool类型的变量,该变量会被设置为1。这反映了C把所有的非零值都视为真。
一、while循环
(1)循环的语法
while( 循环条件 ) { // 可以执行的语句 }
(2)循环的执行过程
(3) While 循环的使用场景
在程序中,需要将特定语句部分在满足循环条件的情况下循环执行的时候使用这个语句。这个循环在很多情况下就如同我们在完成自己的作业。我们每天的作业数量是不同的,没有办法进行设定每天定量要写多少。
但是,我们知道一条准则,就是如果没有写完,那就要一直写下去,直到写完为止。这里的循环判断条件就是作业没有写完.那么这个就是一个 while 循环。每次都会检查一个条件,如果条件满足,那么就一直循环下去。
(4)循环的使用实例
#include <stdio.h> int main() { int x = 10; while(x>0) { printf("Number: %d\n",x); x--; } return 0; }
Number: 10 Number: 9 Number: 8 Number: 7 Number: 6 Number: 5 Number: 4 Number: 3 Number: 2 Number: 1
(5)总结while
while语句是先进行条件判断,然后再决定是不是要执行被括号包围的循环体中的内容是不是要被执行。
如果循环条件满足则执行。执行程序循环体中的内容。如果不满足则不执行循环。这也就是说,如果在第一次判断循环条件是否满足的时候,如果判断结果是不满足,那么包括在循环语句中的内容就一次也不会被执行,直接会被忽略。
Tips:这个语句有时候会有一个特别的用途,就是在写单片机程序的时候,你有时候需要采用轮询的方式来采集端口的信息,也就是需要不断的扫描每个端口的状态。这个时候,程序会使用 while(1) 来进行。这个语句其实是一个不会停止的循环。程序会反复不断的来执行程序循环体中的内容。
二、for循环
(1)for 循环的语法
for(控制循环的变量; 循环判断条件; 循环变量增减变化) { // 循环执行的语句 }
(2)for 循环的使用场景
当我们可以确定循环的控制条件的时候采用这个语句。这里的循环一般都是有限次的循环。我们都知道高斯小时候计算 1 到 100 累加的故事。那么 for 循环就可以用来解决这种头尾数字都固定的反复一致的任务。这里就是从数字 1 一直相加到数字 100 。这就是 for 循环的一个应用。
for语句使用3个表达式控制循环过程,分别用分号隔开。initialize表达式在执行for语句之前只执行一次;然后对test表达式求值,如果表达式为真(或非零),执行循环一次;接着对update表达式求值,并再次检查test表达式。for语句是一种入口条件循环,即在执行循环之前就决定了是否执行循环。因此,for循环可能一次都不执行。statement部分可以是一条简单语句或复合语句。
形式:for(initialize; test; update){
statement;
}
在test为假或0前,重复执行statement部分
实例:
for(n = 0;n < 10; n++){
printf("%d %d \n",n,n*2+1);
}
(3)for的实例
#include <stdio.h> int main() { for (int i = 0; i < 10; i++) { printf("No. %d: Hello C Language!\n", i); } return 0; } No. 0: Hello C Language! No. 1: Hello C Language! No. 2: Hello C Language! No. 3: Hello C Language! No. 4: Hello C Language! No. 5: Hello C Language! No. 6: Hello C Language! No. 7: Hello C Language! No. 8: Hello C Language! No. 9: Hello C Language!
三、do-While
(1)概述
while循环和for循环都是入口条件循环,即在循环的每次迭代之前检查测试条件
C语言还有出口条件循环(exit-condition loop),即在循环的每次迭代之后检查测试条件,这保证了至少执行循环体中的内容一次。这种循环被称为do while循环。
(2) do-while 循环的使用场景
当需要先执行一次循环体内部的语句,然后再进行是否再次执行循环语句的时候使用。这有点像你吃饭,先尝一下食物是不是好吃,然后再决定是不是要继续吃下去。
(3) 通用形式
do
statement
while (expression);
do while循环在执行完循环体后才执行测试条件,所以至少执行循环体一次;
而for循环或while循环都是在执行循环体之前先执行测试条件。
形式:
do
statement;
while();
实例:
do
scanf("%d ",&num);
while(num !=20);
四、嵌套循环
可以想象俄罗斯套娃,循环套循环
(1)乘法口诀表
#include <stdio.h> int main(void) { for (int i = 1; i < 10; i++) { for (int j = 1; j < i+1; j++) { int sum = i * j; printf("%d * %d = %d ",i,j,sum); } printf("\n"); } return 0; } 1 * 1 = 1 2 * 1 = 2 2 * 2 = 4 3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16 5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25 6 * 1 = 6 6 * 2 = 12 6 * 3 = 18 6 * 4 = 24 6 * 5 = 30 6 * 6 = 36 7 * 1 = 7 7 * 2 = 14 7 * 3 = 21 7 * 4 = 28 7 * 5 = 35 7 * 6 = 42 7 * 7 = 49 8 * 1 = 8 8 * 2 = 16 8 * 3 = 24 8 * 4 = 32 8 * 5 = 40 8 * 6 = 48 8 * 7 = 56 8 * 8 = 64 9 * 1 = 9 9 * 2 = 18 9 * 3 = 27 9 * 4 = 36 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81
五、关键概念
循环是一个很强大的工具,只能多用,多锻炼自己的编程思维
不需要死记硬背
测试条件,结果为0遍试假,非0表示真
六、编程练习
1.c
#include <stdio.h> #define LEN 26 int main(void) { int n; char letters[LEN]; //java中创建数组是int[] arr = {}; //c是int arr[] = {}; //先赋值 for (n = 0; n < LEN; n++) { letters[n] = 'a' + n; } printf("Here are %d letters:\n", LEN); //后遍历 for (n = 0; n < LEN; n++) { printf("%-3c", letters[n]); } return 0; } Here are 26 letters: a b c d e f g h i j k l m n o p q r s t u v w x y z
2.c
#include <stdio.h> #define N 5 int main(void) { int i, j; for (i = 1; i <= N; i++) { for (j = 1; j <= i; j++) { printf("$"); } printf("\n"); } return 0; } 这就是乘法口诀的样式啊
3.c
#include <stdio.h> #define N 6 int main(void) { int i, j; for (i = 1; i <= N; i++) { for (j = 0; j < i; j++) { printf("%c", 'F' - j); } printf("\n"); } return 0; } F FE FED FEDC FEDCB FEDCBA
4.c
#include <stdio.h> #define N 6 int main(void) { int i, j; char ch = 'A'; for (i = 1; i <= N; i++) { for (j = 1; j <= i; j++) { printf("%c", ch++); } printf("\n"); } return 0; }
5.c
#include <stdio.h> int main(void) { int i, j; char ch; printf("Please enter a upper letter: "); scanf("%c", &ch); int length = ch - 'A'; //循环次数; printf("The pyramid of %c is:\n", ch); for (i = 0; i <= length; i++) { char t = 'A' - 1; for (j = 0; j < length - i; j++) { printf(" "); } //↑左侧空格数; for (j = 0; j <= i; j++) { printf("%c", ++t); } //↑打印递增字母; for (j = 0; j < i; j++) { printf("%c", --t); } //↑打印递减字母 printf("\n"); } return 0; }
6.c
#include <stdio.h> int main(void) { int i, upper, lower; printf("Please input the upper limits: "); scanf("%d", &upper); printf("Please input the lower limits: "); scanf("%d", &lower); printf("%-10s%-10s%-10s\n", "number", "square", "cube"); for (i = lower; i <= upper; i++) { printf("%-10d%-10d%-10d\n", i, i * i, i * i * i); } printf("Done.\n"); return 0; }
7.c
#include <stdio.h> #include <string.h> #define LEN 20 int main(void) { int i; char str[LEN]; printf("Please enter a word: "); scanf("%19s", str); printf("The word is:\n"); printf("%s\n", str); printf("Reversing the word is:\n"); for (i = strlen(str) - 1; i >= 0; i--) { printf("%c", str[i]); } return 0; }
8.c
#include <stdio.h> int main(void) { double i, j; printf("Please enter two numbers (q to quit): "); while (scanf("%lf %lf", &i, &j) == 2) { printf("(%g - %g) / (%g * %g)", i, j, i, j); printf(" = %g\n", (i - j) / (i * j)); printf("You can enter again (q to quit): "); } printf("Done.\n"); return 0; }
9.c
#include <stdio.h> double cal(double n, double k); int main(void) { double i, j; printf("Please enter two numbers (q to quit): "); while (scanf("%lf %lf", &i, &j) == 2) { printf("(%g - %g) / (%g * %g)", i, j, i, j); printf(" = %g\n", cal(i, j)); printf("You can enter again (q to quit): "); } printf("Done.\n"); return 0; } double cal(double n, double k) { return (n - k) / (n * k); }
10.c
#include <stdio.h> int main(void) { int upp, low, i; printf("Enter lower and upper integer limits: "); while ((scanf("%d %d", &low, &upp) == 2) && (upp > low)) { int sum = 0; for (i = low; i <= upp; i++) { sum += i * i; } printf("The sums of the squares "); printf("from %d to %d is %d\n", low * low, upp * upp, sum); printf("Enter next set of limits: "); } printf("Done\n"); return 0; }
11.c
#include <stdio.h> #define N 8 int main(void) { int i, a[N]; printf("Please enter 8 numbers:\n", N); for (i = 0; i < N; i++) { scanf("%d", &a[i]); } printf("Reverse order printing 8 numbers:\n", N); for (i = N - 1; i >= 0; i--) { printf("%-3d", a[i]); } return 0; }
12.c
#include <stdio.h> int main(void) { int i, n; printf("Please enter a number (<= 0 to quit): "); while ((scanf("%d", &n) == 1) && (n > 0)) { double res1 = 0.0; double res2 = 0.0; for (i = 1; i <= n; i++) { res1 += 1.0 / i; if (i % 2 == 1) { res2 += 1.0 / i; } else { res2 -= 1.0 / i; } } printf("1.0 + 1.0/2.0 + 1.0/3.0 + 1.0/4.0 + ..."); printf("sum are %g\n", n, res1); printf("1.0 - 1.0/2.0 + 1.0/3.0 - 1.0/4.0 + ..."); printf("sum are %g\n", n, res2); printf("The sum of the first %d items of the two sequences is %g\n", n, res1 + res2); printf("\nYou can enter again (<= 0 to quit): "); } printf("Done.\n"); return 0; }
13.c
#include <stdio.h> #define N 8 int main(void) { int a[N], i; int val = 2; for (i = 0; i < N; i++) { a[i] = val; val *= 2; } i = 0; printf("Here are the results for array:\n", N); do { printf("%d ", a[i++]); } while (i < N); printf("\nDone.\n"); return 0; }
14.c
#include <stdio.h> #define N 8 int main(void) { int i; double a[N], b[N]; printf("Please enter %d numbers:\n", N); for (i = 0; i < N; i++) { scanf("%lf", &a[i]); } b[0] = a[0]; for (i = 1; i < N; i++) { b[i] = a[i] + b[i - 1]; } printf("Here are the results for array a:\n"); for (i = 0; i < N; i++) { printf("%-3g", a[i]); } printf("\nHere are the results for array b:\n"); for (i = 0; i < N; i++) { printf("%-3g", b[i]); } printf("\nDone.\n"); return 0; }
15.c
#include <stdio.h> #define LEN 255 int main(void) { int i = 0; char input[LEN]; printf("Please enter a string:\n"); do { scanf("%c", &input[i]); } while (input[i] != '\n' && ++i && i < LEN); printf("Reversing print the string is:\n"); for (i--; i >= 0; i--) { //↑避免打印换行符; printf("%c", input[i]); } printf("\nDone.\n"); return 0; }
16.c
#include <stdio.h> #define RATE_SIMP 0.10 #define RATE_COMP 0.05 #define INIT_AMT 100.0 int main(void) { int years = 0; double daphne = INIT_AMT; double deirdre = INIT_AMT; do { daphne += RATE_SIMP * INIT_AMT; deirdre += RATE_COMP * deirdre; years++; } while (deirdre < daphne); printf("Investment values after %d years:\n", years); printf("Daphne: $%.2f\n", daphne); printf("Deirdre: $%.2f\n", deirdre); printf("Deirdre(invest) > Daphne(invest)\n"); return 0; }
17.c
#include <stdio.h> #define TAX 0.08 int main(void) { int i = 0; double Chuckie = 100.0; do { i++; Chuckie += Chuckie * TAX; Chuckie -= 10; printf("(%d)account:%g.\n", i, Chuckie); } while (Chuckie > 9); //↑若余额低于9则不够下一年支取; printf("After %d years:\n", ++i); printf("Chuckie has taken all of the money!\n"); return 0; }
18.c
#include <stdio.h> int main(void) { int i = 1; int friends = 5; while (friends < 150) { printf("At %d weeks, Rabnud has", i); printf("%4d friends.\n", friends); friends = 2 * (friends - i++); } printf("At %d weeks, over Dunbar's number(150).\n", i); return 0; }