第3章用户菜单设计



在第2章中,学习并掌握了“学生成绩管理系统”的数据定义和数据运算相关知识。接下来,本章开始搭建项目框架,完成项目的两级菜单的设计。项目中包含主菜单和子菜单(管理员用户和学生用户)。系统运行首先进入主菜单,通过选择进入相应用户的子菜单,再选择进入各项功能。由于菜单的选择应该具有重现性和循环性,因此,本章的主要任务就是完成主菜单和子菜单的循环显示和选择。为后面的学生成绩管理功能提供调用界面。部分难点以微课的形式展示,帮助读者理解。



 任务3.1主菜单显示

 任务3.2主菜单选择

 任务3.3子菜单选择

 任务3.4菜单循环显示



知识目标

(1) 掌握流程控制的顺序、选择和循环三大结构,并能够熟练画出算法流程图。

(2) 掌握顺序结构的输入/输出语句。

(3) 掌握分支结构的if语句和switch语句。

(4) 掌握循环结构的while语句和dowhile语句。

能力目标

(1) 能够分解算法,并熟练画出算法流程图。

(2) 能够熟练掌握利用if和switch分支语句进行选择结构程序设计和应用的方法。

(3) 能够熟练掌握利用while语句进行循环结构程序设计和应用的方法。

(4) 能够对选择结构和循环结构进行综合应用。

素质目标


(1) 在系统界面设计过程中,培养学生的创新精神。


(2) 以袁隆平等榜样人物的生平事迹进行流程结构拓展,培养学生的奉献精神,理论联系实际、勤奋进取的务实精神,顾全大局、不计名利、甘为“人梯”的协作精神。


(3) 通过泡茶的流程,循序渐进地学习结构化程序设计,提高学生的文化素养。

(4) 培养学生树立正确的价值观和人生观。

(5) 培养学生举一反三、融会贯通的学习能力。

任务3.1主菜单显示



周老师要求每个项目组完成“学生成绩管理系统”的主菜单的显示。周老师要求大家发挥自己的想象力,让简单的界面呈现不一样的设计。基本的实现效果如图31所示。系统运行时,首先进入主菜单,主菜单有3个选项,分别代表管理员、学生和退出。

要完成这个任务,周老师要给项目组的同学们分析一下需要掌握哪些知识。



图31主菜单显示


首先,程序开发前要了解算法流程图和基本的程序控制结构。在进行程序设计之前,要将解决这个任务的程序结构理清,并将算法描述出来,才能进行编码。

其次,本任务需要用到C语言中的格式化输出语句。



3.1.1算法和程序结构



程序设计就是面对一个需解决的实际问题时,能够设计适合于计算机运行的算法,并利用程序设计语言(如C语言)写出算法,成为程序,运行程序,此问题得以解决。程序是解决特定问题所需的语句集合。算法是为解决某个特定问题而采取的确定有效的步骤。描述算法可以采用自然语言法、伪代码法、流程图表示法、高级语言表示法。下面介绍传统流程图的算法描述方法。

传统流程图符号如图32所示。



图32传统流程图符号及功能


基本的程序结构有以下3种。

(1) 顺序结构。语句顺序逐条执行,不发生流程转移,其流程图如图33所示。

(2) 选择结构。根据条件是否成立选择某一段程序执行,其流程图如图34所示。

(3) 循环结构。根据循环条件重复执行循环体代码,其流程图如图35和图36所示。



图33顺序结构流程图




图34选择结构流程图





图35循环结构流程图——当型循环




图36循环结构流程图——直到型循环




循环结构分为两种。
图35所示
的循环称为当型循环。首先判断条件是否满足,如果满足条件,则执行循环体语句,否则退出循环。
图36所示的循环
称为直到型循环,不管条件是否满足,先执行循环体语句,再进行条件判断,如果满足继续循环,不满足则退出循环。



程序设计算法基于日常逻辑,由于计算机擅长大量的重复计算,引入了循环和判断等结构,程序设计算法往往更简洁。

