1、为什么要使用循环?循环的要素?
思考:输入输出10个学生的年龄?
数据模型:10个学生的年龄
操作:10个scanf和10个printf
总结:执行大量相同重复的操作
为什么要循环:当程序中出现大量重复操作
循环的要素:
1:重复做的事(scanf,printf)——>{}
2:重复的次数————>循环变量控制循环的次数
循环的次数n{
scanf()
}
2、常见循环的种类
1:while
2:do-while
3:for
3、while构成的循环
格式:
while(表达式){
语句1;
语句2;
……
语句n;
}
表达式:一般是关系表达式或逻辑表达式,循环条件
执行过程:当程序执行到while循环时,首先判断while后面表达式是否为真(非0),如果为真就执行表达式后面大括号里的操作,接着再去判断表达式是否为真,直到表达式的值为假,整个循环结束
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
i = 0;//循环变量赋初值
while(i<10){//循环条件
printf("i = %d\n", i);//循环体
i++;//循环变量增值
}
return 0;
}
#if 0
1:重复做的事------>{}循环体
printf
2:重复的次数------>循环变量
i = 0;循环变量赋初值
i<10;循环条件
i++;使循环趋于结束
#enif
练习:
1:倒序输出0~10之间的任意数字的数字序列。
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
i = 9;
while (i >= 0){
printf("i = %d\n", i);
i--;
}
return 0;
}
2:打印100以内所有的奇数,偶数和3的倍数(不包括100)
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
i = 0;//循环变量初值
while(i < 100){//循环条件
if (i%2 == 0){//偶数
printf("i = %d\n", i);
}
if (i%2 == 1){//奇数
printf("i = %d\n", i);
}
if (i%3 == 0){//3的倍数
printf("i = %d\n", i);
}
i++;//增值
}
return 0;
}
3:计算1-100之间所有整数之和。
1+2+3……100
sum =
前n-1个数的和+n
sum =
前99个数的和+100
sum =
前98个数的和+99
……
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
int sum = 0;//保存前n-1个数的和
i = 1;
while(i <= 100){
sum = sum + i;//累加
i++;
}
printf("sum = %d\n", sum);
return 0;
}
4:计算5的阶乘
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
int sum = 1;
i = 1;
while(i<=5){
sum = sum * i;
i++;
}
printf("sum = %d\n", sum);
return 0;
}
5: 1!+2!+3!+4!+5!
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
int sum = 1;
int total = 0;
i = 1;
while(i<=5){
sum = sum * i;
total = total + sum;
i++;
}
printf("sum = %d\n", sum);
printf("total = %d\n", total);
return 0;
}
6:输出n以内任意数的阶乘,注意n输入使用scanf输入
7:输入一行字符以’#’结束,分别统计出其中英文字母、数字、空格和其他字符的个数
#include <stdio.h>
int main(int argc, const char *argv[])
{
char ch = 0;
int n_c = 0;
int n_n = 0;
int n_s = 0;
int n_e = 0;
while ((ch = getchar()) != ‘#‘){
if (((ch>=‘A‘) && (ch<=‘Z‘)) || ((ch>=‘a‘) && (ch<=‘z‘))){
n_c++;
} else if ((ch>=‘0‘) && (ch<=‘9‘)){
n_n++;
} else if (ch == ‘ ‘){
n_s++;
} else {
n_e++;
}
}
printf("字母的个数 = %d\n", n_c);
printf("数字的个数 = %d\n", n_n);
printf("空格的个数 = %d\n", n_s);
printf("其他的个数 = %d\n", n_e);
return 0;
}
4、do-while构成的循环
格式:
do{
语句1;
语句2;
……
语句n;
}while(表达式);
表达式:关系表达式或逻辑表达式,循环条件
执行过程:当程序执行到do时,首先执行do后面大括号里的操作,再去判断while后面表达式的值是否为真,如果为真,继续执行do后面的操作,直到表达式的值为假,循环结束
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
i = 0;//循环变量初值
do {
printf("i = %d\n", i);//循环体
i++;//循环变量增值
}while(i<10);//循环条件
return 0;
}
#if 0
1:重复做的事------->{}循环体
printf
2:重复的次数
i=0;//循环变量初值
i<10;//循环条件
i++;//循环趋于结束
#endif
练习:
1:打印100以内所有的奇数,偶数和3的倍数(不包括100)
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
i = 1;
do {
if (i%2 == 0){//偶数
printf("i = %d\n", i);
}
if (i%2 == 1){//奇数
printf("i = %d\n", i);
}
if (i%3 == 0){//3的倍数
printf("i = %d\n", i);
}
i++;
}while(i < 100);
return 0;
}
2:正序输出两个大写字母之间的字母序列。注意输入使用scanf输入
#include <stdio.h>
int main(int argc, const char *argv[])
{
char beginCh = 0;
char endCh = 0;
beginCh = getchar()+1;
endCh = getchar();
do {
printf("%c", beginCh);
beginCh++;
}while(beginCh<endCh);
return 0;
}
3:计算1-100之间所有整数之和。
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
int sum = 0;
i = 0;
do {
sum = sum + i;
i++;
}while(i <= 100);
printf("sum = %d\n", sum);
return 0;
}
4:1!+2!+3!+4!+5!
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
int sum = 1;
int total = 0;
i = 1;
do {
sum = sum * i;
total = total + sum;
i++;
}while(i<=5);
printf("sum = %d\n", sum);
printf("total = %d\n", total);
return 0;
}
5、while和do-while的比较
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
int sum = 0;
scanf("%d", &i);
while(i<=10){
sum = sum + i;
i++;
}
printf("sum = %d\n", sum);
return 0;
}
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
int sum = 0;
scanf("%d", &i);
do{
sum = sum + i;
i++;
}while(i <= 10);
printf("sum = %d\n", sum);
return 0;
}
总结:
1:当循环条件一开始为真时,两个循环运行结果相同
2:当一开始循环条件为假时,while循环的循环体一次也不执行,do-while循环的循环体执行一次
6、for构成的循环
格式:
for(表达式1;表达式2;表达式3){
语句1;
语句2;
……
语句n;
}
1:表达式:
表达式1:循环变量赋初值
表达式2:循环条件
表达式3:循环变量增值
2:表达式的作用
表达式1:循环变量赋初值,也可以是多个变量赋初值
表达式2:循环条件,每次执行循环体之前都需要判断表达式2的值是否为真
表达式3:循环变量增值,使循环趋于结束
3:表达式执行过程
1:先执行表达式1
2:执行表达式2,并判断表达式2的值是否为真,如果为真执行3,如果为假,循环结束
3:执行循环体中的操作
4:执行表达式3
5:回到2继续执行
4:表达式执行的次数
for(i=0;i<1;i++){
printf();
}
表达式1:1次
表达式2:11次
循环体:10次
表达式3:10次
5:表达式的省略
1:表达式1可以省略,需要程序的其他位置加上表达式1
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
i = 0;
for (; i<10; i++){
printf("i = %d\n", i);
}
return 0;
}
2:表达式2可以省略,死循环
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
for (i=0; ; i++){
printf("i = %d\n", i);
}
return 0;
}
3:表达式3可以省略,需要把表达式3放进循环体中
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
for (i=0; i<10; ){
printf("i = %d\n", i);
i++;
}
return 0;
}
4:表达式1和表达式3可以同时省略等价于while循环
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
i = 0;
for (; i<10; ){
printf("i = %d\n", i);
i++;
}
return 0;
}
5:三个表达式可以同时省略,死循环
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
i = 0;
for (; ; ){
printf("i = %d\n", i);
i++;
}
return 0;
}
练习:
1:打印100以内所有的奇数,偶数和3的倍数(不包括100)。
2:计算1-100之间所有整数之和。
3:打印Fibonacci数列的前20个数,并打印这20个数的总和。
Fibonacci特点:第1,2两个数值为1,从第三个数开始,该数是其前面两个数之和
4:输入一个数,判断这个数是几位数。(打印每一位,计算每一位的总和)
5:输出一下4*5的矩阵
1 2
3 4 5
2 4
6 8 10
3 6
9 12 15
4 8
12 16 20
7、while和do-while和for循环的比较
总结:三种循环语法格式不同但循环的本质相同
8、break:结束当前循环
思考:16-100之间能被15整除的最小整数
int n = 0;
for (n=16; n<100; i++){
if (n % 15 == 0){
结束循环;
}
}
课堂练习:
1:在全系10学生中,征集慈善募捐,当总数得到100时就结束,统计此时的捐款人数,以及每人捐款的数目。
2:输入一个大于3的数判断这个数是否为素数。(只能被1和本身整除)
条件运算符:? :
格式:表达式1 ?表达式2 :表达式3
执行过程:首先执行表达式1,判断表达式1的值是否为真,如果为真则执行表达式2并把表达式2的值,作为整个表达式的值,如果表达式1为假,则执行表达式3,并把表达式3的值作为整个表达式的值
9、continue:结束本次循环(100—>1次)
输出100-200之间所有不能被3整除的数
int i = 0;
for (i=100; i<200; i++){//i=103—200
if (i%3 == 0){
continue;//i = 102
}
printf(“i = %d”, i);
}
10、return:结束一个自定义函数
11、exit:结束整个程序
12、continue,break,return,exit的比较
continue:结束本次循环
break:结束当前循环
return:结束一个自定义函数
exit:结束整个程序
课后练习:(简单)
1:正序输出0~10之间的任意数字的数字序列。注意输入使用scanf输入
2:倒序输出0~10之间的任意数字的数字序列。注意输入使用scanf输入
3:倒序输出0~10之间的任意数字的偶数序列。注意输入使用scanf输入
4:正序输出0~10之间的任意数字的偶数序列。注意输入使用scanf输入
5:顺序输出26个小写字母。注意输入使用scanf输入
6:顺序输出从A到26个大写字母之间的任意字母序列。注意输入使用scanf
7:倒序输出两个大写字母之间的字母序列。注意输入使用scanf输入
8:顺序输出两个小写字母之间的字母序列。注意输入使用scanf输入
9:输入任意一个字符,将该字符的大小写及ASCII码同时输出。注意输入使用scanf输入
10:输出10000以内的从0开始到任意数范围内的奇数和与偶数和。,注意输入使用scanf输入
11:输出10000以内的从0开始到任意数范围内的总和,注意输入使用scanf输入
12:输出10的阶乘。注意输入使用scanf输入
13:输出n以内任意数的阶乘,注意n输入使用scanf输入
14:输出n以内任意数范围内的的质数。注意输入使用scanf输入
15:正序输出0~10之间的任意数字的奇数序列。注意输入使用scanf输入
16:
输出数字序列,a,aa,aaa,aaaa.....输出个数与显示数字由键盘输入。每个数以整数形式输出。注意输入使用scanf输入
课后练习:(中等)
1.
在屏幕上输出10行内容,每行的内容都是“*”。
2.
在屏幕上输出10行内容,每行的内容都是“*****”。
3.
在屏幕上输出10行内容,每行的内容都不一样,第1行一个星号,第2行2个星号,依此类推第10行10个星号。
4.
在屏幕上输出10行内容,每行的内容都是“1”。
5.
在屏幕上输出10行内容,每行的内容都不一样,第1行输出“1”,第
2行输出“2”,依此类推第10行输出“10”。
6.
在屏幕上输出以下内容:
A
AB
ABCD
ABCDE
ABCDEF
7.
在屏幕上输出以下内容:
12345
1234
123
12
1
8.
计算10个99相加后的值并输出。
9.
计算从1加到100的值并输出。
10. 计算10的阶乘(1x2x3x4x5x6x7x8x9x10)。
11. 计算2的20次方。
12.
计算从1到1000以内所有奇数的合并输出。
13.
计算从1到1000以内所有能被3或者17整除的数的合并输出。
14.
计算从1到1000以内所有能同时被3,5和7整除的数的合并输出。
15.
计算1到100以内能被7或者3整除但不能同时被这两者整除的数的个数。
16.
计算1到100以内能被7整除但不是偶数的数的个数。
17.
计算从1到100之间临近两个整数的合并依次输出。比如第一次输出3(1+2),第二次输出5(2+3),最后依次输出199(100+99)。
18.
计算从1加到100中途的所有数值的合,比如第一次输出1,第二次输出1+2的合,第3次输出1+2+3的合,最后一次输出1到100所有数相加之后的合。
19.
判断1077是不是一个质数(质数是只能被1和它自身整除的数)。
20.
一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?
21.
将某个8位的整数所有位的数值加在一起并输出。
22.
给定一个5位的整数,将该数按照10进制位逆置,例如给定12345变成54321,12320变成2321。
23. 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字(1-9之间)计算的数据的个数是5。例如2+22+222+2222+22222。
24. 给定一个正整数n按照下面的公式计算S(浮点类型)的值。公式:S=1+1/(1+2)+1/(1+2+3)+…….+1/(1+2+3+4+……+n)
课后练习:(难)
1:输入一行字符以’#’结束,分别统计出其中英文字母、数字、空格和其他字符的个数
2:打印Fibonacci数列的前20个数,并打印这20个数的总和。
Fibonacci特点:第1,2两个数值为1,从第三个数开始,该数是其前面两个数之和
3:求a+a*a+a*a*a+......+a*a......*a(n个a),其中a是一个数字,n表示a的位数。例如:2
+ 2*2 + 2*2*2 + 2*2*2*2 + 2*2*2*2*2(n等于5),a和n由键盘输入
4:求1!+2!+3!+4!+5!.......20!的值
5:输入一个数,判断这个数是几位数。
6:输入一个数,判断这个数是几位数并把每一位上的数输出。
6:输出所有的水仙花数,所谓水仙花数是指一个3位数,其各位数字立方和等于该数本身。例如:153
= 1*1*1+5*5*5+3*3*3
7:输入一个大于3的数判断这个数是否为素数。
8:编写一个程序,输入一个整数,然后输出小于或等于该数的素数。
9:输入两个数,求这两个数的最大公约数和最小公倍数
10:输出一下4*5的矩阵
1 2
3 4 5
2 4
6 8 10
3 6
9 12 15
4 8
12 16 20
11:编写一个程序。该程序读取输入直到遇到#字符。使程序打印每个输入的字符以及它的十进制ASCII码。每行打印8个字符/编码对。建议:利用字符计数和模运算符(%)在每8个循环周期时打印一个换行符。
12:编写一个程序。该程序输入整数,直到输入0。输入终止后,程序应该报告输入的偶数(不包括0)总个数、偶数的平均值,输入的奇数总个数以及奇数的平均值。
13:编写一个程序读取输入,直到#。用一个感叹号代替每个句号,将原有的每个感叹号用两个感叹号代替,最后报告进行了多少次替换。
14:编写一个程序读取输入,直到#。并报告ei出现的次数。
15:
有 1、2、3、4
个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
16:有人想将手中一张面值100元的人民币换成5元、1元、0.5元面值的零钱100张,以上三种面值的零钱至少有一张,问共有几种换法。请编程实现。
17:打印输出乘法口诀表