目录
前言
一、分支语句(选择结构)
(一)if语句
1、年龄
2、判断数字是否为奇数
3、输出1~100的奇数
(二)switch语句
总结:
二、循环语句
(一)while循环
打印1~10
总结:
(二)continue
总结:
接下来举几个关于循环的例子:
例一:
例二:猜数字游戏
总结代码:
(三)goto语句
写一个关机程序
C语言有九种控制语句,可以分为三类:
1.条件判断语句,也叫分支语句:if语句、switch语句;
2.循环执行语句:do while语句、while语句、for语句;
3.转向语句:break语句、goto语句、continue语句、return语句。
单分支
if(表达式) 语句;
双分支
if(表达式) 语句1; else 语句2;
多分支
if(表达式1) 语句1; else if (表达式2) 语句2; else 语句3;
举个例子:
1、年龄
int main() { int age = 0; scantf("%d", &age); //单分支 //if (age >= 18) // printf("成年\n") //双分支 /*if (age >= 18) printf("成年\n"); else printf("未成年\n");*/ //多分支 if (age <= 6) printf("儿童\n"); else if (age > 6 && age <= 16) printf("少年\n"); else if (age > 16 && age <= 30) printf("青年\n"); else if (age > 30 && age <= 60) printf("壮年\n"); else if (age > 60 && age <= 80) printf("老年\n"); else printf("老寿星\n"); return 0; }
if语句可以嵌套使用
2、判断数字是否为奇数
//判断数字是否为奇数 int main() { int num = 0; scanf("%d", &num); //判断是否为奇数 if (num % 2 == 1) printf("奇数\n"); else printf("偶数\n"); return 0; }
3、输出1~100的奇数
(1)循环先产生1~100的数字,
(2)判断产生的数字是不是奇数,
(3)是奇数打印
int main() { int i = 1; while (i <= 100) { if (i % 2 == 1) { printf("%d", i); } i++; } return 0; }
或者
int main() { int i = 1; while (i <= 100) { printf("%d", i); i+=2;//i+2的意思 } return 0; }
switch(整型表达式)
{
语句项;
case(整型常量表达式):
语句;
break;
}
int main() { int day = 0; scanf("%d", &day); 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; default: printf("选择错误\n"); } return 0; }
总结:
一般来说,case 决定入口,break 决定出口,若输入的信息错误则会跳到default
只要逻辑恰当,case顺序可以调整;
default如果不在最后,应在后面添加break;
int main() { int day = 0; scanf("%d", &day); 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; default: printf("选择错误\n"); } return 0; }
int main() { int day = 0; scanf("%d", &day); switch(day) { case 1: case 2: case 3: case 4: case 5: printf("工作日\n"); break; case 6: case 7: printf("休息日\n"); break; default: printf("选择错误\n"); } return 0; }
两串代码效果相同,因此并不是每个case后面都需要break
while(表达式)
循环语句;
//表达式为真,执行循环语句
打印1~10
int main() { int n = 1; while (n <= 10) { printf("%d", n); n++; } return 0; }
那while循环中break应该如何使用,举个例子:
int main() { int n = 1; while (n <= 10) { if (5==n) { break; } printf("%d", n); n++; } return 0; }
总结:
break在while循环中的作用:
在循环中人只要遇到break,就停止后期的所有循环,直接终止循环。
因此,while循环中的break是用于永久终止循环的。
我们将上面代码中的break换成continue看看效果:
此时,光标闪烁,代码等待,进入死循环
代码反复在while和continue之间运行,但对输出结果没有任何改变
总结:
continue用于终止本次循环,也就是本次continue后面的代码不会再执行,
而是直接跳到while语句的判断部分,进行下一次循环的入口判断。
先介绍一个函数:getchar putchar
int main()
{
char ch = 0;
/*scanf("%c", &ch);
printf("%c", ch);*/
//scanf和printf用于各种类型,如:整型、字符、浮点型……
//getchar putchar只用于字符
ch = getchar();
putchar(ch);
return 0;
}
getchar输入字符,在输入缓冲区检查有无字符,没有字符,在键盘上输入字符,getchar从缓冲区中取一个字符A,while循环判断,不等于EOF输出;此时缓冲区中还有 \n ,getchar取出,判断,换行,等待输入……
putchar输出字符,读取成功返回字符的ASCII码值;读取失败返回EOF
这里为什么错误呢?
scanf遇到 \n 甚至是空格 就不拿走了,剩下的\n只能到下面的getchar中,而\ n 不是 Y 就进入else,确认失败。
既然这样的话,我加入一个 getchar 拿走 \n 是不是就可以了?
但如果我输入了
就又不行了。
于是,一鼓作气,加一个while循环,直到getchar拿到了'\n'才停止
int main() { char password[20] = { 0 }; int ch = 0; printf("请输入密码:_"); scanf("%s", password); //这里的password是数组,数组名本来就是地址,因此不需要使用取地址符 while(getchar()!='\n') { ; } //清除缓冲区 printf("请确认密码(Y/N)"); ch = getchar(); if (ch == 'Y') printf("确认成功\n"); else printf("确认失败\n"); return 0; }
1.程序会生成一个1~100之间的随机数
2.猜数字
1>猜大了,程序告诉你猜大了,继续猜
2>猜小了,程序告诉你猜小了,继续猜
3>猜对了,程序告诉你:恭喜你,猜对了
3.可以反复玩
设置一个菜单,选择继续玩还是退出
希望游戏一开始就能打印菜单,说明游戏至少能进行一次,使用do while循环
void menu()//void表示这个函数不需要返回
{
printf("************************\n");
printf("****** 1.play ******\n");
printf("****** 0.exit ******\n");
printf("************************\n");
}
int main()
{
int input = 0;
do
{
menu();//打印菜单
printf("请选择:__\n");
scanf("%d", &input);//需要有一个数字输入决定玩还是不玩
switch (input)//判断一下输入的数字
{
case 1://玩猜数字游戏
printf("开始游戏\n");
break;
case 0://退出,不玩
printf("退出游戏\n");
break;
default ://输入的数字错误
printf("选择错误,重新选择\n");
break;
}
} while (input);
return 0;
}
此时,框架已初步完成;我们需要开始编写游戏部分
首先要生成随机数,介绍一个函数rand,rand函数是专门用来生成随机数的
rand函数返回的是0~RAND_MAX(32767)之间的一个随机数,它的头文件是#include
在这个时候,就有人兴致勃勃的去实践了,他就可能直接写:
#define _CRT_SECURE_NO_WARNINGS 1 #include
#include void menu() { printf("************************\n"); printf("****** 1.play ******\n"); printf("****** 0.exit ******\n"); printf("************************\n"); } void game() { //1.生成随机数,打印看看 int ret=rand(); printf("%d\n",ret); } int main() { int input = 0; do { menu();//打印菜单 printf("请选择:__\n"); scanf("%d", &input); switch (input) { case 1://玩猜数字游戏 game();//game函数中是猜数字的整个路基逻辑,不需要返回 break; case 0: printf("退出游戏\n"); break; default : printf("选择错误,重新选择\n"); break; } } while (input); return 0; } 运行就发现问题了,无论你运行几次,每次打印的数字都是一样的;
这是因为:在使用rand函数时,还要使用另外一个函数srand去初始化随机数生成起点
于是,我就把代码改动一下
void game() { srand(0) int ret=rand(); printf("%d\n",ret): }
这次运行又不行:srand()中括号里是什么值,运行后就只对应一个数,要想不断随机出不同的数,括号里面就要是一个随机数,死循环。
换个思路,其实我们不一定要随机数,要一个变化的数就行,时间就是在不断变化的,这里引入时间戳的概念。Unix时间戳就是从1970年1月1日开始到现在所经过的秒数,不考虑闰秒。
C语言中time函数会返回时间戳。头文件是#include
但是,运行起来还是有弊端,当我运行速度很快时,他所显示的随机数就会很接近,甚至相同。其实,我们是不是只要调取一次srand就行,不需要频繁调取。所以,将srand函数放到main函数中。
有细心的人就发现了,我们这个数太大了呀,随机数不是只要0~100吗?
这里只要把生成的随机数%100+1就行了。无论再大的数,%100后都不可能等于100,+1后也不可能是0。
最后,编写猜数字环节,输入数字,存放“我”猜的数字,然后与 ret 进行比较,用if语句比较,while语句循环。
总结代码:
#define _CRT_SECURE_NO_WARNINGS 1 #include
#include #include void menu()//void表示这个函数不需要返回 { printf("************************\n"); printf("****** 1.play ******\n"); printf("****** 0.exit ******\n"); printf("************************\n"); } void game() { //1.生成随机数,rand函数是专门用来生成随机数的 int ret = rand()%100+1; int num = 0; //printf("%d\n", ret); //2.猜数字 while (1) { printf("请猜数字:》\n"); scanf("%d", &num); if (num < ret) { printf("猜小了\n"); } else if (num > ret) { printf("猜大了\n"); } else { printf("恭喜你,猜对了!\n"); break; } } } int main() { srand(time(NULL));//此时time函数中传入空指针 //srand函数只要在程序中调用一次就好了,不需要多次调用,因此放在mian函数中 int input = 0; do { menu();//打印菜单 printf("请选择:__\n"); scanf("%d", &input);//需要有一个数字输入决定玩还是不玩 switch (input)//判断一下输入的数字 { case 1://玩猜数字游戏 game();//game函数中是猜数字的整个路基逻辑,不需要返回 break; case 0://退出,不玩 printf("退出游戏\n"); break; default ://输入的数字错误 printf("选择错误,重新选择\n"); break; } } while (input); return 0; }
int mian() { flag: printf("o_o\n"); goto flag; return 0; }
运行这个代码会不断的打印 o_o ,因为在同一个函数内部中,当代码运行到goto时,会跳转到flag,此处不断循环。
最常见的用法是在深度嵌套的函数中,goto就能直接跳出并结束程序。
写一个关机程序
1.程序执行起来就倒计时关机,倒计时一分钟
2.如果输入“快停下来啊!!!”就取消关机
这里需要用到两个命令:
shutdown -s -t 60 一分钟后关机
shutdown -a 取消关机
这里一定记得前面要空格
#include
#include int main() { char input[20] = { 0 }; system("shutdown -s -t 60"); again: printf("系统将在一分钟内关机,如果输入:快停下来啊!!!将取消关机\n"); scanf("%s", input); //判断 if (strcmp(input, "快停下来啊!!!") == 0) { system("shutdown -a"); } else { goto again; } return 0; }