模块2-结构化程序设计_第1页
模块2-结构化程序设计_第2页
模块2-结构化程序设计_第3页
模块2-结构化程序设计_第4页
模块2-结构化程序设计_第5页
已阅读5页,还剩233页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计任务式教程(微课版)

VisualC++1计算机工程学院模块2结构化程序设计任务1顺序结构程序设计和程序的基本结构任务2选择结构程序设计任务3循环结构程序设计

2计算机工程学院

任务1顺序结构程序设计和程序的基本结构

学习目标

掌握程序设计的三种基本结构,掌握流程图的绘制方法。3计算机工程学院案例1计算课程总评成绩1.问题描述已知某学生课程A的平时成绩、实验成绩和期末考试成绩,求该课程的总评成绩。其中平时、实验和期末成绩分别占20%、30%和50%。2.1.1案例讲解

4计算机工程学院2.编写程序

(1)定义整型变量score1、score2和score3分别存放课程A的平时成绩、实验成绩和期末考试成绩;定义实型变量total存放总评成绩;(2)输入score1、score2和score3的值;(3)根据比例计算总评成绩:

total=score1*0.2+score2*0.3+score3*0.5;(4)输出总评成绩total。

5计算机工程学院3.编写源程序

/*EX2_1.cpp*/#include"stdio.h"voidmain(){intscore1,score2,score3;floattotal;printf("请输入成绩:");scanf("%d%d%d",&score1,&score2,&score3);

total=score1*0.2+score2*0.3+score3*0.5;

printf("总评成绩是%.1f\n",total);}6计算机工程学院4.运行结果7图2-1案例1运行结果计算机工程学院5.归纳分析案例1程序的执行过程是按照源程序中语句的书写顺序逐条执行的,这样的程序结构称为顺序结构。模块1中的程序均属于顺序结构。顺序结构在程序自上而下执行时,程序中的每一条语句都要执行一次,并且只执行一次,以这样固定的处理方式只能解决一些简单的任务。但实际应用中,往往会出现一些特别的要求,比如根据某个条件来决定下面该进行什么操作,或根据某个要求不断地重复执行若干动作,这就需要控制程序的执行顺序。

8计算机工程学院

2.1.2基础理论

1.三种基本控制结构

程序中语句的执行顺序是由程序设计语言中的控制结构规定的。控制结构有顺序结构、选择结构及循环结构三种基本结构。

顺序结构是最简单的结构。

选择结构又称为分支结构,当程序执行时,计算机按一定的条件选择下一步要执行的操作。例如:输入三角形的三条边计算面积时,要判断三条边是否能构成三角形,若能则计算面积,否则要告诉用户输入错误。

9计算机工程学院循环结构又称为重复结构,它是程序中需要按某一条件反复执行一定的操作而采用的控制结构。例如,从键盘上输入20个整数,求其累加和。三种结构之间可以是平行关系,也可以相互嵌套,结构之间通过复合可以形成复杂的结构。已经证明,由以上三种基本结构顺序组成的程序结构,可以解决任何复杂的问题。由三种基本结构构成的程序称为结构化程序。2.程序流程图10计算机工程学院在对一个复杂问题求解时,程序的结构比较复杂,所以在程序设计阶段为了表示程序的操作顺序往往先画出程序流程图,这样有助于最终写出完整正确的程序。下面介绍流程图的有关概念。流程图是用规定的图形、连线和文字说明表示问题求解步骤(算法)的一组图形,具有直观、形象、易于理解等优点。流程图使用的图形符号见表2-1。流程图中的每一个框表示一段程序(包括一个或多个语句)的功能,各框内必须写明

11计算机工程学院要做的操作,说明要简单明确,不能含糊不清。如在框内只写“计算”,但却不写出计算什么,就不容易让人明白。一般来说,用得最多的是矩形框和菱形框。矩形框表示处理,不进行比较和判断,只有一个入口和一个出口;菱形框表示进行检查判别,有一个入口,两个出口,即比较后形成两个分支,在两个出口处必须注明哪一个分支是对应满足条件的,哪个分支是对应不满足条件的。

12计算机工程学院表2-1流程图图形符号13计算机工程学院前面介绍的三种基本结构的流程图可分别用图2-2、图2-3和图2-4表示。其中循环结构有两种形式:当型(图2-4(a))和直到型(图2-4(b))。

图2-4循环结构14计算机工程学院3.语句在模块1中,我们已经了解了C语言程序的基本构成。其中语句是程序的主要部分。C语句一般可分为:表达式语句、控制语句、复合语句和空语句。

(1)表达式语句表达式语句由一个表达式加上分号构成,一般格式为:

表达式;最常用的表达式语句是赋值表达式语句,例如:total=score1*0.2+score2*0.3+score*0.5;15计算机工程学院

在C语言中,任何一个合法的C语言表达式后面加上一个分号就成了一个语句,例如:

m=a+b

是表达式,不是语句

i++;

是语句,作用是使i加1

