绪论
书接上回,今天正式开始进入C语言的学习,第一章《控制语句》,全文共5500字,不算多也不算少,全是我的 心 和 血 ,希望看完对你有所帮助,如果没看过C语言概括建议看后再看本篇。
所以安全带系好,发车啦(建议电脑观看)
目录
1.分支语句(选择语句)
1.1 if语句:
1.2 switch语句:
2.循环语句
2.1while循环:
2.3 for语句
2.4 do...while()循环
3. goto 语句(转向语句)
思维导图:
1.分支语句(选择语句)
1.1 if语句:
知识点(语法):
if(表达式)
语句;
//单分支
if(表达式)
{
语句1;
}
else
{
语句2;
}
//多分支
细节:
else if 可多次使用形成多分支的效果,其中若表达式为真则进入执行语句/代码块
C语言中:0为假,而非0表示真
//直接用多分支语句,因单分支和没分支他们只是少了else / else if #include<stdio.h> int main() { int i = 0; if( i<18 ) { printf("未成年"); } else if(i >= 18 && i<32 ) { printf("成年人,青年"); } else if(i>=32 && i<50) { printf("壮年"); } else { printf("老年"); } return 0; }
代码风格:
if(表达式) if(表达式)
{ {
语句; 语句;
} 效果< }
语句; else
{
语句;
}
当常量和变量比较时可用把常量放在左边,以免出现num = 5的这种赋值情况使if肯定能进入(5 = num运行时会报错)
int num = 5;
if(num = 5) if( 5 == num)
{ {
语句; 语句;
} 效果< }
语句; else
{
语句;
}
练习:
判断一个整数能不能被5整除:
注:如果出现下面情况:else将和if的匹配原则是就近原则
#include<stdio.h> int main() { int i = 0; int b == 2; if( a==1 ) if( b == 2) printf("hehe"); else printf("haha"); return 0; }
并且该程序的结果是什么都不打印,因:第一个if(a == 1) 处未进入,故后面的 if else也将不会执行(if else 是一个语句)
1.2 switch语句:
语法:
switch(整形表达式)
{
语句项;
}
语句项是一些case语句;如下
case(整形常量表达式):
语句;
因if书写多分支过于繁杂,所以switch通常用在多分支的情况
如输入1,输出星期一;输入2,输出星期二;输入3,输出星期三; ........
细节:
switch只有搭配了break才能真正的实现分支
#include <stdio.h> int main() { int day = 0; switch(day)//整形 { case 1://整形常量 printf("星期一\n"); break;//跳出选择语句后面将不会执行 case 2: printf("星期二\n"); break; case 3: printf("星期三\n"); break; case 4: printf("星期四\n"); break; case 5: printf("星期五\n"); break; case 6: printf("星期六\n"); break; case 7: printf("星期天\n"); break; } return 0; }
若没有break,case1执行完后将会继续执行case2 3 .... 直到代码块走完 / 遇到break才会停止
switch语句中的default字句:
以上为例,如果输入的值并不是1~7内的一个值,将怎么办?此时就有了default,当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
注:default可以出现在任意位置,并不一定要在case前后
代码风格:
在一般在最后一个case语句后加上break因:
1.可以给你留下一个好习惯在case后加break.如果case 后面还有 default 他也仍会执行。
2.在每个switch语句中都加上default字句,如果你习惯将default放在最后则可以不加break,但若没有则必须要在其后面加上break
练习:
习题1:
输入1~5,输出weekday , 输入6~7,输出weekend
#include <stdio.h> //switch代码演示 int main() { int day = 0; switch(day) { case 1: case 2: case 3: case 4: case 5: printf("weekday\n"); break; case 6: case 7: printf("weekend\n"); break; default: printf("输入错误\n"); break; } return 0; }
总结:当没break将持续向下,但当一些情况下也可以灵活的使用。
练习2:
判断输出结果
#include <stdio.h> int main() { int n = 1; int m = 2; switch (n) { case 1: m++; case 2: n++; case 3: switch (n) {//switch允许嵌套使用 case 1: n++; case 2: m++; n++; break; } case 4: m++; break; default: break; } printf("m = %d, n = %d\n", m, n); return 0; }
结果在评论区最好先自行计算,再进行比较,如果有任何问题我们都可以相互讨论。
2.循环语句
2.1while循环:
语法
while(表达式)
循环语句;
当表达式为真时即及进入循环,否则反之 。C语言中的真假:0为假,而非0的都是真
如 下代码打印1~100的数
#include<stdio.h> int main() { int i = 0; while( i <= 100 ) // 表达式 { printf("%d ",i); i++; //注意这是调整部分,不然这个循环将无限满足条件并且无限执行下去 //一般这是必须的 } }
你可以感受一下这里面while循环的过程了解他的进行
细节:
while的执行流程:
相信你也看到了在流程图中还用两个英文(break,continue)这两个在整个控制语句中起到重要的组成。
break在switch中已经大概了解了,他们的用法几乎一样,就是不管三七二十一直接跳出所在的循环。
continue则是跳过下面的循环语句直接进到判断部分重新一次的循环,一般都要在continue前面就放置调整部分否则将会死循环,这也是while循环的一个小小的缺点。
具体的可以看一下练习部分,直接通过代码可能更容易理解。
代码风格:
因写while书写语法比较简单,故没有什么好的建议,如果硬要说也就是continue部分中需要你注意一下调整部分。
练习:
1.关于break,打印1~10
#include <stdio.h> int main() { int i = 1; while(i<=10) { if(i == 5) break; printf("%d ", i); i = i+1; } return 0; }
此处因为break的原因当 i 等于5时就会直接跳出循环而前面已经进行了4次循环故他的结果应该是打印1~4
2.关于continue,打印1~10
#include <stdio.h> int main() { int i = 1; while(i<=10) { if(i == 5) continue; printf("%d ", i); i = i+1; } return 0; }
xdm,根据我在上面所写的知识觉得这结果会是什么?(偷偷告诉你哈可以在自己的编译器下测试一下)答案在评论区,欢迎前来讨论。
3.这次练习内会加入一些新知识
getchar()函数 putchar()函数
他们意如其名:获得(输入)一个字符,输出(打印)一个字符
getchar:获取,输入一个字符,返回字符的ASCII码值('A'的..值为97)/EOF
putchar:输出一个字符到屏幕上
int main() { int ch = 0; while((ch = gechar()) != EOF) //while表达式内判断getchar有没有输入字符 按ctrl + z则表 //示不输入字符,若没有获得则会返回EOF { putchar(ch);//打印输入的字符 } rerturn 0; }
上面的代码用循环的方法巧妙的循环进行着getchar的输入,并且打印。
scanf getchar 从缓冲区里拿东西 而键盘输入的则放在缓冲区内
清理缓冲区的方法:
while((getchar) != '\0')
{
;
}
防止\n被拿到而影响结果(当你输入你个值时回车(\n)也会跟着被输进)/ 清理不需要的字符
注意:scanf一般只会拿到空格前一位 或者\n 前一位,如果scanf和getchar一起用时则可能发生下诉问题
未输入就直接报错
上面代码未输入N就直接出了确认失败就是因为,getchar他直接把缓冲区内的\n取进了导致直接确认失败,而下面的代码这因为清理了缓冲区故可以正常的进行输入。
2.3 for语句
1.语法
for(表达式1 ;表达式2 ;表达式3)
循环语句;
表达式1是初始化部分
表达式2条件判断部分
表达式3是调整部分
如下:打印1~10的数字(省略了主函数)
int i = 0;
for(i = 1;i <= 10 ; i++ )
{
printf("%d ",i);
}
细节:
for循环的执行流程图
当然在for循环中也有break和continue,他们的意义和while差不多,break直接跳出循环,而continue则是跳过下面的循环体,直接来到循环变量自变(调整部分)
风格:
1:尽量不要在for循环内进行变量调整(就按照for的方法写在表达式3处),否则容易使变成死循环
2.建议在写for语句的循环控制变量采用前闭后开的写法
int i =0;
for(i = 0; i < 10 ; i++) //前开后闭这样写便于别人在读代码时可以清楚的知道你要循环几次
{}
for(i = 0 ; i <= 9; i++ )
{}
练习:
1.一些特殊的for循环:
#include<stdio.h> //一.for死循环 int main() { for( ; ; )//for循环内表达式处都可以省略不过,在还不太熟时建议都不要省 { // 注意: 当for 中的判断部分若省略了将进行死循环,除非break printf("heihei\n"); } return 0; } 二.多变量 int main() { int x ,y; for(x = 0,y = 0;x < 2 && y < 5 ; ++x,y++) { printf("hh\n"); //此处同时满足两个变量以至于当x == 2时就会跳出循环 { return 0; }
2.判断循环几次
#include<stdio.h> int main() { int i = 0; int k = 0; for(i = 0, k = 0; k = 0 ; i++,k++) { k++; } return 0; }
2.4 do...while()循环
语法:
do
循环语句;
while(表达式);
他的特点就是上来先进入循环(上来就干),后再判断是否还要继续进入
除了先循环后判断外其他基本都和while循环一样(即相当于第一次先进入循环体,后面到判断后就和while一样了)
细节:
do while流程图
如上图do while中的break , continue:与while中的break,continue一样只不过图像稍微有点不一样。
习题:
1.写代码,使多个字符从两端向中间汇聚
其中又出现了两个新的知识点Sleep(1000),和system("cls")
Sleep
其中Sleep他的用法就是使程序停止1000ms,Sleep()括号里的单位是毫秒(ms)
他的头文件是#include<windows.h>
system
systme("cls")他的用法是清理屏幕使调试控制台中的内容被清除
systme其实是源系统内的程序用system调用了他们
故systme还可以控制我们的电脑如当你写到system("shutdown -s -t 60"),就是使电脑在60秒内关机,而systme(shutdown -a)则是取消关机
他的头文件是#include<stdlib.h>
2.折半查找
一半一半的查找若查大了则省去大的这一半,反之若查小了就省略小的这一半,当中间值和所要查到数相等则返回。
3.猜数字游戏
C语言中产生随机值的方法:
rand()函数生成一个随机数(用一变量存着),而在用rand在使用前需要调用srand(),但srand内也需要传一个随机值,即time()函数会返回一个“时间戳”,故srand(time())而time()函数内需要一个指针(NULL空指针即可)且需要无符号整形类型故:
srand((unsigned int)time(NULL))一般放在主函数下。
头文件time():#include<time.h> srand():#include<stdlib.h>
注:rand()不要放进循环内否则每次都会产生一个随机值
3. goto 语句(转向语句)
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号,实际上goto语句即使不出在也可以很好的写代码,但是当你在一个深度嵌套的循环中想直接跳出来或者从某一处跳到某一处还是有一些麻烦,所有就有了goto语句。
语法
for
{
for
{
for
{
goto name;
}
}
}
name:
.....
习题
关机程序(注意模仿时别打错了,真会关机)
strcmp(用来比较两个字符串):
当你要比较字符串时不可以if(arr1 == arr2)因为数组名代表着他们首元素的地址无法进行比较若比较也一定不等,故有了怎么用来比较字符串的函数
本章完。预知后事如何,暂听下回分说。