1
程序设计基础 (C++)
第 3章 结构化程序设计
2
实际问题
1,已知半径求圆周长和圆面积
2,求一元二次方程的根
3,计算某班级某课程平均成绩
3
如何解决?
程序 = 数据结构 + 算法
数据结构:数据的组织形式
算法:解决问题的步骤和方法设计得当的数据结构可以带来高效率的算法
4
本章学习目标
通过本章学习,你能够
了解有关 算法 的基本概念
了解 面向过程 的程序设计的特点
掌握 结构化 程序设计的特点
能够利用 选择结构 解决问题
能够利用 循环结构 解决问题
5
本章内容
算法和算法的表示
结构化程序设计
选择结构与 if,switch语句
循环结构与 while,do,for语句
其它相关控制语句,break,continue
结构的嵌套
本章作业
6
面向过程程序设计
给出计算机执行的 具体步骤
解决程序,怎么做,的问题
7
算法
完成任务所需的具体步骤和方法
相同的任务可以有不同的算法
算法的优劣用 空间复杂度 与 时间复杂度来衡量
8
算法的表示形式
自然语言
伪代码
流程图
9
问题 1算法
1,输入半径 r
2,计算周长,2*r*?
3,计算面积,r*r*?
4,输出周长和面积
10
问题 2算法
1,输入系数,a,b,c
2,计算:
3,如果 D大于等于 0,计算实根
4,如果 D小于 0,计算复根
5,输出结果,x1,x2
acb 42-=D
11
问题 3算法
1,输入成绩,score
2,累加成绩,total + score
3,统计学生数,count + 1
4,如果不是最后一个同学,重复 1,2,3
5,计算平均成绩,total /count
6,输出结果
12
问题 3算法伪代码
1,input score
2,total = total + score
3,count = count + 1
4,if not the last one,go to 1
5,average = total /count
6,output average
13
流程图
直观描述控制结构
流程图符号:
动作符号 判断符号开始 /结束连接符号输入 /输出问题 2流程图
D>=0
计算实根真假计算复根输入 a,b,c
D=b*b-4*a*c
输出 x1,x2
15
结构化程序设计
优点:
程序结构清晰、可读性强
程序更易于调试
程序更利于避免错误
16
如何结构化程序设计
只使用 3种基本控制结构:
顺序结构、选择结构、循环结构
每个结构块必须单入单出
结构块之间可以嵌套和堆叠
17
顺序结构
程序按照 书写顺序 执行语句 (在模块内部 )
例如:
...
cout<<"请输入圆半径 \n";
cin>>r;
area=r*r*3.14;
cout<<"圆面积是,"<<area<<endl;
18
选择结构 (分支结构 )
流程图如下:
分数大于等于 60
打印 "考试通过 "
真假打印 "考试失败 "
19
选择结构
根据判断条件选择执行路径。
例:
if (score>=60)
cout<<"考试通过 "<<endl;
else
cout<<"考试失败 "<<endl;
20
循环结构流程图如下:
不是最后一个? 将分数加到 总分上真假
21
循环结构
重复执行某段代码
例:
while (count <= num) //num个学生
{
cin>> score;
total += score;
count ++;
}
22
C++语句
两类语句
1,非执行语句
声明类
2,可执行语句
赋值语句
控制语句控制语句:改变程序的执行顺序
23
C++控制语句
2种 选择结构 控制语句:
if,switch
3种 循环结构 控制语句:
while,do/while,for
其它 控制语句:
break/continue/goto
return
24
if 语句
三种形式
1,if (选择条件 ) 语句
2,if (选择条件 )
语句 1
else
语句 2
选择条件通常是:关系表达式或逻辑表达式
25
if 语句
三种形式
3,if (表达式 1) 语句 1
else if(表达式 2) 语句 2
else if(表达式 3) 语句 3