x+y;

也是语句,作用是完成x+y的操作,它是合法的,但并不把结果赋给变量,所以没有实际意义。

案例1中出现的以下语句:

printf("请输入成绩:");scanf("%d%d%d",&score1,&score2,&score3);16计算机工程学院称为函数调用语句,是由一次函数调用加上一个分号构成。函数调用语句也属于表达式语句。

(2)控制语句控制语句是用于控制程序执行流程的。C语言中有以下九种控制语句,它们是:

(1)if()~else~ 条件语句(2)switch 多分支选择语句(3)for()~ 循环语句(4)while()~ 循环语句17计算机工程学院

(5)do~while() 循环语句(6)continue 结束本次循环语句(7)break 中止执行switch或循环语句(8)goto 转向语句(9)return 函数返回语句其中语句(1)和(2)用于实现程序的选择结构,语句(3)~(5)用于实现程序的循环结构。(3)复合语句18计算机工程学院

复合语句是用一对花括号括起来的一组语句,又称块语言。一般格式为:

{

语句1

语句2

······

语句n}

在以后的案例程序中将会经常使用到复合语句。

19计算机工程学院

(4)空语句

空语句是仅有一个分号的语句,格式为:;空语句被执行时实际上什么也不做。但在后面的案例程序中我们将会看到它的特殊用途。20计算机工程学院2.1.3技能训练

【实验2.1.1】编写程序,求一个三位正整数的各位数字之和。例如756的各位数字之和为7+5+6=18.【指导】(1)问题分析首先要正确分离出三位正整数的个位数、十位数和百位数:百位数可用对100整除的方法求得,如756/100=7;十位数用对100求余的结果再对10整除求得,如756%100/10=5;个位数用对10求余求得,如756%10=6。21计算机工程学院(2)求解步骤定义变量num存放三位正整数;变量n1、n2和n3分别存放个位数、十位数和百位数;变量sum

存放和;分离正整数num;求和;输出结果。(3)编写源程序22计算机工程学院

/*EX2_2.cpp*/

#include"stdio.h"voidmain(){intnum,n1,n2,n3,sum;printf("请输入一个三位正整数:");scanf("%d",&num);n1=num%10;/*分离个位数*/n2=num%100/10;/*分离十位数*/n3=num/100;/*分离百位数*/sum=n1+n2+n3;printf("%d+%d+%d=%d\n",n1,n2,n3,sum);}23计算机工程学院(4)运行结果图2-5实验2-1运行结果24计算机工程学院【实验2.1.2】用流程图表示求解下述问题的程序流程。(1)问题描述根据人体的身高和体重因素,可以按以下“体重指数”对人的肥胖程度进行划分:体重指数t=体重w/(身高h)2

(w单位为kg,h单位为m)当t<18时,为低体重;当t介于18和25之间时,为正常体重;当t介于25和27之间时,为超体重;当t>27时,为肥胖。25计算机工程学院

(2)问题分析该问题需要采用选择结构来实现。具体步骤如下:输入体重w和身高h;计算体重指数t;根据体重指数t判断体型。(3)流程图26计算机工程学院图2-6实验2-2流程图

开始定义w,h,t输入w,h计算tt<18t<25t<27肥胖偏胖正常偏低结束YNYYNN27计算机工程学院【实验2.1.3】用流程图表示输入10个整数,输出其中最大数的求解步骤。

(1)问题分析该问题采用循环结构实现反复输入数据和比较数据,数据的比较则用选择结构完成。具体步骤如下:设变量a存放输入的数据,变量max存放最大数;输入第一数a,并将它设为最大值(默认为最大),即max=a;28计算机工程学院依次读入数据,与max比较,若比max大,则用当前数代替max中的值,如此循环9次;输出最大数。(2)流程图29计算机工程学院图2-7实验2-3流程图NNYYi=1i<=9a>maxmax=a开始结束i=i+1输入a输出max输入amax=a30计算机工程学院

2.1.4拓展与练习

【练习1】编写程序求解一元二次方程ax2+bx+c=0的根(假定方程有实根)。编程要求:

(1)画出流程图;(2)从键盘输入系数a、b、c,输入前要有如下提示:“请输入系数”;(3)以“x1=...”和“x2=...”的格式输出方程的根。

31计算机工程学院【练习2】用流程图表示判断一个数能否同时被3和5整除。【练习3】从键盘输入20学生的成绩,统计合格和不合格学生的人数。成绩大于等于60为合格,否则为不合格。用流程图表示求解步骤。32计算机工程学院

2.1.5编程规范与常见错误

1.编程规范(1)表达式比较复杂时,可以在运算符的两边各加一个空格,使源程序更加清晰。例如:

total=score1*0.2+score2*0.3+score3*0.5;

age>=20&&sex==’M’。(2)输入数据前要加提示信息。例如:

intnum;printf("请输入一个三位正整数:");

scanf("%d",&num);

33计算机工程学院

避免这样的书写习惯:

