1、上机实验题目、内容和要求实验 1:熟悉上机环境和顺序结构编程练习1. 键盘输入与屏幕输出练习问题 1 要使下面程序的输出语句在屏幕上显示 1, 2, 34,则从键盘输入的数据格式应为以序号 实验目的和要求 实验题目 学时 数 类别 1熟悉 C 语言编程环境,利用输入输出函数进行简单程序设计 计算定期存款本利之和 3 基础验证 2熟悉分支结构程序设计方法,同时熟悉机考系统的使用方法 身高预测,简单的计算器 3 设计 3熟悉循环结构程序设计方法,同时熟悉机考系统的使用方法 猜数游戏 3 设计 4熟悉函数编程方法 ,同时熟悉机考系统的使用方法给小学生出加法考试题 3 设计 5 熟悉数组编程方法 文曲
2、星猜数游戏 3 设计 6熟悉一维数组和函数综合编程方法,同时熟悉机考系统的使用方法 学生成绩统计 3 综合设计 7熟悉二维数组和函数综合编程方法,同时熟悉机考系统的使用方法 学生成绩排名与查询 3 综合设计 8熟悉数组、指针和函数综合编程方法,同时熟悉机考系统的使用方法 查找并打印学生成绩最高分及其学号 3 综合设计9熟悉结构体编程方法,同时熟悉机考系统的使用方法 在屏幕上模拟显示一个数字式时钟 3 综合设计10熟悉文件编程方法,利用机考自动评分系统进行模拟考试 文件的复制与追加 3 设计 下备选答案中的 。#include main()char a,b; int c; scanf(“%c%c
3、%d“,printf(“%c,%c,%dn“,a,b,c);A)1 2 34 B)1, 2, 34 C) 1,2,34 D)12 34问题 2 在与上面程序的键盘输入相同的情况下,要使上面程序的输出语句在屏幕上显示 1 2 34,则应修改程序中的哪条语句?怎样修改? 问题 3 要使上面程序的键盘输入数据格式为 1,2,34,输出语句在屏幕上显示的结果也为1,2,34,则应修改程序中的哪条语句?怎样修改?问题 4 要使上面程序的键盘输入数据格式为 1,2,34,而输出语句在屏幕上显示的结果为1, 2,34,则应修改程序中的哪条语句?怎样修改?提示:利用转义字符输出字符 单引号字符。问题 5 要使
4、上面程序的键盘输入无论用下面哪种格式输入数据,程序在屏幕上的输出结果都为1, 2,34,则程序应修改程序中的哪条语句?怎样修改?第 1 种输入方式:1,2,34(以逗号作为分隔符)第 2 种输入方式:1 2 34(以空格作为分隔符)第 3 种输入方式:1 2 34(以 Tab 键作为分隔符)第 4 种输入方式:1234 (以回车符作为分隔符)提示:利用忽略输入修饰符。2. 计算定期存款本利之和设银行定期存款的年利率 rate 为 2.25%,并已知存款期为 n 年,存款本金为 capital 元,试编程计算 n 年后的本利之和 deposit。要求定期存款的年利率 rate、存款期 n 和存款
5、本金capital 均由键盘输入。实验 2:选择结构编程练习1. 身高预测每个做父母的都关心自己孩子成人后的身高,据有关生理卫生知识与数理统计分析表明,影响小孩成人后的身高的因素包括遗传、饮食习惯与体育锻炼等。小孩成人后的身高与其父母的身高和自身的性别密切相关。设 faHeight 为其父身高,moHeight 为其母身高,身高预测公式为男性成人时身高=(faHeight + moHeight)0.54cm女性成人时身高=(faHeight0.923 + moHeight)/2cm此外,如果喜爱体育锻炼,那么可增加身高 2%;如果有良好的卫生饮食习惯,那么可增加身高 1.5%。编程从键盘输入用
6、户的性别(用字符型变量 sex 存储,输入字符 F 表示女性,输入字符 M表示男性) 、父母身高(用实型变量存储,faHeight 为其父身高,moHeight 为其母身高) 、是否喜爱体育锻炼(用字符型变量 sports 存储,输入字符 Y 表示喜爱,输入字符 N 表示不喜爱) 、是否有良好的饮食习惯等条件(用字符型变量 diet 存储,输入字符 Y 表示良好,输入字符 N 表示不好) ,利用给定公式和身高预测方法对身高进行预测。2. 简单的计算器用 switch 语句编程设计一个简单的计算器程序,要求根据用户从键盘输入的表达式:操作数 1 运算符 op 操作数 2计算表达式的值,指定的算术
7、运算符为加(+) 、减(- ) 、乘( *) 、除(/ ) 。本实验程序是在例 4.8 的基础上,增加如下要求:(1)如果要求程序能进行浮点数的算术运算,程序应该如何修改?如何比较实型变量data2 和常数 0 是否相等?(2)如果要求输入的算术表达式中的操作数和运算符之间可以加入任意多个空白符,那么程序如何修改?(3) (选作题)如果要求连续做多次算术运算,每次运算结束后,程序都给出提示:Do you want to continue(Y/N or y/n)?用户输入 Y 或 y 时,程序继续进行其他算术运算;否则程序退出运行状态。那么,程序如何修改?提示:利用空格加%c(或者%1s)格式符
8、输入用户回答,利用 do-while 语句实现反复运算直到用户输入 N 或 n。【思考题】比较实型变量 data2 和常数 0 是否相等,能用 if (data2 = 0)吗?为什么?实验 3:循环结构编程练习猜数游戏在这个实验中,我们将尝试编写一个猜数游戏程序,这个程序看上去有些难度,但是如果按下列要求循序渐进地编程实现,会发现其实这个程序是很容易实现的。那么,现在就开始吧,先编写第 1 个程序,然后试着在第 1 个程序的基础上编写第 2 个程序,程序 1 编程先由计算机 “想”一个 1100 之间的数请人猜,如果人猜对了,则计算机给出 提 示 “Right!”, 否 则 提 示 “Wron
9、g!”, 并 告 诉 人 所 猜 的 数 是 大 ( Too high) 还 是 小 ( Too low) , 然后结束游戏。要求每次运行程序时机器所“想”的数不能都一样。程序 2 编程先由计算机“想”一个 1100 之间的数请人猜,如果人猜对了,则结束游戏,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平;否则计算机给出提示,告诉人所猜的数是太大还是太小,直到人猜对为止。程序 3 编程先由计算机“想”一个 1100 之间的数请人猜,如果人猜对了,则结束游戏,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平;否则计算机给出提示,告诉人所猜的数是太大还是太小,
10、最多可以猜 10 次,如果猜了 10 次仍未猜中的话,结束游戏。程序 4 编程先由计算机 “想 ”一个 1100 之间的数请人猜,如果人猜对了,在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平,则结束游戏;否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜 10 次,如果猜了 10 次仍未猜中的话,则停止本次猜数,然后继续猜下一个数。每次运行程序可以反复猜多个数,直到操作者想停止时才结束。【思考题】 如果用 scanf 输入用户猜测的数据时,如果用户不小心输入了非法字符,如字符 a,那么程序运行就会出错,用什么方法可以避免这样的错误发生呢?请读者编写程序验证方法的有效
11、性。实验 4:函数编程练习1. 给小学生出加法考试题编写一个程序,给学生出一道加法运算题,然后判断学生输入的答案对错与否,按下列要求以循序渐进的方式编程。程 序 1 通 过 输 入 两 个 加 数 给 学 生 出 一 道 加 法 运 算 题 , 如 果 输 入 答 案 正 确 , 则 显 示 “Right!”,否 则 显 示 “Not correct! Try again!”, 程 序 结 束 。程 序 2 通 过 输 入 两 个 加 数 给 学 生 出 一 道 加 法 运 算 题 , 如 果 输 入 答 案 正 确 , 则 显 示 “Right!”,否 则 显 示 “Not correct!
12、 Try again!”, 直 到 做 对 为 止 。程 序 3 通 过 输 入 两 个 加 数 给 学 生 出 一 道 加 法 运 算 题 , 如 果 输 入 答 案 正 确 , 则 显 示 “Right!”,否 则 提 示 重 做 , 显 示 “Not correct! Try again!”, 最 多 给 三 次 机 会 , 如 果 三 次 仍 未 做 对 , 则 显示 “Not correct! You have tried three times! Test over!”, 程 序 结 束 。程序 4 连续做 10 道题,通过计算机随机产生两个 110 之间的加数给学生出一道加法运算
13、题,如果输入答案正确,则显示“Right!” ,否则显示“ Not correct!”,不给机会重做,10道题做完后,按每题 10 分统计总得分,然后打印出总分和做错的题数。程序 5 通过计算机随机产生 10 道四则运算题,两个操作数为 110 之间的随机数,运算类型为随机产生的加、减、乘、整除中的任意一种,如果输入答案正确,则显示“Right! ”,否则显示“Not correct!”,不给机会重做,10 道题做完后,按每题 10 分统计总得分,然后打印出总分和做错题数。【思考题】 如果要求将整数之间的四则运算题改为实数之间的四则运算题,那么程序该如何修改呢?请读者修改程序,并上机测试程序运
14、行结果。2掷骰子游戏编写程序模拟掷骰子游戏。已知掷骰子游戏的游戏规则为:每个骰子有 6 面,这些面包含1、2、3、4、5、6 个点,投两枚骰子之后,计算点数之和。如果第一次投的点数和为 7 或11,则游戏者获胜;如果第一次投的点数和为 2、3 或 12,则游戏者输;如果第一次投的点数和为 4、5、6、8、9 或 10,则将这个和作为游戏者获胜需要掷出的点数,继续投骰子,直到赚到该点数时算是游戏者获胜。如果投掷 7 次仍未赚到该点数,则游戏者输。提示:由于这个游戏的游戏规则 相对较为复杂,游戏者第一次投骰子时可能输,也可能赢,还可能再投很多次才能确定胜负。因此,设置一个枚举型变量 gameSta
15、tus 来跟踪这个状态,游戏者获胜时,将 gameStatus 置为 WON,游戏者失败时,将 gameStatus 置为 LOST,否 则游戏不能结束,需通过再次投掷 确定胜负,先将 gameStatus 置为 CONTINUE,同时,将 sum 保存在 myPoint 中,在后 续的 while 循环中,再次 调用 rollDice 产生新的 sum,当 sum 等于myPoint 时,将 gameStatus 置 为 WON,如果又投掷了 7 次,sum 仍未等于 myPoint,则将gameStatus 置为 LOST。在程序的最后,根据 gameStatus 的值,打印胜负结果。 【
16、思考题】 将游戏规则改为:计算机想一个数作为一个骰子掷出的点数(在用户输入数据之前不显示该点数) ,用户从键盘输入一个数作为另一个骰子掷出的点数,再计算两点数之和。其余规则相同,然后请读者重新编写该程序。实验 5:数组编程练习1. 检验并打印魔方矩阵在下面的 55 阶魔方矩阵中,每一行、每一列、每一对角线上的元素之和都是相等的,试编写程序将这些魔方矩阵中的元素读到一个二维整型数组中,然后检验其是否为魔方矩阵,并将其按如下格式显示到屏幕上。17 24 1 8 1523 5 7 14 164 6 13 20 2210 12 19 21 311 18 25 2 92. 餐饮服务质量调查打分在商业和科
17、学研究中,人们经常需要对数据进行分析并将结果以直方图的形式显示出来。例如,一个公司的主管可能需要了解一年来公司的营业状况,比较一下各月份的销售收入状况。如果仅给出一大堆数据,这显然太不直观了,如果能将这些数据以条形图(直方图)的形式表示,将会大大增加这些数据的直观性,也便于数据的分析与对比。下面以顾客对餐饮服务打分为例,练习这方面的程序编写方法。假设有 40 个学生被邀请来给自助餐厅的食品和服务质量打分,分数划分为 110 这 10 个等级(1 表示最低分,10 表示最高分) ,试统计调查结果,并用*打印出如下形式的统计结果直方图。Grade Count Histogram1 5 *2 10
18、*3 7 *. 提示:定义一个含有 40 个元素的数组 score,40 个学生打的分数存放在这个数组中,再定义一个含有 11 个元素的数组 count,作为计数器使用(count0不用)。第一步是计算统计结果,设置一个循环,依次检查数组 score 中的元素值,是 1 则将数组元素 count1加 1,是 2 则将数组元素 count2加 1,依次类推,将各等级分数的统计结果存放在 count 数组中。第二步是打印统计结果,设置一个循 环,按数 组 count 中元素 值的大小,依次打印相 应个数的星号*。计算 统计结果时,既可以用 switch 语句,也可以不用 switch 语句,请分别
19、考虑这两种编程方法。3. 文曲星猜数游戏模拟文曲星上的猜数游戏,先由计算机随机生成一个各位相异的 4 位数字,由用户来猜,根据用户猜测的结果给出提示:xAyB其中,A 前面的数字表示有几位数字不仅数字猜对了,而且位置也正确,B 前面的数字表示有几位数字猜对了,但是位置不正确。最多允许用户猜的次数由用户从键盘输入。如果猜对,则提示“Congratulations!” ;如果在规定次数以内仍然猜不对,则给出提示“Sorry, you havent guess the right number!”。程序结束之前,在屏幕上显示这个正确的数字。提示:用数组 a 存储计算机随机生成的 4 位数,用数组 b
20、 存储用户猜的 4 位数,对 a 和b 中相同位置的元素进行比较,得到 A 前面待显示的数字,对 a 和 b 的不同位置的元素进行比较,得到 B 前面待显示的数字。实验 6:一维数组和函数综合编程练习学生成绩统计从键盘输入一个班(全班最多不超过 30 人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实现下列功能:(1)统计不及格人数并打印不及格学生名单;(2)统计成绩在全班平均分及平均分之上的学生人数,并打印这些学生的名单;(3)统计各分数段的学生人数及所占的百分比。提示:(1)用 numi存放第 i+1 个学生的学号,用 scorei存放第 i+1 个学生的成绩。设置计数器 coun
21、t,当 scorei=aver 时 ,打 印 numi和 scorei。(3)将 成 绩 分 为 6 个 分 数 段 ,60 分 以 下 为 第 0 段 ,60 69 分 为 第 1 段 ,707 9 分 为 第 2段 ,80 89 分 为 第 3 段 ,90 99 分 为 第 4 段 ,100 分 为 第 5 段 ,因 此 成 绩 与 分 数 段 的 对 应关 系 为: 分分分分 6/)5(各分数段的学生人数保存在数组 stu 中,用 stui存放第 i 段的学生人数。对于每个学生的成绩,先计算出该成绩所对应的分数段,然后将相应的分数段的人数加 1,即 stui+。从本次实验开始,所有实验都
22、使用函数来 编程。 【思考题】 在编程实现对数据的统计任务时,需要注意什么问题?实验 7:二维数组和函数综合编程练习成绩排名次某班期末考试科目为数学(MT) 、英语(EN)和物理(PH) ,有最多不超过 30 人参加考试。考试后要求:(1)计算每个学生的总分和平均分;(2)按总分成绩由高到低排出成绩的名次;(3)打印出名次表,表格内包括学生编号、各科分数、总分和平均分;(4)任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数。提示:用二维数组 score 存放每个学生各门课程的成绩,用一维数组 num 存放每个学生的学号,用一维数组 sum 存放每个学生的总分,用一维数组 aver
23、存放每个学生的平均分。 用函数 编程 实现计算每个学生的总分。 用函数 编程实现按总分由高到低对学生成绩排序。注意:排序时,一维数组 sum 元素的变化应连同二维数组 score 及一 维数组 num 和 aver 一起变化。 用函数编程 实现查找学号为 k 的学生在班级中的排名及相关成绩等信息,找不到时返回-1 值 。【思考题】 请读者思考如下问题。 如果增加一个要求:要求按照学生的学号由小到大对学号、成绩等信息进行排序,那么程序如何修改呢? 如果要求程序运行后先打印出一个菜单,提示用户选择:成绩录入、成绩排序、成绩查找,在选择某项功能后执行相应的操作,那么程序如何修改呢?实验 8:数组、指
24、针和函数综合编程练习打印最高分和学号假设每班人数最多不超过 40 人,具体人数由键盘输入,试编程打印最高分及其学号。程 序 1 用 一 维 数 组 和 指 针 变 量 作 为 函 数 参 数 , 编 程 打 印 某 班 一 门 课 成 绩 的 最 高 分 及 其 学 号 。程序 2 用二维数组和指针变量作为函数参数,编程打印 3 个班学生(假设每班 4 个学生)的某门课成绩的最高分,并指出具有该最高分成绩的学生是第几个班的第几个学生。程序 3 用指向二维数组第 0 行第 0 列元素的指针作为函数参数,编写一个计算任意 m 行n 列二维数组中元素的最大值,并指出其所在的行列下标值的函数,利用该函
25、数计算 3 个班学生(假设每班 4 个学生)的某门课成绩的最高分,并指出具有该最高分成绩的学生是第几个班的第几个学生。程序 4 编写一个计算任意 m 行 n 列二维数组中元素的最大值,并指出其所在的行列下标值的函数,利用该函数和动态内存分配方法,计算任意 m 个班、每班 n 个学生的某门课成绩的最高分,并指出具有该最高分成绩的学生是第几个班的第几个学生。 【思考题】 请读者思考: 编写一个能计算任意 m 行 n 列的二维数组中的最大值,并指出其所在的行列下标值的函数,能否使用二维数组或者指向二维数组的行指针作为函数参数进行编程实现呢?为什么? 请读者自己分析动态内存分配方法(题目要求中的程序
26、4)和二维数组(题目要求中的程序 3)两种编程方法有什么不同?使用动态内存分配方法存储学生成绩与用二维数组存储学生成绩相比,其优点是什么?实验 9:结构体编程练习在屏幕上模拟显示一个数字式时钟按如下方法定义一个时钟结构体类型:struct clockint hour;int minute;int second;typedef struct clock CLOCK;然后,将下列用全局变量编写的时钟模拟显示程序改成用 CLOCK 结构体变量类型重新编写。已知用全局变量编写的时钟模拟显示程序如下:#include #include int hour, minute, second; /*全局变量定义
27、*/*函数功能:时、分、秒时间的更新函数参数:无函数返回值:无*/void Update(void) second+;if (second = 60) /*若second值为60,表示已过1分钟,则 minute值加1*/second = 0;minute+; if (minute = 60) /*若minute值为60,表示已过1小时,则 hour值加1*/minute = 0;hour+;if (hour = 24) /*若hour值为24 ,则hour 的值从0开始计时*/hour = 0;/*函数功能:时、分、秒时间的显示函数参数:无函数返回值:无*/void Display(void
28、) /*用回车符r控制时、分、秒显示的位置*/printf(“%2d:%2d:%2dr“, hour, minute, second); /*函数功能:模拟延迟1秒的时间函数参数:无函数返回值:无*/void Delay(void) long t;for (t=0; thour = m / 3600; t-minute = (m 3600 * t-hour) / 60; t-second = m % 60; m+; if (t-hour = 24) m = 1; void Update(struct clock *t)static long m = 1;t-second = m % 60;t-minute = (m / 60) % 60;t-hour = (m / 3600) % 24;m+;if (t-hour = 24)m = 1;