#分支语句
1.if
2.switch
语法格式:
switch(表达式){
case 常量或者常量表达式:
语句;
[break;]
...
[default:
语句;
break;
]
}
#include<string.h>
switch(m){
case 12:
case 1:
case 2: :puts(“冬季”);
break;
case 3:
case 4:
case 5:puts(“春季”);
...
default:
}
或者
if(mon>0&&mon<=12){
switch(m/3){
case 1:
case 2:
case 3:
default:
puts(“冬”);
break;
}
}
switch () 括号中的表达式结果只能是整数(字符本质上也是整数),所以不能是浮点数,也可以是变量 int x= 1; switch(x) 。
case标号 标号不能用变量例如x这种即使在外面已经定义为1,即#define x 1 宏定义或者 10/5 5%2 这种都行
case后面只能是一个确切的值,不能由变量(即使用const修饰的变量也不行)
case 0.01:也不行 case 10/5 可行
但是标号的常量值不能出现相等的情况,标号后面的语句不允许声明定义变量,除非加上{ }大括号,用{}括起来的代码称为语句块
case和default语句后面不一定要break,
switch其实是一个开关语句 case作为开,break为关
只有switch表达式的结果和case语句的值相等时,才进入相应的case执行代码,遇到break才会跳出switch,否则一次顺下执行,并且忽略判断其余case的标号,直接运行case中的于语句。
case 3 … 5 #意为3~5 !注意 … 三点前后必须要有空格,并且这种语法只在gnu标准里面是被允许的,其他不行
default 放在最后可以省略break.
练习:
1.输入一个百分制成绩,输出这个成绩的成绩 优秀,良好…
#include <stdio.h>
int main(){
int score = 0;
printf("请输入一个百分制成绩:");
scanf("%d",&score);
if(score >= 0 && score <= 100){
switch(score/10){
case 10:
case 9:
printf("优秀\n");
break;
case 8:
printf("良好\n");
break;
case 7:
printf("中等\n");
break;
case 6:
printf("及格\n");
break;
default:
printf("不及格\n");
break;
}
}else{
printf("不是一个百分制成绩!\n");
}
return 0;
}
2.输入一个有效日期,判断这个日期是当年的第几天
#include <stdio.h>
int main(){
int year,mon,day;
printf("请输入一个日期:");
scanf("%d%d%d",&year,&mon,&day);
int isleap = year%4==0&&year%100!=0||year%400==0;
int ds = 0;
switch(mon){
case 12:ds+=30;//+的是前一个月的天数,最后case1加上当月的日数
case 11:ds+=31;
case 10:ds+=30;
case 9:ds+=31;
case 8:ds+=31;
case 7:ds+=30;
case 6:ds+=31;
case 5:ds+=30;
case 4:ds+=31;
case 3:ds+=28+isleap;
case 2:ds+=31;
case 1:ds+=day;
}
printf("该日期是当年%d天\n",ds);
return 0;
}
3.玩石头 剪刀 布
涉及到srand(time(NULL)) 设置随机种子,这是随机函数rand()要用到的
会用 到time和stdlib头文件
//如果要随机生成[1,33]的随机号码
rand()%33+1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
//随机数
srand(time(NULL));//设置随机种子 如果不设置随机种子,那么种子将是一个固定的数字
//大部分的游戏 都是随机事件
int n = rand()%3;//伪随机数 随机数是根据随机种子生成出来的
//printf("%d\n",n);
//0石头 1布 2剪刀
int in = 0;
printf("请输入0:石头 1:布 2:剪刀 :");
scanf("%d",&in);
switch(in){
case 0:
switch(n){//系统的不同出法
case 0:
printf("平局!\n");break;
case 1:
printf("失败!\n");break;
case 2:
printf("赢了!\n");break;
}
break;
case 1:
switch(n){
case 0:
printf("赢了!\n");break;
case 1:
printf("平局!\n");break;
case 2:
printf("失败!\n");break;
}
break;
case 2://剪刀
switch(n){
case 0:
printf("失败!\n");break;
case 1:
printf("赢了!\n");break;
case 2:
printf("平局!\n");break;
}
break;
default:
printf("输入无效!\n");
break;
}
//生成号码为[1,33]的随机号码 rand()%33+1
return 0;
}
循环语句
for循环
while循环
do while循环
无条件跳转 goto
使用数学函数库 pow sqrt
1. #include<math.h>
2. 编译时 gcc x.c -lm
for(int i=0;i<10;i++)
for 循环中有两个;;不能省略,即for(;;)无限循环的表达同while(1)
练习
1.找出所有的水仙花数
#include <stdio.h>
#include <math.h>
int main(){
int num = 0;
for(num=100;num<1000;num++){
int n = num%10;
int t = num/10%10;
int h = num/100;
//if(n*n*n + t*t*t + h*h*h == num){
if(pow(n,3)+pow(t,3)+pow(h,3) == num){
printf("%d ",num);
}
}
printf("\n");
return 0;
}
2.输入一个整数,判断该整数是否是一个素数(质数)
素数:只能被1和自己本身整数的数 0,1不是素数
因为只判断正数,所以我们采用绝对值
num = num<0?-num:num;//绝对值
#include <stdio.h>
int main(){
int num = 0;
printf("请输入一个正整数:");
scanf("%d",&num);
num = num<0?-num:num;//绝对值
int isprime = 1;//假设它是质数
int i=0;
for(i=2;i<=sqrt(num);i++){
if(num%i==0){//找到了一个i可以整除 说明num不是质数
isprime = 0;//不是质数
//只需要找到一个数能够整除即可 没必要一直找下去
//提高效率一种方式 跳出没有意义的循环
break;//提前结束循环
}
}
if(isprime == 1 && num != 1 && num != 0){
printf("%d是质数!\n",num);
}else{
printf("%d不是一个质数!\n",num);
}
return 0;
}
3.找出100以内的素数
#include <stdio.h>
#include <math.h>
int main(){
int num = 0;
for(num=2;num<100;num++){
int isprime = 1;//假设它是质数
int i=0;
for(i=2;i<=sqrt(num);i++){
if(num%i==0){//找到了一个i可以整除 说明num不是质数
isprime = 0;//不是质数
//只需要找到一个数能够整除即可 没必要一直找下去
//提高效率一种方式 跳出没有意义的循环
break;//提前结束循环
}
}
if(isprime == 1){
printf("%d ",num);
}
}
printf("\n");
return 0;
}
4.输入两个整数,求它们的最大公约数
用辗转求余法%
辗转求余:
24 36
24%36 24
36%24 余数是12
上一个除数%余数
24%12 0 所以最大公约数是12
36 11
36%11 3
11%3 2
3%2 1
2%1 0 所以最大公约数是1
这是辗转相减法,道理相同,但是减法比除法慢很多
24 36
36-24 = 12
24-12 = 12
12-12 = 0 12
36 11
36-11 = 25
25-11 = 14
14-11 = 3
11-3 = 8
8-3 = 5
5-3 = 2
3-2 = 1
2-1 = 1
1-1 = 0 1
#include <stdio.h>
int main(){
int a,b;
printf("请输入两个整数:");
scanf("%d%d",&a,&b);
if(a==0||b==0){
printf("没有最大公约数!\n");
}else{
int i;
//for(i=1;i<=(a<b?a:b);i++){}//不能写这种
//for(i=a<b?a:b;i>=1;i--){}
int max = a>b?a:b;
int min = a>b?b:a;
for(;max-min!=0;){
int c = max-min;
max = min>c?min:c;
min = min>c?c:min;
}
printf("%d\n",min);
//以上是辗转相减求余的方法
//以下是辗转相除求余的方法
for(;a%b!=0;){
int y = a%b;
a = b;
b = y;
}
printf("%d\n",b);
}
return 0;
}
5.输入一个整数,判断这个整数是个几位数
#include <stdio.h>
int main(){
int num = 0;
scanf("%d",&num);
int cnt = 0;
if(num==0){
cnt = 1;
}
for(;num!=0;cnt++){
num = num/10;
}
//12345
printf("%d\n",cnt);
return 0;
}
6.输入一个整数 输出这个整数的逆转数
12345 -> 54321
#include <stdio.h>
int main(){
int num = 0;
scanf("%d",&num);
int n = 0;
for(;num!=0;){
printf("%d",num%10);
n = n*10+num%10;
num = num/10;
}
printf("\n%d\n",n);
return 0;
}
7.计算10的阶乘
#include <stdio.h>
int main(){
int s = 1,n = 0;
for(n=10;n>=1;n--){
s = s*n;
}
printf("%d\n",s);
return 0;
}
8.计算1000的阶乘末尾有几个0
这是竞赛题,凡是先算1000阶乘都是错的,因为数据太大保存不了,
#include <stdio.h>
int main(){
int zero = 0;
int n = 0;
int num = 1000;
for(;num/5!=0;){
zero += num/5;//200个5的倍数 40个25的倍数 8个125的倍数 1个625的倍数
num = num/5;//200
}
printf("%d\n",zero);
return 0;
}
9.输入一个整数,输出这个整数的二进制(补码)
和1按位与==0就是偶数 (x&1)==0
按位与的优先级低于==
#include <stdio.h>
int main(){
int num = 0;
scanf("%d",&num);
//1110 1001 1100 1001 1111 0000 0101 0110
int i=0;
for(i=31;i>=0;i--){
printf("%d",(num>>i)&1);//0...1 1的二进制只有最后一位是1,所以除了最后一位还是原来的数,其他位都变为0,即一次循环只输出最后一个为1或者0的数字
}
printf("\n");
return 0;
}
10.猜数字游戏
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
srand(time(NULL));
int num = rand()%99 + 1;
int left = 0,right = 100;
int guess = 0;//用户的输入
//无限循环 循环条件为空 表示永久为真
for(;;){
//1.提示用户输入
printf("请猜一个在(%d,%d)区间的数字:",left,right);
//2.读取
scanf("%d",&guess);
//3.判断
if(guess == num){
printf("恭喜中奖了!\n");
break;//跳出循环
}
//合法性判断
if(guess > right || guess < left){
printf("猜的数字无效!");
continue;//结束本次循环 直接跳到change语句 进行下次循环判断
}
//大小判断
if(guess > num){
printf("太大了,");
right = guess;
}else{
printf("太小了,");
left = guess;
}
}
return 0;
}
1.while
while(condition)
无限循环 —> while(1){}
条件不能省略,即while() 这样是错误的
2.do{
}while(condition);
do while先执行循环体,再进行条件判断,至少会执行一次循环体的内容
例如判断输入的数字是几位数的时候会用到,
因为0也是一位数,如果用while则会缺少0这个判断,因为我们用来判断何时停止循环,就是当数字=0时,停止循环
do while 不会
3.goto end;
end://相当于一个标签跳转
printf(“无效的非法数据)
如果是顺序执行,它会忽略其他标签,但是goto不安全,不要用