intnum;

scanf("%d",&num);。(3)输出结果要有文字说明。例如:

total=score1*0.2+score2*0.3+score3*0.5;

printf("总评成绩是%.1f\n",total);

不要只输出一个值,例如:

printf("%.1f\n",total);。34计算机工程学院2.常见错误(1)表达式漏括号。例如计算x=,写成x=-b/2*a。源程序能通过编译,但运行结果会出错。正确的写法是x=-b/(2*a),或x=-b/2/a。(2)语句漏分号。这是初学者上机时遇到的最多问题。例如程序中有以下语句:

sum=num1+num2;ave=sum/2.0;编译时会出现出错提示:syntaxerror:

missing';'beforeidentifier'ave'。表示由于前一语句漏分号引起语法错误。35计算机工程学院一、算法1、算法的概念:为解决某一个问题而采取的方法和步骤。补充:

算法及其表示2、算法的五大特性:⑴有穷性:有限步骤内结束⑵确定性:不能产生歧义⑶可行性⑷0个或多个输入:从外界获取必要信息⑸1个或多个输出:算法必须有结果①计算出5!;②输入一个正整数n,然后判断n是否为素数;③计算任意两个整数的最大公约数。示例程序=算法+数据结构将成绩优秀的学生名单打印计算机工程学院运算符的优先级别及结合性【例3-1】c>a+b等价于c>(a+b);关系运算符的优先级低于算术运算符a>b==c等价于(a>b)==c;“>”优先级高于“==”a==b<c等价于a==(b<c);“<”优先级高于“==”a=b>c 等价于a=(b>c);关系运算符的优先级高于赋值运算符计算机工程学院二、算法的表示1、自然语言:易懂但不直观2、流程图:自然图形3、N-S图:矩形框4、伪代码:介于自然语言和计算机语言之间的文字和符号【示例】求a,b的最大值max。自然语言:如果a的值比b的值大,把a的值赋给max;否则,把b的值赋给max。符号形状名称圆角矩形起止框平行四边形输入、输出框矩形处理框菱形判断框带箭头的(折)线段流程线a>ba=>maxb=>maxYN流程图【例2-1】⑴用伪代码方式表示算法“打印出x的绝对值”;⑵用伪代码方式表示算法“求5!”;⑵开始置t的值为1置i的值为2当<=5时t=t×ii=i﹢1输出t结束N-S图a>ba=>maxb=>max成立不成立⑴开始若x为正数打印x的值否则打印-x的值结束计算机工程学院

典型实例【例】求一元二次方程ax2+bx+c=0的两个不同的实数根,要求:a、b、c三个系数从键盘输入,保证a≠0且b2-4ac>0。分析:由高中数学可知,当判别式∆=b2-4ac>0时,方程有两个不相等的实数根,并可用求根公式表示。令p=-b/2a,q=sqrt(∆)/2a,两个根分别为:x1=p+q,x2=p-q。因此,程序中要用到系统提供的平方根函数sqrt(),需要将该函数所在的头文件math.h包含到程序中。定义变量disc,x1,x2,p,qp+q=>x1b*b-4*a*c=>discsqrt(disc)/(2*a)=>q-b/(2*a)=>pp-q=>x2输出x1,x2计算机工程学院

2.1.6贯通案例之一

1.问题描述学生成绩管理系统可以分为八个主要的模块,包括加载文件模块、增加学生成绩模块、显示学生成绩模块、删除学生成绩模块、修改学生成绩模块、查询学生成绩模块、学生成绩排序模块和保存文件模块。2.系统模块结构40计算机工程学院图2-8功能模块结构图41计算机工程学院3.编写程序实现系统主菜单的显示

/*EX2_3.cpp*/#include"stdio.h"voidmain(){printf("#=========================#\n");printf(“#学生成绩管理系统#\n");printf("#--------------------------------------------#\n");printf("#copyright@2009-10-1#\n");printf("#=========================#\n");printf(“#1.加载文件#\n");printf(“#2.增加学生成绩#\n");42计算机工程学院

printf(“#3.显示学生成绩#\n");printf(“#4.删除学生成绩#\n");printf(“#5.修改学生成绩#\n");printf(“#6.查询学生成绩#\n");printf(“#7.学生成绩排序#\n");printf(“#8.保存文件#\n");printf(“#0.退出系统#\n");printf("#=============================#\n");}43计算机工程学院4.运行结果图2-9系统主菜单界面

44计算机工程学院

任务2选择结构程序设计

学习目标

掌握关系运算符、逻辑运算符,熟练掌握if…else的三种用法,领会switch与break语句的作用。45计算机工程学院

2.2.1案例讲解

案例1出租车计费1.问题描述某市出租车3公里的起租价为10元,3公里以外,按1.8元/公里计费。现编程输入行车里程数,输出应付车费。2.编程分析(1)用实型变量km存放行车里程数,实型变量fee存放车费;(2)输入行车里程数;(3)根据行车里程数作出判断,进行不同的处理;46计算机工程学院(4)输出车费。3.编写源程序

/*EX2_4.cpp*/#include<stdio.h>voidmain(){floatkm,fee;printf("输入行车里程数:");scanf("%f",&km);if(km<=3.0)47计算机工程学院

fee=10.0;else fee=10.0+(km-3.0)*1.8;printf("%.2f公里,请付¥%.2f\n",km,fee);}48计算机工程学院4.运行结果图2-10案例1运行结果49计算机工程学院5.归纳分析