3.1.2格式化输出语句
1. 格式化输出函数printf()

printf()函数的作用是向系统指定的输出设备输出数据。


printf()函数的语法格式如下。

printf("格式控制字符串",输出项列表); 


其中,输出项列表可以是常量、变量、表达式、函数调用等。格式控制字符串一般包含两部分: 格式控制符和其余字符。格式控制符是以%开头的字符串,控制输出数据的类型和格式。其余字符指原样输出的提示字符串,有几个%,就有几个输出项。

思考: 语句printf(“x=%d,y=%d\n”,x,y);中,哪些是格式控制符,哪些是提示字符串?将输出什么?


表31列出了常用的格式字符。


表31格式字符





格式字符说明

%d,i 输出带符号的十进制数(正数不带符号)
%u输出无符号的十进制数
%o输出无符号的八进制数(不输出前导符0)
%x,X输出无符号的十六进制数(不输出前导符0x)
%c以字符形式输出1个字符
%s输出1个字符串(到第1个'\0'为止)
%f输出小数形式的实数(默认输出6位小数)
%e,E输出指数形式的实数(默认输出6位小数)
%g,G输出%f和%e中宽度较短的,不输出无意义的0
%p输出指针地址
%%输出%



附加的输出用格式字符如表32所示。


表32附加格式字符




附加字符说明

+ 输出的数字总带+或-号
-输出的数据在所在域中左对齐
l输出长整型
m输出数据的最小宽度
.n输出数据中小数点后的位数
#使输出的八或十六进制数带前导0或0x


2. 字符输出函数


字符输出函数为putchar(ch),可以向终端输出1个字符,与printf()的%c格式输出无区别。

例如: 

putchar('y'); putchar('\n'); putchar(ch); putchar('0xa');

3. 字符串输出函数


字符串输出函数为puts(字符串常量/字符串地址),可以将字符串内容输出,直至'\0',并且自动换行。


例如,
printf("%s","I am a good student");语句可以输出字符串"I am a good student",但不会自动换行。

puts("I am a good student");语句也可以输出字符串"I am a good student",但会换行。

3.1.3空语句和复合语句
1. 空语句

空语句只有一个“;”,语句为空,不执行任何操作,但在构成程序结构或调试阶段,还是很有用的。

2. 复合语句


多于1条的语句用{}括起来,称为复合语句。复合语句在语法上等同于1条语句,凡是单条语句出现的地方,都可以出现复合语句,大大增强了程序的处理能力。在复合语句内部可以包含任何数据结构定义和其他语句,在其内部定义的变量只在此复合语句内起作用。

3. 注释

注释是为了使编码人员和其他读者更好的理解程序,在程序中写的注解。

//: 用于单行注释。

/*...*/: 用于多行注释,或块注释。

注释的内容是不进行编译和运行的,因此注释有两个作用: 对程序进行注解; 屏蔽不需执行的代码。



3.1.4主菜单显示

通过以上知识的学习,项目组就可以实施主菜单显示的任务了。在main()函数中添加代码来完成。用
4条printf语句输出提示字符串(3个选择),注意各行的对齐方式。

具体代码如下。

int main()

{

//主菜单的显示

printf("\t\t学生成绩管理系统\n\n");

printf("\t\t1——管理员\n");

printf("\t\t2——学生\n");

printf("\t\t0——退出\n");

printf("\n");

printf("\n");

getchar();

getchar();

return 0;

}

3.1.5子菜单显示


根据主菜单的显示的实施过程完成管理员子菜单和学生子菜单的显示。

管理员菜单的各项如下。

(1) 班级成绩添加。

(2) 班级成绩浏览。

(3) 求最高分。

(4) 求最低分。

(5) 求平均分。

(6) 求各分数段所占比率。

(7) 成绩排序。


因此,管理员子菜单可以由9条printf语句输出提示字符串(8个选择)。

具体代码如下。

int main()

