C语言学习(3)
一、C语言中循环
1. 三种循环
第一种: for循环
语法:for(表达式1; 表达式2; 表达式3) //先执行表达式1,然后判断表达式2是否为真,在执行代码
{
执行的代码
}
注意:花括号中的代码只有一句话,那么花括号可写可不写
花括号中的代码有多句话,一定要写
难点:循环的嵌套
#include<stdio.h> int main() { int i=0; int j=0; //从外到内执行 //规律: 外层循环成立,里面的循环会全部执行一遍,然后再判断外层循环 for(i=0; i<5; i++) //外层循环 { printf("外层循环成立了:%d\n",i); for(j=0; j<5; j++) //内层循环 { printf("里面的循环执行%d\n",j); } } }
写法一: for( ; i<5; i++)
写法二: for( ; i<5; )
写法三: for( ; ;) //死循环
例子如下:
#include <stdio.h> int main() { int i=0; //循环打印5次 /* for(i=0; i<5; i++) //常规的写法 { printf("hello world!\n"); } */ /* for(; i<5; i++) { printf("hello world!\n"); } */ for(; i<5; ) { printf("hello world!\n"); i++; } /* for(;;) //死循环 { printf("hello gec!\n"); } */ }
第二种: while循环
语法:while(条件) //条件为真,则执行循环语句
{
}
while(i<5)
{
i++;
}
while(1) //等价于 for(;;) while('a')死循环
{
}
第三种:do while循环
do
{
执行的代码
}while(条件);
注意: do while循环先斩后奏,会先执行一次循环,然后再判断条件是否成立
while和do while的例子如下:
#include <stdio.h> int main() { int i=0; while('a')// while(1) 表达式0 就是假的 非零就是真 { printf("死循环!\n"); } while(i<5) { printf("hello gec!\n"); i++; } int a=88; int b=99; do { printf("另外一个循环!\n"); }while(a<10&&b>100); }
2. break和continue
break --》彻底结束循环
#include<stdio.h> int main() { int i; for(i=0; i<10; i++) { if(i==5) //break; //结束整个循环 continue; //结束当前这一次循环,进入下一次循环 printf("循环正常进行%d次!\n",i); } }
continue --》结束本次循环,进入下一次循环
练习:
1. for循环打印99乘法表
#include <stdio.h> /* for循环打印9*9乘法表 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 思路:用两个变量i,j分别表示两个要相乘的数 循环就是找数学规律: 第一行:j 1 i 1--》j 第二行:j 2 i 1--》j 第三行:j 3 i 1--》j */ int main() { int i,j; for(j=1; j<=9; j++) //总共9行 { for(i=1; i<=j; i++) //每一行中i的变化次数跟j有关 { printf("%d*%d=%-2d",i,j,i*j); //打印每一行的乘法表 } //打印完一行在换行 printf("\n"); } }
2. for循环实现*三角图案
#include <stdio.h> /* * *** ***** */ int main() { int n; int i,j,k; printf("请输入你想打印多少行的钻石图案,输入奇数!\n"); scanf("%d",&n); //先分析搞定钻石图案的上半部分的规律,总共n/2+1行 for(i=1; i<=(n/2+1); i++) //上半部分 { for(j=0; j<(n/2+1)-i; j++) //打印空格的数目 printf(" "); for(k=0; k<2*i-1; k++) //打印型号的数目 printf("*"); //换行 printf("\n"); } }
3.for循环实现钻石图案
#include <stdio.h> /* * *** ***** n=5 *** * * *** ***** ******* n=7 ***** *** * */ int main(int argc, char *argv[]) { int row, half, i, j; printf("输入你的想要的钻石行数:\n"); scanf("%d",&row); //打印钻石上半部分 half = row / 2 + 1; for(i = 1; i <= half; i++) { //打印前导空格 for(j = 1; j <= half - i; j++) { printf(" "); } //打印星号 for(j = 1; j <= 2 * i - 1; j++) { printf("*"); } //换行 printf("\n"); } //打印钻石下半部分 for(i = 1; i < half; i++) { //打印前导空格 for(j = 1; j<= i; j++) { printf(" "); } //打印星号 for(j = 1; j <= 2 * (half - i - 1) + 1; j++) { printf("*"); } //换行 printf("\n"); } return 0; }
4. while循环实现任意输入一个整数,编程得到这个整数总共多少位,各个位分别是多少
123/10 --》12 --》12/10 --》1 1/10--》0
123%10 --》3 12%10 --》2 1%10--》1
#include <stdio.h> int main() { int num; int count=0; printf("请输入任意一个整数!\n"); scanf("%d",&num); //求出num的各个位 while(num!=0) { printf("num低位到高位依次是:%d\n",num%10); count++; num=num/10; } //打印num是几位数 printf("你刚才输入的整数是:%d 位数!\n",count); }
二、C语言的条件判断
1. 第一种:单个情况的判断
if(条件)
{
代码
}
2.第二种:两种情况的判断,非此即彼
if(条件)
{
}
else
{
}
#include <stdio.h> int main() { int a=10; int b=100; if(a>b) { printf("a>b\n"); } //printf("我是来捣乱的!\n"); //if和else之间不能穿插其他语句,编译会报错 else { printf("a<=b\n"); } }
3.第三种:大于等于三种情况的判断
if(条件)
{
}
else if(条件)
{
}
else if(条件)
{
}
else
{
}
注意:if和else之间不能出现其他语句
if或者else花括号里面的语句如果只有一条语句,花括号可以省略
练习:
1. if语句实现求5个整数的最大值和最小值
#include <stdio.h> int main() { int n1,n2,n3,n4,n5; printf("请输入五个整数!\n"); scanf("%d%d%d%d%d",&n1,&n2,&n3,&n4,&n5); //最大值 int max=n1; //保存最大值,先假设n1是最大的 //依次轮流跟max进行比较 if(n2>max) max=n2; if(n3>max) max=n3; if(n4>max) max=n4; if(n5>max) max=n5; //最小值 int min=n1; //保存最小值,先假设n1是最小的 //依次轮流跟min进行比较 if(n2<min) min=n2; if(n3<min) min=n3; if(n4<min) min=n4; if(n5<min) min=n5; printf("五个数的最大值是:%d\n",max); printf("五个数的最小值是:%d\n",min); }
2. 编程实现任意输入6个整数,从小到大排个序(升序)
#include <stdio.h> int main() { int i,j,a[6],cup; printf("请输入6个不同数据:\n"); for(i = 0;i<6;i++)//循环输入整数 { scanf("%d",&a[i]); } for(i=0;i<5;i++)//判断第一个数与其他数的大小,再接着下一个,最后一个也就被比较了 { for(j=i+1;j<6;j++)//判断除了筛选出来的那个数后面的数 { if(a[i]>a[j])//前面数大于后面数,调换位置 { cup=a[i]; a[i]=a[j]; a[j]=cup; } } } printf("排列顺序从小到大为:"); for(i=0;i<6;i++)//循环打印打印结果 { printf("%d ",a[i]); } printf("\n"); return 0; }
三、C语言中选择条件分支语句(开关语句)
1. 语法
swich(变量) //标准写法
{
case 1:
代码;
break; //结束switch,break只能在循环或者switch中使用
case 2:
代码;
break;
default:
代码;
break;
}
特点:switch中的变量只能是整数,字符,常量
switch有变形形式
第一种: default 可写可不写
第二种: switch中的break是可以不写,写和不写含义完全不同
第三种: default跟case的书写顺序可以随意颠倒
总结:switch一直执行,直到遇到break才结束switch,没有遇到break一直往下运行
#include <stdio.h> int main() { int n; /* float m=15.6; switch(m) //错误,switch要求只能是整数,字符,整型常量 { case 15.6: printf("m是15.6"); break; default: printf("m不是15.6"); break; } */ char c = 'i';//字符 switch (c) { case 'i': printf("iiii\n"); break; default: printf("ooooo\n"); break; } printf("请输入数字 1-7 分别代表星期一到星期天!\n"); scanf("%d", &n); // if(n==1) else if(n==2) else switch (n) { case 1: printf("星期一!\n"); break; case 2: printf("星期二!\n"); break; case 3: printf("星期三!\n"); break; case 4: printf("星期四!\n"); break; case 5: printf("星期五!\n"); break; case 6: printf("星期六!\n"); break; case 7: printf("星期日!\n"); break; default: printf("你输入的是其他数字,不是1和2\n"); break; } printf("你输入的是%d\n",n); }
四、作业:
1. switch做一个功能选择菜单,重复选择不同的功能
printf("请你选择如下功能!\n");
1. 登录
2. 借书
3. 还书
4. 修改账户密码
5. 查询
#include <stdio.h> int main() { int mode; printf("请选择如下功能!\n"); printf("1.登录\n"); printf("2.借书\n"); printf("3.还书\n"); printf("4.修改账户密码\n"); printf("5.查询\n"); while(1) { scanf("%d",&mode); switch(mode) { case 1:printf("登录\n");break; case 2:printf("借书\n");break; case 3:printf("还书\n");break; case 4:printf("修改账户密码\n");break; case 5:printf("查询\n");break; default:printf("Error\n");break; } } }
2. switch键盘任意输入年,月,日, 告诉我这个日期是这个一年的第几天
1987 6 23
#include <stdio.h> /* * switch键盘任意输入年,月,日, * 告诉我这个日期是这个一年的第几天 * 1987 6 23 */ int main() { int year,mon,day,a,MON; printf("=====判断日期是今年的第几日=====\n"); printf("请输入年份 月份 日:\n"); scanf("%d %d %d",&year,&mon,&day); //闰年能被4整除,却不能被100整除。能被400整除的数。 if(year%400==0) a=1; else { if(year%4==0&&year%100!=0) a=1; else a=0; } if(a==1)//闰年 { switch(mon)//月份 { case 1:MON=0;break;//1月说明还没过完,看天数 case 2:MON=31;break;//2月说明1月已经过完,1月就有31天 case 3:MON=60;break;//3月说明1,2月已经过完,1,2月就有60天(闰年2月29日,则31+29=60) case 4:MON=91;break;//以此类推…… case 5:MON=121;break; case 6:MON=152;break; case 7:MON=182;break; case 8:MON=213;break; case 9:MON=244;break; case 10:MON=274;break; case 11:MON=305;break; case 12:MON=335;break; } MON=MON+day;//计算今日是今年的第几天 printf("%d 此年是闰年\n",year); printf("今天是此年的第%d天!\n",MON); } else//非闰年 { switch(mon) { case 1:MON=0;break;//1月说明还没过完,看天数 case 2:MON=31;break;//2月说明1月已经过完,1月就有31天 case 3:MON=59;break;//3月说明1,2月已经过完,1,2月就有59天(非闰年2月28日,则31+28=59) case 4:MON=90;break;//以此类推…… case 5:MON=120;break; case 6:MON=151;break; case 7:MON=181;break; case 8:MON=212;break; case 9:MON=243;break; case 10:MON=273;break; case 11:MON=304;break; case 12:MON=334;break; } MON=MON+day;//计算今日是今年的第几天 printf("%d 此年非闰年\n",year); printf("今天是此年的第%d天!\n",MON); } return 0; }
3. 用循环求出这种表达式的结果
1+1.0/2-1.0/3+1.0/4-1/5.........1.0/n
思路一: 加法和减法分开来计算
思路二:-1的n次方表示正负号
n从键盘输入
#include <stdio.h> /* * 用循环求出这种表达式的结果 * 1+1.0/2-1.0/3+1.0/4-1/5.........1.0/n * 思路一: 加法和减法分开来计算 * 思路二:-1的n次方表示正负号 * n从键盘输入 * *以上类举可以看出,当分母为双数的加起来,分母为单数的时候减去 */ int main() { int a,i; float sum = 1.0;//sum=1.0是因为这个数怎么加都是有1, float k = 1.0;//正负号,首先为正 printf("请输入一个数:\n"); scanf("%d",&a); for(i=2;i<=a;i++) { sum += k/i;//总数求和,双数加,单数减 k *= -1;//替换符号 } printf("总和为:%f\n",sum); return 0; }