目录
一、分支
1.if语句
(1)if语句的语法为:
if(表达式)
{
语句块
}
其含义是:如果表达式为真,则执行语句块,否则不执行。
(2)if else语句的语法为:
if(表达式)
{
语句块1
}
else
{
语句块2
}
其含义是:如果表达式为真,则执行语句块1,否则执行语句块2。
说明:
- 表达式可以是任何合法的C语言表达式,如加减、赋值、条件运算、逗号运算、逻辑运算、关系运算等;
- 语句块要求是一条语句,如果有多条语句则应组成一条复合语句。当语句块是单条语句时,虽然语法上可以不适用大括号,但是为了程序代码的清晰性和层次性起见,推荐使用大括号。另外,大括号对于else子句的正确配对也具有较好的提示作用;
- if或if...else语句本身在语法上理解为一条语句。
(3)if嵌套
当需要对多种情况进行判别处理时,为结构清晰起见,可以采用如下的排版方式:
if(表达式1)
语句块1
else if(表达式2)
语句块2
else if(表达式3)
...
else
语句块n
注意:C语言规定,else总是与它前面最近的且没有配对的if相匹配
2.switch语句
switch语句的语法为:
switch (表达式)
{
case 常量表达式1:语句系列1
case 常量表达式2:语句系列2
...
case 常量表达式n:语句系列n
[default: 语句系列n+1]
}
说明:
- switch后面的表达式可以为整型、字符型或者枚举型,但不允许是实型;
- case后面必须为常量,且类型应与switch中表达式的类型相同;
- switch语句的执行过程是:首先计算switch后面表达式的值,然后与各case分支的常量进行匹配,与哪个常量相等,就从该分支的语句系列开始执行,直到遇到break或者switch语句块的后大括号;
- default分支主要用于处理switch表达式与所有case常量都不匹配的情况。它在语法上可以省略,但推荐使用。
二、循环结构
1.while语句
while语句语法为:
while(表达式)
{
语句块
}
如果表达式的值为真,则进入循环,执行语句块;如果表达式的值为假,则不进入循环,执行while语句的下一条语句。
例:
int a,i=0;
scanf("%d",&a);
while(i<a)
{
printf("%d",i);
}
在这个程序中,while语句块执行a-i+1次,变量i承担了控制循环次数的作用,一般称之为循环控制变量。通过对循环控制变量的修改,控制循环结束的时机。
2.do...while语句
do...while语句的语法为:
do
{
语句块
}while(表达式)
先执行语句,后判断表达式的真假,若为真,则继续执行语句块,否则执行do...while的下一条语句。语句块会被至少执行一次。
3.for语句
for语句的语法为:
for (表达式1;表达式2;表达式3)
{
语句块
}
其中,表达式1,2,3分别对应初始化,条件,更新。具体执行过程为:计算表达式1的值,若满足表达式2,则开始执行语句块的内容,一次循环后执行表达式3,达到变量更新的效果。当表达式2为假时,退出循环,执行下一个语句块。
说明:
- for语句中,表达式1、表达式2、表达式3均可省略。当表达式2省略时,默认其计算结果为真,for中的语句块会被一直执行。
4.break与continue
break与continue是两个流程控制关键字,主要用于循环的中断控制。
两者的区别为:break是结束本层循环体的运行,退出本层循环;continue只是提前结束本层循环体的运行,忽略循环体内其后面的语句,然后重新判断循环条件,并未退出循环体。
例:
#include <stdio.h>
int main()
{
int i,n;
for(i=1;i<=5;i++)
{
printf("Enter in:");
scanf("%d",&n);
if(n<0)
break;
printf("n=%d\n",n);
}
printf("The end.\n")
return 0;
}
#include <stdio.h>
int main()
{
int i,n;
for(i=1;i<=5;i++)
{
printf("Enter in:");
scanf("%d",&n);
if(n<0)
continue;
printf("n=%d\n",n);
}
printf("The end.\n")
return 0;
}
二者运行的结果分别为:
Enter n: 3
n = 3
Enter n: 4
n = 4
Enter n: -5
The end.
Enter n: 3
n = 3
Enter n: 4
n = 4
Enter n: -5
Enter n: -6
Enter n: 7
n = 7
The end.
两段程序的区别在于,第一个使用了break语句,第二个使用了continue语句。当输入-5时,第一个程序中for循环中断,剩余的两次循环不再执行;当输入-5,-6时,第二个程序中只是忽略了当前循环剩余的语句“printf("n = %d\n",n);”,for语句循环体的执行次数并没有减少,仍然为5次。
三、应用举例
1.打印九九加法表
#include <stdio.h>
int main()
{
int i, j;
for (i = 1; i <= 9; i++) //外层循环:控制行数
{
for (j = 1; j <= i; j++) //内层循环:控制输出的等式数
{
printf("%d+%d=%2d ", i, j, i + j); //输出具体内容
}
printf("\n"); //每行最后应有一个回车换行
}
return 0;
}
2.质数判断
#include <stdio.h>
#include <math.h>
int main()
{
int n, i, k;
do
{
printf("Enter a positive integer:");
scanf("%d", &n);
} while (n <= 0); //确保n为正数
if (n == 1)
{
printf("%d is not a prime.\n", n);
}
else
{
k = (int)sqrt(n);
for (i = 2; i <= k; i++)
if (n % i == 0)
break;
}
if (i > k)
{
printf("%d is a prime.\n", n);
}
else
{
printf("%d is not a prime.\n", n);
}
return 0;
}
3.百钱百鸡
//公鸡5钱1只,母鸡3钱1只,小鸡1钱3只。100钱买100只鸡,问公鸡、母鸡、小鸡各几只?
#include <stdio.h>
int main()
{
int a, b, c;
for (a = 0; a <= 20; a++)
{
for (b = 0; b <= 33; b++)
{
c = 100 - a - b;
if (15 * a + 9 * b + c == 300)
{
printf("%d, %d, %d\n", a, b, c);
}
}
}
return 0;
}