判断与循环

判断与循环

1.If语句

含义:如果if语句判断成立,那么就执行if大括号里面的内容,如果不成立就跳过该括号里面的语句

语法:

if(条件){

}W

注意:

  • 如果没有大括号,紧跟着if后面的语句条件成立的时候执行。
  • IF语句后面要没有分号,分号放在语句结束后

关系运算:

运算符 意义
== 相等
!= 不相等
> 大于
>= 大于或等于
< 小于
<= 小于等于

注意:

  • 关系运算符的结果要么是0或者1
  • 1代表true,0代表false
  • 所有的关系符的优先级比算术运算符的低,但是比赋值运算符的高
  • 判断是否相等的==和判断不相等的!=和其他运算符优先级要低,而连续的关系运算的关系是从左到右的
#include <stdio.h>

int main()
{
	printf("%d \n",5==3); //0
	printf("%d \n",5>3);  //1
	printf("%d \n",5<=3); //0
	printf("%d \n",7<=4+3); //1

	return 0;
}
#include <stdio.h>

int main()
{
	int a =1;
	int b =2;
	printf("%d \n",5>3==5>4); //1
	printf("%d \n",6>5>4); //0
	printf("%d \n",a==b==3);//从左到右  结果为0 
	printf("%d \n",a==b>0); //结果为:1 
	
    return 0;
}

image-20210910105830191

#include <stdio.h>

int main() {
	//初始化
	double price = 0;
	double bill = 0;

	printf("请输入金额:");
	scanf("%f", &price);
	printf("请输入票面:");
	scanf("%f", &bill);

	/*	double change=bill-price;
		if(change>0){
		  printf("用户余额不足\n");
		}
		else{
		  printf("应该找您:%f \n",change);
		}
		*/
	//计算找零
	if(bill>price) {
		printf("用户余额不足\n");
	} else {
		printf("应该找您:%f\n",bill-price);
	}
	return 0;
}

1.1嵌套if else

示例:比较大小

#include  <stdio.h>

int main()
{
    int a,b,c;
    printf("请输入三个整数:\n");
    scanf("%d %d %d",&a,&b,&c);
	
	int max =0;
	if(a>b){
	    if(a>c){
	    	max =a;
		} else{
			max =c;
		}
	}else{
		if(b>c){
			max =b;
		}else{
			max =c;
		}			
	}
	printf("The max is %d\n",max);
	return 0;
}
#include <stdio.h>

int main() {
	const int READY = 24 ;
	int code =0;
	int count = 0;
	printf("请输入code和count的值:\n"); 
	scanf("%d %d",&code,&count);

	if(code ==READY) {
		if (count <20) {
			printf("一切正常\n");
		} else {
			printf("出现故障\n");
		}
	} else {
		printf("继续等待\n");
	}
	return 0;

}

注意:

  • else总是和最近的if匹配
  • 在if或else后面总用{},即便只有一条if语句

1.2级联的if-else if

示例:分段函数

#include <stdio.h>
//级联的if-else if
int main() {
	int x=0;
	int fx=0;
	printf("请输入x的值:\n");
	scanf("%d",&x);

	if(x<0) {
		fx=-1;
	} else if(x==0) {
		fx=0;
	} else {
		fx=2*x;
	}
	printf("函数值为:%d",fx);
	return 0;

}

注意:

  • 在c语言当中,=不是表示等于的意思,==才是不要搞错了
  • if只要()里面的值是零或者非零就会做事情

1.3 多路分支

switch语句

switch (控制表达式){

​ case 常量;

​ 语句..

break;

​ case 常量;

语句..

​ break;

​ default:

​ 语句...

}

#include <stdio.h>

int main()
{
	const int MRN =2; 
	int type;
	
	scanf("%d",&type);
	
	switch(type){
	//控制表达式(就是括号内的)只能是整形的表达式 
	case 1://常量也可以是常数,也可以是常数计算的表达式 
		printf("你好");
		break;
	case MRN:
		printf("早上好");
		break;
	case 3:
		printf("晚上好");
		break;	
	case 4:
		printf("再见");
		break;
	default:
	    printf("啊?什么啊?");	
		
	}
}

注意:

  • 控制表达式(就是括号内的)只能是整形的表达式
  • 常量也可以是常数,也可以是常数计算的表达式
  • 如果case后面没有break,那么会执行到下个case里面去,直到遇到一个break,或者switch结束为止

