C语言实训:删除数组元素与成绩统计程序解析

需积分: 47 4 下载量 24 浏览量 更新于2024-07-27 2 收藏 293KB PDF 举报
"上海电机学院C语言实训50题答案" 在给定的实训题目中,我们可以看到两个C语言编程任务。下面是这两个任务的详细解释和相关知识点: 任务一: 这个任务要求编写一个C程序来删除一个整型数组中所有等于特定值n的元素。程序应该包括一个主函数和一个子函数。主函数负责接收用户输入的10个正整数和要删除的值n,而子函数负责删除值为n的元素。 1. 主函数`main()`: - 用户输入:通过`scanf`函数获取10个正整数和一个整数n。 - 调用子函数`fun()`,将处理后的数组传回。 - 输出删除n后的数组元素。 2. 子函数`fun(int *b, int m)`: - 参数:b指向原始数组,m是要删除的值。 - 新数组`c[]`用于存储处理后的元素。 - 使用一个循环遍历原始数组,如果当前元素不等于m,则将其复制到新数组c[]。 - 返回新数组的长度,即删除n后的有效元素数量。 在这个程序中,子函数`fun()`实际上没有正确地更新数组`c[]`。它应该将非n元素复制到`c[]`,而不是将指针`b+j`直接赋值给`c[k]`。此外,注释中的无限循环部分是为了处理连续的相同值,但代码并未正确实现。实际实现时,可以使用一个额外的变量来跟踪连续的相同值,而不需要无限循环。 任务二: 这个任务要求编写一个程序来处理10个学生5门课程的成绩,计算每个学生的平均分、每门课程的平均分,并找出最高分对应的学生和课程。 1. 主函数`main()`: - 两层循环分别处理学生和课程,使用`scanf`读取成绩。 - 计算每个学生的总分并除以5得到平均分,存储在`a[i][5]`位置。 - 使用循环和条件语句找到最高分及其对应的学号(N)和课程编号(C)。 2. 计算平均分: - 对于每个学生,使用`sum`变量累加5门课程的分数,然后除以5得到平均分。 - 对于每门课程,可以使用类似的逻辑遍历所有学生的成绩,累加后再除以学生总数。 在这个程序中,变量`H`、`N`和`C`用于追踪最高分及其对应的学号和课程编号。在每个学生的成绩输入完成后,都要更新这些变量,以确保始终记录的是目前的最高分。 这两个任务展示了C语言中基本的数组操作、用户输入、函数调用以及条件判断等核心概念。同时,它们也涉及到了动态计算平均分和查找最大值的算法。在实际编程中,需要注意内存管理、错误处理和代码的可读性。
2012-01-22 上传
解除C语言实训烦恼 “计算机能力强化实训”(C语言)任务书 一、实训目的 C语言程序设计是本科工科类各专业的重要基础课,主要学习程序设计的基本概念和方法,通过本门课程学习,使学生掌握C语言的基本原理,熟练掌握程序设计的基础知识、基本概念;掌握程序设计的思想和编程技巧。 实训是在学生已经具备了使用C语言编写简单的应用程序的能力,为使学生对C语言有更全面的理解,进一步提高运用C语言编程解决实际问题的能力,通过提出算法、指定输入输出来设计一个解决方案。并为参加计算机等级考试作准备。 二、实训的基本内容和要求 参加实训的学生,应当认真完成实训的全部内容。最终提交实训成果来证明其独立完成各种实际任务的能力。从而反映出理解和运用本课程知识的水平和能力。具体如下: 1、代码编写规范,形成良好的编程习惯; 2、程序须有一定的健壮性和必要的提示信息,考虑问题的多种可能和边界数据。 3、提交实训报告电子稿、装订的打印稿。实训报告内容包括以下几个方面:  程序的总体设计和算法分析。  程序流程图、函数说明  源程序代码清单  测试数据和测试过程记录  遇到的问题及解决方法分析  实训小结 4. 程序运行方式 构建一个简易菜单,形如: 用户通过输入数值选择所需运行的子程序,当一个子程序运行结束后回到菜单界面,直至用户输入0后退出程序。 5.实训选题 每人至少做6题,题目如下(每人的题目由任课老师安排) (1)编写一个程序实现如下功能:一个整型数组有10个元素,删除所有值为n的元素。要求: ① 主函数完成n的输入,数组元素输入以及删除后数组元素的输出。 ② 删除功能用子函数完成。 (2)编写一个程序实现如下功能:输入10个学生5门课程的成绩,分别用函数求:①每个学生的平均分;②每门课程的平均分;③找出最高的分数所对应的学生和课程。 若输入2个学生的成绩,其运行结果如下图所示。 (3)编写一个程序实现如下功能:找最长的单词。设输入的英文短文不超过一行(假设正文最后有“.”结束,以“,”或空格分隔,不出现其他符号),编程将所有单词输出,并求其中最长单词的长度,并将该单词输出。 (4)编写一个程序实现如下功能:有8位裁判为1个运动员打分,请计算并输出去掉一个最高分和一个最低分后这个运动员的平均得分以及所评分最接近平均分的裁判员号。裁判员号及其所打分数从键盘输入,假设裁判员号为整数,所打分数为实数。 (5)编写一个程序实现如下功能:从键盘输入字符(最多为80个),遇到回车键输入结束,将输入的字符串按奇偶位置拆分,奇数位上的字符在前,偶数位上的字符在后,重新组成新的字符串输出,例如输入: ab12cd3456fg,则经过程序处理后输出: a1c35fb2d46g 。 (6)功能说明:编写程序,实现以下成绩处理功能(输出格式参见示例): 1)输入n和n个成绩(成绩为浮点数类型,数组名记为a,假设1≤n≤50); 2)计算并输出成绩的累加和(记为sum)与平均成绩(记为ave),将≥ave的成绩归为A档,将<ave的成绩归为B档; 3)分别统计A、B两档的人数,计算在总人数中的比率; 4)求出A档学生的最低分和B档学生的最高分,它们与平均成绩的差值; 运行示例: 输入:9 55.5 99.5 50.0 90.0 88 59.5 48 60 78.0 输出: Sum=628.5, Ave=69.8 A: 4,44.4% B: 5,55.6% MinA: 78.0,+8.2 MaxB: 60.0,-9.8 说明:输入的第1个数表示学生人数(n=9),接着输入的9个成绩中,累加和为628.5(所有小数均保留一位小数输出),平均分为69.8分;平均分以上(A档)有4人,占44.4%,平均分以下(B档)有5人,占55.6%;A档的最低分为78分,超出平均分8.2分,B档的最高分为60分,距离平均分还有9.8分的差距。 (7)功能说明:编写程序,通过以下步骤验证一个正整数对是否符合特定的编码规则: 1)输入正整数a与b; 2)计算a的所有不同的质因子(包括1)之积,记为s; 3)如果s等于b,则通过验证,输出“OK”,否则输出“Err”。 输出格式参见以下示例。 运行示例1: 输入:588 42 输出:588: 1*2*3*7=42, OK 说明:输入数为588(对应a)和42(对应b),588的质因子为1、2、3和7,其累乘结果为42(对应s),由s等于b(均为42),输出OK。 运行示例2: 输入:17 55 输出:17: 1*17=17, Err(17!=55) 说明:质因子为1和17,乘积仍为17,不等于b(55),输出Err,及不通过原因“(17!=55)”。 (8)编写一个程序实现如下功能:从字符串中删除指定的字符。同一字母的大、小写按不同字符处理。 例:若程序执行时,输入字符串为:Shanghai Dianji University,从键盘上输入字符:s,则输出后变为:Shanghai Dianji Univerity,如果输入的字符串不存在,则字符串照原样输出。 (9)编写一个函数void fun(char a[],int k,int n),其功能是:删除字符串中指定下标开始的n 个字符。其中,a中放字符串,k中存放指定的下标。 例如,字符串内容为:Hellollo World!,k中值为:5,n中的值为:3,则调用该函数的结果为:Hello World!。 (10)编写一个程序实现如下功能:调用名为tj的函数,求一个二维数组中正数、负数的代数和,以及零的个数。 (11)编写一个程序实现如下功能:调用一个名为gm的函数,该函数实现简单的加密。加密方法如下:先定义一张字母加密对照表: 原字母 a b c d e i k , w 加密后字母 d w k , i a b c e 将需要加密的一行文字输入加密程序,程序根据加密表中的对应关系,可以简单地将输入的文字加密输出,对于表中未出现的字符则不加密。 运行示例: 输入:lajgdike,w 输出:ldjg,abice (12)编写程序验证以下说法:输入一个4位数,该数个、十、百、千位上的数互不相等,由个、十、百、千位上的数组成一个最大数和一个最小数,最大数-最小数,构成一个新的4位数。反复以上运算,使其最终结果为:6174。 要求如下(下面的函数名为建议函数名): ① 用函数 int IsNumberEqual(int number) 检查输入的整数number各数码是否互不相等,全相等返回值为1否则为0; ② 用函数(void ntos (int number, int c[]) )把四位数整数number各位数码分别存入数组c ③ 用函数( void sort (int a[ ] )对4个元素的数组a排序(升序或降序都可以); ④ 由输入整数分解排序后的数组得到最大值和最小值: int getmaxn(int a[ ]) 返回值为最大值 int getminn(int b[ ]) 返回值为最小值 (13)函数 fun 的功能是:计算正整数num的各位上的数字之积。例如,若输入:252,则输出应该是:20。若输入:202,则输出应该是:0。 (14)函数 fun 的功能是:用插入排序法将n个字符进行排序(降序)。(提示: 插入法排序的思路是:先对数组的头两个元素进行排序, 然后根据前两个元素的情况插入第三个元素,再插入第四个元素…)。 (15)爱因斯坦数学题。爱因斯坦曾出过这样一道数学题:有一条长阶梯,若每步跨2阶,则最后剩下1阶,若每步跨3阶,则最后剩下2阶,若每步跨5阶,则最后剩下4阶,若每步跨6阶,则最后剩下5阶,只有每步跨7阶,最后才正好1阶不剩。请问,这条阶梯共有多少阶? (16)猜数游戏 在这个实验中,我们将尝试编写一个猜数游戏程序,这个程序看上去有些难度,但是如果按下列要求循序渐进地编程实现,会发现其实这个程序是很容易实现的。那么,现在就开始吧,先编写第1个程序,然后试着在第1个程序的基础上编写第2个程序,…… 程序1 编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,则计算机给出提示“Right!”,否则提示“Wrong!”,并告诉人所猜的数是大(Too high)还是小(Too low),然后结束游戏。要求每次运行程序时机器所“想”的数不能都一样。 程序2 编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,则结束游戏,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平;否则计算机给出提示,告诉人所猜的数是太大还是太小,直到人猜对为止。 程序3 编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,则结束游戏,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平;否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜10次,如果猜了10次仍未猜中的话,结束游戏。 程序4 编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平,则结束游戏;否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜10次,如果猜了10次仍未猜中的话,则停止本次猜数,然后继续猜下一个数。每次运行程序可以反复猜多个数,直到操作者想停止时才结束。 (17)给小学生出加法考试题 编写一个程序,给学生出一道加法运算题,然后判断学生输入的答案对错与否,按下列要求以循序渐进的方式编程。 程序1 通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!”,否则显示“Not correct! Try again!”,程序结束。 程序2 通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!”,否则显示“Not correct! Try again!”,直到做对为止。 程序3 通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!”,否则提示重做,显示“Not correct! Try again!”,最多给三次机会,如果三次仍未做对,则显示“Not correct! You have tried three times! Test over!”,程序结束。 程序4 连续做10道题,通过计算机随机产生两个1~10之间的加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!”,否则显示“Not correct!”,不给机会重做,10道题做完后,按每题10分统计总得分,然后打印出总分和做错的题数。 (18)学生成绩统计 从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实现下列功能: 1)统计不及格人数并打印不及格学生名单; 2)统计成绩在全班平均分及平均分之上的学生人数,并打印这些学生的名单; 3)统计各分数段的学生人数及所占的百分比。 提示:可考虑用两个一维数组实现学生成绩和学生信息的存储。 (19)歌手大赛评分 某歌手大赛,共有十个评委给选手打分,分数采用百分制,去掉一个最高分,去掉一个最低分,然后取平均分,得到歌手的最后成绩。 (20)统计 输入一行字符,以回车键作为结束标志,分别统计出大写字母、小写字母、空格、数字和其它字符的个数。 (21)求 的值,其中a是一个数字,如2+22+222+2222+22222(此时a=2,n=5),a和n均由键盘输入。 (22)读入一批正整数(以零或负数为结束标志),求其中的奇数和。 (23) 利用泰勒级数sin(x)≈ 计算sin(x) 的值。要求最后一项的绝对值小于10-5,并统计出此时累加了多少项(x由键盘输入)。 (24)最大值、最小值及其交换 输入一个正整数n (1<n<=10),再输入n 个整数,输出最大值极其下标(设最大值惟一,下标从0 开始)。 输入一个正整数n (1<n<=10),再输入n 个整数,将最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的n 个数。 (25)抓住肇事者 一辆卡车违反交通规则,撞人后逃跑。现场共有三个目击者,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是个数学家,他说,四位车号刚好是一个整数的平方。请根据以上线索帮助警方找到车号。 (26)百钱百鸡问题 中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱百鸡”问题:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问翁、母、雏各几何。 (27)有一堆鱼,由A、B、C、D、E五人先后进行分配。A第一个到来,他将鱼平分作5份,把多余的一条扔回湖中,拿走自己分好的一份回家去了;B第二个到来,也将鱼平分为5份,扔掉多余的一条,只拿走自己分好的一份;接着C、D、E依次到来,也按同样的方法分鱼。问这堆鱼共有多少条?每个人到来时看到的鱼数是多少条? (28)约瑟夫环问题:编号为1,2,3,...,n的n个人按顺时针方向围坐一圈,每人持有一个正整数密码。一开始任选一个正整数m作为报数上限值,从第一个人开始按顺时针报数,报到m时停止,报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计程序求出出列顺序。 (29)某公司在传输数据过程中为了安全要对数据进行加密,若传递的是四位的整数,对其进行加密的规则为:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。如:输入数字7659,则加密后的数字为4012 (30) 将十进制正整数用除n取余法转换为n进制数输出。(n从键盘输入) (31)从键盘输入一行字符,统计其中有多少单词,假设单词之间以逗号分隔。 (32)从键盘输入一字符串,放在字符数组a中,将字符数组a中下标值为偶数的元素按从小到大排序。 (33)编写程序输出以下杨辉三角形(要求输出10行)。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 … … … … … … (34)编写程序查找数值18在以下二维数组中第一次出现的位置。 3 4 5 18 8 12 16 54 43 34 18 7 (35)设有4行4列的数组a,其元素a[i][j]=3*i+2*j-6。编写程序,实现如下功能: ① 求第二行4元素的累加和; ② 求第四列4元素的平均值; ③ 求主对角线4元素中负数的个数。 (36)编写程序输出100~1000内的可逆素数。可逆素数是指:一个素数将其各位数字的顺序倒过来构成的反序数也是素数。如157和751均为素数,它们是可逆素数。要求调用两个子函数实现。 (37)输入一行数字字符存入字符数组str[80]中,用num[10]中的数组元素作为计数器来统计每个数字字符的个数。用下标为0的元素统计字符“0”的个数,用下标为1的元素统计字符“1”出现的次数,……。输出每个奇数字符出现的次数。 (38)假设数组a有4行4列的随机整数,计算每行的平均值,保留两位小数,然后输出平均值和每行的最大值。 (39)输入一行字符串,分别统计字符串中各元音字母(AEIOU)的个数(不分大小写)。 (40)编写程序计算并输出:1 + 12 + 123 + 1234 + …… 的前n(设0<n<10)项的和,n从键盘输入。 例如输入:3,则输出:136 又如输入:6,则输出:137171 (41)功能说明:函数fun求sum=d+dd+ddd+……+dd...d(n个d),其中d为1-9的数字。从主函数中输入d和n,调用fun函数,并以sum=XXXXXXX的形式输出结果。 如输入d=3,n=4 则输出:sum=3702 (42)随机产生N个数,按升序排序,然后在其中查找数据k,若找到,显示查找成功的信息,并将该数据删除;若没有找到,则将数据k插入到这些数中,插入操作后数据仍然有序。 (43)编写一个程序实现如下功能:有4名学生,每个学生信息包含学号、姓名、数学成绩、英语成绩、C语言成绩和三门课程的总分,并对数据进行输入和输出。 (44) 编写一个程序实现如下功能:定义一个点的结构数据类型,实现下列功能:①为点输入坐标值。②求两个点中点坐标。③求两点间距离。 (45)编写一个程序实现如下功能:建立一个单链表,每个结点数据要有职工号、工资。用一个creat函数来建立链表,用list函数输出数据(数据自定)。 (46)编写一个程序实现如下功能:有5个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stud”中。 (47) 编写一个程序实现如下功能:将一个整形ASCII码文件FileA.txt复制到ASCII码文件FileB.txt。 FileA.txt FileB.txt 10 11 12 13 14 15 10 11 12 13 14 15 20 21 22 23 24 25 20 21 22 23 24 25 30 31 32 33 34 35 30 31 32 33 34 35 (48)编写一个程序实现如下功能:有一个整数文件(二进制文件),读取其中的数值,如果为奇数加一;如果为偶数,减一,存放到新的文件中去。 (49)从键盘输入若干行字符,将其存入“s8”磁盘文件中,再从文件中读取这些字符,将其中的大写字母转换成小写字母后输出到屏幕显示。 (50)以下程序从文件“student.txt”读取学生的学号、姓名、平时成绩和考试成绩,再从键盘上输入一个成绩,将所有考试成绩达到或超过该成绩的学生数据写到新的文本文件“studentD.txt”。文件的最后一行为0表示学生数据结束。 设文件student.txt的内容为 101 Zhao 95 58 103 Qian 75 81 105 Sun 99 91 107 Li 80 67 0 运行时键盘输入:80 则生成新文件studentD.txt的内容为: 103 Qian 75 81 105 Sun 99 91 0 例示说明:student.txt中考试成绩在80分以上的Qian与Sun信息写到studentD.txt 三、课程设计的进度安排 熟悉文件内容 1天 整体设计和详细设计、编代码 1天 编代码、调试和测试  1天 实训报告书写 1天 演示软件   1天 四、指导书、参考资料 谭浩强著 《C程序设计》(第四版) 清华大学出版社 夏耘 吉顺如主编 《大学程序设计(C)实践手册》 复旦大学出版社 六、其他 附件为实训报告封面样张