




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验4程序设计(4学时)目的与要求1. 掌握VFP程序设计特点,程序文件的建立、修改和运行方法;2. 掌握环境设置语句的含义和基本输入输出命令的使用;3. 掌握VFP的顺序、选择和循环结构的设计方法;4. 掌握程序设计过程中参数传值和传引用的传递规则;5. 掌握子程序、过程和自定义函数的建立,以及调用与返回规则;6. 掌握内存变量的作用域属性及对参数传递的影响。实验内容一、实验准备1. 参照“附录一”,熟悉VFP 6.0 程序文件的建立、修改和运行方法;2. 将ftp上实验指导书文件夹中“实验项目5、6用表”文件夹下的学生表(student.dbf)、成绩表(score.dbf)、课程表(course.dbf)以及备注文件“student.fpt”四个文件,拷贝到C:Program FilesMicrosoft Visual StudioVfp98目录下,然后完成实验。示例与程序中用到的三个表结构如下,各位同学可以参照这些结构还原这三个数据表之间的相互关联。“student.dbf”的结构:字段名数据类型宽度小数位学号字符型6姓名字符型8性别字符型2出生日期日期型8班级字符型20奖学金数值型62简历备注型4“score.dbf”的结构:字段名数据类型宽度小数位学号字符型6课程号字符型6成绩数值型51“course.dbf”的结构:字段名数据类型宽度小数位课程号字符型6课程名字符型20学时整型4学分整型4二、顺序结构程序设计1. 参照“附录二”中的示例,熟悉VFP的顺序程序设计方法。2. 完成如下程序设计:(1) 物体长度可以用公制或者英制单位表示,已知公制长度单位为毫米(mm),英制单位长度为英寸(inch),其转换公式为1 inch = 25.4 mm,编写程序将输入的英制长度转换为公制后输出。(2) 从键盘输入圆锥体的半径(r)和高度(h),计算其体积并输出,体积计算公式为v = p * r * r * h / 3。(3) 求方程 ax2 + bx + c = 0的根,a, b, c的值从键盘输入(假设输入的a, b, c值满足b2 4ac 0,不考虑虚根的情况)。(4) 由键盘输入学生名,将“student表”中该学生的奖学金增加100元,并显示该学生修改后的奖学金。(5) 分析下面程序的输出结果。USE studentINDEX ON 姓名 TAG nameidxACCEPT 请输入要查找的学生姓名 TO 姓名SEEK M - 姓名DISPLAY三、选择结构程序设计1. 参照“附录三”中的示例,熟悉VFP的选择程序设计方法。2. 完成如下程序设计:(1) 输入3个不同的数,将它们按照数值降序从大到小输出。(2) 从键盘输入数字月份,然后输出该月份的英文名称的缩写,如1月输出“Jan”、10月输出“Oct”等等。(3) 输入学生的姓名,在“student表”中查找该学生的信息,如果找到则显示该学生的信息,并将该学生的“班级”改为“机械2班”;如果没有找到则显示“无此人!”。(4) 求方程 ax2 + bx + c = 0的根,a, b, c值从键盘输入,程序应当较为完整地考虑方程的实根、虚根或者输入的数据有误。(也可以在顺序程序设计题3程序基础上改写)。(5) 用多路选择分支结构将从键盘输入的阿拉伯数字(0, 1, 2, , 9)转换为中文大写数字(、一、二、九)。(6) 已知符号函数的定义如下,后面的程序用于计算符号函数的值,请在(1)、(2)处填入恰当的语句。-1a 0SET TALK OFF(1)& 输入数据到内存变量aDO CASECASE a 0b = 1CASE a = 0b = 0(2)& 此处不允许写CASE a 0b = -1ENDCASE? bSET TALK ON四、循环结构程序设计1. 参照“附录四”中的示例,熟悉VFP的循环程序设计方法。2. 完成如下程序设计:(1) 从键盘输入10个数,去掉10个数中的一个最大值与一个最小值,然后输出其平均值。(2) 分别用DO WHILEENDDO循环结构和SCANENDSCAN循环结构输出“student表”中奖学金超过200元的男生姓名和奖学金数额。(3) 编写口令判断程序,要求从键盘输入用户名和口令,并判断判断两者是否分别与“student表”中的“姓名”与“学号”字段的值完全一致,若是则显示欢迎信息;否则给予重新输入的机会,输入次数一共超过三次则显示无权使用本系统的提示。(4) 将用户输入的一个字符串进行大小写互换,即将字符串中所有的大写英文字母转换成小写,小写英文字母转换成大写后输出,其它字符不变。(5) 求s = ,其中x和n的值从键盘输入,当时停止计算。(6) 输出如下图形,其中的行数从键盘输入:6 5 4 3 2 15 4 3 2 14 3 2 13 2 12 11(7) 输出如下图形,其中的行数从键盘输入: A ABC ABCDEABCDEFG ABCDE ABC A(8) 用循环计算出“score表”中各个学生的平均成绩,再根据平均成绩用多路选择分支结构确定其奖学金,并将“student表”中的“奖学金”字段修改为计算出的奖学金值,平均成绩与奖学金的标准如下:平均分奖学金数额95 1001000元90 94750元85 89500元80 84250元3. 分析程序的运行结果,并说明该程序的功能。(1) SET TALK OFFk = 1s = 0DO WHILE k = 10s = s + kk = k + 1ENDDO? s = , s(2) CLEARa = 0b = 0DO WHILE a m,其中求阶乘和组合数的内容均设计为过程或者函数。(2) 编写自定义函数CheckEven(Num),其功能为:若其数值型参数Num仅由偶数字( 0, 2, 4, 6, 8 )组成时(如86420),函数返回.T.,否则返回.F.(如68032),并编写程序调用该函数。提示:函数体中重复使用“Num % 10”以及“Num = Num / 10”来获得Num的各位数字,并判断这些数字是否全为偶数。(3) 编写一个自定义函数,实现将任意的日期型表达式转换为中文大写形式,如2009-12-15转换为:“二零零九年十二月十五日”。(4) 基于“student表”和“score表”,完成一个简单的“学籍管理系统”,要求将每一个功能作为一个单独的过程,在主控程序中按照用户输入的不同要求分别调用这些过程,其基本功能模块如下:a. 查询,按姓名或者学号,并显示该学生的信息;b. 插入,增加新的学生记录或者增加新的成绩信息;c. 删除,按学号删除该学生的信息以及“score表”中所有成绩记录;d. 修改,按学号修改该学生的成绩信息。有余力的同学也可以在此基础上,加进“course表”,并增加操作课程的功能,完成一个比较简单的学生成绩管理系统。附录:VFP6.0的程序设计一、 程序文件的建立、修改和运行方法1 建立程序文件的3种方法(1) 项目管理器:代码选项卡中的程序项 新建(2) 文件菜单:新建 程序 新建文件(3) 命令窗口键入:MODIFY COMMAND2 运行程序文件的4种方法(1) 项目管理器:运行(2) 程序菜单:运行,利用对话框选择要运行的程序(3) 命令窗口键入:DO 程序文件名(4) 选取代码行 右击快捷菜单 运行所选区域3 程序文件的编辑修改方法(1) 项目管理器:选定程序文件 修改(2) 文件菜单 打开(3) MODIFY COMMAND 程序文件名二、 顺序结构程序设计顺序结构的程序运行时按照语句排列的先后顺序,一条接一条地依次执行,是程序的最基本结构。例1:根据输入的半径值,编程计算相应的圆面积。解题思路:编程时,首先用输入语句输入圆半径,然后用公式计算圆面积,最后用输出语句输出圆面积示例程序:SET TALK OFFCLEARINPUT 请输入圆的半径: TO rs = 3.14 * r * r? 圆的面积是: + ALLTRIM( STR( s, 19, 2 ) )SET TALK ON例2:在学生表中,根据从键盘上输入的学生姓名,显示该学生的基本情况。解题思路:程序首先要打开“student表”文件,然后用输入语句输入学生姓名,接着将记录指针定位在该学生,显示该学生信息,最后关闭表文件。示例程序:SET TALK OFFCLEARUSE studentACCEPT 请输入学生姓名: TO stunameLOCATE FOR 姓名 = stuname& 没有考虑查找失败DISPLAYUSESET TALK ON例3:编写程序,按照用户输入的表文件名与表中的记录号显示记录内容。解题思路:首先从键盘输入表文件名,然后打开该表文件,接下来输入记录号,然后将记录指针移至该记录并显示,最后关闭该表文件。示例程序:SET TALK OFFCLEARACCEPT 请输入表文件名: TO filenameUSE &filenameINPUT 请输入记录号: TO recordnoGO recordnoDISPLAYUSESET TALK ON三、 选择结构程序设计分支选择结构是根据测试条件的结果执行不同的操作,即程序中某些命令的执行受某一条件的控制,当条件成立时,执行其中的一部分命令,不成立时执行另外一部分的命令,即根据条件决定做什么操作。VFP中实现条件分支有两种格式:二路分支选择结构(IFENDIF) 和多路选择分支结构(DO CASEENDCASE),其中IFENDIF语句又可以分成带ELSE与不带ELSE两种格式。例1:已知一元一次方程ax + b = 0,输入a、b值后,求解x值。解题思路:该方程只有当a不等于零时,方程才有解x = b / a,而当a = 0时就不用求解。示例程序:SET TALK OFFCLEARINPUT a = TO aINPUT b = TO bIF a 0? x = , -b / aENDIFSET TALK ON例2:从键盘输入学生的学号,在“score表”中计算该学生的平均成绩,并判断平均成绩是否大于60分,分别显示“平均分及格”和“平均分不及格”信息,如果该学生的学号不在表中,则提示相应的信息。解题思路:从键盘输入的学号在“score表”中确实存在时,才能统计平均成绩,输入的学号一旦在“成绩表”中找不到,程序运行之后会因为找不到满足条件的记录而出错,因此必须检测输入输入的学号是否存在。程序框架如下:(1) 打开相应的数据表文件;(2) 输入学号;(3) 查找该学号是否存在(可以使用顺序查找或索引查找);(4) 如果输入的学号在“成绩表”中存在,则进行步骤5,否则显示信息说明该学号不存在,进行步骤6;(5) 计算该学号学生的平均成绩,并判断平均成绩是否大于等于60分,如果是则显示“平均分及格”信息,否则显示“平均分不及格”;(6) 结束对表中信息的操作,关闭相应的表文件。示例程序:SET TALK OFFCLEARUSE scoreACCEPT 请输入学号: TO stunoLOCATE FOR 学号 = stunoIF FOUND( )AVERAGE 成绩 TO scravg FOR 学号 = stuno? scravgIF scravg = 60? 平均分及格!ELSE? 平均分不及格!ENDIFELSE? 该学号不存在!ENDIFUSESET TALK ON例3:扩充例2的程序,按平均成绩分别显示出“优”(90100),“良”(8089),“中”(7079),“及格”(6069)和“不及格”(低于60分)。解题思路:程序的基本框架同例2,差别只是在于步骤5,首先判断平均成绩是否大于等于90,是则显示“优”;否则再判断平均成绩是否大于等于80,是则显示“良”,否则继续判断平均成绩是否大于等于70,依次类推,直到该平均成绩小于60,则显示“不及格”,因此要用到嵌套的IFENDIF结构。示例程序1:SET TALK OFFCLEARUSE scoreACCEPT 请输入学号: TO stunoLOCATE FOR 学号 = stunoIF EOF( )? 该学号不存在!ELSEAVERAGE 成绩 TO scravg FOR 学号 = stunoIF scravg = 90grade = 优ELSEIF scravg = 80grade = 良ELSEIF scravg = 70grade = 中ELSEIF scravg = 60grade = 及格ELSEgrade = 不及格ENDIFENDIFENDIFENDIF? stuno, scravg, gradeENDIFUSESET TALK ON由于IF只能在两种情况下做出选择,如果出现两种以上的情况,则需要采用嵌套的IF语句,这样不仅增加了程序编写的难度,也影响程序的可读性。此时可以用多分支DO CASEENDCASE语句来简化程序,上述程序因此也可以改写如下。示例程序2:SET TALK OFFCLEARUSE scoreACCEPT 请输入学号: TO stunoLOCATE FOR 学号 = stunoIF EOF( )? 该学号不存在!ELSEAVERAGE 成绩 TO scravg FOR 学号 = stunoDO CASECASE scravg = 90grade = 优CASE scravg = 80grade = 良CASE scravg = 70grade = 中CASE scravg = 60grade = 及格OTHERWISEgrade = 不及格ENDCASE? stuno, scravg, gradeENDIFUSESET TALK ON四、 循环结构程序设计循环结构指按问题的需要,多次重复执行一行或者多行语句,也就是说某些语句在某条件成立时,需要重复执行,直到条件不成立时才结束重复执行。循环结构中特别需要注意的是:一定有控制退出循环的语句,以避免出现死循环现象。在VFP中有三种循环语句:步长型循环FORENDFOR、条件型循环DO WHILEENDDO和基于数据表的循环SCANENDSCAN。在循环体中再次包含有循环语句时,统称为多重循环。例1:输入10个数,统计大于零的数值个数并计算其总和。解题思路:由于是通过累加求和,因此可以用已知循环次数的程序进行计数操作来实现。程序框架如下:(1) 给循环变量赋初值(从1开始)并预设存放累加结果的变量(初值为0,大于0的个数sn和数值之和st);(2) 循环开始,如果循环变量的值没有超过10,则进入循环内的操作;否则结束循环操作,直接执行(3);(2.1) 从键盘输入一个数给变量x,并判断它是否大于0,如果是则sn = sn + 1,st = st + x,否则直接进行(2.2);(2.2) 循环变量当前值加1;(2.3) 回到循环起点,重新判断循环条件;(3) 输出显示累加的结果。示例程序:SET TALK OFFsn = 0st = 0n = 1DO WHILE n 0sn = sn + 1st = st + xENDIFn = n + 1ENDDO? 大于零的个数为:, sn? 大于零的数值之和为:, stSET TALK ON例2:逐条记录输出“student表”中男学生的详细信息。解题思路:由于操作过程是对表文件记录逐条进行,因此可以使用DO WHILEENDDO结构来实现,并且用EOF( )函数测试是否已到文件尾。显然,可以直接在LIST 或者 DISPLAY 命令中使用条件语句来实现该功能,但是其输出格式并不能按照自己的需要来定制。示例程序:SET TALK OFFCLEARUSE studentLOCATE FOR 性别 = 男DO WHILE .NOT. EOF( )? SPACE(10), 学号, SPACE(10), 姓名, SPACE(10), 性别CONTINUEENDDOUSESET TALK ON例3:用SCANENDSCAN统计“student表”中姓刘的女生人数。解题思路:由于SCAN语句可以带条件,因此直接在条件中过滤学生性别即可。程序框架如下:(1) 首先预设存放累加结果的变量n(初值为0);(2) 打开学生表文件;(3) 用SCAN语句循环搜索满足条件的学生(姓刘的女生),每搜索到一个,变量n = n + 1;(4) 输出显示累加结果,并关闭表文件。示例程序:SET TALK OFFSET EXACT OFFCLEARn = 0USE studentSCAN FOR 性别 = 女 .AND. 姓名 = 刘n = n + 1ENDSCAN? 学生表中女生的人数是:, nUSESET TALK ON例4:用FORENDFOR实现从键盘输入一个数判断它是否为质数。解题思路:所谓质数,就是只能被1和它本身整除的自然数,因此根据这一特性就可利用循环来判断给定的数是否能被1到该数之间的某个数整除(不包含1和该数本身),如无一被整除,说明该数就是质数,否则不是质数。程序框架如下:(1) 首先输入一个自然数至内存变量x;(2) 循环开始时,循环变量的初值为2,循环终值为该数减1,退出循环后,直接跳到步骤(3);(2.1) 判断给定的数能否被循环变量整除;如果是则退出循环,说明该数不是质数;否则继续判断能否被其他的数整除;(2.2) 循环变量递增1;(3) 输出判断结果。示例程序:SET TALK OFFCLEARINPUT 输入任意一个数: to xFOR i = 2 TO x - 1IF INT( x / i ) = x / i& 或者使用x % i = 0EXITENDIFENDFORIF i = x? ALLTRIM( STR( x, 19 ) ) + 是质数!ELSE? ALLTRIM( STR( x, 19 ) ) + 不是质数!ENDIFSET TALK ON例5:编写一个程序可以重复计算任意数的阶乘,直到按任意键结束计算。解题思路:显然计算某数的阶乘可以使用循环来完成,为了实现重复按照输入来计算阶乘,于是外层使用永真循环,即采用二重循环结构来实现,从键盘输入要计算阶乘的数,退出循环的条件是按下除“Y”或“y”外的任意键。示例程序:SET TALK ONCLEARDO WHILE .T.INPUT 请输入数据: TO xt = 1i = 1DO WHILE i = xt = t * ii = i + 1ENDDO? ALLTRIM( STR( x, 19 ) ) + !=, tWAIT 继续计算阶乘吗?(Y/N) TO ynIF UPPER(yn) = YLOOPELSEEXITENDIFENDDOSET TALK ON例6:编程输出下列图形。 1 222 33333 4444444555555555 4444444 33333 222 1解题思路:平面趣味图案输出显示时,通过横向和纵向两个坐标的二重循环控制来完成。程序框架如下:(1)外循环除控制图案组成元素外,还要控制输出的行数。从图中可知,输出显示的行数与给定的图案半高n(5)有关,可以归纳出外循环的循环变量初值为1,终值为2n - 1(11)。(2)内循环除控制图案组成元素外,还要控制输出的列数。从图中可知,尽管每行输出的列数都不相同,但每行输出的列数与当前的行数i有关,同样可以归纳出规律。可以将该图案分解为两个三角形,上面三角形每行中的列数是逐行递增的,下面三角形每行中的列数是逐行递减的,所以内循环应当分为两部分分别处理两个三角形。(3)内循环控制的所有列输出在同一行中,且每列之间有一空格,但是外循环控制的所有行应当换行后,输出在不同的行中。示例程序:SET TALK OFFCLEARn = 5p = 2 * n - 1FOR i = 1 TO pIF i = n? SPACE( n - i + 1 )FOR j = 1 TO 2 * i - 1? STR( i, 1 )ENDFORELSE? SPACE( i - n + 1 )FOR k = 1 TO 2 * ( 2 * n - i ) - 1? STR( 2 * n - i, 1 )ENDFORENDIFENDFORSET TALK ON五、 过程式程序设计采用过程与自定义函数可以将复杂的问题简单化,实现模块化的设计。过程没有返回值,定义的引导词为PROCEDURE,自定义函数则有一个返回值,引导词为FUNCTION;如果过程的实参是变量则传址(传引用),如果实参是常数或者表达式则传值,但是自定义函数的调用永远传值。例1:用子程序实现计算s = a! + b! + c!,其中a、b、c由键盘输入。解题思路:子程序实现的功能:接收主程序传递过来的参数,用循环结构实现求该数的阶乘,并将阶乘返回主程序。主程序的功能为:从键盘输入a、b、c三个数,然后分别调用子程序求三个数的阶乘,并计算累加和s示例程序:*主程序main.prgSET TALK OFFCLEARINPUT a = TO aINPUT b = TO bINPUT c = TO cs = 0ps = 1p = aDO facs = s + psp = bDO facs = s + psp = cDO facs = s + ps? s = , sSET TALK ON*子程序fac.prgps = 1FOR i = 1 TO pps = p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理心理辅导试题及答案指导
- 顺利通过2025年入团考试试题及答案
- 高级审计师考试复习挑战及试题及答案
- 中级会计战略规划思路分享试题及答案
- 青年参与社会治理的重要性试题及答案
- 高级会计变革中的机遇试题及答案
- 财务数据可视化的重要性试题及答案
- 航空器密封与更换技巧试题及答案
- 投入学习的正确姿势2024年高级审计师考试试题及答案
- 消防技术人员培训试题及答案建议
- 哈尔滨市早市现状调研及分析
- 绘本故事 第一次上街买东西
- 中国神华能源股份有限公司大柳塔煤矿矿山地质环境保护与土地复垦方案
- GB/T 17241.1-1998铸铁管法兰类型
- GB/T 14981-2009热轧圆盘条尺寸、外形、重量及允许偏差
- ANSA 初级培训教程课件
- 哈萨克族课件
- 高压开关柜基础知识培训课件
- 企业临时用工合同范本(5篇)
- 质量三体系课件
- 卡介苗的接种课件
评论
0/150
提交评论