第五章 选择结构程序设计
本章主要内容,
? 程序设计方法简述
? 算法与流程图
算法的两种表示法
两种流程图
三种基本结构
? 选择结构程序设计
if …else 语句 switch语句
课外阅读材料
程式设计与流程图
(请上网下载 )
一、程序设计方法简述
1、计算机处理问题的过程
? 【 例一 】 让某学生解方程 ax2+bx+c=0
求解过程:
① 分析问题
这是一个一元二次方程(代数问题,须中学代数知识)
②确定处理方案 用求根公式
③确定解题步骤
确定 a,b,c的值
求出 b2 -4ac的值
如果 b2 -4ac>0(双实根)
X1=……
X2=……
如果 b2 -4ac=0(单实根)
X1=X2=……
如果 b2 -4ac<0(双复根)
X1=……
X2=……
④ 根据上述步骤计算
⑤写出答案,
一、程序设计方法简述
2、程序测试
? 目的
发现程序中的错误( Bug)
? 程序错误
◆ 语法错误(编译系统检查)
◆ 逻辑错误(编程人员检查)
二、算法与流程图
1、算法 (algorithm) P14
? 算法,解题思路(解题步骤等)
算法有表示方式:
? 伪码 ( pseudocode)
用人类语言的形式(通常是英语)表示算法。
伪码不在计算机上执行,仅供程序员缩写程序之前构思时用( *注意伪
码程序只包含执行语句,没有声明语句,后者仅仅是给编译器提供的 信息)
? 流程图( flow chart) 用图示方式表示算法
编程依据(便于检查) 编程时用
使用流程图的优点:不易出错 /便于编程 /便于别人阅读和检查程序。
? 通常编程的技术路线是:
用伪码和自顶向下、逐步求精的方法来制定算法,然后再编写相应的 C
语言程序。
复杂程序处理部分宜用流程图表示程序处理的过程。
二、算法与流程图
1、算法 (algorithm)
示例:根据学生成绩输出评定结果。
伪码语句示例之一
if student‘s grades greater than or equal to 60
display ‖ Passed‖
else
display ‖Failed‖
伪码语句示例之二
如果学生成绩大于或等于 60
显示, 及格,
否则
显示, 不及格,
C语言源程序段示例
if (grade>=60)
printf(―Passed!‖);
else
printf(―Failed‖);
二、算法与流程图
2、传统流程图 P19
? 特点:
直观形象;
使用流线。
? 缺点:
占面积大,使用流线
任意转移,易出现
,乱麻, 现象,造成
编程与阅读程序困难。
二、算法与流程图
3,N-S结构化流程图 P26-27
77年美学者 I.Nassi和 B.Scheiderman提出。
? 特点
①取消流线
②不允许流程任意转移,只能从上而下顺序执行
③规定三种基本结构的流程图单元,由这些基本结构象搭积木似的组成各种算
法(结构化设计)。
? 优点
算法清晰,流程不会无规律乱转移。
二、算法与流程图
4、三种基本结构 P23-26
? 通常情况下,程序中的语句是以所编写的顺序一句接一句
地执行,这种执行方法称为, 顺序执行, 。许多 C语句能够
让程序员指定不按编写顺序执行下一条执行语句,这种执
行方法称为, 控制转移, 。
? Bohm和 Jacopini的研究证实,所有的程序都能够只用三种
控制结构编写,即
◆ 顺序结构
◆ 选择结构( selection structure)
◆ 循环结构( repetition structure)
顺序结构是 C语言的基本结构,除非指示转移,否则计算机
自动以语句编写的顺序一句一句地执行 C语句。
? 任何 C语言程序都是由七种控制结构(顺序结构、三种选择
结构和三种循环结构)构成的。
二、算法与流程图
4、三种基本结构 P23-26
?顺序结构
A块,B块顺序执行(每块代表一个或一组操作)
二、算法与流程图
4、三种基本结构 P23-26
? 选择结构
条件 p成立时执行 a块 (否
则执行 b块 )
?if 选择结构 条件为真时
执行某个指定的操作,条
件为假时跳过该操作(单
路选择)
?if… else选择结构 条件
为真时执行某个指定的操
作,为假时执行另一个指
定的操作(双路选择)
?switch选择结构 根据表
达式的值执行众多不同操
作中的某个指定的操作
(多路选择)
二、算法与流程图
4、三种基本结构 P23-26
? 循环结构
分 当型 和 直到型 两类。
当型 先判断,只要条
件为真就反复执行 A块,
为假则结束循环。
直到型 先执行 A块,再
判断条件是否为真,为
真则继续执行循环体,
为假则结束循环。
? C语言提供了三种循环
结构,即 while循环结构,
do… while循环结构和
for循环结构。
三、选择结构程序设计
1,if语句 P95
三种形式:
? if(表达式) 语句; (图 5.5a)
? if(表达式) 语句 1;
else 语句 2; (图 5.5b)
? if(表达式 1) 语句 1; (图 5.6)
else if(表达式 2) 语句 2;
……
else if(表达式 n) 语句 n;
else 语句 n+1;
◆ e1?e2:e3 是 if … else 语句在特定情况下的变体。
注意,
表达式外必须
加括号,且括号
外无分号,语句
结束后要加分号,
三、选择结构程序设计
1,if(天气晴朗 )
我就上街 ;
例, if(x>y)
printf(“%d”,x);
2,if(天气晴朗 )
我就上街 ;
else
在家玩 ;
例, if(x>y)
printf(“%d”,x);
else
printf(“%d”,y);
3,if(天气晴朗 )
我就上街 ;
else if(天气阴 )
我就去图书馆 ;
else
在家玩 ;
例, if(x>y)
printf(“%d”,x);
else if(x<y)
printf(“%d”,y);
else
printf(“x=y=%d”,x);
4,天气晴朗?上街,在家玩
例, printf(“%d”,x>y? x:y);
三、选择结构程序设计
1,if语句 示例
【 例一 】 以下程序的作用是什么?
main( )
{
char c;
printf(―Input,‖);
scanf(―%c‖,&c);
if (c>=‘a‘ && c<=‘z‘)
c=c-32;
else c=c;
printf(―%c‖,c);
}
/*将小写字母转换为大写字母 */
三、选择结构程序设计
1,if语句
if语句的嵌套 P99
一般形式,
if( )
if( ) 语句 1;
else 语句 2;
else
if( ) 语句 1;
else 语句 2;
内嵌 if
内嵌 if
三、选择结构程序设计
1,if语句
if与 else的配对关系,else总是与它上面的最近的未
配对的 if配对,即就近配对原则,
if( )
if( ) 语句 1;
else
if( ) 语句 2;
else 语句 3;
第一个 else虽然与第一
个 if 在同一列上,但实际
上它是与第二个 if 配对,
因为它们相距最近,
如果想让第一个 else与第
一个 if配对可写成,
if ( )
{if ( ) 语句 ; } 内嵌 if
else
if ( ) 语句 ;
else 语句 ;
内嵌 if
内嵌 if
三、选择结构程序设计
1,if语句 示例
【 例二 】 以下程序的执行结果是什么?
main( )
{
int x=2,y=-1,z=2;
if (x<y)
if (y<0) z=0;
else z+=1;
printf(―%d\n‖,z);
}
/*结果是 2*/
哦,原来是因
为 else 总是与
靠近它的 if配
套 …
常见错误,
if (x>0) ; if (x=2) if (1<=x<=10)
y=3x+2; printf(―y>0‖); y=x-1;
三、选择结构程序设计
2,switch语句 P98
switch 语句的一般形式,
switch(e)
{
case c1:语句组 1;
case c2:语句组 2;
……
case cn:语句组 n;
default:语句组 n+1; /*可缺省 */
}
/*e – 表达式(整型、字符型或枚举型 ) */
c1~ cn
常量(整数、字符、
常量表达式如 3+4,不
含变量或函数)
default – 不是 c1~ cn的情况 (位置不一定在最后)。
? switch语句的执行过程:
switch语句先计算表达式的值, 然后同多个 case语
句后的常量比较, 找到相等的 case常量则执行该常量
冒号后的语句段, 并从这个入口一直执行下面所有冒
号后的语句, 直到 switch语句结束 。 如果执行一个或
几个冒号后的语句就要跳出 switch语句, 则可以在跳
出处使用 break语句 。 如果 switch语句后表达式的值
找不到匹配的 case常量, 就执行 default后面的语句段
直到结束 。 default是任选项, 如果没有该语句, 则在
所有配对都失败时, 什么也不执行 。
三、选择结构程序设计
2,switch语句 示例
main()
{
char s;
scanf(―%c‖,&s);
switch(s)
{
case ?A‘, printf(―85~ 100\n‖);
case ?B‘, printf(―70~ 84\n‖);
case ?C‘, printf(―60~ 69\n‖);
case ?D‘, printf(―<60\n‖);
default, printf(―错误输入 \n‖);
}
}
输入 c,求输出结果。
结果:
60~ 69
<60
错误输入
!
三、选择结构程序设计
2,switch语句 示例
main()
{
char s;
scanf(―%c‖,&s);
switch(s)
{
case ?A‘, printf(―85~ 100\n‖);
case ?B‘, printf(―70~ 84\n‖);
case ?C‘, printf(―60~ 69\n‖);
case ?D‘, printf(―<60\n‖);
default, printf(―错误输入 \n‖);
}
}
不好意思,
我属于 C级 !我的成绩 应该是
60~ 69!
什么 !―<60‖?
―错误输入,?
怎么会这样?!
运行结果:
60~ 69
<60
错误输入
三、选择结构程序设计
2,switch语句 示例
解决方法 ——break语句:
main()
{
char s;
scanf(―%c‖,&s);
switch(s)
{
case ?A‘, printf(―85~ 100\n‖);break;
case ?B‘, printf(―70~ 84\n‖);break;
case ?C‘, printf(―60~ 69\n‖);break;
case ?D‘, printf(―<60\n‖);break;
default, printf(―错误输入 \n‖);
}
}
这才差不
多 !
break!
运行结果:
60~ 69
三、选择结构程序设计
2,switch语句 示例
解决方法 ——break语句:
main()
{
char s;
scanf(―%c‖,&s);
switch(s)
{
case ?A‘, printf(―85~ 100\n‖);break;
case ?B‘, printf(―70~ 84\n‖);break;
case ?C‘, printf(―60~ 69\n‖);break;
case ?D‘, printf(―<60\n‖);break;
default, printf(―错误输入 \n‖);
}
}
讨论
switch(s)语句中的 s实际上
并非真正的条件选择,而
只是一种跳转指示(与 if语
句不同),表示下面应该
跳转到什么位置继续执行。
而各 case实际上只是一个
跳转处的标记。当程序跳
转到某个 case处时,并非
只执行此 case行的程序组,
而是从此处开始一直向下
执行各条语句,直到整个
switch开关体结束(,}‖)。
如果要使每个 case处相当
于一种 if( s) else的效果,
必须在其语句组最后加上
break语句。
switch语句的执行过程:
switch语句先计算表达式的值, 然后同
多个 case语句后的常量比较, 找到相
等的 case常量则执行该常量冒号后的
语句段, 并从这个入口一直执行下
面所有冒号后的语句, 直到 switch语
句结束 。 如果执行一个或几个冒号后
的语句就要跳出 switch语句, 则可以
在 跳 出 处 使 用 break 语句 。 如果
switch语句后表达式的值找不到匹配
的 case常量, 就执行 default后面的
语句段直到结束 。 default是任选项,
如果没有该语句, 则在所有配对都
失败时, 什么也不执行 。
三、选择结构程序设计
2,switch语句 示例
main()
{
int x=1,y=0,a=0,b=0;
switch(x)
{ case 1,
switch(y)
{ case 0, a++;break;
case 1, b++;break;
}
case 2, a++;b++;break;
case 3, a++;b++;
}
printf(―a=%d,b=%d\n‖,a,b);
}
求程序运行结果。
结果,a=2,b=1。
如果 x=2?
结果,a=1,b=1
如果 x=3?
结果,a=1,b=1
说明,1、每个 case常量表达式的值必须互不相同,否则
会出现互相矛盾的结果。
2、允许多个 case共用一个执行语句。
例一,
main()
{ char s;
scanf(“%c”,&s);
switch(s)
{
case ?A?, printf(“优 \n”);
case ?B?, printf(“良 \n”);
case ?C?, printf(“中 \n”);
case ?C?, printf(“差 \n”);
default, printf(“错误输
入 \n”);
}
}
例二,
main()
{ char s;
scanf(“%c”,&s);
switch(s)
{
case ?A?,
case ?B?, printf(“好 \n”);
case ?C?,
case ?D?, printf(“差 \n”);
default, printf(“错误输
入 \n”);
}
}
例, 给定一个不多于 5位的正整数,要求分别打印出每一位数
字,按逆序打印出各位数字,
main()
{ int num;
int idiv,ten,hundred,thousand,ten_thousand;
printf(“请输入一个小于五位的整数,”);
scanf(“%d”,&num);
ten_thousand=num/10000;
num=num%10000;
thousand=num/1000;
num=num%1000;
hundred=num/100;
num=num%100;
ten=num/10;
idiv=num%10;
if(ten_thousand!=0)
{printf(“逆,%d%d%d%d%d”,idiv,ten,hundred,thousand,
ten_thousand);
printf(“每位数字,%d%d%d%d%d”,ten_thousand,thousand,
hundred,ten,idiv);}
else if(thousand !=0)
{printf(“逆序为,%d%d%d%d”,idiv,ten,hundred,thousand);
printf(“每位数字,%d%d%d%d”,thousand,hundred,ten,idiv);}
else if(hundred !=0)
{printf(“逆序为,%d%d%d”,idiv,ten,hundred);
printf(“每位数字,%d%d%d”,hundred,ten,idiv);}
else if(ten !=0)
{printf(“逆序为,%d%d”,idiv,ten);
printf(“每位数字,%d%d”,ten,idiv);}
else {printf(“逆序为,%d”,idiv);
printf(“每位数字为,%d”,idiv);}
}
例:输入三个数,按由大到小顺序输出。
main()
{int a,b,c,t;
scanf(“%d,%d,%d”,&a,&b,&c);
if(b>a)
{ t=a;a=b;b=t;}
if(c>a)
{t=a;a=c;c=t;}
if(c>b)
{t=b;b=c;c=t;}
printf(“a=%d,b=%d,c=%d”,a,b,c);
}
例:输入一个实数判断它在平面直角坐标系中所在的象限。
main()
{ float x,y;
scanf(“%f,%f”,&x,&y);
if(x>0)
if(y>0)
printf(“x和 y在第一象限”);
else
printf(“x和 y在第四象限”);
else
if(y>0)
printf(“x和 y在第二象限”);
else
printf(“x和 y在第三象限”);
}
例:给出一百分制成绩,要求输出成绩等级
‘ A?,’ B?,’ C?,’ D?,’ E?。 90分以上为‘ A?,
80~90分为‘ B?,70~79分为‘ C?,60~69分为‘ D?,
60分以下为‘ E?。
程序,main()
{ float score;
char grade;
int x;
printf(“请输入学生的成绩:”);
scanf(“%f”,&score);
x=( int) (score) /10;
switch(x)
{case 10:
case 9:grade=?A?;break;
case 8:grade=?B?;break;
case 7:grade=?C?;break;
case 6:grade=?D?;break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0,grade=?E?;
}
printf(“成绩是 %f,相应的等级是 %c.\n”,score,grade);
}
运行结果:
请输入学生的成绩,95.2
成绩是 95.2,相应的等级是 A。
第六章 循环控制
一、循环结构程序设计
循环是在循环条件为真时计算机反复执行的一组指令(循
环体)。
循环控制通常有两种方式:
◆ 计数控制 事先能够准确知道循环次数时用之
用专门的循环变量来计算循环的次数,循环变量的值在每次
执行完循环体各语句后递增,达到预定循环次数时则终止循环,
继续执行循环结构后的语句。
◆ 标记控制 事先不知道准确的循环次数时用之
由专门的标记变量控制循环是否继续进行。当标记变量的值
达到指定的标记值时,循环终止,继续执行循环结构后的语句。
二、循环结构程序设计
在 C语言中可用以下语句构成循环:
? if … goto
? while
? do … while
? for
其中 if … goto是通过编程技巧 (if语句和 goto语句组
合 )构成循环功能。而且 goto语句将影响程序流程的
模块化,使程序可读性变差,所以结构化程序设计主
张限制 goto语句的使用。
其他三种语句是 C语言提供的循环结构专用语句。
二、循环结构程序设计
循环结构两大要素:
?循环条件 p
结束循环的条件表达式
?循环体 A
循环执行的语句或语句组
设置循环条件要特别注意确定:
?循环变量 的 初值
?循环变量 的 终值
?循环变量 的 变化规律
名词解释
无限循环
死循环
名词解释
空循环
二、循环结构程序设计
1,if … goto语句循环结构 P113【 例一 】
main()
{
int n=0,sum=0;
loop,sum+=n;
++n;
if (sum<=10000)
goto loop;
printf(―n = %d\n‖,n);
}
【 例二 】
main()
{
int n=0,sum=0;
loop,if (sum>=10000)
goto end;
sum+=n;
++n;
goto loop;
end:printf(―n = %d\n‖,n);
}





