今天学习C语言循环结构,为什么要用循环呢?因为有时候我们对一堆的数字进行重复的处理的时候要重复的编写一些相同或者差不多的代码,让程序显得很臃肿,而且写着也麻烦,如果用循环来写的话能简化很多,出错的话也更容易查找,程序也更一目了然。
那么循环要怎么来用呢?又该在哪里开始用呢?首先我们要知道循环主要有三种: while循环,do…while循环和for循环。
while循环:先判断条件是否成立,如果条件成立将执行其下的循环体,如果条件不成立就不执行,要注意while循环有可能一次都不执行哦。
语法:
while(条件) //括号内的循环条件要注意,写错的话就不循环了
{
//循环体; //这就是要循环执行的指令,一遍一遍又一遍...直到循环结束。
结束方法; //每个循环都要设置有一个条件,当满足这个条件的时候就结束循环,如果没有这个条件的话循环会一直走直到永远...形成一个死循环。
//所以千万不要漏写结束的条件哦,除非你是故意想让它死循环。
}
示例:打印100遍"我是最棒的!",没事就打印一次可以激励自己哦,自我催眠一下哈哈。
int i=1; while(i<=100){ printf("第%d遍:我是最棒的!\n",i); i++; } |
示例2:计算0~100的偶数和
int i=0,sum=0; while(i<100){ if(i%2==0){//偶数 sum+=i; } i++; } printf("0~100之间的所有偶数和为:%d\n",sum); |
示例2:计算0~100的奇数和
int a=1;
int b=0;
while(a<=100){
if(a%2!=0){
b+=a;
}
a++;
}
printf("奇数和是%d",b);
do...while循环结构:先执行循环体,再判断条件是否为真,如果为真继续执行,如果为假终止循环。
和while循环不同的是do...while循环先执行循环体,再判断所以它至少会执行一次。
语法: do{
循环体;
}while(条件);
示例:用do...while循环再计算一下奇数和
int i=0,sum=0; do{ if(i%2!=0){ sum+=i; } i++; }while(i<100); printf("0~100之间的所有奇数和为:%d\n",sum); |
示例2.猜价格高低:5次机会
int number,i=0,price=100; do{ printf("请输入商品价格:\n"); scanf("%d",&number); if(number<price){ printf("低了!\n"); }else if(number>price){ printf("高了!\n"); }else{ printf("猜中了!\n"); break;//跳出循环 } i++; }while(i<5); |
自己的练习:加入了一点自己的想法,去实现猜错了以后显示的提示不相同。
int a,b=0,c=100;
printf("你猜是多少啊\n");
scanf("%d",&a);
if(a>b){
do{
printf("不对哦,你再猜\n");
scanf("%d",&a);
if(a>c){
printf("大了,你再猜\n");
}
else if(a<c){
printf("小了,你再猜\n");
}
else{
printf("猜对了\n");
break;
}
b++;
}
while(b<4);
}
小作业:
计算0~100之间所有能被3整除和带3的数字之和
int i=0;//循环变量 int sum=0; while(i<100){ if((i%3==0)||(i%10==3)||(i/10==3)){ sum+=i; } i++; } printf("0~100之间所有能被3整除和带3的数字之和为%d",sum); |
自己写的 还是要注意变量名的命名最好别用拼音...
#include <stdio.h>
void main(){
int he=0;
int xun=0;
int ge,shi;
ge=xun%10;
shi=xun/10%10;
while(xun<100){
if((xun%3==0)||(ge==3)||(shi==3)){
he+=xun;
}
xun++;
}
printf("0~100之间所有能被3整除和带3的数字之和为%d",he);
作业2:打印100~1000之间所有水仙花数,并统计其个数:如==>153=1^3+5^3+3^3
int i=100;//循环变量 int count=0,ge,shi,bai,he;//统计水仙花数 do{ ge=i%10;//获取个位 shi=i/10%10;//获取十位 bai=i/100; //获取百位 he=ge*ge*ge+shi*shi*shi+bai*bai*bai; if(he==i){ printf("%d\t",i); count++; } i++; }while(i<1000); printf("\n100~1000之间共有%d个水仙花数",count); |
自己写的:还是要注意变量名的命名最好别用拼音...
#include <stdio.h>
void main(){
int xun=100;
int ge,shi,bai,he,ci=0;
do{
ge=xun%10;
shi=xun/10%10;
bai=xun/100%10;
he=ge*ge*ge+shi*shi*shi+bai*bai*bai;
if(xun==he){
++ci;
printf("%d\n",xun);
}
xun++;
}while(xun<1000);
printf("水仙花数的个数是%d\n",ci);
}
作业3:李白闲来无事街上走,提壶去买酒,遇店加一倍,遇花喝一斗,五遇花和店喝光壶中酒,李白壶中原有多少酒? 经典问题需要多看多想几遍。
float x=0;//壶中原有酒的斗数 int i=0; while(i<5){ x=(x+1)/2;//遇到花和店之前的壶中酒的斗数 i++; } printf("李白壶中原有%7.3f斗酒",x); |
自己写的:思路,题目没有限定要求具体怎么样遇到花怎么样遇到店,所以就假设李白是交叉着一次花一次店的方式走的,倒着走一遍就是他最开始的量。
#include <stdio.h>
void main(){
int xun=0;
float x=0.0;
while(xun<5){
x=(x+1)/2;
xun++;
}
printf("李白原先有%f斗的酒\n",x);
}
循环和if条件语句一样是可以嵌套的。
循环嵌套:一个循环中嵌套其他循环,只有在内层循环结束时,才能执行下一次外层循环(外层循环执行1次,内层循环执行N次)
如:while(条件){
while(条件){
//循环体;
}
}
以及:do{
do{
//循环体;
}while(条件);
}while(条件);
示例: 使用循环打印矩形:外层循环控制打印的行数,内层循环控制每行打印*的个数 ******** ******** ******** int i=0,j; while(i<3){ j=0; while(j<8){ printf("*"); j++; } printf("\n"); i++; } |
打印直角三角形: * ** *** **** int i=0,j; while(i<4){//外层控制打印的行数 j=0; while(j<=i){//内层循环控制每行打印星号的个数 printf("*"); j++; } printf("\n"); i++; } |
打印倒直角三角形: **** *** ** * int i=0,j; while(i<4){ j=0; while(j<4-i){ printf("*"); j++; } printf("\n"); i++; } |
打印平行四边形 ******** ******** ******** int i=0,j,k; while(i<3){//外层循环控制行数 //打印空格循环 j=0,k=0; while(j<2-i){ printf(" "); j++; } //打印星号的循环 while(k<8){ printf("*"); k++; } //换行 printf("\n") ; i++; } |
打印直角三角形 * *** ***** ******* int i=1,j; while(i<5){//外层控制打印的行数 j=0; while(j<2*i-1){//内层循环控制每行打印星号的个数 printf("*"); j++; } printf("\n"); i++; } |
打印正的等腰三角形 * *** ***** ******* int i=0,j,k; while(i<4){//外层循环控制行数 j=0,k=0; //打印空格 while(j<3-i){ printf(" "); j++; } //打印星号 while(k<2*i+1){ printf("*"); k++; } //换行 printf("\n"); i++; } |
接下来是for循环;
for循环:在for循环中‘;’是不能或缺的,表达式1,表达式2,表达式3都可以省略。
for(表达式1[A1] ;表达2[A2] ;表达式3[A3] )
{
//循环体;[A4]
}
执行顺序: 初始化循环变量》循环条件判断》执行循环体》更改循坏变量
↑ ↓
←←←←←←←←←
[A1]初始化循环变量,只执行1次 .
[A2]循环条件
[A3]更改循环变量
[A4]循环体
示例:逢3过小游戏":遇到3或3的倍数或带3的数字替换成"过" 1 2 过 4 5 过 7 8 过
int i; for(i=1;i<40;i++){ if(i%3==0||i%10==3||i/10%10==3){ printf("过\t"); }else{ printf("%d\t",i); } } |
示例:根据用户输入的数字计算其阶乘 5!=1*2*3*4*5
int number,fac=1;//接受用户输入的数字 int i; printf("请输入数字"); scanf("%d",&number); for(i=1;i<=number;i++){ fac=i*fac; } printf("%d",fac); |
示例: 九九乘法表
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
int i,j; for(i=1;i<=9;i++){ for(j=1;j<=i;j++){ printf("%d*%d=%d\t",i,j,i*j); } printf("\n"); } |
有时候我们会遇到一种情况,一个循环还没走完,我们就想让它停止,这个时候应该怎么办呢?
这就用到了break和contine关键字。
break:跳出循环,这个就是终止循环不再走了。
continue: 跳过本次循环,继续下一次循环,只是跳过这一次还会继续循环。
示例: int i; for(i=1;i<9;i++){ if(i%3==0){ // break;//跳出循环 continue; } printf("%d\t",i); } |
作业1: 打印倒等腰三角形
*****
***
*
#include <stdio.h>
void main(){
/*
//打印正的等腰三角形,拆分一个空格的倒得直接三角形一个星号的正的直角三角形
int i,j,k;
for(i=0;i<3;i++){
for(j=0;j<i;j++){
printf(" ");
}
for(k=0;k<5-2*i;k++){
printf("*");
}
printf("\n");
}
*/
作业2:打印菱形
*
***
*****
*******
*****
**
*
/*
*打印菱形。
int i,j,k;
for(i=0;i<4;i++){
for(j=0;j<3-i;j++){
printf(" ");
}
for(k=0;k<2*i+1;k++){
printf("*");
}
printf("\n");
}
for(i=0;i<3;i++){
for(j=0;j<=i;j++){
printf(" ");
}
for(k=0;k<5-2*i;k++){
printf("*");
}
printf("\n");
}
作业3: 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?(暴力破解)
有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
int i,j,k,count=0;
for(i=1;i<5;i++){
for(j=1;j<5;j++){
for(k=1;k<5;k++){
if(i!=j&&i!=k&&j!=k){
printf("%d%d%d\t",i,j,k);
count++;
}
}
}
}
printf("\n一共有%d个",count);
总结一下,当我们遇到需要重复进行的某件事情的时候就可以用循环去代替一行一行的代码,这样简单明朗,容易排错,而且省下不少的敲代码时间。