示例:

#include <stdio.h>

int main()
{
	int score;
	printf("请输入你的成绩:\n");
	
	scanf("%d",&score);
    score /=10;
    switch( score ) {
    	case 10:
 		case 9:  
        printf("你的成绩为A\n");
		break; 
		case 8: 
		printf("你的成绩为B\n");
		break; 
		case 7:
		printf("你的成绩为C\n");
		break;   
		case 6:
		printf("你的成绩为D\n");	 
		break; 
		default:	
		printf("你的成绩为F\n");
    	break;
	} 
	
	return 0;
}

2. 循环

2.1while循环

作用:如果条件成立,则执行循环体中的语句,直到运行到条件不成立

语法:

while(条件){

循环体

}

示例:

程序要读入一个四位数一下(含四位数)的正整数,然后输出这个整数的位数

#include <stdio.h>
用if来做
//程序要读入一个四位数一下(含四位数)的正整数,然后输出这个整数的位数
int main() {

	int num1 = 1;
	printf("请输入四位数以下(含四位数的正整数): \n");
	scanf("%d",&num1);

	if(num1>999) {
		printf("您输入的是四位数\n");
	} else if(num1>99) {
		printf("您输入的是三位数\n");
	} else if(num1>9) {
		printf("您输入的是二位数\n");
	}else{
		printf("您输入的是一位数\n");
	}
	
	return 0;
}
#include <stdio.h>

int main()
{
	int x;
	int n=0;
	printf("请输入正整数: \n");
	scanf("%d",&x);
	n++;
	x/=10;
	while(x>0){
		n++;
		x/=10;
	}
	printf("您输入的是%d位数\n",n);
	return 0;
}

注意

  • 在循环体内要有改变条件的机会否则就成死循环了

2.1.1do while 循环

定义:在进入循环的时候不做检查,而是在执行完一轮循环体的代码之后,再来检查循环的条件是否满足,如果满足则进行下轮的循环,不满足则结束循环

语法

do

{

<循环体语句>

}while(<循环条件>);

do-while和while的区别:

  • do-while循环出来的时候判断,while先判断是否满足,再执行
  • 即do-while无论满足都会执行一次

示例:

#include <stdio.h>

int main() {
	int x;
	int n=0;
	printf("请输入正整数: \n");
	scanf("%d",&x);

	do {
		x/=10;
		n++;
		printf("x=%d,n=%d\n",x,n);
	} while(x>0);//while循环后面要有分号 

	printf("您输入的是%d位数\n",n);
	return 0;
}

注意:

  • while循环后面要有分号

2.1.2随机数

语法:rand(),预加载文件要加上#include <time.h>,在前面还要写个srand(time(0));

作用:每次召唤rand()就得到一个随机数的整数

#include <stdio.h>
#include <stdlib.h>
#include <time.h> 
//引入类库 
int main()
{
	srand(time(0));//暂时不知道什么意思 
	int a =rand();//生成一个随机数并赋值给a ,四位以内随机数
	
	printf("%d\n",a%100);//a是一百一类的
	return 0;
	
 } 

示例:

猜数游戏

image-20210911173627815

#include <stdio.h>
#include <stdlib.h> 
#include <time.h>
////引入类库 

int main() {
	srand(time(0));
	int num=rand()%100;//生成一个1~100的随机数
	int a=0;//初始化变量
	int count=0;//计数
	do {
		printf("请猜一个数(1~100):");
		count++;
		scanf("%d",&a); //获取a的值
		if(a>num) {
			printf("你猜的数太大了!\n"); 
		} else if(a<num) {
			printf("你猜的数太小了!\n");
		}
	} while(a!=num);
	printf("太好了你猜对了,用了%d次,答案为:%d",count,num);
	return  0;
}
算平均数
#include <stdio.h>
#include <stdlib.h> 
#include <time.h>
////引入类库 

int main() {
	srand(time(0));
	int num=rand()%100;//生成一个1~100的随机数
	int a=0;//初始化变量
	int count=0;//计数
	do {
		printf("请猜一个数(1~100):");
		count++;
		scanf("%d",&a); //获取a的值
		if(a>num) {
			printf("你猜的数太大了!\n"); 
		} else if(a<num) {
			printf("你猜的数太小了!\n");
		}
	} while(a!=num);
	printf("太好了你猜对了,用了%d次,答案为:%d",count,num);
	return  0;
}
整数数位的判断

