分支语句
循环语句
goto语句
C语句可分为以下五类:
控制语句用于控制程序的执行流程,以实现程序的各种结构方式,他们由特定的语句定义符组成,C语言有九种控制语句。
可分为以下三类:
C语言是结构化的语言,分为三类:顺序结构、选择结构、循环结构。
语法结构:
//单分支
if(表达式)
语句;
//双分支
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
C语言中0表示假,非零表示真。
如果条件成立,要执行多条语句,则应该使用代码块。(即大括号)
#include
int main()
{
if(表达式)
{
表达列表1;
}
else
{
表达列表2;
}
return 0;
}
if(num==5) 可以通过写成 if(5==num) 的方式,防止出现 if(num=5) 的错误。
switch(整形表达式)
{
语句项;
}
什么是语句项
是一些case语句:
case 整型常量表达式
语句;
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1: //整型常量表达式
printf("星期1\n");
break;
case 2:
printf("星期2\n");
break;
case 3:
printf("星期3\n");
break;
case 4:
printf("星期4\n");
break;
case 5:
printf("星期5\n");
break;
case 6:
printf("星期6\n");
break;
case 7:
printf("星期7\n");
break;
}
return 0;
}
如果表达的值与所有的case值都不符合,default子句后面的语句就会执行。所以,每个switch语句中只会出现一条default子句。
语法结构:
while(表达式)
循环语句;
int main()
{
int i = 0;
while (i < 10)
{
if (5 == i) break; //等于五的时候直接跳出循环,不打印5
printf("%d hehe\n",i);
i++;
}
return 0;
}
break直接跳出本循环,不会影响if语句。
int main()
{
int i2 = 0;
while (i2 < 10)
{
i2++;
if (i2 == 5) continue; //跳过本轮循环继续下一次循环
printf("%d hehe\n", i2);
}
return 0;
}
continue跳过本轮循环继续后续循环。
int main()
{
//举个例子
//假设密码是一个字符串
char password[20] = { 0 };
printf("请输入密码");
scanf("%s", password); //password前不加&
int ch3 = 0;
while ((ch3=getchar())!='\n')
{
continue;
}
printf("请确认密码(Y/N):>");
int ret = getchar();
if ('Y' == ret)
printf("YES\n");
else
printf("N\n");
return 0;
}
在使用scanf和getchar获取输入字符串时,会从输入缓冲区中获取,当scanf获取密码时,缓冲区中会留下\n没有被取走,下一次的getchar会直接获取\n。
所以需要通过while循环将输入缓冲区中的字符清空。
当字符以int类型储存到变量中时,是以ASCII码值的方式储存的。当int类型以char类型打印时,也是以ASCII码表转换后打印出来的。
字符类型可以通过比较ASCII大小的方式比较大小。
scanf("%4d%2d%2d", &year,&month,&day); //scanf输入中,%2d表示获取两位整数
printf("month=%02d\n", month); //printf输出中,%02d表示输出两位整数,不满两位前面会用0扩充
printf("NO.%d is %.2f,%.2f,%.2f", id, c, math, eng); //%.2f表示输出的浮点数小数点后保留两位
scanf("%d;%f,%f,%f", &id, &c, &math, &eng); //以分号、逗号、逗号、逗号的方式隔开输入的四个字符
语法结构:
for(表达式1;表达式2;表达式3)
循环语句;
表达式1为初始化部分,用于初始化循环变量的。
表达式2为条件判断部分,用于判断循环时候终止。
表达式3为调整部分,用于循环条件的调整。
int main()
{
for (int i = 1; i <= 10; i++)
{
if (i == 5)
break; //i等于5的时候跳出循环,不会打印5
printf("%d ", i);
}
return 0;
}
建议:
int i=0;
//前闭后开写法
for(i=0;i<10:i++)
{}
//前闭后闭写法
for(i=0;i<=9;i++)
{}
for(int i=0;i<10;i++){} 的写法可能不支持C99的编译器会报错。
语法结构:
do
循环语句;
while(表达式);
循环至少执行一次,使用的场景有限,所以不是经常使用。
//打印阶乘
#include
int main()
{
int n = 0;
scanf("%d", &n); //输入整型
int ret = 1; //输出的阶乘
for (int i = 1; i <= n; i++)
{
ret *= i;
}
printf("%d\n", ret);
return 0;
}
//打印阶乘之和
#include
int main()
{
int n = 0;
scanf("%d", &n); //输入整型
int sum = 0; //输出和
int ret = 1; //输出阶乘
for (int i = 1; i <= n; i++)
{
ret = 1; //注意:阶乘记得初始成1
for (int j = 1; j <= i; j++)
{
ret *= j; //阶乘计算
}
sum += ret; //阶乘之和计算
}
printf("%d\n", sum);
return 0;
}
//打印阶乘之和2
#include
int main()
{
int n = 0;
scanf("%d", &n); //输入整型
int ret2 = 1; //输出阶乘
int sum2 = 0; //输出和
for (int i = 1; i <= n; i++)
{
ret2 *= i; //阶乘计算
sum2 += ret2; //阶乘之和计算
}
printf("%d\n", sum2);
return 0;
}
#include
int main()
{
//二分查找
int arr[] = { 1,2,3,4,5,6,7,8,9 }; //查找数组
int k = 6; //查找数字
int sz = sizeof(arr) / sizeof(arr[0]);//数组长度
int left = 0; //左编号
int right = sz - 1; //右编号
while (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
printf("下标是:%d\n", mid);
break;
}
}
if (left > right)
{
printf("找不到\n");
}
return 0;
}
//字幕两边滚动
#include
#include //vs2022可省略
#include //vs2022可省略
int main()
{
char arr1[] = "welcome to bit!!!!";
char arr2[] = "##################";
int n1 = 0;
while (n1 <= (strlen(arr1)-1) / 2) //字符串用sizeof结尾会多算一个\0,所以此处用strlen
{
arr2[n1] = arr1[n1];
arr2[strlen(arr1)-1 - n1] = arr1[strlen(arr1)-1 - n1];
printf("%s\n", arr2);
Sleep(1000); //延后1000毫秒
system("cls"); //system是一个库函数,可以执行系统命令,这里执行的是cls清空屏幕的命令
n1++;
}
printf("%s\n", arr2);
return 0;
}
#include
#include //vs2022可省略
int main()
{
//模拟用户登录,最多输错三次
//比较两个字符串是否相等,不能使用==,而应该使用一个库函数:strcmp
//如果返回值是0,表示2个字符串相等
int i = 0;
char password[20] = { 0 };
printf("请输入密码\n");
for (i = 0; i < 3; i3++)
{
scanf("%s", password); //数组本身就是地址,不需要加&
if (strcmp(password, "abcdef") == 0)
{
printf("登陆成功\n");
break;
}
printf("输入错误\n");
}
if (i >= 3)
{
printf("输入三次,登陆失败");
}
return 0;
}
//猜数字游戏
#include
#include
#include
void Menu()
{
printf("********************************\n");
printf("********** 1.play **********\n");
printf("********** 0.exit **********\n");
printf("********************************\n");
}
void Game()
{
int guess = 0;
int ret = rand()%100+1; //设置随机数 因为rand函数生成的随机数范围是0~RAND_MAX,这里是0~32767,通过模100的方式转换成0~99的数字
while (guess != -1) //输入非-1的数字时循环猜数字
{
printf("请猜数字");
scanf("%d", &guess);
if (guess < ret&&guess>0)
{
printf("猜小了\n");
}
else if (guess > ret&&guess<101)
{
printf("猜大了\n");
}
else if (guess == ret)
{
printf("恭喜!猜对了\n");
Sleep(2000);
for (int i = 0; i < 5; i++)
{
Sleep(100);
printf("********************************\n");
}
system("cls");
break;
}
else
{
printf("请输入1~100的数字\n");
}
}
}
int main()
{
srand((unsigned int)time(NULL)); //设置随机数种子,输入的(unsigned int)time(NULL)是转换成unsigned int类型的时间戳
int a = 0;
do //循环询问是否开始游戏,输入0退出
{
Menu();
printf("请选择:>");
scanf("%d", &a);
switch (a)
{
case 0:
printf("游戏结束\n");
break;
case 1:
system("cls");
printf("游戏开始\n");
Game();
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (a!=0);
return 0;
}
C语言中提供了可以随意滥用的goto语句和标记跳转的标号。
理论上goto语句没有必要,但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构处理过程。
例如:一次跳出两层或多层循环。
注意:goto不能跨函数跳跃。
#include
int main()
{
again: //标签
printf("hehe\n");
printf("haha\n");
goto again; //跳转到again的地方
return 0;
}
//关机跳转
#include
#include
#include
int main()
{
char input[20] = { 0 };
system("shutdown -s -t 60"); //调用系统关机功能,60秒后关机
again:
printf("请注意,你的电脑在60秒后关机,如果输入:我是猪。就取消关机\n");
scanf("%s", input);
if (strcmp(input, "我是猪") == 0)
{
system("shutdown -a"); //取消系统关机功能
}
else
{
goto again;
}
return 0;
}
此代码慎用!
将工具栏中debug调整成release,再运行一次会编成release版本。保存的文件夹中会有应用程序。