C语言循环语句,分支语句的使用及例题

#分支语句
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不安全,不要用

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值