分析:

  • 对一个整数做10%的操作,就得到它的个位数;
  • 对一个整数做/10的操作,就是去掉它的个位数;
  • 然后再对2的结果做%10,就得到原来数的十位数了以此类推
案例:逆序整数

方法1:

#include <stdio.h>

int main() {
	int x = 0; //接收输入的整数
	printf("请输入一个正整数:\n");
	scanf("%d",&x);
    int dight =0;
	//int ret=0;
	//用于接收反转之后的整数
 
	//先知道它的最后一位数
	while(x>0) {
		dight = x%10;
		printf("%d",dight);
		x/=10;//去掉最后一位数,目的:进入循环之后再%10得到倒数第二位数
	}
    return 0;

}

方法2:(700就只能倒序为7,不太推荐)

#include <stdio.h>

int main()
{
	int x;
	printf("请输入一位正整数:\n");
	scanf("%d",&x);
	int dight =0;
	int ret = 0; 
	while(x>0){
		dight =x%10; //获得最后一位的数 
		//printf("%d",dight);
		ret =ret*10+dight;
		//printf("x=%d,dight=%d,ret = %d \n",x,dight,ret);
		x /=10; //去掉最后一位的数 
	}
	printf("%d",ret);
	return 0;
}

2.2for循环

作用:for循环像一个计数循环:设定一个计数器,初始化它,然后在计数器到达某值之前,重复执行循环体,而每执行一轮循环,计数器值以一定步步调整,不如加1或者减1,可以做其他的运算,不一定是加一或者减一

语法:

for(初始动作;条件;每一轮的动作){

循环体

}

  • for中国的每一个表达式都可以省略
  • for(;条件;) == while(条件)

示例:

for (count=10;count>0;count--)

  • 翻译成中文就是:一开始count=10,当count>0时重复做循环体,没完成一次循环,使得count--

注意:

  • 求和时,记录结果的最初变量应该初始化为0
  • 求积时,记录结果的最初变量应该初始化为1
  • 循环控制变量i之在循环里面被使用了在循环外面他没有任何作用,因此,外面可以把变量i的定义写到for语句里面去

示例:

阶乘
#include <stdio.h>

int main() {
	int n;
	scanf("%d",&n);
	int fact =1;


	int i=1;
	if(n==0) {
        printf("0!=1\n");
	} else {
		for (i=2; i<=n; i++) {
			fact *=i;
		}
		printf("%d!=%d\n",n,fact);
	}
	return 0;

}

反向乘

#include <stdio.h>

int main() {
	int n;
	scanf("%d",&n);
	int fact =1;

//    int i =1;
//    for(int i=2;i<=n;i++){
//    	fact *=i;
//	}
	int i=1;
	if(n==0) {
        printf("0!=1\n");
	} else {
		for (i=n; i>1; i--) {
			fact *=i;
		}
		printf("%d!=%d\n",n,fact);
	}
	return 0;

}

2.1循环控制

  • break:跳出循环
  • continue:跳过循环这一轮进入下一轮的语句进入下一轮
素数(break)
#include <stdio.h>

int main(){
	int x;
	scanf("%d",&x);
    
	int i;
	int isPrime =1;  //x是素数 
    for(i=2; i<x; i++){
		if(x %i==0){
		     isPrime =0;
		     break ;//跳出循环
		}
	}
	if (isPrime ==1 ){
		printf("是素数\n");
	}else{
		printf("不是素数\n");
	}

	return 0;
} 

2.2循环的嵌套

含义:循环里面还是循环

  • 一般来说:每一层用的控制变量是不一样的
计算前50个素数
#include <stdio.h>

int main() {
	int x;
	int cnt =0; 
//	for(x=1; cnt<50; x++) {
//	他的条件不一定要用x 
    x=1;
	while(cnt<50){
		int isPrime =1;
		int i;
		for(i=2; i<x; i++) {
			if(x%i==0) {
				isPrime =0;
				break;
			}
		}
		if(isPrime==1) {
			cnt ++; 
			printf("%d\t",x);
			if( cnt %5 ==0){
				printf("\n");
			}
		}
		x++;
	}
	return 0;
}
2.2.1从嵌套循环中跳出
  • break和continue只能对它所在的那层循环做

