资源描述
附件(四)本文档仅限于学习交流,禁止抄袭。程序结果截图非本人信息,请自行修改。深圳大学实验报告课程名称:C 程序设计实验名称:Lab Assignment 4学院:信息工程学院专业:指导教师:报告人:报告人学号:班级:实验时间:报告提交时间:教务处制一、实验目的与要求1.实验目的:(1) 进一步掌握C 语言的编程方法;进一步掌握数组的定义与使用;进一步掌握函数的定义和函数调用方法;(2) 学习和掌握结构体的定义和使用方法。(3) 学习和掌握文件的基本输入输出方法。2.实验要求:编写一个通过键盘或文件输入学生信息,并将学生信息输出到文件和屏幕的程序。1) 定义一个 student 结构体如下:struct student char name20; / 姓名float score4; / 四门功课的成绩float average; / 四门功课的平均成绩;其中, name 中存放同学的姓名;score4 数组中存放同学的英语、数学、物理、化学成绩; average 中存放上述四门功课的平均成绩。2) 编写下面六个函数。其中 6 个函数中的后 2 个函数是文件操作函数。函数的具体要求:void inputFromKeyboard(struct student stu, int num)从键盘输入学生信息的函数。stu 为结构体数组,num 为数组中元素的个数。void outputToScreen(struct student stu, int num)将学生信息输出到屏幕的函数。stu 为结构体数组,num 为数组中元素的个数。void averageScore(struct student stu, int num)计算学生平均成绩的函数。stu 为结构体数组,num 为数组中元素的个数。void sortByAverageScore(struct student stu, int num)根据学生的平均成绩对学生信息整体排序的函数。stu 为结构体数组,num 为数组中元素的个数。void inputFromFile(struct student stu, int num, FILE *fp)从文件输入学生信息的函数。stu 为结构体数组, num 为数组中元素的个数,fp为以“读”方式打开的文本文件的指针。void outputToFile(struct student stu, int num, FILE *fp)将学生信息输出到文件的函数。stu 为结构体数组,num 为数组中元素的个数,fp为以“写”方式打开的文本文件的指针。3) 编写主函数对你所编写的上述六个函数进行调用验证。主函数可分下面几个阶段编写:第 1 个阶段 (可参考在第 11 章的实验作业 ):定 义 3 个 学生 的 结构体 数 组 , 编 写 函 数 inputFromKeyboard 、 outputToScreen 和averageScore。调用函数 inputFromKeyboard 由键盘输入学生的信息 ( 姓名、英语、数学、物理、化学成绩 ),调用函数 outputToScreen 将输入的信息显示到屏幕上;上述两个函数调试正确后,编写函数 averageScore并调用,计算每个同学的平均成绩,然后调用函数 outputToScreen,将计算后的数据信息显示到屏幕上第 2 个阶段:编写函数outputToFile 。调用函数inputFromKeyboard 由键盘输入3 个学生的信息 ( 姓名、英语、数学、物理、化学成绩 ),并以文本“写”方式打开文本student1.txt 文件,调用函数outputToFile ,将这 3 个同学的信息存入student1.txt 文本文件,关闭该文件;使用windows XP 的“记事本”文本编辑器打开文本文件student1.txt 查看是否正确。其中,在程序运行后文本文件student1.txt 中可能的内容及格式为:刘翔88.0 76.0 78.0 70.0 -107374176.0姚明98.0 67.0 79.0 65.0 -107374176.0李娜89.0 79.0 85.0 79.0 -107374176.02第 3 个阶段:编写函数inputFromFile 。将上面两个阶段中调用函数inputFromKeyboard 的语句变成注释行。以文本“读”方式打开文本student1.txt 文件,调用函数inputFromFile ,将这 3 个同学的信息读入并存放到学生信息结构体数组中,关闭该文件;调用函数averageScore计算每个同学的平均成绩,并将平均成绩存储在结构数组的相应位置处。调用函数outputToScreen 将学生的完整的信息显示到屏幕上;以文本“写”方式打开文本student2.txt 文件,调用函数outputToFile ,将这 3 个同学的计算有平均成绩的所有信息存入 student2.txt 文本文件,关闭该文件;在这段程序运行后文本文件 student2.txt 中可能的内容及格式为:刘翔 88.0 76.0 78.0 70.0 78.0姚明98.0 67.0 79.0 65.0 77.3李娜89.0 79.0 85.0 79.0 83.0第 4 个阶段,完整调试6 个函数:编写函数sortByAverageScore。在第 3 阶段编写的程序段后面添加下面的语句:调用函数sortByAverageScore 根据学生的平均成绩对学生信息整体排序。调用函数outputToScreen 将学生的完整的信息显示到屏幕上;以文本“写”方式打开文本 student3.txt 文件,调用函数 outputToFile ,将排序后的这 3 个同学的所有信息存入 student3.txt 文本文件,关闭该文件;在程序运行后文本文件 student3.txt 中可能的内容及格式为:李娜89.0 79.0 85.0 79.0 83.0刘翔88.0 76.0 78.0 70.0 78.0姚明98.0 67.0 79.0 65.0 77.3结束主程序。二、实验步骤与过程:1.试验流程图设计:开始编写编写 outputToFile函inputStudentInform定义一个结构体,数,用于向文件中输函数,用于输入学生类型是student入数据的信息编写 averageScore编写inputFromFile编写outputStudentInfo函数,用于计算学函数,用于向文件rm 函数,用于输出生的平均成绩中读取数据学生的信息写主函数,调用inputStudentInform和函 outputStudentInform数并从键盘输入和输出调用outputToFile函数,用于将输入的数据存入student1.txt文件中先注释掉上面的代码,然后调用inputFromFile和outputStudentInform函数,用于从student1.txt文件中读取上一步骤中输入的数据和输出数据编写sortByAverageScore函数,用于对学生的成绩排序调用averageScore函数和outputStudentInform函数用于计算各位同学的平均成绩,然后将新的数据写入到student2.txt文件中调用sortByAverageScore函数和outputStudentInform,分别用于对成绩排序和将新的数据写入到student3.txt文件中结束2.本实验的代码:#include stdio.h#includestdlib.h#define NUM 4struct student char name20;int score4;float average;void inputStudentInform(struct student stu,int num)int k = 0;for(;k num;k +)printf( 请输入第 %d 个同学的姓名:,k + 1);gets(stuk.name);fflush(stdin);printf(请输入第%d个同学的英语成绩:,k + 1);scanf(%d,&stuk.score0);printf(请输入第%d个同学的数学成绩:,k + 1);scanf(%d,&stuk.score1);printf(请输入第%d个同学的物理成绩:,k + 1);scanf(%d,&stuk.score2);printf(请输入第%d个同学的化学成绩:,k + 1);scanf(%d,&stuk.score3);fflush(stdin);void averageScore(struct student stu, int num)int k = 0;for(;k num;k +)stuk.average = 0;for(int i = 0; i 4;i +)stuk.average += stuk.scorei;stuk.average /= 4.0;void outputStudentInform(struct student stu, int num)int k = 0;for(;k num;k +)printf(n第 %d 个同学的信息如下:n,k +1);printf( 姓名: %sn,stuk.name);printf( 英语成绩: %dn,stuk.score0);printf( 数学成绩: %dn,stuk.score1);printf( 物理成绩: %dn,stuk.score2);printf( 化学成绩: %dnn,stuk.score3);printf( 平均成绩: %.2fnn,stuk.average);void outputToFile(struct student stu, int num,FILE *fp)int k;for(k = 0; k num; k +)fprintf(fp,%s,stuk.name);fprintf(fp,t%d,stuk.score0);fprintf(fp,t%d,stuk.score1);fprintf(fp,t%d,stuk.score2);fprintf(fp,t%d,stuk.score3);fprintf(fp,t%f,stuk.average);fprintf(fp,n);fclose(fp);void inputFromFile(struct student stu, int num,FILE *fp)int k;for(k = 0; k num; k +)fscanf(fp,%s,&stuk.name);fscanf(fp,%d,&stuk.score0);fscanf(fp,%d,&stuk.score1);fscanf(fp,%d,&stuk.score2);fscanf(fp,%d,&stuk.score3);fscanf(fp,%f,&stuk.average);void sortByAverageScore(struct student stu, int num)int k=0;struct student temp;for(int i=0;inum-1;i+)k=i;for(int j=i+1;jstuj.average)k=j;if(k!=j)temp = stui;stui=stuk;stuk=temp;void main( )FILE *fp1,*fp2,*fp3;struct student stuNUM;/*- 输入学生的成绩数据并存入student1 文件中 -*/inputStudentInform(stu,NUM);fp1 = fopen(student1.txt,w+);if(fp1 = NULL)printf( 打不开 student1 文件 :n);exit(0);outputToFile(stu,NUM,fp1);fclose(fp1);/*- 打开 student 文件并计算各位同学成绩的平均数并将新的数据存入student2 文件中 -*/fp1 = fopen(student1.txt,r+);if(fp1 = NULL)printf( 不存在 student1 文件 :n);exit(0);inputFromFile(stu,NUM,fp1);fclose(fp1);averageScore(stu,NUM);outputStudentInform(stu,NUM);fp2 = fopen(student2.txt,w);if(fp2 = NULL)printf( 打不开 student2 文件 :n);exit(0);outputToFile(stu,NUM,fp2);fclose(fp2);/*- 将各位同学按照平均成绩由小到大的顺序排列并将新的数据存入student3 文件中去 -*/ sortByAverageScore(stu,NUM); outputStudentInform(stu,NUM);fp3 = fopen(student3.txt,w);if(fp3 = NULL)printf( 打不开 student3 文件 :n);exit(0);outputToFile(stu,NUM,fp3);fclose(fp3);三、实验结果:四、实验结果与数据分析:1.首先,这次实验让我进一步掌握 C 语言的编程方法; 进一步掌握数组的定义与使用; 进一步掌握函数的定义和函数调用方法;学习和掌握结构体的定义和使用方法以及文件的基本输入输出方法。2.其次,这次实验锻炼了我的逻辑思维能力,第一次写完代码之后心里很得意,但是运行之后我就发现不用管我输入什么坐标,结果都是“您在A 区”,这令我很郁闷,因为代码编译没有错误啊。后来我发现有几句判断的语句我放的位置不对, 我就把不同程序段的代码调换了一下顺序就好了。 通过这个错误我体会到了结构化程序设计语言的执行特点了:从上往下依次执行。3.我认识到了写代码的重要性,例如空格,空行,缩进等细节。因为做到了这些细节,程序一旦发生了错误,修改的时候很容易下手,一目了然,别人看着也舒服。4.实验中遇到了一个问题:每当我在主函数中注释掉inputStudentInform(stu,NUM) 函数,然后打开inputFromFile(stu,NUM,fp1) 函数之后,程序的运行结果是乱码,跟之前没输入数据的结果一样,并且 student.txt 文 件 变 成 空 的 了 。 后 来 仔 细 想 了 想 , 是 因 为 我 只 注 释 掉 了 上 一 步 中 的inputStudentInform(stu,NUM) 函数,而没有注释掉 outputToFile(stu,NUM,fp1) 函数,这就导致我进行下 一 步 的 时 候 又 运 行 了 一 次 outputToFile(stu,NUM,fp1) 函 数 , 而 这 一 次 我 因 为 注 释 掉 了 inputStudentInform(stu,NUM) 而 没有输 入 数据 ,故上 一步中输 入的数 据将会 被清零 。 后来 将 inputStudentInform(stu,NUM) 函数和 outputToFile(stu,NUM,fp1) 函数都注释掉再进行下一步实验时就正常了。5.这次试验我浪费了大量的时间,因为我之前对文件输入与输出的相关基础知识都不熟悉,导致我像无头苍蝇一样做了很多无用功。由此“磨刀不误砍柴工”啊,以后一定要注重基础知识的学习!(注:“指导教师批阅意见”栏请单独放置一页)指导教师批阅意见:实验报告内容完实验数据准确性实验结果与数据实验报告(格式规实验态度(实验整性(程序与程序运分析范、按时完成)课考勤、实验表(20 分)行结果)( 30分)(20 分)(20 分)现)( 10分)完较不准较不正较不规较不好较一整完完确准够确正正范规够好般整整确准确确范规确范201510302010201002015101052说明:说明:说明:说明:说明:成绩评定:指导教师签字:年月日备注:
展开阅读全文