案例1需要根据行车里程数作出选择进行不同的两种计算。处理此类两个分支问题时常使用if语句。if语句是用来判断给定的条件是否满足,根据判断的结果(真或假)决定执行某个分支的操作。

(1)if语句的一般形式

if(<表达式>)

<语句1>else<语句2>50计算机工程学院

(2)执行过程:计算<表达式>的值,若结果为“真”(非0),则执行<语句1>,否则,执行<语句2>。if-else构成了一个两路分支结构。流程图见图2-11。

(3)注意if后面的<表达式>必须用圆括号括起来;if和else同属于一个if语句,else不能作为语句单独使用,必须与if配对使用。51计算机工程学院案例2计算三角形的面积1.问题描述

输入三角形的三个边长,判断能否构成三角形,若能则计算并输出三角形的面积,否则输出出错信息。2.编程分析

(1)用实型变量a、b和c表示三角形的三条边,实型变量area表示三角形的面积;(2)构成三角形的条件是任意两边之和大于第三边;52计算机工程学院

(3)如满足构成三角形的条件,计算并输出三角形的面积;否则输出出错信息。计算三角形的面积使用海伦公式:

其中:

3.编写源程序53计算机工程学院

/*EX2_5.cpp*/#include<stdio.h>#include<math.h>voidmain(){ floata,b,c; floatarea,s;/*s为中间变量,存放三角形的半周长*/ printf("Pleaseinputabc:");

scanf("%f%f%f",&a,&b,&c);

if(a+b>c&&a+c>b&&b+c>a)/*判断输入的a,b,c能否构成三角形*/54计算机工程学院

{ s=(a+b+c)/2.0; area=sqrt(s*(s-a)*(s-b)*(s-c)); printf("areais%f\n",area); } else printf("inputerrer\n");}55计算机工程学院4.运行结果图2-12案例2三边符合构成三角形的运行结果56计算机工程学院图2-13案例2三边不符合构成三角形的运行结果57计算机工程学院5.归纳分析当输入的三条边符合构成三角形条件时,进行计算并输出三角形的面积时需要三条语句完成,此时必须用一对花括号把它们括起来,即使用复合语句的形式。案例3数制转换1.问题描述

58计算机工程学院输入一个无符号整数,然后按用户输入的进制代号,分别以十进制(代号d)、八进制(代号o)和十六进制(代号x)数的形式输出。2.编程分析

(1)设变量ua存储无符号整数、变量code表示进制代号;(2)根据输入的进制代号输出相应的数据。流程图如图2-14所示。59计算机工程学院图2-14案例3的流程图60计算机工程学院3.编写源程序

/*EX2_6.cpp*/#include<stdio.h>voidmain(){ intua; charcode; printf("请输入无符号整数和进制代号:"); scanf("%d%c",&ua,&code);61计算机工程学院

switch(code){ case'd':printf("十进制数:%d\n",ua);break;case'o':printf("八进制数:%o\n",ua);break;case'x':printf("十六进制数:%x\n",ua);break;default:printf("进制代号错误!");}}62计算机工程学院4.运行结果

图2-15案例3运行结果163计算机工程学院图2-16案例3运行结果264计算机工程学院5.归纳分析案例3是一个多路分支问题,程序中使用了C语言提供的实现多路选择的语句—switch语句。

(1)switch语句根据一个供进行判断的表达式的结果来执行多个分支中的一个,其一般形式如下:switch(<表达式>){case<常量表达式1>:<语句序列1>case<常量表达式2>:<语句序列2>::65计算机工程学院case<常量表达式n>:<语句序列n>default:<语句序列n+1>

}其中,每个“case<常量表达式>:”称为case子句,代表一个case分支的入口。因此每个case后面<常量表达式>的值必须互不相等。(2)switch语句的执行过程先计算<表达式>的值,然后依次与每个case子句后面的<常量表达式>的值进行比较,如果

66计算机工程学院匹配成功,则执行该case子句后面的<语句序列>,在执行过程中,若遇到break语句,就跳出switch语句,否则就继续执行后面的<语句序列>,直到遇到break语句或执行到switch语句的末尾(‘}’);若表达式的值不能与任何一个<常量表达式>匹配,则执行default子句所对应的语句。default子句是可选项,如果没有该子句,则表示在所有匹配都失败时,switch语句什么也不执行。67计算机工程学院案例4字符类型判断。1.问题描述

