或许不是今天,或许不是明天,或许不是下个月,但是,有一件事是确定的,有一天我肯定会成为冠军。—莫雷诺
目录
C语言循环结构的三种循环语句
1、for语句语句循环结构
1.1for语句的循环结构
1.2for语句的执行步骤
1.3for语句里的break和continue
1.4练习
1.4.1练习1
1.4.2练习2
2、while语句循环结构
2.1while语句的结构
2.2while语句的执行步骤
2.3while语句中的break和continue
2.4练习
2.4.1练习
3、do-while语句循环结构
3.1do-while语句执行步骤
3.2do-while语句中的break和continue
控制循环结构的两个语句
1、break语句
2、continue语句
3、嵌套循环
练习
1、计算n的阶乘
2、计算1!+2!+3!+...+10!
3、尝试用键盘读入一个字符,然后在屏幕上显示一个用这个字符填充的对角线长5个字符,倾斜放置的菱形
在日常生活中我们许多事物离不开循环。像超市的收银系统,学校的学生管理系统等。都是重复一些类似的操作来录入信息,这时候就需要用到循环控制语句完成。下面我就来介绍这几种循环语句:
♀️通过以下程序来看下它的结构:
//for语法结构
#include
int main()
{
for(表达式1;表达式2;表达式3)
{
循环体;
}
}
- 表达式1是程序始初我们定义的值,它经过循环过后会改变我们称之循环变量
- 表达式2根据条件来判断true或false(继续或结束程序)我们称之为循环判断
- 表达式3它也会随着程序的运行不断自增,我们也称它为循环变量
- 循环体内容一般就是我们要求的内容也就是程序的目的
for语句流程图:
//for语法结构
#include
int main()
{
for(表达式1;表达式2;表达式3)
{
循环体;
}
}
执行步骤:
第一,给表达式1进行循环变量初始化,表达式2设置循环终止条件,表达式3设置循环变量增量或减量;
第二,执行表达式2,判断结果为true(真),则进入表达式3循环变量增量或减量,否则为false(假)退出循环;
第三,执行循环体内容;
第四,转入第二步;
注意
for语句里面的每个表达式都用英文分号;隔开
例子:求0的9的和
//求0到9的和
#include
int main()
{
int s = 0;
for (int i = 0; i < 10; i++)
{
s += i;
}
printf("%d\n", s);
return 0;
}
输出:45
第一次:i=0;i<10;i++,执行循环体内容,此时s=0;
第二次:i=1;i<10;i++,执行循环体内容,此时s=1;
此处省略多次
最后一次:i=10;i!<9,退出循环,此时s=45;
我们可以理解为每一次判断过后,i都要自增。自增后的i作为下一次判断条件,直到判断终止。
首先我们要了解到break和continue的用法。在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。而continue则是退出本次循环,不终止循环,继续下一次循环。
我们来看break在for语句中的用法:
#include
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
输出:1 2 3 4
这个程序比较容易理解,循环体内输出4次i后,i自增到5。if语句判断i==5为正则运行break语句,退出了整个循环。
♀️continue在for语句中的用法:
#include
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
输出:1 2 3 4 6 7 8 9 10
可以看到,与break不同之处是。当i自增到5时候,continue语句执行退出了当次的循环后,for语句还并未结束。所以输出的结果也是截然不同的。
相信大家都已经懂得了for循环的结构、运行流程和for中break和continue的用法,我们来练习一下吧。
有以下程序输出的结果是什么
#include
int main()
{
int a = 0, b = 0;
for (a = 1, b = 1; a <= 100; a++)
{
if (b >= 20) break;
if (b % 3 == 1)
{
b = b + 3;
continue;
}
b = b-5;
}
printf("%d\n", a);
return 0;
}
输出: 8
第一次循环:a = 1,b=1->b<20,if不成立,b%3==1%3==1成立,b=b+3, 此时b的值为4
第二次循环:a = 2,b=4->b<20,if不成立,4%3==1成立,b=b+3, 此时b的值为7
第三次循环:a = 3,b=7->b<20,if不成立,7%3==1成立,b=b+3, 此时b的值为10
第四次循环:a = 4,b=10->b<20,if不成立,10%3==1成立,b=b+3, 此时b的值为13
第五次循环:a = 5,b=13->b<20,if不成立,13%3==1成立,b=b+3, 此时b的值为16
第六次循环:a = 6,b=16->b<20,if不成立,16%3==1成立,b=b+3, 此时b的值为19
第七次循环:a = 7,b=19->b<20,if不成立,19%3==1成立,b=b+3, 此时b的值为22
第八次循环:a = 8,b=22->b>20,if成立,循环break提出
最后打印a:8
♀️找到10个数里面最大的值使用for循环
#include
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int rat = sizeof(arr) /sizeof(arr[0]);
int max = 0;
for (int i = 0; i < rat; i++)
{
if (arr[i] > max)
max = arr[i];
}
printf("%d\n", max);
return 0;
}
输出:10
sizeof是求字节数,sizeof(arr)求出arr数组总字节数,sizeof(arr[0])求出arr单个元素字节数。那么sizeof(arr) /sizeof(arr[0])就是arr数组的长度了。
上述程序 ,输出的结果是正确的。但这个程序是由漏洞的,这个程序固定设计了十个整数。那么自行输入呢。输入的数可以是整数、负数。那时候,最大的值该怎么求呢?
我们可以这样改:
#include
int main()
{
int n = 0;
int arr[10] = {0};
int rat = sizeof(arr) / sizeof(arr[0])-1;
for (int i = 0; i < rat; i++)
{
scanf("%d ", &arr[i]);
}
int max = arr[0];
for (int j = 0; j < rat; j++)
{
if (arr[j] > max)
max = arr[j];
}
printf("%d\n", max);
}
输入:-1 -2 -3 -4 -5 -1 -6 -10 -9 -10
输出:-1
我们可以看到上述程序中的max=arr[0]了,防止我输入的全都是负数,因此我干脆将第一个元素先最为最大值。
//while语法结构
#include
int main()
{
表达式1;
while (表达式2)
{
语句;
表达式3;
}
}
注意不知道各位发现没有for语句与while语句有着同工异曲之处。那么如果我们会了for语句或者while语句其中一个是不是就掌握了两种语句呢?
while流程图 :
//while语法结构
#include
int main()
{
表达式1;
while (表达式2)
{
语句;
表达式3;
}
}
执行步骤:
第一,给表达式1进行循环变量初始化,表达式2设置循环终止条件,表达式3设置循环变量增量或减量;
第二,执行表达式2,判断结果为true(真)执行语句,否则为false(假)退出循环;
第三,表达式3循环变量增量或减量
第四,转入第二步;
while语句我们理解为先判断再执行
例子:求0到9的和
//求0到9的和
#include
int main()
{
int i = 0;
int s = 0;
while (i < 10)
{
s = s + i;
i++;
}
printf("%d\n", s);
return 0;
}
输出:45
和for语句执行的结果一样都是45,我们可以认为掌握for语句后就掌握了while语句,所以for语句与while语句有着同工异曲之处。
上面已经讲到了break和continue的区别
那么break在while中的用法:
#include
int main()
{
int i = 1;
while(i <= 10)
{
if (i == 5)
break;
printf("%d ", i);
i = i + 1;
}
return 0;
}
输出:1 2 3 4
和刚刚讲解for的语句一样,输出4次i的值,当i自增到5时,满足了if判断为真执行break语句退出整个循环。
♀️continue在while中的用法:
#include
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i = i + 1;
}
return 0;
}
输出:1 2 3 4 光标一直闪烁
与for语句中不同的是,i自增的位置发生了改变。导致每次退出的时候i始终是=5,所以if判断一直是真就一直执行continue语句。最终导致程序不能终止。
打印数字字符个数跳过其余字符
#include
int main()
{
char ch = '\0';
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch > '9')
continue;
putchar(ch);
}
return 0;
}
输入:abcd1234fafa567
输出:1234567
EOF文件结束标志,我们理解EOF=-1||是或的意思
这里我们可以引用一句话:“东厂不敢杀的人我杀,东厂不敢管的事我管。一句话,东厂管得了的我要管,东厂管不了的我更要管,先斩后奏,皇权特许!”开个玩笑,其实这句话没什么用。主要是显现出do它不管后面的while满不满意先做了再说。
#include
int main()
{
表达式1;
do
{
语句;
表达式2;
}while(表达式3);
return 0;
}
先执行循环里面语句和表达式2,在判断表达式3。因此我们理解 do-while为先执行再判断
do-while流程图 :
我们直接来看代码:
//简单的while循环
#include
int main()
{
int a = 0;
int b = 1;
do
{
a = a + b;
b++;
printf("%d ", a);
} while (a<100);
printf("\n");
return 0;
}
输出:1 3 6 10 15 21 28 36 45 55 66 78 91 105
我们可以看到,最后一次结果为105,超出了a<100。可见do-while确实是先执行循环体后判断。
break语句在do-while中的用法:
#include
int main()
{
int i = 1;
do
{
if (5 == i)
break;
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}
输出:1 2 3 4
与上面for循环,while循环都有一样,输出4次i,i自增到5满足if判断语句退出循环。可见判断语句在程序中的重要性。
♀️continue语句在do-while中的用法:
#include
int main()
{
int i = 1;
do
{
if (5 == i)
continue;
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}
输出:1 2 3 4 光标闪烁不停
do-while语句中的continue语句跟上面while程序中continue语句功能是一样的。都是每次退出的时候i始终是=5,所以if判断一直是真就一直执行continue语句。最终导致程序不能终止。
我们直接看代码:
执行break操作,跳出所在的当前整个循环,到外层代码继续执行。
执行break操作,跳出所在的当前整个循环,到外层代码继续执行。可以跟上述continue语句对比。
♀️咱们直接看代码:
执行continue操作,跳出本次循环,从下一个迭代继续运行循环,内层循环执行完毕,外层代码继续运行。
上面可以看两个不同的语句实现同一种功能,都跳过了3然后继续打印下个一个数字直到程序结束。
嵌套循环:将一个循环结构A声明在另一个循环结构B的循环体中,就构成了嵌套循环
最经典之一的嵌套循环有9*9乘法口诀,来吧展示:
#include
int main()
{
int i = 1;
int j = 1;
while (j < 10)
{
for (i = 1; i <=j; i++)
{
printf("%d*%d=%d ", i, j,i*j);
}
printf("\n");
j++;
}
}
可以看到结果非常的漂亮:
C语言循环结构语句,控制循环语句你会了吗?
总结:
- 1、while语句先判断后执行
- 2、do-while语句先执行后判断(先斩后奏)
- 3、for语句跟while语句有着同工异曲之处
- 4、break语句退出本次循环结束程序
- 5、continue语句退出本次循环继续执行程序
#include
int main()
{
int n = 0;
int s = 1;
scanf("%d", &n);
for (int i = 1; i <=n; i++)
{
s = s * i;
}
printf("%d\n", s);
return 0;
}
输入:5
输出:120
#include
int main()
{
int n = 0;
int s = 0;
int m = 0;
scanf("%d", &n);
for (int i = 1; i <=n; i++)
{
m = 1;
for (int j = 1; j <= i; j++)
{
m = m * j;
}
s = s + m;
}
printf("%d\n", s);
return 0;
}
输入:6
输出:873
#include
int main()
{
int i,j,k,n;
n=3;
char a;
scanf("%c",&a);
for(i=1;i<=n;i++)
{
for(j=0;j
输入:*
输出:
“我真的恨死训练了。但我告诉自己,‘别放弃,忍受当下的苦,然后这辈子都像一个冠军一样活着。’”——阿里
这个是拳击哥的博客主页