一、大纲介绍
- 顺序语句(if~else~)
- 分支语句(switch)
- 循环语句(for、while~、do~while~、goto)
二、顺序语句
(一)lif语句概述
if (表达式)
语句块1
else
语句块2
常见形式:
if(表达式) 语句块 例如: if(x>y) printf(“%d”, x);
阶梯形式if语句
if(表达式1) 语句块1
else if(表达式2) 语句块2
else if(表达式3) 语句块3
else if(表达式4) 语句块4
...
else 语句块n
if语句的嵌套
if()
if() 语句块1
else 语句块2
else
if() 语句块3
else 语句块4
注意:
语句块:当有若干条语句时,必须用{…}括起来。
表达式:
a)一般情况下为逻辑表达式或关系表达式
如:if(a= =b && x= =y) printf(“a=b,x=y”);
b)也可以是任意类型(包括整型、实型、字符型、指针类型)
如:if(‘a’) printf(“%d”,’a’);
c)请区分if(x=1)与if(x= =1)的不同。
(二)实例
1、实例一
#include <stdio.h>
int main(int argc, char *argv[]) {
float a = 4, b = 5, c = 2, t;
if(a >b) {
t = a;
a = b;
b = t;
};
if(a > c) {
t = a;
a = c;
c = t;
};
if(b > c) {
t = b;
b = c;
c = t;
};
printf("%5.2f, %5.2f, %5.2f\n", a, b, c); // 2.00, 4.00, 5.00
return 0;
}
2、实例二
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[]) {
float a, b, c;
float p;
float area;
scanf("%f %f %f", &a, &b, &c);
if( a + b <= c || a + c <= b || b + c <= a || abs(a - b) >= c || abs(a - c) >= b || abs(b - c) >= a) {
printf("invalid input\n");
} else {
p = (a+b+c) / 2;
area = sqrt(p * (p-a) * (p-b) * (p-c));
printf("%.2f, %.2f, %.2f ---> %.2f\n", a, b, c, area);
};
return 0;
}
3、实例三
#include <stdio.h>
int main(int argc, char *argv[]) {
float score;
printf("please input your score:");
scanf("%f", &score);
if (!(score >= 0 && score <= 100)) {
printf("not in [0, 100]\n");
} else if (score >= 90) {
printf("A-excellent\n");
} else if (score >= 70) {
printf("B-good\n");
} else if (score >= 60) {
printf("C-ok\n");
} else {
printf("D-not paas\n");
}
return 0;
}
三、分支语句
(一)switch语句概述
switch语句的基本形式:
switch (表达式)
{ case 常量表达式1:语句块1;break;
case 常量表达式2:语句块2; break;
….
case 常量表达式n:语句块n; break;
default :语句块n+1
}
switch语句的使用:
- 每个常量表达式的值必须各不相同,否则将会出现矛盾。
- 当表达式的值与case后面的常量表达式值相等时,就执行此case后面的语句。
- switch中的表达式可以是整型、字符型表达式或枚举。
- case 常量:只起语句标号的作用。
switch语句的使用:
- break语句用于强行跳出switch体,一般每个case后面应有一个break语句,default分支后的break可以省略。
- 多个case可以执行一组语句。
(二)实例
1、实例一
#include <stdio.h>
int main(int argc, char *argv[]) {
enum weekday
{sun, mon, tue, wed} a;
a = wed;
switch (a) {
case 1:
printf("1\n");
break;
case 2:
printf("2\n");
break;
case 3:
printf("3\n");
break;
default:
printf("not 1 2 3\n");
}
return 0;
}
2、实例二
#include <stdio.h>
int main(int argc, char *argv[]) {
float score = 0;
printf("please input score:");
scanf("%f", &score);
if (!(score >= 0 && score <= 100)) {
printf("not in [0, 100]\n");
} else {
switch ((int)score / 10) {
case 10:
case 9:
printf("A-excellent\n");
break;
case 8:
case 7:
printf("B-good\n");
break;
case 6:
printf("C-ok\n");
break;
default:
printf("D-not paas\n");
}
}
return 0;
}
四、循环语句
(一)goto语句
特点:当函数有很多个出口,使用goto把这些出口集中到一处是很方便的,特别是函数中有许多重复的清理工作的时候。
- 无条件跳转易于理解
- 可以减少嵌套
- 可以避免那种忘记更新某一个出口点的问题
- 帮助编译器做了代码优化
#include <stdio.h>
int main(int argc, char *argv[]) {
int i = 0;
int sum = 0;
_loop:
if (i <= 100) {
sum += i;
i++;
goto _loop;
}
printf("1+2+3...+100=%d\n", sum);
return 0;
}
(二)while语句
while语句构成循环
基本形式:
while (表达式) {
statatments;
}
求1到100的和:
#include <stdio.h>
int main(int argc, char *argv[]) {
int i = 0;
int sum = 0;
while (i <= 100) {
sum += i;
i++;
}
printf("1+2+3...+100=%d\n", sum);
return 0;
}
打印出所有的“水仙花”数。“水仙花”数是指一个3位数,其各个位数字立方和等于该数本身:
#include <stdio.h>
#include <math.h>
int main(int argc, char *argv[]) {
int n = 100;
int a, b, c;
while (n <= 999) {
a = n / 100;
b = n / 10 % 10;
c = n % 10;
if (pow(a, 3) + pow(b, 3) + pow(c, 3) == n) {
printf("%d\n", n);
}
n++;
}
return 0;
}
(三)do-while语句
do-while语句构成循环
基本形式
do {
statatments;
}while(表达式);
例子,求1到100的和
#include <stdio.h>
int main(int argc, char *argv[]) {
int i = 1;
int sum = 0;
do {
sum += i;
i++;
} while (i <= 100);
printf("1+2+3...+100=%d\n", sum);
return 0;
}
(四)for语句
一般形式:
for(expression1; expression2; expression3)
{ statements;}
执行过程:
- 1.先求解表达式
- 2.求解表达式2,若为真,则执行循环体,然后执行步骤3;若为假,则执行步骤5;
- 3.求解表达式3;
- 4.转回执行步骤2;
- 5.执行for下面的语句。
for语句构成循环:
- 表达式1可省略,但循环之前应给循环变量赋值
- 表达式2可省略,将陷入死循环
- 表达式3可省略,但在循环体中增加使循环变量值改变的语句
求1-100的和:
#include <stdio.h>
int main(int argc, char *argv[]) {
int i = 1;
int sum = 0;
for (;i <= 100; i++) {
sum += i;
}
printf("1+2+3+...+100=%d\n", sum);
}
利用for循环打印九九乘法表 :
#include <stdio.h>
int main(int argc, char *argv[]) {
int i, j;
for (i = 1; i <= 9; i++) {
for (j = 1; j <= i; j++) {
printf("%d*%d=%d\t", i, j, i * j);
}
puts("");
}
return 0;
}
思考:利用for循环打印下面的图案?(大小写)
F
_FE
__FED
___FEDC
FEDCB
_FEDCBA
#include <stdio.h>
int main(int argc, char *argv[]) {
int i, j;
char ch = 'F';
printf("please input char:");
scanf("%c", &ch);
for (i = 0; i <= ch - 'A'; i++) {
for (j = 0; j < i; j++) {
putchar('_');
}
for (j = 0; j <= i; j++) {
putchar(ch-j);
}
putchar('\n');
}
return 0;
}
(五)辅助控制语句
1、break语句
用于从循环体内跳出循环体,即提前结束循环。
注意:break只能用在循环语句和switch语句中
判断素数:
在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。
换句话说,只有两个正因数(1和自己)的自然数即为素数。比1大但不是素数的数称为合数。1和0既非素数也非合数。
#include <stdio.h>
#include <math.h>
int main(int argc, char *argv[]) {
int n, temp;
int i;
printf("please input:");
scanf("%d", &n);
temp = sqrt(n);
i = 2;
while (i <= temp) {
if (n % i == 0) {
break;
}
i++;
}
if (i <= temp) {
printf("%d not paas\n", n);
} else {
printf("%d paas\n", n);
}
return 0;
}
2、continue语句
结束本次循环,接着判定下一次是否执行循环
注意:continue与break的区别
continue直结束本次循环,而break终止本层循环
#include <stdio.h>
#include <math.h>
int main(int argc, char *argv[]) {
for (int i = 1; i <= 1000; i++) {
if (i % 3 == 0) {
continue;
}
printf("%d\n", i);
}
return 0;
}
3、return语句
return语句的一般形式: return ( <表达式> )
- 主要用于终止包含它的函数的执行
- 若终止的为主函数,则主程序结束
#include <stdio.h>
int func() {
return 10;
}
int main(int argc, char *argv[]) {
int res;
res = func();
printf("%d\n", res);
return 0;
}