C++初级学习五

2023-12-21 12:15:33

循环语句

? 在实际生活中经常会将同一件事情重复做很多次,比如走路会重复使用左右脚,打乒乓球会重复挥拍的动作等。同样在C语言中,也经常需要重复执行同一代码块,这时就需要使用循环语句。

循环语句分为while循环语句、do…while循环语句和for循环语句三种。

循环的本质:

定义:

在某一条件成立的情况下反复做重复性的事情,这就是循环。

循环结构三要素:

(1)循环从什么时候开始,即“循环变量赋初值"。
(2)满足什么条件要循环,即“循环控制条件表达式”。
(3)每次循环要做什么,即“反复执行的语句",称为”循环体“。

while语句

一般格式:

while(表达式)? ? 循环控制条件表达式

{

循环体;? ? ? ? ? ?由一条或多条语句组成,当”循环体“仅有一条语句时,可省略“{}”。

}

注意事项:

(1)while是C语言的关键字

(2)表达式可以是C语言中任意合法的表达式,但是不能为空,由它控制循环体是否执行

(3)进入循环的循环条件唯一判断标准是循环体条件的值非零

while(1){}.......进入循环且为死循环

while(3){}.......进入循环且为死循环

(4)while语句的循环体可能一次都不执行,即当条件表达式一开始就为0。

(5)循环体只能是一条可执行语句,若循环体内有多个语句,应该使用复合语句。

(6)循环可以没有循环体,以分号结束,即不执行任何操作。但是不意味着循环不执行,当循环没有执行完之前,后面的语句不执行。

#include<stdio.h> 
int main()
{
	int x;
	while(x);  //死循环
	printf("%d",x);
}

(7)通常应在循环体内改变条件表达式中有关变量的值,使条件表达式的值最终变成0,结束循环。

若此表达式的值不变,则循环体内应有在某种条件下强行终止循环的语句(如break等)。

语句练习:

例题一:输出20个星型
#include<stdio.h>
int main(){
	int i=1;
	while(i<=20)
	{
		printf("*");
		i++;
	}
	}

例题二:输出100个1

#include<stdio.h>
int main(){
	int i=1;
	while(i<=100){
		printf("1\n");
		i++;
	}
	printf("a");//实验一个1一个a还是100个1一个a,实验结果100个1一个a 
}

例题三:输出100个1的和?

#include<stdio.h>  //求和的过程就算循环 
int main(){
	int i=1;
	int sum=0; //初始化 
	while(i<=100){
		sum+=1;
		i++; 
	}
	printf("sum=%d",sum);
} 

例题四:计算1+2+3+4+...+100

#include<stdio.h>
int main(){
	int i=1;
	int sum=0;       //初始化 
	while(i<=100)   //循环控制 
	{              //循环体 
		sum=sum+i;  //sum+=i 
		i++;
	}
	printf("%d",sum);
}

例题五:输出2的n次方,n=8

#include<stdio.h>
int main(){
	int i=1;
	int s=1;
	while(i<=8){
		s=s*2;
		i++;
	}
	printf("%d",s);
}

例题六:输入整数a和b,输出a的b次方

#include<stdio.h>
int main()
{
	int a,b;
	int i=1;
	int s=1;
	printf("请输入a和b的值:\n");
	scanf("%d%d",&a,&b);
	while(i<=b)
	{
	s=s*a;
	i++;	
	}
	printf("%d的%d次方结果为%d\n",a,b,s);
} 

例题七:求10以内偶数的和

#include<stdio.h>
int main(){
	int i=1;
	int s=0;
	while(i<=10){
		if(i%2==0){
			s=s+i;
		}
		i++;	
	}
	printf("%d",s);
}

例题8:利用while语句计算大赛选手总分(有十位评委)

#include<stdio.h>
int main(){
	float score;
	float sum=0;
	int i=1;
	while(i<=10){
		printf("请输入%d位评委的打分:\n",i);
		scanf("%f",&score);
		sum+=score;
		i++;
	}
	printf("%f",sum);
}

总结:

遇到数列求和、求积的一类问题,一般可以考虑使用循环解决。

注意循环初值的设置:

一般对于累加器常常设置为0,累乘器常常设置为1。

循环体中做要重复的工作,同时要保证使循环倾向于结束。

do-while语句:

一般格式:

do{? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 循环体;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}while(表达式);? ? //表达式后必须有;

注意事项:

