顺序结构
示例一:
输入三角形的三边长,求三角形面积
已知三角形的三边长a,b,c,则该三角形的面积公式为
#include<math.h> #include<stdio.h> void main() { double a,b,c,s,area; scanf("%lf,%lf,%lf",&a,&b,&c); s=(a+b+c)/2.0; area=sqrt(s*(s-a)*(s-b)*(s-c)); printf("a=%7.2f,b=%7.2f,c=%7.2f ",a,b,c,s); printf("area=%7.2f ",area); }
分支程序设计
关系运算符和表达式比较大小
关系表达式的值是真和假,用1和0表示
#include<stdio.h> int main(void) { int true_val, false_val; true_val = (10 > 2); // 关系为真的值 false_val = (10 == 2); // 关系为假的值 printf("true = %d; false = %d ", true_val, false_val); return 0; }
逻辑运算符和表达式
与运算:&& 参与运算的两个值都为真,结果才为真,否则为假
或运算:|| 参与运算的两个值只要有一个为真,结果就为真,两个都为假,结果为假
非运算:! 参与运算量为真,结果为假,参与运算量为假,结果为真
void main() { int score; printf("请输入一个分数: "); scanf("%d",&score); if(score < 60) { printf(" the score is E"); } //else if(60<=score<70) else if ((score>60 || score==60)&&score<70) { printf("the score is D"); } else if((score>70||score==70)&&score<80) { printf("the score is C"); } else if((score>80||score==80)&&score<90) { printf("the score is B"); } else { printf("the score is A"); } }
void main() { int a,b,c,temp; printf("请输入三个数: "); scanf("%d%d%d",&a,&b,&c); if(a>b) { temp=a; a=b; b=temp; } if(a>c) { temp=a; a=b; b=temp; } if(b>c) { temp=b; b=c; c=temp; } printf("%d %d %d ",a,b,c); }
if语句的嵌套
在嵌套内的if语句可能又是if-else型的
为了避免二异性,C语言规定,else总是与它前面最近的if配对
条件表达式通常用于赋值语句中
例如条件语句
if(a>b)max=a;
else max=b;
可用条件表达式写为 max=(a>b)?a:b;
执行该语句的语义是:如a>b为真,则把a赋予max,否则把b赋予max
使用条件表达式时,还应注意以下几点:
1. 条件运算符的运算优先级低于关系运算符和算数运算符,但高于赋值符,因此,max=(a>b)?a:b;可以去括号写为max=a>b?a:b;
2. 条件运算符?和:是一对运算符,不能分开单独使用
3. 条件运算符的结合方向是自右向左
switch语句
C语言还提供了另一个用于多分支选择的switch语句,其一般形式为:
switch ( 整型表达式) { case 常量1:语句 <--可选 case 常量2:语句 <--可选 default : <--可选 语句 <--可选 }
其语义是:计算表达式的值,并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断
继续执行后面所有case后的语句,如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句
void main() { int a; printf("请输入一个整数:"); scanf("%d",&a); switch(a) { case 1:printf("星期一");break; case 2:printf("星期二");break; case 3:printf("星期三");break; case 4:printf("星期四");break; case 5:printf("星期五");break; case 6:printf("星期六");break; case 7:printf("星期日");break; default:printf("错误"); } }
注意以下几点:
1. 在case后的各常量表达式的值不能相同,否则会出现错误
2. 在case后,允许有多个语句,可以不用{}括起来
3. 各case和default子句的先后顺序可以变动,而不会影响程序执行结果
4. default子句可以省略不写
tips:全选然后按alt+F8会排整好代码的顺序
void main() { double a,b; char c; printf("请输入要计算的公式:"); scanf("%lf%c%lf",&a,&c,&b); switch(c) { case '+': printf("%lf ",a+b); break; case '-': printf("%lf ",a-b); break; case '*': printf("%lf ",a*b); break; case '/': printf("%lf ",a/b); break; default: printf("您输入的公式有误"); } }
void main() { double p,w,s,d; printf("请输入基本运费: "); scanf("%lf",&p); printf("请输入货物重: "); scanf("%lf",&w); printf("请输入距离: "); scanf("%lf",&s); if (s<250) { d=0; } else if(s>250||s==250 &&s<500) { d=0.02; } else if(s>500||s==500 &&s<1000) { d=0.05; } else if(s>1000||s==1000 &&s<2000) { d=0.08; } else if(s>2000||s==2000 &&s<3000) { d=0.10; } else if(s>3000||s==3000 ) { d=0.15; } printf("总运费是:%lf ",p*w*s*(1-d)); }
循环程序设计
特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止
给定的条件成为循环条件,反复执行的程序段称为循环体
C语言提供了多种循环语句,可以组成各种不同形式的循环结构
1. 用goto语句和if语句构成循环
2. 用while语句
3. 用do-while语句
4. 用for语句
goto语句以及goto语句构成循环
goto语句是一种无条件转义语句,与BASIC中的goto语句相似,goto语句的使用格式:
goto 语句标号;
其中标号是一个有效的标识符,这个标识符加上一个":"一起出现在函数内某处,执行goto语句后,程序将跳转到该标号处并执行其后的语句,另外标号必须在goto语句同处于一个函数中,但可以不在一个循环层中
通常goto语句与if条件语句连用,当满足某一条件时,程序跳到标号处运行
但是注意:goto语句通常不用,主要因为它将使程序层次不清,且不易读,但在多层嵌套退出时,用goto语句则比较合理
实现从1+2+3+....+100
#include<stdio.h> void main() { int i,sum=0; i=1; loop:if(i<=100) { sum=sum+i; i++; goto loop; } printf("%d ",sum); }
loop是语句标号
while语句
while语句的一般形式为:
while(表达式)语句
其中表达式是循环条件,语句为循环体
while语句的语义是:计算表达式的值,当值为真(非0)时,执行循环体语句,其执行过程可用下图表示
注意:如果表达式的值一开始就为0,则语句一次也不会执行
实现从1+2+3+....+100
#include<stdio.h> void main() { int n,sum; n=1; sum=0; while(n<=100) { sum+=n; n+=1; } printf("%d",sum); }
使用while语句应注意以下几点:
1. while语句中的表达式一般是关系表达式或逻辑表达式,只要表达式的值为真(非0)即可继续循环
2. 循环体如包括有一个以上的语句,则必须用{}括起来,组成复合语句
do-while语句
一般形式:
do 语句 while(表达式);
这个循环与while循环的不同在于:它先执行循环中的语句,然后再判断是否为真,如果为真则继续循环,如果为假,则终止循环,因此,do-while循环至少要执行一次循环语句
实现从1+2+3+....+100
ude<stdio.h> void main() { int n,sum; n=1; sum=0; do { sum+=n; n+=1; }while(n<=100); printf("%d",sum); }
for语句
一般形式:
for (表达式1;表达式2;表达式3)语句
执行过程如下:
1. 先求解表达式1
2. 求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第3步;若其值为假(0),则循环结束,转到第5步
3. 求解表达式3
4. 转回上面第2步继续执行
5. 循环结束,执行for语句下面的一个语句
for(循环变量赋初值;循环条件;循环变量增量)语句
循环变量赋初值总是一个赋值语句,它用来给循环控制变量赋初值,循环条件是一个关系表达式,它决定什么时候退出循环,循环变量增量,定义循环控制变量
每循环一次后按什么方式变化,这三个部分之间用 ; 隔开
for(i=1;i<=100;i++) { sum=sum+i; }
先给i赋初值1,判断i是否小于100,若是则执行语句,之后值增加1,再重新判断知道条件为假,即i>100时,结束循环
#include<stdio.h> void main() { int n,sum; n=1; sum=0; for(n=1;i<=100;n++) { sum+=n; } }
注意:
1. for循环中的表达式1,表达2和表达式3都是选择项,即可以缺省,但 ; 不能缺省
2. 省略了表达式1,表示不对循环控制变量赋初值
3. 省略了表达式2,则不做其他处理时便成死循环
4. 如果省略了表达式3,则不对循环控制变量进行操作,这时可在语句中加入修改循环控制变量的语句
#include<stdio.h> void main() { int n,sum; n=1; sum=0; for(n=1;n<=100;) { sum+=n; n++; } printf("%d",sum); }
5. 3个表达式都可以省略
for(; ;)语句相当于while(1)语句
6. 表达式1可以是设置循环变量的初值的赋值表达式,也可以是其他表达式
#include<stdio.h> void main() { int n,sum; for(n=1,sum=0;;n<=100;) { sum+=n; n++; } printf("%d",sum); }
7. 表达式1和表达式3可以是一个简单表达式也可以是逗号表达式
8. 表达式2一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值非零,就执行循环体
#include<stdio.h> void main() { int i,j; for(i=1;i<=6;i++) { printf(" "); for(j=1;j<=i;j++) { putchar('*'); } } }
程序1. 有1,2,3,4数字,能组成多少个互不相同且不重复的三位数,都是多少
void main() { int i,j,k; printf(" "); for(i=1;i<5;i++) { for(j=1;j<5;j++) { for(k=1;k<5;k++) { if(i!=k&&i!=j&&j!=k) { printf("%d%d%d ",i,j,k); } } } } }
break和continue语句
break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句
一般形式:break;
break语句不能用于循环语句和switch语句之外的任何其他语句中
注意:
1, break语句对if-else的条件语句不起作用
2, 在多层循环中,一个break语句只向外跳一层
void main() { int r; float area; float pi=3.14159; for(r=1;r<=10;r++) { area=pi*r*r; if (area>100) { break; } printf("r=%d,area=%f ",r,area); } }
break跳出for循环
continue语句
作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定
continue语句和break语句的区别
continue语句只结束本次循环,而不是终止整个循环的执行
break语句则是结束整个循环过程,不再判断执行循环的条件是否成立
例题把100~200之间的不能被3整除的数输出
void main() { int n; for (n=100;n<=200;n++) { if(n%3==0) continue; printf("%d ",n); } }
例题2 求π
#include<math.h> void main() { int s; float n,t,pi; t=1; pi=0; n=1.0; s=1; while(fabs(t)>1e-6) { pi=pi+t;n=n+2;s=-s;t=s/n; } pi=pi*4; printf("pi=%10.6f ",pi); }