二、循环结构程序设计
2,while语句循环结构 P114 【 例三 】main()
{
int n=0,sum=0;
while (sum<=10000)
{
sum+=n;
++n;
}
printf(―n = %d\n‖,n);
}


? 一般形式
while (条件表达式 ) 循环体;
? 用于构成当型循环:先判
断后执行 /条件为真继续循
环,直到条件为假时结束
循环。
2,while语句循环结构
注意,
1.循环体如果包含一个以上的语句,应该用花括号括起来,以复
合语句形式出现,如果不加花括号,则 while语句的范围只到
while后面的第一个分号处,
2.条件表达式或循环体内应有改变条件使循环结束的语句,
否则可能陷入, 死循环, 。
main()
{
int n=0,sum=0;
while (sum<=10000)
{
sum+=n;
++n;
}
printf(―n = %d\n‖,n);
}
main()
{
int n=0,sum=0;
while (sum<=10000)
sum+=n;
++n;
printf(―n = %d\n‖,n);
}
二、循环结构程序设计
3,do… while语句循环结构 P108
【 例四 】
main()
{
int n=0,sum=0;
do {
sum+=n;
++n;
} while (sum<=10000);
printf(―n = %d\n‖,n);
}
? 一般形式
do {
循环语句(组)
} while ( 条件表达式 );
? 用于构成直到型循环:先
执行后判断 /条件为真继续
循环,直到条件为假时结
束循环。
? 【 注意 】 条件表达式或循
环体内同样应有改变条件
使循环结束的语句,否则
可能陷入“死循环”。



