大家好这里是三岁,C语言是各类语言的基础,由于个人学习需要特别开设了C语言基础专题,内容不一定深入,都是基础知识,还是白话C语言,最简单的方式带领大家学习不是那么容易理解的C语言!
循环程序结构
循环语句是计算机编程中最基础最常用的语句,使用范围广,而且方法简单,只有用法得当可以省略非常多的代码行,而且便于理解。
举例:把1加到100,这个简单的案例大家都知道首相加末项乘以项数除以2.
使用C语言表达式就是:
#include<stdio.h> int main() { int x; x=(1+100)*100/2; printf("%d\n",x); }
那么人果不知道是几位呢?
#include<stdio.h> int main() { int x,y; printf("需要加到第几位?"); scanf("%d",&y); x=(1+y)*y/2; printf("%d\n",x); }
这样子也不是说不行,但是也没有什么更好的办法呢?
使用循环语句,虽然叠加的项目可以直接使用公式完成但是很多还是不行,比如阶乘比如不规则的叠加等等。
让我们来看看循环的几种形式:
while示例
#include<stdio.h> int main() { int x,y=0; while(y<=100){ x+=y; y++; } printf("%d\n",x); }
仔细查看可以发现这个的运算速度比使用公式更加的快。
do–while
#include<stdio.h> int main() { int x,y=0; do{ x+=y; y++; }while(y<=100); printf("%d\n",x); }
do–while语句虽然用法上和while语句差不多但是在算法和构思上缺却相差甚远,运算次数什么的也截然不同,使用时需要严格注意。
for
#include<stdio.h> int main() { int x,y; for(y=0;y<=100;y++){ x+=y; }; printf("%d\n",x); }
接下来让我们一起看看这几种循环有什么是不一样的。
让我们一个一个来看吧
while循环
while的语句结果如下:
while<判断表达式>{ //循环判断 语句块 //循环体 }
判断表达式
使用0和1表示最后的结果,如果是0while循环结束,如果是1while继续执行。
这里面的表达是逻辑表达
最后出现的结果默认为逻辑结果。
如果while判断表达式始终为1则结果会呈现死循环,需要通过break
语句或其他方式停止。(书写过程中需要注意防止该情况)特殊时候会用死循环完成特定逻辑(需要合理使用)
举例使用while循环完成5!
(5的阶乘)
#include<stdio.h> int main() { int x=1,y=2; //定义xy,并初始化 while(y<=5){ //设置判断添加逻辑判断语句 x*=y; //算法设置 y++; }; printf("%d\n",x); //设置输出 }
思路:首先了解阶乘就是逐个相加5!就是
1*2*3*4*5
- 循环判断就是值到5那么<判断表达式>就是(y<=5)
- 因为是乘法不能够有0所以所有的初始值都是大于1的。
又因为1*1没有意义所以y可以从2开始那么初始数据就是:int x=1,y=2;
- 判断的主体就是
x*=y;
或者x=x*y;
最后要加上判断的要求就是y值要变大不然没有运行的意义。y++
遍历过程中各个数的值
遍历次数 | x的值 | y的值 |
第一次结束 | x=2 | y=3 |
第二次结束 | x=6 | y=4 |
第三次结束 | x=24 | y=5 |
第四次结束 | x=120 | y=6 |
第五次 | x=120 | y不符合逻辑判断语句判断结束 |
do–while语句
语句结构:
do{ 语句块; }while(<逻辑判断语块>)
与while语句不同的就是他是先执行后判断的,因此有可能有些时候因为代码组合不一样会出现比while语句多训练一轮的情况,需要更据自己实际情况合理使用。
举例还是使用(5!)
#include<stdio.h> int main() { int x=1,y=2; do{ x*=y; y++; }while(y<=5); printf("%d\n",x); }
原理和之前的一样。
当第4轮时y的值已经变成了6,再进行判定不符合do-while语句结束。最后的结果是120.
如果我们换一种写法!
#include<stdio.h> int main() { int x=1,y=1; do{ y++; x*=y; }while(y<=5); printf("%d\n",x); }
这样子我们的道理还是那个道理但是结果
720怎么来的呢?
第一次:y=2,x=12=2,判定成功继续执行;
第二次:y=3,x=23=6,判定成功继续执行;
第三次:y=4,x=64=24,判定成功继续执行;
第四次:y=5,x=245=120,判定成功继续执行;
第五次:y=6,x=120*6=720.判定失败语句循环结束。
问题找到了多循环了一次那么怎么办呢?
修改我们的判断语句!
#include<stdio.h> int main() { int x=1,y=1; do{ y++; x*=y; }while(y<5); printf("%d\n",x); }
这种情况在do–while里面都有可能出现就是语法不一样导致的结果不一样,需要对语法进行细致的研究。
for语句
for语句是最经常使用的循环语句。
语句结构:
for(表达式1;表达式2;表达式3){ 语句块 //循环体 } 表达式1:设置初始条件 表达式2:控制语句(相对应逻辑判断语块) 表达式3:循环调整语句 注:表达式可以不存在但是两个分号不能够少!
还是5!的例子:
#include<stdio.h> int main() { int x=1,y; for(y=2;y<=5;y++){ x*=y; } printf("%d\n",x); }
解析:for(初始化y;y判断条件;y调整办法){
执行语句x*=y;
}
break语句
break语句用于跳出全部循环.
break语句既可以用于switch语句又可以使用于循环语句。
一般是循环语句和判定语句嵌套使用。
例如死循环里面满足一定条件就退出。
#include<stdio.h> int main() { int x=1; while(1){ //死循环 x++; //x自加先运算后输出 if(x==10) //判定是否等于10 break; //条件成立执行break指令 } printf("%d\n",x); //输出结果 }
continue语句
continue语句 用于结束当前循环(本次循环,不会跳出当前这个大循环),也就是终止本次循环后面发生的内容。
#include<stdio.h> int main() { int x=1,y=1; //初始化值 for(y;y<=5;y++){ //循环定义 x++; //自加 if(x==2){ //判断 continue; //continue语句 } printf("%d\n",x); //循环输出 } }
问题来了按道理应该是1、3、4、5但是结果怎么会酱紫有点奇怪我们来捋一捋!
for一共可以循环5次:
第一次循环:x++得到2 2判断跳出本次循环
第二次循环:x++得到3 输出第一个值3
第三次循环:x++得到4 输出第一个值4
第四次循环:x++得到5 输出第一个值5
第五次循环:x++得到6 输出第一个值6
这里有个问题为什么x++不能够放if语句后面?
让我们来看看
#include<stdio.h> int main() { int x=1,y=1; for(y;y<=5;y++){ if(x==2){ continue; } x++; printf("%d\n",x); } }
第一次执行:x=1,判断失败,继续执行x++并输出得到结果2
第二次执行:x=2,判定成功,跳出本次循环
第三次执行:x=2,判定成功,跳出本次循环
第四次执行:x=2,判定成功,跳出本次循环
第五次执行:x=2,判定成功,跳出本次循环
最后的结果是2
死循环
之前提到过的一个陷阱,有可能万劫不复,但是加以使用还是有好处的,特别是配合比较好的if语句和break语句。
让我们来看看这些语句的死循环形式:
while语句:
while(1){ //此处逻辑结果始终为1即可 xxx; }
do–while语句:
do{ xxx; }while(1); //此处逻辑值始终为1即可
for语句:
for(;;){ //表达式2逻辑值始终为1即可 xxx; }
嵌套循环
循环加循环加判断就可以解决几乎全部的代码(就是执行起来有可能比较麻烦)但是俗话说的好,跑的通的代码就是好的代码。
传说中的乘法口诀!
#include<stdio.h> int main() { int x,y; //定义x,y for(x=1;x<=9;x++){ //设置9层大循环 for(y=1;y<=x;y++){ //设置内部的小循环 printf("%d*%d=%d\t",x,y,x*y); //输出 } printf("\n"); //设置换行 } }
这里有一种错误写法需要警惕!!!
这里有一种错误写法需要警惕!!!
这里有一种错误写法需要警惕!!!
#include<stdio.h> int main() { int x,y=1; for(x=1;x<=9;x++){ for(y;y<=x;y++){ printf("%d*%d=%d\t",x,y,x*y); } printf("\n"); } }
大家会发现基本上没有什么区别理解起来也没有问题,那么为什么会说是错误的呢???
这个是最后的结果!
理解:这个理解不是官方的,是个人在python语言的基础上理解的。
第一层循环可以读取外面的数据,也就是python里面的全局变量。
但是第二层的for循环读取不到外面的变量,只能够在通过判断的时候被x赋值,最后得到的结果也就是x的值。
(此解释仅限于个人理解,还需进一步考证)
此种问题需要警惕。
到这里C语言的基本语句就都说完了,有了这些可以完成大部分的内容,但是并没有这么简单,C语言的路程才刚刚开始,让我们继续加油吧!