else if(表达式 m) 语句 m
26
三种 if语句的执行过程
27
三种 if语句的执行过程
28
if 语句举例编写程序,判断某年是否闰年。
闰年符合下面二者之一:
1,能被 4整除,但不能被 100整除。
2,能被 400整除。
(year%4 == 0 && year%100 != 0)
|| (year%400 ==0)
29
if 语句举例
int year;
bool leap;
cin>>year;
leap= (year%4 = = 0 && year%100 != 0)
||(year%400 = =0);
if (leap)
cout<<year<<″是闰年。 ″;
else
cout<<year<<″不是闰年。 ″;
30
问题 2的源程序
...
if (fabs(a)<=1.0e-6)
{
cout<<"This is not quadratic\n";
return 0;
}
else
disc=b*b-4*a*c;
31
问题 2的源程序 (续 )
if (disc>=0)
{
x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
cout<<"real roots:"<<x1<<x2<<endl;
}
else
{
realpart=-b/(2*a);
imagpart=sqrt(-disc)/(2*a);
cout<<"comlex roots,\n";
cout<<realpart<<'+'<<imagpart<<'i'<<endl;
cout<<realpart<<'-'<<imagpart<<'i'<<endl;
}
32
良好的编程习惯
使用缩进的书写格式
33
复合语句
if (grade>=60)
cout<<"Passed\n";
else
{
cout<<"Failed\n";
cout<<"You must take it again\n";
}
请思考:如果不使用大括号,程序将如何执行?
34
多分支选择结构举例学生成绩分类如下:
85 ~100分为‘ A’类
70 ~ 84 分为‘ B’类
60 ~ 69 分为‘ C’类
< 60 分为‘ D’类要求根据成绩的等级打印出百分制分数段。
35
多分支结构流程图
36
多分支选择结构举例 (用 if语句 )
if (grade=='A')
cout<<"85~100\n";
else if (grade=='B')
cout<<"70~84\n";
else if (grade=='C')
cout<<"60~69\n";
else if (grade=='D')
cout<<"<60\n";
else
cout<<"error\n";
37
多分支选择结构举例 (用 switch语句 )
switch(grade)
{
case 'A',cout<<"85~100\n"; break;
case 'B',cout<<"70~84\n"; break;
case 'C',cout<<"60~69\n"; break;
case 'D',cout<<"<60\n"; break;
default,cout<<"error\n";
}
38
switch语句
switch(表达式 )//必须是整数
{
case 常量表达式 1:语句 1
case 常量表达式 2:语句 2
...
case 常量表达式 n:语句 n
default:语句 n+1
}
39
循环结构与循环语句循环结构必须考虑三个要素:
循环体、循环控制、循环初始化三种循环语句:
1,while语句
2,do/while语句
3,for语句
40
while语句一般形式如下:
while (循环条件 )
语句
while循环称为 当型循环
当语句多于一条时,使用复合语句
41
while语句的执行过程
42
while 语句举例求 1+2+3+… +100。
43
while 语句举例
...
int i=1,sum=0; //循环初始化
while (i<=100) //循环控制
{
sum += i; //循环体
i++;
}
cout<<″sum=″<<sum<<endl;
...
44
问题 3的源程序
int count=1,num;
float total=0,score;
cin>>num; //学生个数
while (count <= num)
{
cin>> score;
total += score;
count ++;
}
cout<<total/num;