第一种方法:在每个层for循环中加上break

#include <stdio.h>

int main() {
	int x;
	int one,two,five;
	int exit=0;
	x=2;
	for(one=1; one < x*10; one++) {
		for(two=1; two < x*10/2; two++) {
			for(five=1; five < x*10/5; five++) {
				if(one*1+two*2+five*5==x*10) {
					printf("用%d个一角%d个两角和%d五角可以找零%d元 \n",one,two,five,x);
					exit=1;
					break;
					//这个break只会结束内层的循环
				}
			}
			if(exit)break;
		}
		if(exit) break;
	}
	return 0;
}

第二种方法:goto

#include <stdio.h>

int main() {
	int x;
	int one,two,five;
	int exit=0;
	x=2;
	for(one=1; one < x*10; one++) {
		for(two=1; two < x*10/2; two++) {
			for(five=1; five < x*10/5; five++) {
				if(one*1+two*2+five*5==x*10) {
					printf("用%d个一角%d个两角和%d五角可以找零%d元 \n",one,two,five,x);
					exit=1;
					goto out;
					//goto out; out为自己所写的标号:意思就是跳到写的out的那个位置上去 
				}
			}
		}
	}
	out;
	return 0:
}

本章习题:

1.前n项求和

#include <stdio.h> 
//f(x)=1+1/2+1/3...+1/n
int main()
{
	int n;
	int i;
	double sum =0.0;
//	scanf("%d",&n);
	n=1000;
	for(i=1;i<=n;i++){
		sum+=1.0/i;
	}
	printf("f(%d)=%f \n",n,sum);
	return 0;
}
#include <stdio.h> 
//f(x)=1-1/2+1/3...+1/n
int main()
{
	int n;
	int i;
	double sum =0.0;
//	scanf("%d",&n);
    double sign=1.0;
	n=10000;
	for(i=1;i<=n;i++){
		sum+=sign*1/i;
		sign=-sign;	
	}
	printf("f(%d)=%f \n",n,sum);
	return 0;
}

2.正序分解整数

错误案例:

#include <stdio.h> 

int main()
{
	int x=0;
	scanf("%d",&x);
	int t=0;
	int dight=0;
/*	x=123;        
	123/100=1     
	123%100=23
	23/10=2
	23%10=3 
	3/1=3
	3%1=0

	123%10=3 最后一位 
	123/10=12
	12%10=2  最后两位 
	12/10=1 
	1%10=1
	1/10=0
	*/
	while(x>0){
		dight=x%10;//获取最后一位数
		t=t*10+dight;  
		x/=10; //去掉最后一位 
		printf("x=%d,dight=%d,t=%d \n",x,dight,t); 
	}
	x=t;//得到翻转之后的三位数 
	
	int dight2=0;
    while(x>0){
    	dight2=x%10;//得到最后一位数 
		printf("%d",dight2);
		if(x>=10){
			printf(" ");
		} 
		x/=10; 
	}
	printf("\n");
	return 0;
}

正解:

#include <stdio.h> 
/*思路: 
    x=123;        
	123/100=1  //得到第一位    
	123%100=23  //去掉第一位 
	23/10=2  //得到第二位   
	23%10=3 
	3/1=3
	3%1=0
	*/
int main()
{
	int x=10;
	scanf("%d",&x);

    int cnt=0;
	int mask=1; 
	int t=x;
	while(x>9){
		x/=10;
		//去掉最后一位 
		mask *=10;
		//让mask可以符合循环条件进行后面的操作 
		cnt++;
	} 
	//printf("mask=%d\n",mask);
    //用函数pow,算出 
    //int mask =pow(10,cnt-1);
    x=t;
	do{
		int d=x/mask; //得到第一位数
		printf("%d",d);
		if(mask>9){
			printf(" ");
		}
		x%=mask; //去掉第一位 
		mask /=10;  
		//printf("x=%d,mask=%d,d=%d\n",x,mask,d);
	}while(mask>0);

	printf("\n");
	return 0;
}

3.最大公约数

方法一:枚举法

