什么是语句,在C语言中语句可以分为五大类1.表达式语句,函数调用语句,控制语句,复合语句,空语句 。
控制语句:用于控制程序的执行流程,以实现程序的各种结构方式(c语言支持三种结构:顺序结构,选择结构,循环结构),他们由特定的语句构成,c语言有九种控制语句
其总共可分为三大类:1.条件判断语句也叫分支语句,if语句 ,switch语句;
2.循环执行语句:do while while for语句;
3.转向语句:break语句,goto语句,continue语句,return语句。
分支语句
if语句
语法结构
if(表达式)
{
语句1;
}
else
{
语句2;
}
int main() { int age; scanf("%d", &age); if (age < 18) { printf("未成年"); } else { printf("成年"); } return 0; }
多分支
if (表达式)
{
语句一;
else if (表达式2)
语句二;
else
语句三;
}
int main() { int age; sacnf("%d\n", &age); if (age < 18) { printf("未成年\n"); } else if (age >= 10 && age < 30) { printf("青年\n"); } else if (age >= 30 && age < 60) { printf("中年\n"); } else if (age >= 60 && age < 90) { printf("老年"); } else { printf("老寿星"); } return 0; }
在多分支结构中,无论分支有多少,只执行一条。在if else语句中,注意if与else的配对,else会优先与跟他近的if配对。c语言中0为假1为真,判断条件真假决定是否执行。
其次在书写习惯上,当比较常量与变量时,常量放在左边,变量放在右边。
switch 语句
语法形式
switch (整形表达式)
{
语句项;(case 整型常量表达式:语句;)
}
int main() { int day = 0; scanf("%d", &day);//可以放字符型,被理解为ASCLL码 switch (day) { case 1: printf("星期一"); break; case 2: printf("星期二"); break; case 3: printf("星期三"); break; case 4: printf("星期四"); break; case 5: printf("星期五"); break; case 6: printf("星期六"); break; case 7: printf("星期天"); break; default: printf("输入错误"); break; } return 0; }
在这里,需要注意的是,switch语句中可以是乱序,一般将特殊的放在default之后,break语句决定这性的语句个数,从哪里开始执行一直到break结束。
while循环
语法形式
while (表达式)
{
循环语句;
}
在这里区分一下break与continue的区别
int main() { //打印一到十 int i = 1; while (i <= 10) { //if (i == 5)添加条件,break作用为终止循环 // break;打印1 2 3 4 //若为contiue 跳过cuntinue后的代码,即跳出本次循环,进入下次循环,结果为 1 2 3 4 死循环 printf("%d", i); i++; } return 0; }
举例一个循环语句的应用场景
int main() { printf("输入密码:"); char password[20] = { 0 }; scanf("%s\n", password); //处理\n,清理掉输入缓冲区的内容,一次清理一个字符,用循环清理全部 while (getchar() != '\n') { ; } printf("请确认密码(N/Y):"); int ch = getchar(); if (ch == 'N') { printf("确认成功\n"); }else { printf("确认失败\n"); } return 0; }
在这里 getchar()读取一个字符,返回类型为对应的ASCII码,故为整形。在这里的scanf getchar 这种输入函数,它们的数据是从输入缓冲区中读入的,若缓冲区有东西直接读入。
scanf函数默认读取到处空格就结束。
在这里若没有while (getchar() != '\n'),在输入你的密码并回车时,你的密码被拿走保存在password里,但留下一个\n在缓冲区里,下一次getchar函数调用时,不等你输入,直接用缓冲区里的数据,因此,我们需要在此之前清理缓冲区,即在此前把他读入掉。因为getchar一次只能读一个,故利用循环,无论缓冲区有多少都可以清理掉。
for 循环
语句:
初始化 判断 循环调整
for( 表达式1 ; 表达式2 ;表达式3)
{
循环语句;
}
我们发现在有时候,while循环的决定条件,循环方式控制的语句不集中,代码冗杂时不易查找,而for语句将这三部分都放在了一起,看起来简单明了。
int main() { //打印一到十 for (int i = 1; i <= 10; i++) { //continue; printf("%d ", i); //结果为1234678910 } return 0; }
在while与for循环中,break与continue功能一样(与上面一个对比,这里的i++在前面故不会死循环)
关于for循环语句的控制变量/1.不可再for循环体内修改循环变量,防止失去循环;
2.建议for语句的循环控制变量的取值采用前闭后开区间[0,10),不强求。
for循环的变种
int main() { //for循环的三个部分都可以省略 //若把判断省略,即恒为真 for (; ; ) { printf("1");//死循环1 } //条件外写 int i = 0; int j = 0; for (;i<3;i++) { for (; j < 3; j++) { printf("0"); } } //打印三个0.循环进行一轮就结束,j为3 }
都是不建议这样写。
do while循环
语句
do
{
循环语句;
}
while(表达式);
int main() { int i = 0; do { printf("%d ", i); i++; } while ( i <= 10); } //特点,至少循环一次
介绍完循环与分支结构,看几个应用场景。
二分查找有序数组
int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int size = sizeof(arr) / sizeof(arr[0]); int key = 7;//查找元素 int left = 0; int right = 0; //int mid = (right + left) / 2;//若left+right和过大,溢出存在一些问题。 int mid = left + (right - left) / 2; while (left <= right) { if (arr[mid] < key) { left = mid + 1; } else if (arr[mid] > key) { right = mid - 1; } else { printf("找到了,是第%d个", mid); break; } } }
字符两端向中间移动
给定一个字符串,再给一个全是*字符串且长度相等,展示*字符串两端向中间移动变为该字符串
int main() { //相向赋值,字符两端向中间移动 char arr1[] = "hello world"; char arr2[] = "***********"; int left = 0; int right = strlen(arr1 - 1); while (left <= right) { arr2[left] = arr1[left]; arr2[right] = arr1[right]; printf("%s\n", arr2); Sleep(1000);//顺延1秒,头文件include<windows.h> system("cls"); left++; right--; } return 0; }
模拟用户登陆密码,最多输入三次
int main() { //假设正确密码为"1234567zxc" int i = 0; int flag = 0; char password[] = { 0 }; for (i = 0; i < 3; i++) { printf("请输入密码:"); scanf("%s", password); //判断 if (strcmp(password, "123456zxc") == 0) { printf("密码正确!\n"); flag = 1; break; } else { printf("密码错误!\n"); } } if (flag == 0) { printf("三次都错,电脑关机!"); system("shutdown -s -t 0"); } return 0; }
猜数字游戏
#include<stdio.h> #include<time.h> #include<stdio.h> #include<stdlib.h> void menu() { printf("**********************"); printf("****** 1.play ******"); printf("****** 2.exit *******"); } void game() { //使用rand前可调用srand来设置随机数生成器 int ret = rand()%100+1; //rand函数或返回一个随机数在0-32767之间 //2.猜数字 int guess = 0; printf("请输入猜的数字:"); scanf("%d", &guess); while (1) { if (guess < ret) { printf("猜小了\n"); } else if (guess > ret) { printf("猜大了\n"); } else { printf("恭喜你!猜对了!\n"); break; } } } int main() { //1.生成随机数 //时间戳,时间差,time函数可以返回一个时间戳,参数是时间指针。 srand((unsigned int)time(NULL)); int input = 0; do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 2: printf("退出游戏\n"); break; default: printf("输出错误\n"); break; } } while (input); return 0; }