45
do/while语句一般形式如下:
do{
语句
}while (循环条件 ) ;
称为直到型循环
46
do/while语句的执行过程
47
do/while 语句举例求 1+2+3+… +100。
48
do/while 语句举例
...
int i=1,sum=0;
do{
sum += i;
i++;
}while (i<=100);
cout<<″sum=″<<sum<<endl;
...
49
for语句一般形式如下:
for(表达式 1;表达式 2;表达式 3)
语句
属当型循环当语句多于一条时,使用复合语句
50
for语句的执行过程循环初始化循环控制循环体改变循环控制变量
51
for 语句举例求 1+2+3+… +100。
for(i=1; i<=100; i++)
sum += i ;
52
break和 continue语句
break语句:
使流程从循环体内或 switch内跳出,接着执行循环体或 switch下面的语句。
只能用于循环语句和 switch语句内,不能单独使用或用于其它语句中。
53
break语句和 continue语句
continue语句:
结束本次循环,而不是终止整个循环的执行。
只能用于循环语句内,不能单独使用或用于其他语句中。
54
break语句和 continue语句
55
break举例
判断 m是否素数
...
k=int(sqrt(m)); //用 k代表根号 m的整数部分
for(i=2; i<=k; i++)
if(m%i==0)
break; //中断整个循环
if(i>k)
cout<<m;
56
结构的嵌套
cin>>year;
while(year>0)
{
leap= (year%4 == 0 && year%100 != 0)
||(year%400 ==0);
if (leap)
cout<<year<<" is a leap year.\n";
else
cout<<year<<" is not a leap year.\n";
cin>>year;
}
可以不断测试是否闰年,如何解决?
57
综合举例
1,求 π的近似值:
π/4≈1-1/3+1/5-1/7+… 直到最后一项的绝对值小于 10-7为止。
2,找出 100~200间的全部素数。
x
58
综合举例 1
int s=1;//符号
double n=1,t=1,pi=0; //分母,被加数,累加器
while((fabs(t))>=1.0e-7)
{
pi = pi + t;
n = n + 2;
s = - s;
t = s / n;
}
pi = pi * 4; 应该注意哪些问题?
59
综合举例 2:
找出 100~200间的全部素数
...
//判断 m是否素数
k=int(sqrt(m)); //用 k代表根号 m的整数部分
for(i=2; i<=k; i++)
if(m%i==0)
break;
if(i>k)
cout<<m;
..,如何完整该程序?
60
本章小结
结构化程序设计
选择结构
if语句 /switch语句
循环结构
while语句 /do-while语句 /for语句
break语句和 continue语句
结构嵌套
61
本章作业
实验 3
复习第 3章,预习第 4章
习题,8~25
62
思考题
某地刑侦大队对涉及 6个嫌疑人的一桩疑案进行分析:
1,A,B至少有 1人作案;
2,A,E,F至少有 2人参与作案;
3,A,D不可能是同案犯;
4,B,C或同时作案,或与本案无关;
5,C,D中有且仅有 1人作案;
6,如果 D没有参与作案,则 E也不可能参与作案。
试设计算法并编程,将作案人找出来。
63
判断条件
(a||b)&&
((a&&e)||(a&&f)||(e&&f))&&
(!(a&&d))&&
((b&&c)||(!b&&!c))&&
((c&&!d)||(!c&&d))&&
(!d&&!e)
//采用穷举算法
for(a=0; a<=1; a++)
for(b=0; b<=1; b++)
...
for(f=0; f<=1; f++)
{
istrue=(a||b)&&
((a&&e)||(a&&f)||(e&&f))&&
(!(a&&d))&&
((b&&c)||(!b&&!c))&&
((c&&!d)||(!c&&d))&&
(!d&&!e);
if(istrue)
输出结果,a,b,c,d,e,f
} //结果,1 1 1 0 0 1
65
第一次大作业
设计以下问题的算法 (流程图 )并编制程序:
利用幂级数展开式 计算三角函数 sin(x)(通项的绝对值小于 )
随机产生两个整数 (<10)的加、减、乘或除的算式供小学生算术练习直到其放弃,并提示计算正确与否。
#include<ctime>
srand( (unsigned)time( NULL ) );//随机种子
a=rand()%10;//随机函数
710-
.,,,s i n !7!5!3!1 753?-?-= xxxxx
66
第一次大作业
递交方式和文件:
上传到助教的 ftp(参见网上助教信息 )
将 3个文件 (1个 word文档,2个,cpp源程序 )打包后上传,压缩文件名,如:学号姓名作业 1
截止日期:
4月 5日
67
思考题 2
编制程序计算平方根 a
68
牛顿迭代法计算平方根
axxf -= 2)(
69
牛顿迭代法计算平方根
根号 a实际上就是 x^2-a=0的一个正实根
不断用 (x,f(x))的切线来逼近方程 x^2-a=0
的根
该函数的导数是 2x,函数上任一点 (x,f(x))处的切线斜率是 2x。
x-f(x)/(2x)是一个比 x更接近的近似值。
代入 f(x)=x^2-a得到近似值 (x+a/x)/2。