第 5讲 程序的控制结构多分支 (选择 )结构程序设计循环结构程序设计请大家及时到我的个人主页 http://cs.cqupt.edu.cn/xiejb
或公共邮箱 http://stu.cqupt.edu.cn中查看作业回复及下载课件自学
2
习题 4.1:求分段函数
编程题:
#include <stdio.h>
void main()
{ int m; scanf("%d",&m); /*输入一个整数 */
if (m > 0) /*是否为正数 */
{ printf("%d is positive\n",m);}
else
{ if(m < 0) /*是否为负数 */
{ printf("%d is negative\n",m);}
else /*是 0*/
{ printf("%d is 0 \n",m);}
}
if (m % 2 == 0) /*是否为偶数 */
{ printf("%d is even\n",m); } /*是偶数 */
else
{ printf("%d is odd\n",m); } /*是奇数 */
}
作业答案

01
00
01
x
x
x
y
#include <stdio.h>
void pos_or_neg(int m);
void odd_or_even(int m);
void pos_or_neg(int m) /*判断整数 m是正、负或 0*/
{ if (m > 0) /*是否为正数 */
{ printf("%d is positive\n",m);
}
else
{ if(m < 0) /*是否为负数 */
{ print d is negative\n",m);}
else /*是 0*/
{ printf("%d is 0 \n",m);}
}
}
void odd_or_even(int m) /*判断整数 m是奇数还是偶数 */
{ if (m % 2 == 0) /*是否为偶数 */
{ printf("%d is even\n",m); } /*是偶数 */
else
{ printf("%d is odd\n",m); } /*是奇数 */
}
void main()
{int m;
scanf("%d",&m); /*输入一个整数 */
pos_or_neg(m);
odd_or_even(m);
}
写成多函数:
多分支 结构
if-else中又有 if-else称为,嵌套,
写程序时,一般在 else中嵌套。
if( )
{ …… }
else
{if( )
{…… }
else
{…… }
}
读程序时按 默认配对原则,从最内层开始,else总与离它上面最近且未曾配对的 if配对,与书写的缩进无关
3
输入三个系数 a,b,c
输出计算结束
P95例 4-12:
求一元二次方程的根怎么求?求解
a==0?
输出,不是一元二次方程,
NO YES
delta>=0
YES
NO
求 x1,x2并输出 输出,无解,
计算 delta
4
#include <math.h>
#include <stdio.h>
main()
{
float a,b,c,delta,x1,x2,p,q;
printf("Please enter the coefficients a,b,c:");
scanf(“%f,%f,%f”,&a,&b,&c); /*输入三个系数 */
if(a==0)
{ printf(,not a quadratic!”);}
else
{ delta = b * b - 4 * a * c; /*计算判别式 */
if(delta<0)
{ printf(“No root!”); } /*输出,无解,*/
else
{ p = - b / (2 * a); q = sqrt(delta) / (2 * a);
x1 = p + q; x2 = p - q; /*求实根 x1,x2 */
printf(“x1=%7.4f,x2=%7.4f\n”,x1,x2); /*输出 x1和 x2*/
}
}
}
忠告:为避免出错,尽量将每个分支中的语句用 {}括起来。
若不括会怎样呢?
5
P99 例 4-15
根据输入的百分制成绩 score,分段转换成相应的等级并打印输出。
分析:
输入 score
转换并输出 (五个分支 )
6
#include <stdio.h>
main()
{ int score;
printf("Please enter score:");
scanf("%d",&score);
if (score < 0 || score > 100) /*对输入数据的合法性进行检查 */
printf("Input error!\n");
else if (score >= 90)
printf("%d--excellent\n",score);
else if (score >= 80)
printf("%d--good\n",score);
else if (score >= 70)
printf("%d—fit exactly\n",score);
else if (score >= 60)
printf("%d--pass\n",score);
else
printf("%d--fail\n",score);
}
方法一程序
在 else分支嵌套
没有 else会怎样?
7
方法二输出 A
Score/10有 11种情况
10
输出 A9
输出 E0

switch(score/10)
{case 10:
case 9,printf(“%d----excellent\n”,score);break;
case 8,printf(“%d----good\n”,score);break;
case 7,printf(“%d----fit exactly\n”,score);break;
case 6,printf(“%d----pass\n”,score);break;
case 5:
case 4:
case 3:
case 2,
case 1:
case 0,printf(“%d----fail\n”,score);break;
}
default,printf(“%d----fail\n”,score);break;
用于判断分支的表达式
表达式的所有可能结果列举在 case后
当上面的情况与下边的情况相同,后边的分支语句可省略
default表示除上述情况以外的所有情况。
当遇到 break时,程序转到 switch语句的的 }后边
8
#include <stdio.h>
void main()
{ int score;
printf("Please enter score:");
scanf("%d",&score);
if(score<0||score>100)
printf(“Input error!\n”);
else
{ switch(score/10)
{ case 10:
case 9,printf(“%d----excellent\n”,score);break;
case 8,printf(“%d----good\n”,score);break;
case 7,printf(“%d----fit exactly\n”,score);break;
case 6,printf(“%d----pass\n”,score);break;
case 5:
case 4:
case 3:
case 2,
case 1:
case 0,printf(“%d----fail\n”,score);break;
}
}
}
方法二程序
default,printf(“%d----fail\n”,score);break;
执行过程??
9
涉及到的语法知识
-switch语句
一般用于菜单等多分支的情况
switch (表达式 )
{
case 常数 1:语句序列 1;
case 常数 2:语句序列 2;
…………
default:语句序列 n;
}
一般结果为多个离散值的情况更详细的语法知识请查阅 P96-97。
10
练习
main()
{ int a=1,b=0;
switch(a)
{case 1:switch(b)
{case 0:putchar(?0?); break;
case 1,putchar(?1?); break;
} break;
case 2:printf(“a=2”);break;
}
} !!!读程序时一定注意有没有 break,并正确分析 break后转到了哪儿?
11
问题
if-else嵌套和 switch都可以解决多分支的情况,在遇到多分支的时候使用哪个呢?
当多个可能的情况是离散值时可以选用
switch,其他情况下用 if-else嵌套。
12
新的问题,P107例 4-23
=1+2+… +100
粗略算法:
输入 n
计算过程
输出结果 p
1 0 0
1i
i计算
分析:从 1开始加,每次加 i,加完后 i加 1,共加 100次
即 i=1,sum=0,sum=sum+i,i++,i<=100?
从哪开始?哪些语句循环 100次呢?什么时候结束呢?
++(自加 1运算符 )
--(自减 1运算符 )
13
方法一程序
#include <stdio.h>
main()
{ int i,sum = 0;
for (i=1; i<=100; i++)/*先判断后执行,循环 100次 */
{
sum = sum + i; /*作累加运算 */
}
printf(" sum = %d\n",sum);
}
循环循环控制变量 i起到控制循环次数的作用。
14
方法二程序
#include <stdio.h>
main()
{ int i = 1,sum=0;
while (i <= 100) /*先判断后执行,循环 n次 */
{ sum = sum+i; /*作累加运算 */
i++; /*累加次数计数器加 1*/
}
printf(" sum = %d\n",sum);
}
15
方法三程序
#include <stdio.h>
main()
{
int i = 1,sum=0;
do
{
sum = sum+i; /*作累加运算 */
i++; /*累加次数计数器加 1*/
}while (i <= 100); /*先执行后判断,循环 n次 */
printf("%d! = %ld\n",n,p);
}
16
涉及的语法知识
-循环语句 1,while
while (表达式 )
{
循环体语句
} A
F
T
P
17
涉及的语法知识
-循环语句 2,do-while
do
{
循环体语句
}while (表达式 );
A
P
T
18
涉及的语法知识
-循环语句 3,for 语句
for(表达式 1 ; 表达式 2 ; 表达式 3)
{
循环体语句
}
AP
T
循环变量增加步长循环变量赋初值
F
19
总结 -循环语句
三条语句几乎等价,编程时可用任意一条语句
刚才例题中的重点语句是
i=1; sum=0 (循环开始之前的 初始值 )
sum=sum+i; i++ (循环内容,即 循环体 )
i<=100 (循环条件 )
因此,写循环时上述三点万不可缺。只是对应不同的循环语句,所放的位置不同
20
下边两个程序的区别?
int sum=0;
int i=1;
do
{ sum=sum+i;
i++;
}
while (i<=100);
int sum=0;
int i=1;
do
{ i++;
sum=sum+i;
}
while (i<=100);
定义变量
sum时不赋初值会怎样?
21
例 4-23又可写成
#include <stdio.h>
main()
{ int i,j,sum = 0;
for(i=1,j=100; i<=50; i++,j--)
{
sum=sum+i+j;
}
printf(“sum = %d\n",sum);
}
两个 循环控制变量 i,j
用逗号分开
逗号运算符
22
课堂练习 P107例 4-24
输入整数 K
输出位数 n
计算结束求倒数第 n位并输出
T还未除尽
n=0
n++;
输出 k%10;
k=k/10;
23
#include <stdio.h>
void main( )
{
int k,n=0;
printf("k=?");
scanf("%d",&k);
printf("\n");
do
{
n++; /* 计数器 n加 1,下边要计算倒数第 n位 */
printf(“%d”,k%10); /* 求倒数第 n位并输出 */
k/=10; /* 为下一次循环做准备 */
} while(k>0);
printf("\n n=%d",n);
}
例 4-24程序
24
本讲小结
掌握多分支的选择结构和简单循环结构的程序设计
能够读懂程序功能,并能分析出其运行结果
应掌握 的语法内容
switch语句
循环结构的三种语句格式
++ --,三种运算符
下节课讲第四章的循环结构程序设计和综合结构的程序设计,请提前预习
25
作业:
习题 4.3,4.6和 4.9