C++初级学习五
循环语句
? 在实际生活中经常会将同一件事情重复做很多次,比如走路会重复使用左右脚,打乒乓球会重复挥拍的动作等。同样在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程序构成的大型项目来说是可能会是致命的。
?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!