结构化程序设计
结构化程序:采用结构化算法化繁为简地把一个复杂问题的求解过程分成可控、易理解和易处理的阶段进行,实现一个便于编写、阅读、修改和维护的程序。
三种基本结构:1966 年,Bohra 和 Jacopini 提出顺序结构、选择结构和循环结构三种基本结构,用这三种基本结构作为表示一个良好算法的基本单元。
- 顺序结构:按顺序执行各个操作。
- 选择结构:又称为选取结构或分支结构,依据不同的条件选择执行不同的操作。
- 循环结构:又称重复结构,反复执行某一部分的操作。
下面按照如何使用控制语句实现三种基本结构。
顺序结构
顺序结构程序:是由一组顺序执行的程序块组成。程序按照语句书写的顺序一步一步顺序执行,没有任何的跳转。
Example :通过键入 a 和 b 的值,输出 a 与 b 的四则运算结果。
int main()
{
int a = 0, b = 0;
printf("Enter a and b :\r\n");
scanf_s("%d%d", &a, &b);
printf("a + b = %d\r\n", a + b);
printf("a - b = %d\r\n", a - b);
printf("a * b = %d\r\n", a * b);
printf("a / b = %d\r\n", a / b);
return 0;
}
运行结果:
选择结构
选择结构程序:依据不同的条件选择执行不同的处理块。可以采用条件语句、分支语句,还有条件运算符来实现选择结构。
if 语句实现选择结构
if 语句:又称条件语句,用来判定所给定的条件是否成立,依据判定的结果(真或假)决定执行处理块。 if 语句有以下三种常见的形式:
形式 1:
if (表达式 1)
{
语句 1
}
执行过程:
- 首先计算表达式 1 的值。
- 若表达式 1 的值不为真(非 0) ,则执行语句 1;
若表达式 1 的值为假(0),则不执行语句 1。
Example:仅当键入 a 值大于 b 值时,才打印信息“a > b”。
int main()
{
int a = 0, b = 0;
printf("Enter a and b :\r\n");
scanf_s("%d%d", &a, &b);
if (a > b)
{
printf("a > b");
}
return 0;
}
形式 2:
if(表达式 1)
语句 1
else
语句 2
执行过程·:
- 首先计算表达式 1 的值。
- 若表达式 1 的值为真(非 0),则执行语句 1;
若表达式 1 的值为假(0),则执行语句 2。
Example:当键入 a 的值大于 b 时,输出 “a > b”,否则输出 “a <= b”。
int main()
{
int a = 0, b = 0;
printf("Enter a and b :\r\n");
scanf_s("%d%d", &a, &b);
if (a > b)
{
printf("a > b");
}
else
{
printf("a <= b");
}
return 0;
}
形式 3:
if(表达式 1)
语句 1
else if(表达式 2)
语句 2
else if(表达式 3)
语句 3
...
else if(表达式 n)
语句 n
else
语句 n + 1
执行过程:
- 首先计算表达式 1 的值。
- 判断表达式 1 的值是否为真(非 0)。
若表达式 1 为真(非 0),执行语句 1;
若表达式 1 的值为假(0),则计算表达式 2 的值。 - 判断表达式 2 的值是否为真(非 0)。
若表达式 2 的值为真(非 0),执行语句 2;
若表达式 2 的值为假(0),则计算表达式 3 的值。 - 依次类推,依次计算第 n 个表达式的值。
- 当表达式 n 的值为真(非 0),执行语句 n,
若表达式 n 的值为假(0),执行语句 n + 1。
Example:键入 a 和 b 的值,输出其大小判断关系。
int main()
{
int a = 0, b = 0;
printf("Enter a and b :\r\n");
scanf_s("%d%d", &a, &b);
if (a > b)
{
printf("a > b");
}
else if(a = b)
{
printf("a = b");
}
else
{
printf("a < b");
}
return 0;
}
switch 实现多分支选择语句
一般形式:
switch(表达式 1)
{
case 常量表达式 1 : 语句组 1;
case 常量表达式 2 : 语句组 2;
...
case 常量表达式 n : 语句组 n;
default : 语句组 n + 1;
}
执行过程:
- 先计算表达式 1 的值。
- 然后依次把表达式 1 的值与常量表达式的值进行比较。
- 一旦发现表达式 1 的值能够与某个常量表达式配对,
则以此为入口号,由此开始顺序执行语句。 - 若表达式 1 的值与所有的 case 中的常量表达式均无法匹配,
则执行 default 后的语句组 n + 1。
NOTE:default 是一个可选项,如果 switch 语句中没有 default 分支,则当 switch 后的表达式与所有的常量表达式都不匹配时,将不执行任何操作。
Example:依据运算符 oper 输出运算结果。
int main()
{
int a = 0, b = 0;
char oper = 0;
printf("Enter a,operator, b :\r\n");
scanf("%d%c%d", &a, &oper, &b);
switch (oper)
{
case '+' :
printf("a + b = %d\r\n", a + b);
case '-' :
printf("a - b = %d\r\n", a - b);
case '*':
printf("a * b = %d\r\n", a * b);
case '/':
if (b != 0)
{
printf("a / b = %d\r\n", a / b);
}
else
{
printf("Error: b = 0");
}
default:
printf("End.\r\n");
}
return 0;
}
输出结果 1:当键入 1+1 时,输出了全部的四则运算结果
输出结果 2: 当键入 1-1 时,输出了减法、乘法和除法的运算结果
输出结果 3:当键入 1*1 时,输出了乘法和除法的运算结果
输出结果 4:当键入 1/1 时,输出了除法的运算结果
NOTE:可以注意到,每当表达式 oper 找到匹配的常量表达式时,会把顺序执行剩余的语句组。这并不是 Example 所设想的结果,我们的目的只是需要特定的运算结果,这时,我们可以采用 break 语句退出 switch 结构。
switch(表达式 1)
{
case 常量表达式 1 : 语句组 1 ;
break;
case 常量表达式 2 : 语句组 2 ;
break;
case 常量表达式 3 : 语句组 3 ;
break;
...
case 常量表达式 n : 语句组 n ;
break;
default : 语句组 n + 1;
break;
}
执行过程:
- 先计算表达式 1 的值。
- 然后依次把表达式 1 的值与常量表达式的值进行比较。
- 一旦发现表达式 1 的值能够与某个常量表达式配对,
则以此为入口号,由此开始顺序执行语句。 - 直到执行到 break 语句,退出 switch 语句。
- 若表达式 1 的值与所有的 case 中的常量表达式均无法匹配,
则执行 default 后的语句组 n + 1。
NOTE:break 语句在 switch 语句中的作用为退出 switch 语句。
Example:实现上一个 Example ,依据运算符 oper 输出运算结果。
int main()
{
int a = 0, b = 0;
char oper = 0;
printf("Enter a,operator, b :\r\n");
scanf("%d%c%d", &a, &oper, &b);
switch (oper)
{
case '+' :
printf("a + b = %d\r\n", a + b);
break;
case '-' :
printf("a - b = %d\r\n", a - b);
break;
case '*':
printf("a * b = %d\r\n", a * b);
break;
case '/':
if (b != 0)
{
printf("a / b = %d\r\n", a / b);
}
else
{
printf("Error: b = 0");
}
break;
default:
printf("End.\r\n");
break;
}
return 0;
}
输出结果 1: 键入 1+1,输出 1+1 的运算结果
输出结果 2: 键入 1-1,输出 1-1 的运算结果
输出结果 3: 键入 1*1,输出 1*1 的运算结果
输出结果 4:键入 1/1,输出1/1的运算结果
条件表达式实现选择结构
一般形式:
表达式 1 ? 表达式 2 :表达式 3
执行过程:
- 首先计算表达式 1 的值。
- 若表达式 1 的值为真(非 0), 则条件表达式的值为表达式 2 的值;
若表达式 1 的值为假(0),则条件表达式的值为表达式 3 的值。
Example:键入 a、b 值,输出最大值。
int main()
{
int a = 0, b = 0, max = 0;
scanf("%d %d", &a, &b); // 注意:键入时中间有个空格
max = (a > b) ? a : b;
printf("max is %d\r\n", max);
return 0;
}
输出结果 1 :键入 1 3,输出 最大值为 3
键入结果 2: 键入 3 1,输出最大值为 3
循环结构
循环结构:用来处理需要的重复操作。
while 语句实现循环结构
一般形式:
while(循环条件表达式)
{
循环体语句;
}
执行过程:
当循环条件表达式的值为真(非 0),则执行循环体语句。
EXAMPLE:使用 while 语句实现计算 1 + 2 + 3 + … + 99 + 100 的结果
int main(void)
{
int i = 1;
int sum = 0;
while (i <= 100)
{
sum += i;
i++;
}
printf("sum = %d", sum);
return 0;
}
输出结果:
do…while 语句实现循环结构
一般形式:
do
{
循环体语句;
}while(循环条件表达式)
执行过程:
- 先执行循环体语句。
- 然后检查循环表达式的值是否为真(非 0)。
若循环表达式的值为真(非 0),执行循环体语句;
若循环表达式的值为假( 0),退出循环。
Example:使用 do - while 语句计算 1 + 2 + 3 + … + 99 + 100 的结果
int main(void)
{
int i = 1;
int sum = 0;
do
{
sum += i;
i++;
} while (i < 101);
printf("sum = %d", sum);
return 0;
}
输出结果:
for 语句实现循环过程
一般形式:
// 表达式1:设置初始条件,只执行一次。
// 表达式2:循环条件表达式,用于判断是否继续循环。在每次执行循环体语句前先执行此表达式。
// 表达式3:循环的调整,在执行完循环体后才进行。
for(表达式1; 表达式2; 表达式3)
{
循环体语句;
}
//即可以理解为
for(循环变量赋初值; 循环条件; 循环变量增值)
{
循环体语句;
}
Example:for 循环方式计算 1 + 2 + 3 + … + 99 + 100 的结果
int main(void)
{
int i = 1;
int sum = 0;
for (i = 1, sum = 0; i <= 100; i++)
{
sum += i;
}
printf("sum = %d", sum);
return 0;
}
输出结果:
改变循环状态的两种方式
- break:提前终止循环。使流程跳出循环体之外,接着接着执行循环体下面的语句。
- continue:提前结束本次循环。跳过循环体中下面尚未执行的语句,转到循环体结束点之前。