#include <stdio.h>
//枚举法
int main() {
	int i;
	scanf("%d",&i);
	int j ;
	scanf("%d",&j);
	int min;
	if(i>j) {
		min=j;
	} else {
		min=i;
	}
	int t=1;
	int ret=0;
	for(t=1; t<=min; t++) {
		if(i%t==0) {
			if(j%t==0) {
				ret=t;
			}
		}
	}
	printf("最大公约数:%d",ret);
    return 0;
}

方法2:辗转法

#include <stdio.h>
//枚举
/*如果b等于0,计算结束,a就是最大公约数;
否则,计算a除以b的余数,让a等于b,而b等于那个余数;
回到第一步. */
int main() {
	int a,b;
	scanf("%d %d",&a,&b);
    int t=0;
     while(b!=0){
     	t=a%b;
     	a=b;
     	b=t;
     	
	 }
	printf("最大公约数:%d",a);

}

4.水仙花

#include <stdio.h>
//输出所有的“水仙花数”,所谓的“水仙花数”是指一个N位数其各位数字的N次幂和等于该数本身,
//例如153是“水仙花数”,因为:153 = 13 + 53 + 33。
int main() {

	int n;
	scanf("%d",&n);

	int first=1;
	int i=1;
	//得到n位最小的整数
	while(i<n) {
		first *=10;
		i++;
	}

	i=first;
	//进行遍历
	while(i<first*10) {
		int t= i;
		int sum = 0;
		//分解 t的值 
		while(t>0) {
			int d = t%10;
			t/=10;
			//拿t的值算出n的幂次方 
			int p =1;
			int j =0;
			while(j<n) {
				p*=d;
				j++;
			}
			// 把所有 算的p加起来 
			sum += p;
		}
		if(sum== i){
			printf("%d \n",i);
		}
		i++;
	}
	return 0;

}

5.给定条件的整数的整数集

#include <stdio.h>

int main(){
	int x;
	printf("请输入一个6以内的数(不包含6):\n");
	scanf("%d",&x);
	int i,j,k;
	int max=x+3;
	int count=0;
	for(i=x;i<=max;i++){
		for(j=x;j<=max;j++){
			for(k=x;k<=max;k++){
				if(i!=j){
					if(i!=k){
						if(j!=k){
							printf("%d%d%d",i,j,k);
							count++;
							if(count==6){
								printf("\n");
								count=0;
							}else{
								printf(" ");
							}
						}	
					}	
				}
		   } 
		} 
	}
	return 0;
}

6.九九乘法表

#include <stdio.h>

int main() {
	  int i,j;
	  for(i=1;i<=9;i++){
	     for(j=1;j<=i;j++){
			printf("%d*%d=%d",j,i,i*j); 
	     	if(i*j<10){
	     		printf("   ");
			 }else{
			 	printf("  ");
			 }
	     }
	      printf("\n");
	  }
	  return 0;
}  

7.打印M-N区间内的素数

#include <stdio.h>

int main() {
	int m,n;
	scanf("%d %d",&m,&n);
	int i,k;
	int sum=0;
	int cnt=0;
    if (m==1)m=2;
	for(i=m; i<=n; i++) {
		int isPrime=1;
		for(k=2; k<i; k++) {
			if(i%k==0) {
				isPrime=0;
				break;
			}
		}
		if(isPrime) {
			cnt++;
			sum+=i;
		}
	}
	printf("%d %d",cnt,sum);
	return 0;
}

8.n项求和

#include <stdio.h>

//计算前n项的和,2/1+3/2+5/3+8/5...的前n项和
//注意改序列从第二项起,每一项的分子都是前一项分子和分母的和,分母是前一项的分子

int main()
{
	int n;
	scanf("%d",&n);
	int cnt=1;
	double sum=0.0;
    double a=2;//a分子 
	double b=1;//b分母 
    int i;
    double t;
    for(i=1;i<=n;i++){
    	sum +=a/b;
    	t=a;
    	a=t+b;
    	b=t;
    	
	}		
	printf("%.2f\n",sum);	
	return 0;
} 

9.约分最简分式

#include <stdio.h>
int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    int c=b;
    while(b!=0){
        int t=0;
        t= a%b;
        a=b;
        b=t;
    }
    printf("最简形式为:%d/%d",a,b);
    return 0;
}

总结

各种循环应用场景

  • 如果有固定的次数,就用for
  • 如果必须执行一次,用do_while
  • 其他情况用while
posted @ 2021-09-29 15:31  DL50  阅读(175)  评论(0)    收藏  举报