(1) do是C语言的关键字,必须和while联合使用。
(2) do - while循环由do开始,至while结束。
(3) while(表达式)后的“;"不可少,它表示do - while语句的结束。
(4)表达式可以是C语言中任意合法的表达式,但不能为空,由它控制循环体是否执行。? ? ? ? ? ? ? ? ? ? (5)do-while语句的循环体至少执行一次。

语句练习:

例题一:利用do while语句计算大赛选手总分。(有10位评委)

#include<stdio.h>
int main(){
	float score;
	float sum=0;
	int i=1;
	do{
		printf("请输入第%d位评委的成绩:\n",i);
		scanf("%f",&score);
		sum+=score;
		i++;
	}while(i<=10);
	printf("该选手的总分为%f",sum);
}

例题二:求出10以内奇数的和

#include<stdio.h>
int main(){
	int i=1;
	int sum=0;
	do{
		if(i%2!=0){    //if(i%2==1)
			sum+=i;
		}
		i++;
	}while(i<=10);
	printf("10以内奇数和为%d",sum);
} 

例题三:求出1*2*3*......*20的积

#include<stdio.h>
int main(){
	int i=1;
	int sum=1;
	do{
		sum=sum*i;
		i++;
	}while(i<=20);
	printf("%d",sum);
}

哈哈,看到这我还以为我自己的代码出现问题了

算出来负数要么没初始化要么溢出?

数据溢出问题解决:

方案一:

改成长整型,没有解决问题

方案二:
#include<stdio.h>
int main(){
	long i=1;
	long sum=1;
	do{
		sum=sum*i;
		i++;
	}while(i<=20);
	printf("%u",sum);    //无符号,有一定的缺陷,负数不太适用 
}

2、b>INTMAX/a

练习四:利用do...while语句计算1+1/2+1/3...1/n。n的值通过编程输入5.3 10:08

#include<stdio.h> 
int main(){
	int n;
	int i=1;
	float sum=0;
	printf("请输入n的值:");
	scanf("%d",&n);
	do{
		sum=sum+1.0/i;      //注意这里是1.0,如果输入1将会舍弃后面的小数部分 
		i++;
	}while(i<=n);
	printf("sum的值为%lf",sum);
}

?while语句和do-while语句对比

while语句
#include<stdio.h>
int main(){
	int i=1;
	while(i<=3){
		printf("%d\n",i);
		i++;
	}
}

do-while语句
#include<stdio.h>
int main(){
	int i=1;
    do{      //	while(i<=3)  
		printf("%d\n",i);
		i++;
	}while(i<=3); 
}

?但是如果更改i<1

while

#include<stdio.h>
int main(){
	int i=1;
	while(i<1){
		printf("%d\n",i);
		i++;
	} 
}

do-while?

#include<stdio.h>
int main(){
	int i=1;
	do{
		printf("%d\n",i);
		i++;
	}while(i<1);
}

?for语句

一般格式:
for(表达式1;表达式2;表达式3)    //表达式之间用;分开
//for(初始化表达式;循环条件(条件为true);操作表达式; 
{
循环体;//在执行完表达式2之后循环体被执行 
}
//循环体被执行完之后执行表达式3 

例:使用for循环在1行上输入10个*

#include<stdio.h>
int main(){
	int k;
	for(k=0;k<10;k++){
		printf("*");
	}
}

注意事项:

1.初始条件(表达式1)可以省略,可以放在for循环前声明

#include<stdio.h>
int main(){
	int k=0;
	for(;k<10;k++){    //注意循环条件前的分号不能省略
		printf("*");
	}
}

2.循环条件(表达式2)可以省略,相当于无限循环

#include<stdio.h>
int main(){
	int k=0;
	for(;;k++){    //注意循环条件前的分号不能省略
		printf("*");
	}
}


3.操作表达式(表达式3)可以省略,可以在循环体中保证循环正常结束

#include<stdio.h>
int main(){
	int k=0;
	for(;k<10;){    //注意循环条件前的分号不能省略
		printf("*");
		k++;
	}
}

4.初始条件、循环条件、操作表达式(即表达式1.2.3)都可以省略

#include<stdio.h>
int main(){
	int k=0;
	for(;;){    //注意两个分号不能省略
		printf("*");
	}
}