直到 sum超过
10000为止
二、循环结构程序设计
3,do… while语句循环结构 示例
【 例五 】 从键盘输入一个整数 12456,分析以下程序运行结果。
main()
{
int num,c;
printf(―请输入一个整数,―);
scanf(―%d‖,&num);
do {
c=num%10;
printf(―%d‖,c);
} while((num/=10)>0);
printf(―\n‖);
}
/*取得 num的个位数 */
/*输出 num的个位数 */
/*直到 num/10为 0*/
结果:
65421
将各位数字反序显示出来
3,do… while语句循环结构
while和 do-while循环的比较
main()
{
int sum=0,i;
scanf(―%d‖,&i);
while(i<=10)
{
sum=sum+i;
i++;
}
printf(―sum=%d\n‖,sum);
}
main()
{
int sum=0,i;
scanf(―%d‖,&i);
do
{
sum=sum+i;
i++;
} while(i<=10);
printf(―sum=%d\n‖,sum);
}当输入,1 (即 i=1)
sum=55
当输入,1 (即 i=1)
sum=55
当输入,1 1 (即 i=11)
sum=0
当输入,11 (即 i=11)
sum=11
二、循环结构程序设计
4,for语句循环结构 P118
? 一般形式
for (表达式 1;条件表达式;表达式 3)
循环语句(组);
? 用于构成计数型当型循环:先判断后执行 /条件为真继续循环,直到条件为假时
结束循环。
? 表达式 1,整个循环中只执行 1次,常用来
对循环变量设置初值
? 条件表达式(表达式 2), 其值为真(非 0)
时继续执行循环语句(组),否则结束循环
? 表达式 3,常用于循环变量值的更新 (循环
体的一部分每次循环语句组执行完后执行一次 )
简单形式,
for(循环变量赋初值 ;循环条件 ;循环变量增
值 )
循环语句(组);
【 例六 】
求 ∑i =1+2+3+4… +99+100
(i=1~ 100)
main()
{
int i,s=0;
for (i=1;i<=100;i++)
s=s+i;
printf(―Sum=%d\n‖,s);
}
4,for语句循环结构 P118
说明,
1,for语句中“表达式 1”可省,此时应在 for语句之前给循
环变量赋初值,注意省略表达式 1时,其后的分号不能省,
如,for( ; i<=100; i++)
2,如果表达式 2省略,即不判断循环条件,循环无终止的进
行下去,也就是认为表达式 2始终为真,
如, for( i=1; ; i++) sum=sum+i;
相当于,
i=1;
while(1)
{sum=sum+1;
i++;}
? 4,for语句循环结构
3.表达式 3也可省略,但此时程序应另外设法保证
循环能正常结束,
如,for(i=1;i<=100; )
{sum=sum+1;
i++;}
4.可以省略表达式 1和表达式 3,只有表达式 2,即
只给循环条件,如,
for( ;i<=100; ) while(i<=100)
{sum=sum+i; 相当于 {sum=sum+i;
i++;} i++;}
二、循环结构程序设计
5、其他循环控制结构 P122
? break 结束循环
在 switch中退出 switch结构;
在循环中结束循环。
? continue 结束本次循环
循环“短路” (跳过循环体后
面的语句,开始下一轮循环 )。
? goto 跳转
跳到循环体外指定标号处。
【 注意 】
goto 语句只能从循环内向外跳
转,反之不可!
main( )
{
int a,y;
a=10,y=0;
do {
a+=2;y+=a;
if (y>50) break;
} while (a=14);
printf("a=%d,y=%d\n",a,y);
}
结果,a=16,y=60
变量跟踪
a y
10 0
12 12
14+2 16+12=28
14+2 16+28=44
14+2 16+44=60
变量跟踪
分析法
二、循环结构程序设计
5、其他循环控制结构
? break 结束循环
在 switch中退出 switch结构;
在循环中结束循环。
? continue 结束本次循环
循环“短路” (跳过循环体后
面的语句,开始下一轮循环 )。
? goto 跳转
跳到循环体外指定标号处。
【 注意 】
goto 语句只能从循环内向外跳
转,反之不可!
求以下程序段执行后 x和 i的值。
int i,x;
for ( i=1,x=1;i<=50;i++)
{ if (x>=10) break;
if (x%2==1)
{ x+=5;
continue;
}
x-=3;
}
结果,x的值为 10,i的值为 6
变量跟踪
i x
1 1→6
2 6→3
3 3→8
4 8→5
5 5→10
6
二、循环结构程序设计
5、其他循环控制结构
? break 结束循环
在 switch中退出 switch结构;
在循环中结束循环。
? continue 结束本次循环
循环“短路” (跳过循环体后
面的语句,开始下一轮循环 )。
? goto 跳转
跳到循环体外指定标号处。
【 注意 】
goto 语句只能从循环内向外跳
转,反之不可!
main()
{
int i=1;
while (i<=15)
if (++i%3!=2)
continue;
else
printf("%d ",i);
printf("\n");
}
结果,2 5 8 11 14
变量跟踪
i ++i%3 输出 i
1→2 2 2
2→3 0
3→4 1
4→5 2 5
5→6 0
……
二、循环结构程序设计
5、其他循环控制结构
? break 结束循环
在 switch中退出 switch结构;
在循环中结束循环。
? continue 结束本次循环
循环“短路” (跳过循环体后
面的语句,开始下一轮循环 )。
? goto 跳转
跳到循环体外指定标号处。
【 注意 】
goto 语句只能从循环内向外跳
转,反之不可!
main()
{
int i,k=0;
for (i=1; ;i++)
{ k++;
while (k<i*i)
{ k++;
if (k%3==0)
goto loop;
}
}
loop:printf("%d,%d",i,k);
}
结果,2,3
三、常用算法
1、枚举法(穷举法)
,笨人之法,, 把所有可能的情况一一测试,筛
选出符合条件的各种结果进行输出。
【 例一 】 雨水淋湿了算术书的一道题,8个数字只
能看清 3个,第一个数字虽然看不清,但可看出不
是 1。编程求其余数字是什么?
[ □ × (□ 3+□) ]2 = 8□□ 9
? 分析
设分别用 A,B,C,D,E五个变量表示自左到
右五个未知的数字。其中 A的取值范围为 2~ 9,
其余取值范围为 0~ 9。条件表达式即为给定算
式。
main() {
int A,B,C,D,E;
for (A=2;A<=9;A++)
for (B=0;B<=9;B++)
for (C=0;C<=9;C++)
for (D=0;D<=9;D++)
for (E=0;E<=9;E++)
if (A*(B*10+3+C)*A*(B*10+3+C)==8009+D*100+E*10)
printf(―%2d%2d%2d%2d%2d\n‖,A,B,C,D,E);
}
结果,3 2 8 6 4
【 例一 】 雨水淋湿了算术书的一道题,8个数字只
能看清 3个,第一个数字虽然看不清,但可看出不
是 1。编程求其余数字是什么?
[ □ × (□ 3+□) ]2 = 8□□ 9
【 例二 】
求 100~ 200之间不能被 3整除也不能被 7整除的
数。
? 分析,求某区间内符合某一要求的数,
可用一个变量“穷举”。所以可用一个
独立变量 x,取值范围 100~ 200。
for (x=100;x<=200;x++)
if (x%3!=0&&x%7!=0)
printf(―x=%d\n‖,x);
如果是求指定条件的奇数呢?
如果是求指定条件的偶数呢?
x=101;x<=200;x=x+2
x=100;x<=200;x=x+2
2、归纳法(递推法)
“智人之法”, 通过分析归纳,找出从变量旧值出发
求新值的规律。
三、常用算法
【 例一 】
编程求 ∑i =1+2+3+4…+99+100 (i=0 ~ 100)
分析
i=0 S0= 0 (初值 )
i=1 S1= 0+1=S0+1
i=2 S2=1+2=S1+2
i=3 S3=1+2+3=S2+3
i=4 S4=1+2+3+4=S3+4
… … …
i=n Sn=1+ 2+3+4+… +n=Sn-1+n
【 例一 】
编程求 ∑i =1+2+3+4… +n ( n ≤100)
程序:
main()
{
int i,n,s=0;
printf("n=");
scanf("%d",&n);
for ( i=1;i<=n;i++)
s=s+i;
printf("Sum=%d\n",s);
}
运行结果:
n=100
Sum=5050
如果是
∑i =1+1/2+1/3+… +1/n 呢?
算法类型小结,累加型
【 累加型 】 类型诸如
□ +□ +□ +□ +……+ □ +□
求其前 n项之和的编程题。
累加型算法
若设 i为循环变量,s为前 n项累加之和,则程序的
基本结构为:
s=0;
for( i=1 ;i<=n ;i++ )
s=s+□ ;
【 例二 】
编程求 1- 1/2+1/3- 1/4+1/5- … +1/99- 1/100
? 分母为奇数时,相加
? 分母为偶数时,相减
法 1,从变化规律分析 …… 程序:
main()
{
int i;
float s=0;
for (i=1;i<=100;i++)
if (i%2) s=s+1/i;
else s=s-1/i;
printf("Sum=%f\n",s);
}
运行结果,Sum=1.000000
错在哪里?
【 例二 】
编程求 1- 1/2+1/3- 1/4+1/5- … +1/99- 1/100
法 2,这是个累加型算法的编程题 ……
程序:
#include <math.h> main();
{
int i ;
float s=0;
for (i=1;i<=100;i++)
s=s+pow (-1,i+1) / i ;
printf("Sum=%f\n",s);
}
程序:
#include <math.h>
main()
{
int i,k=1; float s=0;
for (i=1;i<=100;i++)
{ s=s+ k / i ;
k = -k ; }
printf("Sum=%f\n",s);
}
累加型算法
程序基本结构为:
s=0;
for( i=1;i<=n;i++ )
s=s+□ ;
错在哪里?
(如何检查程序错误? )
运行结果,Sum=0.688172
运行结果,Sum=1.000000
【 例三 】
编程求 n! ( n由键盘输入)
分析
i=0 S0= 1=S0 (初值 )
i=1 S1=1× 1=S0× 1
i=2 S2=1× 2=S1× 2
i=3 S3=1× 2× 3=S2× 3
i=4 S4=1× 2× 3× 4=S3× 4
… … …
i=n Sn=1× 2× 3× 4× … × n=Sn-1× n
【 例三 】
编程求 n! ( n由键盘输入)
程序:
main()
{
int i,n,s=1;
printf("n=");
scanf("%d",&n);
for ( i=1;i<=n;i++)
s=s*i;
printf("Sum=%d\n",s);
}
运行结果:
n=5
Sum=120
运行结果:
n=8
Sum=-25216
Why?
算法类型小结,阶乘型
【 阶乘型 】 类型诸如
□ ×□×□×□× …… ×□×□
求其前 n项之积的编程题。
阶乘型算法
若设 i为循环变量,s为前 n项相乘之积,则程序的
基本结构为:
s=1;
for( i=1 ;i<=n ;i++ )
s=s*□ ;
【 例四 】
编程求 ∑i! =1!+2!+3!… +n! ( n由键盘输入)
? 外循环为累加型
? 内循环为阶乘型
法 1,从变化规律分析 ……
程序:
main()
{
int i,j,n ;
float s,s1;
printf ( "请输入 n=") ;
scanf ( "%d",&n);
s=0;
for (i=1;i<=n;i++)
{
s1=1;
for (j=1; j<=i ; j++)
s1=s1*j ;
s=s+s1;
}
printf ( "Sum=%.0f\n",s) ;
}
运行结果:
n=5
Sum=153
/*如果 n值较大,可改为 printf ( ―Sum=%e\n‖,s) ;*/
【 例四 】
编程求 ∑n! =1!+2!+3!… +n! ( n由键盘输入)
? 在同一个循环中
先阶乘,后累加
法 2,通过单循环实现 ……
程序:
main()
{
int i,n ;
float s,s1;
printf ( "请输入 n=") ;
scanf ( "%d",&n);
s=0,s1=1;
for (i=1;i<=n;i++)
{
s1=s1* i ;
s=s+s1;
}
printf ( "Sum=%.0f\n",s) ;
}
运行结果:
n=5
Sum=153
除了以上例题,要求根据教材掌握:
?1、求按指定精度近似值问题(例 6.6)
?2、判断一个数是否素数问题(例 6.8)
?3、密码问题(例 6.10)
判断一个数是否素数问题(例 6.8 另一种解法)
#include <math.h>
main()
{
int m,k,i;
clrscr();
printf("x=");
scanf("%d",&m);
for(i=2;i<m-1;i++)
if (m%i==0)
{ printf("%d is not a prime number\n",m);
exit(0);
}
printf("i=%d,%d is a prime number\n",i,m);
}
exit(0)是停止函
数,作用,使程序
正常停止,返回操
作系统状态,
作业
一、编程题
1,有一函数,
x (x<1)
y= 2x+3 (1=<x<=10)
3x-2 (x>10)
写一程序,输入 x,输出 y值,
2、设有一四位数 abcd=(ab+cd)2,编写一个程序,
求 a,b,c,d。
3、编写一个程序,计算给定 n时符合下式要求 S的
值。 n由键盘输入( n为不大于 10的整数)。
S=(n… (… +(6× (5+(4× (3+(1× 2)))
作业
4、编写一个程序,求 S值( n由键盘输入):
(程序检验参考:
x=6.66,n=8时,s=413147.468750;
x=6.66,n=3时,s= -82.951630)
5、编写一个程序,求前 n 项之和 S值,其中 n≥1, x ≠ 0 。
( n由键盘输入):
1 2x 3 5x 8 13x
S = ── - ── + ── - ── + ── - ── +,.,
2x 3 5x 8 13x 21
(程序检验参考,x=6.66,n=8时,s= -16.492;
x=6.66,x=15时,s=-28.469)
6、编写一个程序,求 S值( n由键盘输入):
(程序检验参考:
x=6.66,n=8时,s=40.955;x=6.66,x=15时,s=-1.511)
第二次作业
1,已知字母 a的 ASCII码为十进制的 97,下面程序的输出是:
main()
{ char a=?a?;
a++;
printf(“%d,%c\n”,a+?2?-?0?,a+?3?-?0?); }
2,下面程序的输出结果是:
main()
{ int a=4,b=7;
printf(“%d\n”,(a=a+1,b+a,b+1));
printf(“%d\n”,a=a+1,b+a,b+1); }
3下面程序的输出结果是 ( 已知字母 a的 ASCII码为十进制的 97),
main()
{ char ch=?a?;
printf(“ch1=\”%x\”,ch2=%o”,ch++,++ch); }
4.以下程序不借助任何变量把 a,b中的值交换, 请填空使程序完整:
main()
{ int a,b;
printf(“Input a,b”);
scanf(“%d%d”,_____);
a+= ___ ;b=a- ___ ;a-= ___ ;
printf(“a=%d,b=%d\n”,a,b);
}
5.设有如下的变量定义,int k=7,x=12;
则能使值为 3的表达式是 ( )
A) x%=(k%=5) B)x%=(k-k%5)
C)x%=k-k%5 D)(x%=k)-(k%=5)
6.以下语句输出的结果是什么?
printf(“%%This is \n\ta C programm\n\t\twritten by me!”);