从键盘输入一个字符,判断是英文字母、数字字符还是其他字符。2.编程分析(1)输入字符存放在变量ch中;(2)如果是英文字母,输出“是英文字母”,转(4);否则转(3);(3)如果是数字字符,输出“是数字字符”,否则输出“是其他字符”;

68计算机工程学院(4)结束运行。

其中英文字母可以用表达式“ch>='A'&&ch<='Z'||ch>='a'&&ch<='z'”来判断,而数字字符的判断则用表达式“ch>='0'&&ch<='9'。流程图见图2-16所示。69计算机工程学院图2-17案例4流程图NNYY英文字符?开始输入ch“其他字符”结束数字字符?“是数字”“是英文”①②③④⑤70计算机工程学院3.编写源程序

/*EX2_7.cpp*/#include<stdio.h>voidmain(){charch;printf("请输入一个字符:");scanf("%c",&ch);if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z')printf("%c是英文字母.\n",ch);

71计算机工程学院elseif(ch>='0'&&ch<='9')printf("%c是数字字符.\n",ch);elseprintf("%c是其他字符.\n",ch);}72计算机工程学院4.运行结果

图2-18案例4运行结果173计算机工程学院图2-19案例4运行结果274计算机工程学院5.归纳分析

本案例中,对给定问题要分三种情况进行判断。这就需要使用嵌套形式的if语句来实现。if语句的嵌套就是在一个if语句中又包含另一个if语句。

(1)if语句的一般嵌套形式

if(<表达式1>)

if(<表达式2>)<语句1>内嵌if-else语句

else<语句2>else外层if-else语句

if(<表达式3>)<语句3>内嵌if-else语句

else<语句4>75计算机工程学院上面的一般形式中是在if和else

中各自内嵌一个if-else语句。(2)嵌套形式不具有固定的语句格式。本案例中使用的在外层if语句中的else的后面内嵌一个if-else语句的形式。自上而下看流程图2-16可知,当ch是英文字母时,执行路径为①⑤;当ch是数字文字符时,执行路径为②③⑤,ch是其他字符时,执行路径为②④⑤。76计算机工程学院2.2.2基础理论1.if语句的缺省形式

如果if-else语句中else后面的<语句2>是空语句时,则if语句可简化为:

if(<表达式>)

<语句1>其执行过程是:计算<表达式>的值,如果<表达式>的值“真”(非0),执行<语句1>,否则什么也不做,转去执行if语句的后继语句。流程图见图2-20。77计算机工程学院图2-20流程图假真求表达式语句1后继语句78计算机工程学院用缺省形式的if语句重写【案例1】。#include<stdio.h>voidmain(){floatkm,fee;printf("输入行车里程数:");scanf("%f",&km); fee=10.0;if(km>3.0)fee=10.0+(km-3.0)*1.8;printf("%.2f公里,请付¥%.2f\n",km,fee);}79计算机工程学院程序中在if语句前加了一条语句fee=10.0;,当输入的行车里程数小于3公里时,不再需要计算车费,所以可以采用缺省的if语句。2.if和else的配对规则使用if语句的嵌套形式时,如果if的数目和else的数目相同,它们的配对关系比较清楚。但由于存在if语句的缺省形式,会出现if与else的数目不一样的情况,初学者往往会弄错它们的配对关系。因此,必须正确理解C语言中if与else的配对规则。C语言规定:else与前面最接近它而又没有和其它else配对的if配对。80计算机工程学院下面的程序是试图判断x是大于0的偶数还是小于等于零。现分析一下程序在x分别取值为8、-5和5时的输出结果。

#include<stdio.h>voidmain(){intx;printf("Enterx:");scanf("%d",&x);

81计算机工程学院if(x>0)

if(x%2==0)printf("x>0andxiseven.\n");elseprintf("x<=0.\n");}程序运行情况1:

Enterx:8

x>0andxiseven.程序运行情况2:

Enterx:-5

程序运行情况3:

Enterx:5

x<=0.82计算机工程学院从程序运行的三种情况来看:情况2、3的结果显然是错误的。为什么呢?从书写格式上看,编程者是试图使else与第一个if组成if-else结构,即当x<=0时执行else后面的printf("x<=0.\n");语句。但是,根据if-else的配对原则,编译系统实际上是把else与第二个if作为配对关系处理,程序运行情况3的结果就说明了这种配对关系。所以书写格式并不能代替程序逻辑。为实现编者的意图,必须加“{}”,来强制确定配对关系,即将第二个if语句用“{}”括起来,即:

83计算机工程学院

if(x>0){if(x%2==0)printf("x>0andxiseven.\n");}elseprintf("x<=0.\n");3.正确使用switch语句84计算机工程学院在案例3中我们已经使用了switch语句,但还应注意以下问题:(1)switch后面表达式的类型,一般为整型、字符型和枚举类型(枚举类型将在后面模块中介绍)。(2)case子句中<常量表达式>的类型应该与switch后面<表达式>的类型相容,每个case子句中<常量表达式>的值必须互不相等,case和<常量表达式>之间要有空格,case后面的<常量表达式>之后有“:”,且所有case包含在“{}”里。

