目录
5.1引例
- 需要重复执行的语句称为循环语句,在重复执行的过程中使用了同一个计算公式,但年份每次递减1应是计算出人口会不同
int main() { int n = 13, year; double nu, r = 0.02; for (year = 1; year <= 10; year++) { nu = n * pow((1 + r), year); printf("%2d年后,人数为:%.2f亿\n", year, nu); }return 0; }
编辑
- while语句是3种循环结构之一,while后括号中的表达式称为循环条件,循环开始时,一定要保证循环条件为真。
- 需要重复执行的语句组成了循环体,本例中循环体部分是重复计算item,然后将其值与要求的精度进行比较,决定是否结束循环
int main() { double sum, item, flag, denominator; sum = 0; item = 1; flag = 1; denominator = 1; while (fabs(item) >= 1e-6) { sum = sum + item; flag = -flag; denominator = denominator + 3; item = flag / denominator; }printf("sum=%f\n", sum); return 0; }
编辑
5.2使用for语句实现循环结构
5.2.1for语句的基本循环
for语句的一般形式为:
for(表达式1;表达式2;表达式3;)
循环体结构;
for语句的执行过程如下:
- 首先计算表达式一
- 判断表达式二若琪只为真则执行循环体语句,然后执行第3步,值为假结束循环,转到第5步执行
- 计算表达式3
- 返回第2步继续执行循环
- 结束继续执行for语句的下一条语句
for(循环变量赋初值;循环条件;循环变量增量;)
说明:循环变量赋初值是一个赋值语句,用于给循环变量赋初值,循环条件是一个关系表达式,决定如何种植循环(即确定循环的终止),循环变量增值决定循环变量在完成一次循环后如何变化,向部分之间以‘;’隔开
int main() { int i, n, sum; scanf_s("%d", &n); sum = 0; for (i = 1; i <= n; i++) sum = sum + i; printf("由1到%d的和是:%d\n", n, sum); return 0; }
编辑
本题目是个连乘的重复过程。
int main() { int i, n; double f; printf("输入n的值:"); scanf_s("%d", &n); f = 1; for (i = 1; i <= n; i++) f = f * i; printf("%d=%.0f\n", n, f); return 0; }
编辑
2.for语句的一般形式中省略表达式.
1.for(;表达式2;表达式3;)
循环体语句;
注意:此时不能省略第一个;。
2.for(表达式1;;表达式3;)
省略表达式2时,表示不对循环进行控制,这是不处理的话,会形成死循环;
3.for(表达式1;表达式2;;)
可以在循环语句中加入修改循环变量的值的语句。。
5.2.2for循环使用示例
编辑
int main() { int n, i, denominator, flag; float sum, item; printf("输入n的值:"); scanf_s("%d", &n); flag = 1; denominator = 1; sum = 0; for(i=1;i<=n;i++) { item = flag * 1.0 / denominator; sum = sum + item; flag = -flag; denominator = denominator + 3; }printf("Sum=%.2f\n", sum); return 0; }
编辑
//int main() //{ // int i; // float x, max; // printf("请输入第1个数:"); // scanf_s("%f", &x); // max = x; // for(i=1;i<=9;i++) // { // printf("请输入第%d个数:", i + 1); // scanf_s("%f", &x); // if (x > max) // max = x; // }printf("10个数的最大数是:%0.f",max); // return 0; // //}
编辑
//int main() //{ // int n, a, b, c; // for (n = 100; n <= 999; n++) // { // a = n / 100; // b = n % 100 / 10; // c = n % 10; // if (n == a * a * a + b * b * b + c * c * c) // printf("%5d", n); // }return 0; //}
编辑
//int main() //{ // int n, sum, i; // printf("请输入一个正整数:"); // scanf_s("%d", &n); // sum = 0; // for (i = 1; i <= n - 1; i++) // if (n % i == 0) // sum = sum + i; // if (n == sum) // printf("%d是完数\n", n); // else // printf("%d不是完数\n", n); // return 0; //}
编辑
//int main() //{ // int u, l, d, i, o; // char ch; // u = l = d = o = 0; // printf("输入10个字符:"); // for (i = 1; i <= 10; i++) // { // ch = getchar(); // if (ch >= 'a' && ch <= 'z') // l++; // else if (ch >= 'A' && ch <= 'Z') // u++; // else if (ch >= '0' && ch <= '9') // d++; // else // o++; // }printf("小写字母%d个,大写字母%d个,数字%d个,其他字符%d个\n", l, u, d, o); // return 0; //}
编辑
//int main() //{ // int i; // char ch; // for (i = 1; (ch = getchar()) != '\n'; i++) // putchar(ch - 32); // return 0; //}
编辑
//int main() //{ // int n = 0, i; // char ch; // printf("输入3个数字:"); // for(i=1;i<=3;i++) // { // scanf_s("%c", &ch); // n = n * 10 + ch - '0'; // }printf("%d\n", n); // return 0; //}
编辑
//int main() //{ // int i, f, n; // printf("请输入一个正整数:"); // scanf_s("%d", &n); // f = 1; // for (i = 2; i <= n - 1 && f; i++) // if (n % i == 0) // f = 0; // if (f) // printf("%d是素数\n", n); // else // printf("%d不是素数\n", n); // return 0; //}
5.3使用while语句实现循环结构
while(表达式)
循环体;
第一步,计算表达式的值,若表达式的值为真,就执行第二步或表达式的值为假,就转到第四步。
第二步执行循环体语句。
第三步,返回第一步。
第四步,结束循环执行语句的下一条语句。
注意: while语句的特点是先判断循环条件,后执行循环体。
编辑
//int main() //{ // int i, sum; // i = 1; sum = 0; // while(i<=100) // { // sum = sum + i; // i = i + 1; // }printf("sum=%d\n", sum); // return 0; //}
编辑
//int main() //{ // int i; long n, fact; // i = 2; fact = 1; // printf("请输入n的值:"); // scanf_s("%ld", &n); // while(i<=n) // { // fact = fact * i; // i = i + 1; // }printf("%ld!=%ld\n", n, fact); // return 0; //}
5.4使用do-while语句实现循环结构
在C语言中,do-while语句也用于完成不定次数的循环控制语句。while不同的是语句。do-while首先执行一次循环体,然后判断循环条件,如果满足这反复执行循环体语句,否则结束循环语句。
5.4.1do-while语句的基本语法。
do-while在使用时,首先要执行循环体语句,然后再判断条件所以,do-while可以用语句实现直到型循环。一般形式如下:
do
循环体
while(表达式)
第一步,执行循环体语句。
第二步计算表达式的值,若表达式的值为真,非零,返回第一步,若表达式的值为假零,则执行第三步,
第三部结束循环执行语句的下一条语句。注意语句的特点是先执行循环体,后判断循环条件,因此循环至少执行一次循环体。
编辑
//int main() //{ // int i, sum; // i = 1, sum = 0; // do // { // sum = sum + i; // i = i + 1; // } while (i <= 100); // printf("sum=%d", sum); // return 0; //}
一般来说,如果题目中给出了循环次数,首选for循环语句,如果循环次数不明确,需要通过其他条件控制循环。通常选用while循环语句,如果需要先执行语句,然后再根据条件判断是否继续执行循环体,则do-while语句最合适。
编辑
//int main() //{ // int a, b, r, n, m; // printf("请输入两个整数:"); // scanf_s("%d%d", &a, &b); // m = a, n = b; // do // { // r = a % b; // a = b; // b = r; // } while (r != 0); // printf("%d和%d的最大公约数是:%d\n", m, n, a); // printf("最大公倍数是:%d", m * n / a); // return 0; //}
编辑
//int main() //{ // int count = 0; // long n, m; // printf("请输入一个整数:"); // scanf_s("%ld", &n); // m = n; // if (n < 0)n = -n; // do // { // n = n / 10; // count++; // } while (n != 0); // printf("整数%d有%d位数\n", m, count); // return 0; //}
5.5改变循环结构的跳转语句
在前面介绍的三种循环语句及for循环语句、while循环语句及do well循环语句中,控制循环是通过循环达到设定的次数或者循环的判断条件为假时结束循环。这种循环控制方式在实际程序中是不够的。许多时候,当循环结构中出现多个循环条件时,要求当某个条件满足时会立刻结束循环,或者循环结构中,根据条件会调出某些语句继续循环,需要在循环结构中配合使用break语句和continue语句。
5.5.1 break语句
当break语句用于循环语句中时,可使程序终止循环而转去执行循环语句的后续语句。通常break语句总是与if语句一起配合使用及满足条件时,便跳出循环。
编辑
//int main() //{ // int i = 5; // do // { // if (i % 3 == 1) // if (i % 5 == 2) // { // printf("%d", i); // break; // }i++; // } while (i != 0); // return 0; //}
编辑
//int main() //{ // int n, m, i; // printf("请输入一个正整数:"); // scanf_s("%d",&n); // m = sqrt(n); // for (i = 2; i <= m; i++) // if (n % i == 0) // break; // if (i > m) // // printf("%d是素数!\n", n); // else // printf("%d是素数!\n", n); // return 0; //}
编辑
//int main() //{ // int num, n; // float score, total = 0; // num = 0; n = 0; // while (1) // { // printf("请输入分数#%d(0~100):", n + 1); // scanf_s("%f", &score); // if (score < 0) // break; // if (score < 60) // num++; // total += score; // n++; // } // printf("平均分数是:%.2f.\n", total / n); // printf("不及格的有:%d.\n", num); // return 0; //}
5.5.2 continue语句
Continue语句的作用是跳过循环体中,Continue后面的语句,继续下一次循环。continue语句只能用在循环语句中,常与if语句一起使用。
编辑
//int main() //{ // int i, n = 1; // for (i = 1; i <= 100; i++) // { // if (i % 7 != 0) // continue; // printf("%4d", i); // if (n++ % 5 == 0)printf("\n"); // }return 0; //}
编辑
//int main() //{ // int n, s = 0; // n = 1; // while(n<10) // { // s = s + n; // if (s > 5) // break; // if (n % 2 == 1) // continue; // n++; // }printf("s=%d,n%d\n", s, n); // return 0; //}
5.5.3goto语句
除了前面介绍的三种循环控制语句,还有一种可以实现控制的语句及goto语句说明。语句标号是一个有效的标识符,使用时在语句标号后面跟一个出现在函数中某语句的前面,程序执行到goto语句时会控制跳转到该语句标号处,达到控制循环的目的。
编辑
//int main() //{ // int i, sum; // i = 1; sum = 0; //lopp: if(i<=100) //{ // sum = sum + i; // i = i + 1; // goto lopp; //}printf("sum=%d\n", sum); //return 0; //}
注意,语句标号必须与goto语句处于同一个函数中,通常goto语句与if语句连体,实现控制循环。大型程序中,由于goto语句可能存在的不合理的使用,会使成构程序结构变坏,所以结构化程序设计中不建议使用goto语句。
5.6循环嵌套
当一个循环的循环,体内又包含了另一个完整的循环结构时,成为循环的嵌套或者是二重循环。根据问题的需要,可以构成三重及以上的循环嵌套结构,它一般情况下最多使用到三重循环。
编辑
//int main() //{ // int i, j; // double factorial, s = 0; // for (i = 1; i <= 10; i++) // { // factorial = 1; // for (j = 1; j <= i; j++) // factorial *= j; // s += factorial; // } // printf("1!+2!+3!+···+10!=%.0f\n", s); // return 0; //}
编辑
//int main() //{ // int i, j; // for (i = 1; i <= 9; i++) // { // for (j = 1; j <= i; j++) // printf("%d*%d=%d\t", j, i, j * i); // printf("\n"); // } // return 0; //}
编辑
//int main() //{ // int i, n, k, count = 0; // n = 2; // while (n < 100) // { // k = sqrt(n); // for (i = 2; i <= k; i++) // if (n % i == 0)break; // if (i > k) // { // printf("%4d", n); // if (++count % 10 == 0)printf("\n"); // } // n++; // } // return 0; //}
编辑
// int main() //{ // int i, n, m; // for (m = 10; m <= 20; m++) // { n = m, i = 2; // printf("%d=", n); // do // { if (n % i == 0) // { printf("%d*", i); // n=n/i; // } // else // i++; // }while (n != i); // printf("%d\n", n); // } // return 0; //}
5.7典型算法举例
在解决实际问题的过程中,经常要用到一些典型的算法,熟悉并掌握这些算法对提高程序设计的技能与技巧很有帮助。半介介绍常用的递推法、迭代法及穷举法。
5.7.1 递推法
编辑
//int main() //{ // int day, d1, d2; // day = 9; // d2 = 1; // do // { // d1 = (d2 + 1) * 2; // d2 = d1; // --day; // } // while (day > 0); // printf("第一天摘了%d\n", d1); // return 0; //}
编辑
//#define eps 1e-6 //int main() //{ // int n = 1; float x; // double fz, fm = 1, sinx; // printf("请输入x的值:"); // scanf_s("%f", &x); // fz = x; sinx = x; // do // { // n += 1; // fz = -fz * x * x; // fm = fm * (2 * n - 2) * (2 * n - 1); // sinx = sinx + fz / fm; // } while (fabs(fz / fm) > eps); // printf("sin(%f)=%0.6f\n", x, sinx); // printf("sin(%f)=%0.6f\n", x, sin(x)); // return 0; //}
5.7.2迭代法
编辑
//int main() //{ // float x1, x0, f, f1; // x1 = 1.0; // do // { // x0 = x1; // f = ((2 * x0 - 4) * x0 + 3) * x0 - 6; // f1 = (6 * x0 - 8) * x0 + 3; // x1 = x0 - f / f1; // } while (fabs(x1 - x0) > eps); // printf("%6.2f", x1); // return 0; //}
5.7.3穷举法
编辑
//int main() //{ // int men, women, child; // for (men = 0; men <= 9; men++) // for (women = 0; women <= 12; women++) // { // child = 36 - men - women; // if (men * 4 + women * 3 + child * 0.5 == 36) // printf("男:%d,女:%d,小孩:%d\n", men, women, child); // } //return 0; //}
编辑
//int main() //{ // int i, j, k, n = 0; // for(i=1;i<5;i++) // for ( j= 1; j < 5; j++) // for (k = 1; k < 5; k++) // if (i != k && i != j && j != k) // { // printf("%d%d%d\t", i, j, k); // if (++n % 5 == 0)printf("\n"); // } // printf("\n共有:%d\n", n); // return 0; //}
5.8循环程序设计示例
编辑
//int main() //{ // int i, j; // for (i = 1; i <= 5; i++) // { // for (j = 1; j <= 20 - i; j++) // printf(" "); // for (j = 1; j <= 2 * i - 1; j++) // printf("*"); // printf("\n"); // } // return 0; //} /*【例5.35】*/
编辑
//int main() //{ // int m, n, count = 0; // m = rand() % (80 - 10 + 1) + 10; // printf("请输入一个10—80之间的整数:"); // while (1) // { // scanf_s("%d", &n); // count++; // if (m == n) // { // printf("恭喜!你猜对了,你真棒!\n"); // break; // } // else if (m > n && count < 5) // printf("对不起!你猜小了!再来一次!"); // else if (m < n && count < 5) // printf("对不起!你猜大了!再来一次!"); // if (count == 5) // { // printf("对不起!你没有机会了!\n这个数是:%d,游戏结束!\n", m); // break; // } // } // return 0; //}
编辑
//int main() //{ // int x, i, j = 0, n, k = 0; // for (x = 100; x < 1000; x++) // { // k = sqrt(x); // for (i = 2; i <= k; i++) // if (x % i == 0) // break; // if (i > k) // { // k = x; // n = 0; // while (k > 0) // { // n = n * 10 + k % 10; // k /= 10; // } // if (x == n) // { // printf("%d\t", x); // if (++j % 5 == 0)printf("\n"); // } // } // } // return 0; //}
编辑
//int main() //{ // int x, t; // printf("i\tpower\n"); // for (x = 100; x < 1000; x++) // { // t = x * x; // while (t != 0) // { // if (x == t % 1000) // { // printf("%d\t%d\n", x, x * x); // break; // } // else // t /= 10; // } // } // return 0; //}
文字总结
循环结构是结构化程序设计中的基本结构之一。循环结构在程序设计中的应用很普遍,几乎所有具有使用价值的应用程序中都包含着循环结构。循环结构的特点是可以完成有规律的需要,重复计算或处理的任务。虽然重复执行的语句相同,但与剧中一些变量的值在发生着变化,但达到循环次数或满足一定条件时,循环会结束。C语言提供了for语句、while语句和do while3种循环语句。