{

//管理员子菜单的显示

printf("\t\t管理员成绩管理功能\n\n");

printf("\t\t		1——班级成绩添加\n");

printf("\t\t		2——班级成绩浏览\n");

printf("\t\t		3——最高分\n");

printf("\t\t		4——最低分\n");

printf("\t\t		5——平均分\n");

printf("\t\t		6——各分数段所占比率\n");

printf("\t\t		7——成绩排序\n");

printf("\t\t		0——退出\n");

getchar();

getchar();

return 0;

}

学生子菜单的选项只有查询成绩。
因此,学生子菜单可以由3条printf语句输出提示字符串(2个选择)。


具体代码如下。

int main()

{

//学生子菜单的显示

printf("\t\t学生成绩管理功能\n\n");

printf("\t\t1——查询成绩\n");

printf("\t\t0——退出\n");

getchar();

getchar();

return 0;

}




3.1.6袁隆平的人生流程

【任务描述】以杂交水稻之父袁隆平的人生轨迹为切入点,以袁隆平的一生作为流程主线,分析人生流程结构,画出他的人生流程图。按照年份梳理他的主要事迹和经历,列举重大人生选择时刻,以及为杂交水稻研究事业奋斗终身的职业选择,充分诠释生命不息,事业不止的职业精神。

【任务分析】袁隆平先生的一生可以挖掘出怎样的流程结构,可以分别从求学经历、科研经历、典型事迹等方面进行分析,挖掘流程结构。


1. 求学经历

1930年9月7日,袁隆平出生于北京协和医院。

1931年至1936年,袁隆平随父母居住北平、天津、江西九江、江西赣州、湖北汉口等地。

1936年8月至1938年7月,袁隆平在汉口扶轮小学读书。

1938年8月至1939年1月,袁隆平在湖南省弘毅小学读书。

1939年8月至1942年7月,袁隆平在重庆龙门浩中心小学读书。

1942年8月至1943年1月,袁隆平在重庆复兴初级中学读书。

1943年2月至1944年1月,袁隆平在江西赣江中学读书。

1944年2月至1946年5月,袁隆平在重庆博学中学读书。

1946年8月至1948年1月,袁隆平在汉口博学中学读高中。

1947年暑假,袁隆平读高中一年级时获汉口赛区男子百米自由泳第一名; 获湖北省男子百米自由泳第二名。

1948年2月至1949年4月,袁隆平在南京中央大学附中读高中。

1949年8月至1950年10月,袁隆平在重庆北碚夏坝的相辉学院农学系读书。

1949年8月至1953年8月,袁隆平在西南农学院农学系农作物专业学习。

1950年11月至1953年7月,院系调整并入重庆新建的西南农学院农学系,袁隆平续读3年至毕业。

1951年7月,袁隆平在西南农学院报名参加空军,体检、政审合格,后因在校大学生更需参加经济建设,而未入伍,继续留校学习。

对应的流程图如图37所示。



图37袁隆平求学经历流程图


2. 水稻研究(文字资料)


袁隆平毕生致力于杂交水稻技术的研究、应用与推广。20世纪60年代初,米丘林、李森科遗传学说盛行、他视野开阔,通读外文资料,了解到了孟德尔、摩尔根现代遗传学理论研究的新动向,于是通过理论与实践相结合的研究,打开了杂交水稻“王国”的大门。

(1) 袁隆平在中国率先开展水稻杂种优势利用研究。

(2) 袁隆平解决了三系法杂交稻研究中的三大难题。

(3) 袁隆平提出了杂交水稻的育种发展战略,即方法上由三系到两系再到一系,程序越来越简单而效率越来越高; 杂种优势水平上由品种间到亚种间再到远缘杂种优势利用,优势越来越强,促使杂交水稻一步一步向新的台阶迈进。这一思路已被国内外同行采用,并成为杂交水稻育种发展的指导思想。

(4) 袁隆平解决了两系法中的一些关键技术难题。