(3)一种情况处理完后,一般应使程序的执行流程跳出switch语句,则由break语句完成。如果没有85计算机工程学院

break语句,将会在继续执行后面的语句,直到switch语句结尾。重写【案例3】,观察case子句中没有break语句时程序的运行结果。

#include<stdio.h>voidmain()

{ intua; charcode; printf("请输入无符号整数和进制代号:")

86计算机工程学院

scanf("%d%c",&ua,&code); switch(code){ case'd':printf("十进制数:%d\n",ua);case'o':printf("八进制数:%o\n",ua);case'x':printf("十六进制数:%x\n",ua);default:printf("进制代号错误!");}}运行情况如图2-21所示。由此可见,case子句87计算机工程学院只是起一个标号的作用,确定匹配的入口,然后从此处开始一直执行下去,对后面的case子句的值不再进行比较。所以,当仅需执行一个分支情况时,则在case子句后面的语句序列中必须包含一个break语句。图2-21运行结果88计算机工程学院

(4)当多种常量表达式代表同一种情况时,出现在前面的case子句可以无处理语句,即多个case子句共用一组处理语句。例如【案例3】中,如果用户希望输入进制代号时对字母无大小写要求,则可对【案例3】的源程序作如下修改。运行结果如图2-22所示。89计算机工程学院图2-22运行结果90计算机工程学院2.2.3技能训练【实验2-4】输入一个整数n,判断n是否是一个能被23整除的三位奇数。【指导】

(1)问题分析要对n作出正确的判断,关键在于利用C语言的关系运算符和逻辑运算符,设计出正确、合理的表达式。根据题意,n应满足:取值范围:-999~-100或者100~999;n能被23整除:用n%23==0判断;n是奇数:用n%2!=0判断;91计算机工程学院把这些条件组合起来,可用一个复杂的逻辑表达式来表示:

(-999<=n&&n<=-100||100<=n&&n<=999)&&n%23==0&&n%2!=0。

(2)编写源程序

/*EX2_8.cpp*/#include<stdio.h>main(){intn;

92计算机工程学院

printf("Entern:");scanf("%d",&n);if((-999<=n&&n<=-100||100<=n&&n<=999)&&n%23==0&&n%2!=0)printf("%disright.\n",n);elseprintf("%diswrong.\n",n);}

(3)上机运行程序并分析结果。

93计算机工程学院

(4)问题思考在上例中,如果将条件表达式设计为:

(-999<=n&&n<=-100||100<=n&&n<=999&&n%23==0&&n%2==1)能不能对三位负数作出正确的判断?为什么?【实验2-5】下列程序EX2_9.cpp的功能是计算并输出下面分段函数值。但程序上机发现运行结果错误,见图2-23。94计算机工程学院

/*EX2_9.cpp*/#include<stdio.h>voidmain(){

doublex,y;1/(x+2),-5≤x<0且x≠-21/(x+5),0≤x<51/(x+12),5≤x<100,其它y=95计算机工程学院

printf("inputx="); scanf("%f",&x); if((-5.0<=x<0.0)&&(x!=-2))

y=1.0/(x+2);elseif(5.0<x)

y=1.0/(x+5);elseif(x<10.0)

y=1.0/(x+12);elsey=0.0;printf("x=%e\ny=%e\n",x,y);}96计算机工程学院请理解程序执行流程,通过调试修改程序中的错误。具体要求如下:

(1)不允许改变计算精度;(2)不允许改变原程序的结构,只能在语句和表达式内部进行修改;(3)设计x的值,测试程序的正确性。97计算机工程学院图2-23程序EX2_9.cpp运行结果出错98计算机工程学院【指导】程序EX2_9.cpp使用的是一种阶梯形的嵌套结构,通过不断在else子句中嵌套if语句来实现。这种结构可以进行多个条件(互相排斥的条件)的判断,用来实现多路分支问题的处理:依次对各个条件进行判断,一旦某个条件满足,就执行该条件下的有关语句,其他部分将被跳过;若各个条件均不满足,就执行最后一个if-else语句中else后面的语句。如果没有最后的else子句,就表示什么也不执行。99计算机工程学院【实验2-6】某商场在节日期间举办促销活动,顾客可按购买商品的款数多少分别给予以下不同的优惠折扣:购物不足250元的,没有折扣,赠送小礼品;购物满250元,不足500元的,折扣5%;购物满500元,不足1000元的,折扣8%;购物满1000元,不足2000元的,折扣10%;购物满2000元及2000元以上,折扣15%。试用switch语句编写程序,计算顾客的实际付款数。100计算机工程学院【指导】

(1)问题分析由于switch后面的表达式不具有对某个区间内的值进行判断的作用,它的取值必须对应于每个case子句的一个单值,所以如何设计表达式是关键。对于本题,假设购物款为payment,由于折扣点是以250的倍数变化的,所以可以把表达式设计为payment/250,即:

