一、开关语句
switch(n) //n可以是数值、表达式,运算结果必须是整型
{case val: //必须是常量,如果val等于n,则打开开关...;break; //关闭执行开关,switch中不能与continue配合使用//如果所有的case后面都有break,就形成了多分支结构default: //如果所有的case都没有匹配成功,则打开default执行开关,而且放在任何位置都一定会执行...;break; //a ... b 表示一段范围,但是不推荐使用
}练习1:输入一个月份,判断季节
#include<stdio.h>int main(int argc,const char* argv[])
{int mon;printf("请输入一个月份");scanf("%d",&mon);if(mon<1 || mon>12){printf("输入错误");}else{switch(mon/3){case 1:printf("春天");break;case 2:printf("夏天");break;case 3:printf("秋天");break;default:printf("冬天");break;}}return 0;
}
练习2:输入一个月份,忽略润平年问题,判断该月多少天
#include<stdio.h>int main(int argc,const char* argv[])
{char mon;printf("请输入月份");scanf("%hhd",&mon);if(mon<1 || mon>12){printf("输入错误"); }else{switch(mon){case 2:printf("该月28天");break;case 4:case 6:case 9:case 11:printf("该月30天");break;default:printf("该月31天");break;}}return 0;
}
二、循环语句
循环是一种让一段代码反复执行,从而达到你想要的结果
for是哟中比较灵活而且危险(相比较其他循环)的一种循环
一般使用一个变量来引导这个循环的运行,这个变量叫做循环变量i(index 索引)
for([1];[2];[3])
{[4];
}
[1] 给循环变量赋值,C99可以再次定义循环变量
[2] 判断循环变量是否达到边界
[4] 被反复执行的代码语句,也叫做循环体
[3] 改变循环变量,防止出现死循环,一般对循环体变量进行自加或自减
[2]...[4]...[3]...大括号问题:1、如果循环体只有一行代码,大括号可以省略,但不利于扩展,一般商业代码都要求大括号不能省略。2、建议上下对齐(方便查看是否缺少大括号)for循环的多种循环:for(;;)
{//死循环
}int i = 0;
for(;i<10;i++)
{}for(int i=0;i<10;)
{printf("---");i++;
}while语句:while(条件) //当条件为真执行循环体,为假时结束{//循环体}
while循环语句相当于for循环语句的精简版本
for循环负责明确知道循环次数的问题
while循环负责只知道结束条件而不确定循环次数的问题do while语句
do{//循环体
}while(执行条件); //分号不能少
先执行循环体语句,在判断循环条件,该循环语句至少执行一次
适合先干活,后检查的特殊情况,例如:输入密码,文件读写循环嵌套:循环语句中包含了循环语句外层循环执行一次,内层循环执行全部练习3:计算出所有3位水仙花数
#include<stdio.h>int main(int argc,const char* argv[])
{int num;int i;int a,b,c;for(i=100;i<1000;i++){ a=i/100;b=i/10%10;c=i%10;num=a*a*a+b*b*b+c*c*c;if(i == num){printf("%d ",num); }}return 0;
}
练习4:输入一个正整数,判断是否是素数
#include<stdio.h>int main(int argc,const char* argv[])
{int i;int num;int k=2;printf("请输入一个数");scanf("%d",&num);if(num<0){printf("输入错误");return -1;}for(i=2;i<(num/2);i++){if(0== num % i){k++; }}if(2==k){printf("是素数"); }else{printf("不是素数"); }return 0;
}
练习5:输入一个整数,分解显示
#include<stdio.h>int main(int argc,const char* argv[])
{int a[14];int num,num_0,k=0;int i;printf("请输入一个整数");scanf("%d",&num);num_0=num;while(0 != num){a[k]=num%10;num /= 10;k++;}if(num_0<0){printf("- ");for(i=k-1;i>=0;i--){printf("%d ",0-a[i]); }}else{for(i=k-1;i>=0;i--){printf("%d ",a[i]); }}return 0;
}
练习6:输入一个正整数,判断是否是回文数
#include<stdio.h>int main(int argc,const char* argv[])
{int num,num_0=0,key;printf("请输入一个正整数");scanf("%d",&num);key=num;while(0 != key){num_0=num_0*10+key%10;key /= 10;}if(num==num_0){printf("是回文数"); }else{printf("不是回文数");}return 0;
}
三、跳转语句
goto 可以在函数内任意跳转
它可能会破坏已经设计好的分支或者循环语句,因此绝大多数公司都是禁用的。
但是它他别适合驱动编程中的异常处理。标签名:...goto 标签名;练习7:不使用循环语句计算N的阶乘break 1、在switch语句中用于关闭执行开关2、在循环语句中,用于跳出循环,只能跳出1层continue结束本次循环,进入下一次循环return1、返回一个数据给调用者2、结束函数的执行
练习8:不使用循环语句,计算出前N项的斐波那契数列
1 1 2 3 5 8 13
#include<stdio.h>int main(int argc,const char* argv[])
{int N;int key,num=1,ret=1;printf("请输入N");scanf("%d",&N);if(N<=2){int i=N;
loop1:printf("1 ");i--;if(i>0){goto loop1; }return 0;}else{printf("1 1 "); N -= 2;}
loop2:key=num;num=num+ret;ret=key;N--;printf("%d ",num);if(N>0){goto loop2; }
}
作业:
1、打印99乘法表
#include<stdio.h>int main(int argc,const char* argv[])
{int i,j;for(i=1;i<10;i++){for(j=1;j<=i;j++){printf("%d*%d=%2d ",i,j,i*j); }printf(" \n");}return 0;
}
2、百鸡百钱问题 公鸡5 母鸡3 3小鸡1
#include<stdio.h>int main(int argc,const char* argv[])
{int i,j,k;for(i=0;i<=20;i++){for(j=0;j<=(100-5*i);j++){k=100-5*i-3*j;if(100 == i+j+3*k){printf("公鸡%d只,母鸡%d只,小鸡%d只\n",i,j,3*k); }}}return 0;
}
3、计算100~1000所有素数
#include<stdio.h>int main(int argc,const char* argv[])
{int i,j,key=0;for(i=100;i<=1000;i++){key=0;for(j=2;j<=i/2;j++){if(0 == i%j){key++; }}if(0 == key){printf("%d ",i); }}return 0;
}
4、输入一个日期(yyyy-mm-d)计算公元1年到日期为止过了多少天time(NULL) 获取1970-1-1 0秒 到运行此函数为止过了多少秒srand(time(NULL));rand() 随机数,伪随机
#include<stdio.h>int main(int argc,const char* argv[])
{int year,month,day,i,daymax;int time=0;printf("请输入日期(year-month-day)\n");scanf("%d%d%d",&year,&month,&day);if(month < 1 || month>12){printf("输入有误");return -1;}else{switch(month){case 2:daymax=28;break;case 4:case 6:case 9:case 11:daymax=30;break; default:daymax=31;}if(0 == year%4 && month == 2){daymax++;if(0 == year%100 && 0!= year%400){daymax--;}}if(day > daymax || day<1){printf("输入有误,日最大为%d",daymax);return -2;}}time += (year-1)*365;for(i=1;i<year;i++){if(0 == i%4 && 0 != i%100 || 0 == i%400){time++;}}for(i=1;i<month;i++){time += 31;switch(i){case 2:time -= 3;break;case 4:case 6:case 9:case 11:time -=1;break; }}if(0 == year%4 && 0 != year%100 || 0 == year%400){time += 1;}time += day-1;printf("过了%d天",time);return 0;
}
5、显示平行四边形,每个printf只能输出一个符号
#include<stdio.h>int main(int argc,const char* argv[])
{int i,j,k,l=9;for(i=9;i>=0;i--){for(j=i;j>=0;j--){printf(" ");}for(k=0;k<10;k++){printf("*");}printf("\n");}return 0;
}