(5) 袁隆平设计出了以高冠层、矮穗层和中大穗为特征的超高产株型模式和培育超级杂交稻的技术路线,并在超级杂交稻研究方面连续取得重大进展。

袁隆平先生水稻研究的科学研究经历流程图如图38所示。



图38袁隆科学研究经历流程图


3. 典型事迹

袁隆平带领助手李必湖于1970年11月23日在海南岛的普通野生稻群落中,发现一株雄花败育株,并用广场矮、京引66等品种测交,发现其对野败不育株有保持能力,这就为培育水稻不育系和随后的“三系”配套打开了突破口,给杂交稻研究带来了新的转机。为了早日攻关成功,袁隆平毫不含糊、毫无保留地及时向全国育种专家和技术人员通报了他们的最新发现,并慷慨地把历尽艰辛才发现的“野败”奉献出来,分送给全国18个研究单位进行研究,协作攻克“三系”配套关,从而加快了协作攻关的步伐,使“三系”配套得以很快实现。

典型事迹的流程图如图39所示。



图39袁隆平典型事迹的流程图


通过分析袁隆平先生一生的经历,可以挖掘出人生流程结构,包含了顺序结构、选择结构和循环结构。很多流程往往不是由一种结构组成,而是三种结构的融合。要学会从描述中挖掘出合理的结构,并画出流程图。

3.1.7泡茶的流程

【任务描述】试画出泡工夫茶的流程结构。

【任务分析】根据泡茶的流程,泡茶可以是顺序结构。根据茶叶的选择,泡茶的流程可以添加选择结构。根据茶汤颜色,泡茶的流程可以添加循环结构。因此,泡茶的流程应该是三种结构的融合。



微课: 
顺序结构


1. 顺序结构——泡茶v1

生活中泡工夫茶有一定的步骤。基本步骤包括①准备茶具; 
②温杯; ③放茶; ④洗茶; ⑤冲泡; ⑥品茶。这些步骤是有一定的先后顺序的,这就是一个典型的顺序结构。




微课: 
选择结构

按照泡茶的步骤就可以给出泡茶的算法流程图,如图310所示,按照顺序一步一步执行6个步骤。


2. 选择结构——泡茶v2



顺序结构就是按照算法步骤按顺序一步一步执行。然而,现实生活中,有很多问题不能仅用顺序结构就可以完成。例如,在泡茶时,基本步骤还是顺序结构,但是,如果在泡不同种类的茶叶时,泡茶的步骤可能就会不同。

例如,在第1步准备茶具时: 



图310泡茶顺序流程图


(1) 如果泡的是绿茶,选择的泡茶器具是玻璃杯; 


(2) 如果泡的是普洱茶时,选择的泡茶器具是紫砂壶; 

(3) 如果泡的是岩茶,则会选择盖碗。

因此,当根据条件来选择的时候,执行的步骤也会不一样,这就是选择结构。

一般的选择结构,首先判断条件,当条件为真时,执行左边的语句,当条件为假时,执行右边的语句。不管执行哪边的语句,最终都会继续往下执行。


因此,可以将泡茶的算法流程进行修改。加入选择结构之后,当泡的是绿茶条件为真时,选择绿茶器具玻璃杯
。如果为假,继续判断泡的是否是普洱茶。如果为真,则选择普洱茶的器具紫砂壶。如果为假,则选择岩茶的泡茶器具盖碗,如图311所示。当第一步选择结构执行完之后,则继续按照顺序执行下面的泡茶步骤。这样,泡茶的流程就是一个选择结构和顺序结构的综合。


那么生活中,还有哪些问题是选择结构的呢?其实有很多,因为人们无时无刻不在进行选择,有2选1或多选1的情况。比如,如果今天不下雨,我就出去; 下雨我就在家。买咖啡时,如果喜欢甜的,就加糖,不喜欢甜的就不加糖。或者,数学中求3个数中的最大数问题,需要进行两次比较。首先比较两个数,将大的数再和第三个数进行比较,这是两个选择结构的叠加。