payment<250元时,对应折扣点payment/250为0;

250≤payment<500元时,对应折扣点payment/250取值1;101计算机工程学院

500≤payment<1000元时,对应折扣点payment/250分别取值2、3;

1000≤payment<2000元时,对应折扣点payment/250分别取值4、5、6、7;这样就实现了把payment在一个区间内的取值定位在若干个点上。(2)编写程序

/*EX2_10.cpp*/#include<stdio.h>102计算机工程学院

voidmain(){floatpayment,discount,amount;/*discount:折扣点,amount:付款数*/inttemp;/*中间变量*/printf("请输入你的购物款:"); scanf("%f",&payment); temp=(int)payment/250;/*计算折扣点*/switch(temp){103计算机工程学院

case0:discount=0;printf("你可获得一件小礼品。\n");break; case1:discount=5.0;break; case2: case3:discount=7.0;break; case4: case5: case6: case7:discount=10.0;break;

104计算机工程学院

default:discount=15.0;break; }amount=payment*(1-discount/100);printf("请付款¥%.2f\n",amount);}(3)上机运行程序并验证程序的正确性。(4)完善程序如果输入的购物款不合法(如负数),程序应输出出错信息;输出结果包含以下信息:购物款、获得的折扣和应付款。105计算机工程学院

2.2.4拓展与练习

【练习1】编写程序,输入两个学生的成绩,按从高到低的次序输出。编程要求:

(1)输入两个成绩放入变量score1和变量score2中(2)将高分存入变量score1中,低分存入变量score2中;(3)依次输出变量score1和score2的值。【练习2】根据任务1中【实验2-2】的题目要求、解题步骤和流程图,编写程序。要求设计四106计算机工程学院

组不同的体重和身高的测试数据,程序运行后能输出正确的结果。【练习3】输入一个学生的百分制成绩,然后按此输出等级:90~100为"优秀",70~89为"良好",60~69为"及格",<60为"不及格"。编程要求:(1)用switch语句编写程序;(2)要判断百分制成绩的合理性,对于不合理的成绩应输出出错信息;(3)输出结果中应包括百分制成绩和对应的等级。107计算机工程学院【练习4】编写程序求解一元二次方程ax2+bx+c=0

的根。编程要求:

(1)画出流程图;(2)从键盘输入系数a、b、c,输入前要有如下提示:“请输入系数”;(3)如果方程没有实根,输出信息“此方程无实数根”;如果有重根,以“x1=x2=...”的格式输出方程的根;如果有两个不同的根,以“x1=...”和“x2=...”的格式输出方程的根。108计算机工程学院

【练习5】根据表2-2的工资、薪金所得适用税率表计算月交税金和月实际收入。表2-2工资、薪金所得适用税率表级数

含税级距

适用税率

速算扣除数

1小于500元部分5%02大于等于500元—2000元部分10%253大于等于2000元—5000元部分15%1254大于5000元部分20%375109计算机工程学院计算方法:月应纳税额=月应纳税所得额×适用税率-速算扣除数。其中,月应纳税所得额=月工资收入-个税起征数;个税起征数为1600元。编程要求:输入月工资收入,计算并输出月应纳税额和月实际收入。110计算机工程学院2.2.5编程规范与常见错误1.编程规范(1)if

和switch关键词与之后的表达式之间应加1个空格。(2)在if-else语句中,if与else不应在同一行,并上下对齐;后面的语句应采用缩进形式,如是复合语句,则一对花括号应上下对齐。缩进格式能增加程序的可读性。例如:

if(a+b>c&&a+c>b&&b+c>a) { s=(a+b+c)/2.0;111计算机工程学院

area=sqrt(s*(s-a)*(s-b)*(s-c));

printf("areais%f\n",area); } else printf("inputerrer\n");2.常见错误

(1)在关键词if

后面的表达式中将把赋值运算符“=”误作比较运算符“==”使用。

例如下面的程序段中,输入的b无论为何值,均输出OK。因为这里的表达式是一个赋值表达式

b=a,并不是判断b是否等于a。由于b的值为-1(非0),代表逻辑真,所以语句printf(”NO”);是不可能被执行到的。112计算机工程学院

inta=-1,b;scanf(“%d”,&b);if(b=a)printf(”OK”);else printf(”NO”);

总之,关键词if后面的表达式只要是合法的C语言表达式,当它的值为“非0”,即代表“真”,否则为假。113计算机工程学院

(2)复合语句忘了用花括号括起来。

例如在【案例2】的源程序中如漏了花括号如下示:

if(a+b>c&&a+c>b&&b+c>a) s=(a+b+c)/2.0; area=sqrt(s*(s-a)*(s-b)*(s-c)); printf("areais%f\n",area); else printf("inputerrer\n");114计算机工程学院程序在编译时显示出错信息:“illegalelsewithoutmatchingif”。因为编译系统将if语句理解为是缺省形式,这时else就没有与之配对的if了。115计算机工程学院2.2.6贯通案例之二1.问题描述根据2.1.6贯通案例之一中的菜单,对菜单进行编号,用switch语句实现菜单的选择:

(1)当用户输入2

时模拟实现增加学生成绩的功能。(2)当用户输入1~8中的其他数字时,显示“本模块正在建设中…….”(3)当用户输入1~8以外的数字时,显示适当的错误提示。116计算机工程学院2.编写程序

/*EX2_11.cpp*/#include"stdio.h"main(){char ch; longnum;intscore;printf("#=========================#\n");printf(“#学生成绩管理系统#\n");printf("#--------------------------------------------#\n");printf("#copyright@2009-10-1#\n");printf("#=========================#\n");117计算机工程学院

printf(“#1.加载文件#\n");printf(“#2.增加学生成绩#\n");printf(“#3.显示学生成绩#\n");printf(“#4.删除学生成绩#\n");printf(“#5.修改学生成绩#\n");printf(“#6.查询学生成绩#\n");printf(“#7.学生成绩排序#\n");printf(“#8.保存文件#\n");printf(“#0.退出系统#\n");printf("#==========================#\n");printf("请按0-8选择菜单项:");scanf("%c",&ch);118计算机工程学院

switch(ch){

case'1':printf("进入加载文件模块.本模块正在建设中…….\n");break;

case'2':printf("进入增加学生成绩模块.\n");printf("请输入学号和成绩:");scanf("%ld%d",&num,&score);break;

case'3':printf("进入显示学生成绩模块.本模块正在建设中…….\n");119计算机工程学院

break;case'4':printf("进入删除学生成绩模块.本模块正在建设中…….\n"); break;case'5':printf("进入修改学生成绩模块.本模块正在建设中…….\n"); break;case'6':printf("进入查询学生成绩模块.本模块正在建设中…….\n"); break;case'7':printf("进入学生成绩排序模块.本模块正在建设中…….\n"); break;120计算机工程学院

case'8':printf("进入保存文件模块.本模块正在建设中…….\n"); break; case'0':printf("退出系统.\n");exit(0);default:printf("输入错误!"); break;} }3.运行结果121计算机工程学院图2-24贯通案例运行结果1122计算机工程学院图2-25贯通案例运行结果2123计算机工程学院

任务3循环结构程序设计

学习目标领会程序设计中构成循环的方法,掌握for、while和do-while

语句的用法,了解break和continue

语句在循环语句中的作用。124计算机工程学院

2.3.1案例讲解

案例1累加问题1.问题描述计算100以内的奇数之和,即求1+3+5+…+97+99。2.编程分析(1)设变量sum存放累加和,初值置0;变量i存放需累加的当前项,初值置1;

125计算机工程学院(2)当i<100时,反复执行当前项i加到累加和sum中当前项i+2(3)输出累加和(4)结束流程图见2-26。126计算机工程学院真假i<100sum+=i开始sum=0i=1输出sum结束图2-26案例1流程图i=i+2127计算机工程学院3.编写源程序

/*EX2_12.cpp*/#include<stdio.h>voidmain(){ inti,sum; sum=0;/*累加器清0*/ for(i=1;i<100;i+=2) sum+=i;printf(“1+3+5+…+97+99=%d\n”,sum);}128计算机工程学院4.运行结果图2-27案例1运行结果129计算机工程学院5.归纳分析案例使用的是C语言提供的循环语句—for语句。

(1)for语句的语法形式

for(<表达式1>;<表达式2>;<表达式3>)

<语句>其中,for是关键字。注意,三个表达式之间必须用分号(;)隔开。

(2)for

语句的执行流程①首先计算<表达式1>;130计算机工程学院②求<表达式2>的值,若其值为非零,执行<语句>,然后转③执行,若<表达式2>的值为零,则结束for语句。③求解<表达式3>,转②执行。流程图如图2-28。131计算机工程学院计算表达式1表达式2计算表达式3执行语句(循环体)真假图2-28流程图132计算机工程学院

(3)在程序EX2_12.cpp中,for循环的执行过程是:先赋值i=1,然后判断“i<100”是否成立,如果为真,执行循环体“sum+=i;”,转而执行“i+=2”,再判断“i<100”,如此反复,直到“i>=100”为止。在此,变量i既是当前项,也起到了控制循环次数的作用,所以i也称为循环控制变量,它的值由表达式3来改变;sum起累加器的作用,共累加了50次。表2-3展示了i和sum在循环中的值的变化。133计算机工程学院表2-3循环中i和sum的变化案例2求平均分问题1.问题描述输入若干个学生的C语言课程考试成绩,计算这门课程的平均分,输入负数时结束。i的值1357911…9799sum的值149162536…24032500134计算机工程学院2.编程分析在程序中需要设置以下变量:score存放输入成绩;累加器sum存放总成绩;count统计人数;ave

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论