此时相当于while(1) {语句-------死循环
5.初始条件(表达式1)可以是设置循环变量初值的赋值表达式,也可以是与循环无关的其他表达式

#include<stdio.h>
int main(){
	int i=1;
	int sum;
	for(sum=0;i<=5;i++)
	{ sum+=i; }
	printf("%d" ,sum);
}

6.初始条件(表达式1)和操作表达式(表达式3)可以是一-个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔
?

#include<stdio.h>
int main(){
	int i;
	int sum;
	for(sum=0,i=1;i<=5;i++)
	{ sum+=i; }
	printf("%d" ,sum);
}

语句练习:

例题一:利用for语句计算大赛选手总分(有十位评委)

#include<stdio.h>
int main(){
	int i;
	float sum;
	float sorce; 
	for(sum=0,i=1;i<=10;i++)
	{ 
	printf("请输入第%d位评委的评分:",i);
	scanf("%f",&sorce);
	sum+=sorce;
	}
	printf("%f" ,sum);
}

例题二:实现100以内偶数的和的运算

#include<stdio.h>
int main(){
	int i;
	int sum=0;
	for(i=1;i<=100;i++){
		if(i%2==0){
			sum+=i;
		}
	}
	printf("sum的值为%d",sum);
}   //2550

例题三:用for语句实现2的n次方的运算。n的值由用户输入

#include<stdio.h>
int main(){
	int i=1;
	int r=1;
	int n;
	printf("请输入n的值:"); 
	scanf("%d",&n);
	for(;i<=n;i++){
		r=r*2;
	}
	printf("2的%d次方等于%d",n,r);
}

例题四:计算半径0.5mm、1.0mm、1.5mm、2.0mm、2.5mm时圆面积

简略版

#include<stdio.h>
#define pi 3.14
int main(){
	float r=0.5;
	float s;
	int i;
	for(i=1;i<=5;i++){
		s=pi*r*r;
		printf("当半径为%5.3fmm时,圆面积为%f\n",r,s);
		r=r+0.5;
	}
}

更进版

#include<stdio.h>
#define pi 3.14
int main(){
	float r,s;
	for(r=0.5;r<=2.5;r+=0.5){
		s=pi*r*r;
		printf("当半径为%5.3fmm时,圆面积为%f\n",r,s);
	}
}

例题五:有一只猴子第一天摘下一堆果子,当即吃了一半再多一个,直到第十天,只剩下一个桃子。问第一天这堆果子有多少个?

/*有一只猴子第一天摘下一堆果子,
//当即吃了一半再多一个,直到第十天,
只剩下一个桃子。问第一天这堆果子有多少个?
第10天:1个
第9天:(1+1)*2=4个
第8天 (1+4)*2=10个 
算不出来算法可以根据实际问题写写 
*/
#include<stdio.h>
int main(){
	int sum=1;
	int i=9;
	printf("第10天有1个桃子。");
	for(;i>0;i--){
		sum=(1+sum)*2;
		printf("第%d天有%d个桃子。\n",i,sum);
	}
	printf("%d",sum);
}

循环结构控制语句

break语句:

一般格式:

break;

语句功能:

使程序运行时中途退出switch结构或一个循环体

注意说明:

1. break语句 只能用在switch语句和循环语句中;

2. 嵌套循环结构中,break语句只能退出包含它的那层循环。

表达式:

while(表达式1)

{
...
if(表达式2)
break;
...

}

◆正常情况下,该循环结构的执行由循环控制条件“表达式1"控制,当“表达式1”为假时,循环结束。
◆在程序执行的过程中,如果“表达式2”为真,则执行break语句,此时也会终止循环。

生活实例一:

要求跑步跑十圈,跑到第二圈时因为受伤离场

算法设计:

1.定义一个循环控制变量;
2.利用for语句实现跑10圈;
3.判断如果为第2圈,停止跑步
4.如果不是第2圈,输出结果。
?

#include<stdio.h>
int main(){
	int i;
	for(i=1;i<=10;i++){
		printf("这是跑的第%d圈。\n",i);
		if(i==2){
			break;
		}
	}
	printf("跑步受伤离场,这是跑的第%d圈。\n",i);
} 

个人见解:我觉得他判断的条件应该是是否摔倒不应该是第几圈

实例二:计算sum=1 +2 +3 +... + i.直到累加到sum大于5000为止,并给出sum和i的值
该知识点算法:
#include<stdio.h>
int main(){
	int sum=0;
	int i=1;
	for(;;i++){
		sum=sum+i;
		if(sum>5000){
			break;
		}
	}
	printf("这是sum为%d,i为%d",sum,i);
}
简单算法:
#include<stdio.h>
int main(){
	int sum=0;
	int i=1;
	for(;sum<=5000;i++){
		sum=sum+i;
	}
	printf("这时sum=%d,i=%d",sum,i-1);  //这里的i要减一
}
实例3:输入若干字符,对输入的英文字母原样输出,其他字符不输出,直到输入回车键结束。
?
#include<stdio.h>
int main(){
	char ch;
	while(1){
		ch=getchar();
		if(ch=='\n')
			break;
		else if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
			putchar(ch);	
	}
} 

continue语句

一般格式:

while(表达式1)

{
...
if(表达式2)
continue;
...

}

语句功能:

提前结束本次循环,跳过continue语句下面未执行的语句,继续进行下一-次循环。

注意说明:

1. continue语句通常和if语句配合使用, 只能提前结束本次循环,不能使整个循环终止。

◆在循环控制条件“表达式1"成立的情况下,则执行循环体。
◆在执行循环体的过程中。如果“表达式2”为真,执行continue语句,即不再执行continue后面的循环体语句,转到“表达式1”进行下一-次循环控制条件的判定。
◆continue语句在for语句中结束本次循环,但for语句中的表达式3仍然执行。
?

生活实例:
例题一:要求跑步跑十圈,跑第二圈时偷偷藏到人群后,挪回起点,再跑第三圈,即比别人少跑
?
#include<stdio.h>
int main(){
	int i=1;
	for(;i<=10;i++){
		if(i==2){
		printf("第%d圈我不跑\n",i); 
		continue;
		}
		printf("这是第%d圈\n",i);
	}
} 
例题二:输出100~200之间不能被3整除的数。
#include<stdio.h>
int main(){
	int i;
	for(i=100;i<=200;i++){  //如果不算100和300就改成 for(i=101;i<200;i++)
	if(i%3==0)
	continue;
	printf("%d\n",i); 
	}
}
例题三:输入若干字符,对输入的英文字母原样输出,其他字符不输出,直到输入回车键结束。
?
#include<stdio.h>
int main(){
	char ch;
	while((ch=getchar())!='\n'){
		if(!(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'))
		continue;
		putchar(ch);
	}
}

break和continue对比

- break语句
(1)只能用于循环语句和switch语句。
(2)嵌套循环结构中,break语句 只能退出包含它的那层循环。
- continue语句
只能用于循环语句。

小结:

循环嵌套一

定义:

有时为了解决一个较为复杂的问题,需要在一个循环中再定义一?个循环,这样的方式被称作循环嵌套。在C语言中,while、 do--while. for循环语句都可以进行嵌套,并且它们之间也可以互相嵌套。
?

常见的形式:

例题一:操场跑步,每天跑4圈,三天跑12圈。

//操场跑步,每天跑4圈,三天跑12圈。
#include<stdio.h>
int main(){
	int i;       //一开始定义的i=1,然后只执行第一天的 因为i没有重置,所以第二层for,只会执行一次 
	int t=1;
	for(;t<=3;t++){
		for(i=1;i<=4;i++){
			printf("跑的第%d天的第%d圈\n",t,i);
		}
	}
} 

例题二:输出5行星型,每行4个

#include<stdio.h>
int main(){
	int i,j;
	for(i=1;i<=5;i++){
		for(j=1;j<=4;j++){
			printf("*");
		}
		printf("\n");
	}
} 
//其实只是4个星星,我觉得用单for循环也行,但是万一下次是10个100个呢 

例题三:输出星型组成的直角三角形,图形如下。


*
**
***
****
*****

/* 输出星型组成的直角三角形,图形如下。

*
**
***
****
*****

*/
#include<stdio.h>
int main(){
	int i,j;   //i为行,j为列,i<=j 
	for(j=1;j<=5;j++){
		for(i=1;i<=j;i++){
			printf("*");
		}
		printf("\n");
	}
}
  

例题四:输出星型组成的直角三角形,图形如下

*****
****
***
**
*

/*输出星型组成的直角三角形,图形如下
*****
****
***
**
*

*/
#include<stdio.h>
int main(){
	int i,j;//i为行,j为列,i<=j 
	for(j=5;j>0;j--){
		for(i=1;i<=j;i++){
			printf("*");
		}
		printf("\n");
	}
}

循环嵌套二
例题五:百钱百鸡问题。一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现在要用百钱买百鸡,请问公鸡、母鸡、小鸡各多少只?

/*语句练习5:百钱百鸡问题。一只公鸡值五钱,
一只母鸡值三钱,三只小鸡值一钱,
现在要用百钱买百鸡,请问公鸡、母鸡、小鸡各多少只?
*/
/*
x、y、z的取值范围:
(1) x的取值范围为0 ~ 20;
(2) y的取值范围为0~ 33;
(3) z的取值范围为3~99,,步长为3.
*/
/*
1、先定义三个整型变量分别用来存储公鸡、母鸡和小鸡;
2、第一 层for循环控制公鸡的数量;
3、第二层for循环控制母鸡的数量;
4、第三层for循环控制小鸡的数量; .
5、5*x+*y+1/3*z=100; x+y+z=100
*/
#include<stdio.h>
int main(){
	int x,y,z;  //公鸡、母鸡、小鸡 
	for(x=0;x<=20;x++){
		for(y=0;y<=33;y++){
			for(z=3;z<=99;z+=3){
				if(x+y+z==100&&(5*x+3*y+z/3==100)){     //不可以用1/3*z
					printf("x=%d,y=%d,z=%d\n",x,y,z);
				}
			}
		}
	} 
}
?三个for循环嵌套:
算法优化:
/*语句练习5:百钱百鸡问题。一只公鸡值五钱,
一只母鸡值三钱,三只小鸡值一钱,
现在要用百钱买百鸡,请问公鸡、母鸡、小鸡各多少只?
*/
/*
x、y、z的取值范围:
(1) x的取值范围为0 ~ 20;
(2) y的取值范围为0~ 33;
(3) z的取值范围为3~99,,步长为3.
*/
/*
1、先定义三个整型变量分别用来存储公鸡、母鸡和小鸡;
2、第一 层for循环控制公鸡的数量;
3、第二层for循环控制母鸡的数量;
4、第三层for循环控制小鸡的数量; .
5、5*x+*y+1/3*z=100; x+y+z=100
*/
#include<stdio.h>
int main(){
	int x,y,z;  //公鸡、母鸡、小鸡 
	for(x=0;x<=20;x++){
		for(y=0;y<=33;y++){
			z=100-x-y;
			if(5*x+3*y+z/3.0==100){      //这里的三必须是浮点型三,拿4只鸡举例int(4/3)=3 
					printf("x=%d,y=%d,z=%d\n",x,y,z);
			}		
		}
	} 
}

?例题六:xyz+yzz=532,求x、 y、z的值,数字组合

方法一:
//xyz+yzz=532,求x、 y、z的值
#include<stdio.h>
int main(){
	int x,y,z;
	for(x=0;x<10;x++){
		for(y=0;y<10;y++){
			for(z=0;z<10;z++){
				if((x*100+y*10+z)+(y*100+z*10+z)==532){
					printf("x=%d,y=%d,z=%d\n",x,y,z);
				}
				
			}
		}
	}
}

方法二:提高效率减少工作量、减少工作时间?
//xyz+yzz=532,求x、 y、z的值
//xyz+yzz=532  数字组合,xyz取值均在0-9
//由此x+y<5;x<=5,y<=5;2z个位数=1或6 
#include<stdio.h>
int main(){
	int x,y,z;
	for(x=0;x<=5;x++){
		for(y=0;y<=5;y++){
			for(z=1;z<=6;z=z+5){
				if((x*100+y*10+z)+(y*100+z*10+z)==532){
				printf("x=%d,y=%d,z=%d\n",x,y,z);
			}
			}
		}
	}
}

例题七:输出满九九乘法表

#include<stdio.h>
int main(){
	int i,j,r;   //行、列 i<=j,j<=9 	
	for(j=1;j<=9;j++){
		for(i=1;i<=j;i++){            //i<=9
			r=i*j;
			printf("%d*%d=%d ",i,j,r);   //%d*%d=%-2d
		}printf("\n");
	}
}


?

void main和int main区别:

1、有无返回值

void main没有返回值,int main有返回值。

2、返回值类型

int main返回int类型的数据,void main不返回。

但是在C语言推荐写法中,建议使用int main,因为在有的编译器虽然viod main可以通过编译,但在其他编译器就会报错。为了代码拥有更好的可移植性,一般写int main。

3、书写

可以一律都写成 int main ,然后在方法体中最后加个return 0 ;就行了,这样写基本上所有的编译器都可以通过。

main函数,又称主函数。作为绝大部分C程序唯一的入口(比如windows编程中可以编写一个其他windows程序都可以使用的动态链接库(DLL)模块,由于DLL模块不是独立的程序,因此不需要main函数。再比如,用于专业环境的程序(如机器人中的控制芯片有可能不需要main函数),是要求有返回值的,该返回值返回给操作系统来表明改程序的执行状况。

返回0代表程序正常执行成功,返回非0值代表程序异常结束,因此返回值需要是int整型,于是有了int main()的规范。如果使用void main,既声明主函数没有返回值的话,程序随能编译、运行成功,却不利于操作系统判断其状态,这对于由很多C程序构成的大型项目来说是可能会是致命的。
?

文章来源:https://blog.csdn.net/weixin_64033212/article/details/134882359
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。