实验项目指导书

更新时间:2023-08-28 12:17:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验项目指导书

实验项目名称: 学生成绩管理系统

实验类型: 综合型

所属课程:计算机程序设计基础(C) 所属实验室:计算机基础实验中心 适用专业:机电学院、理学院各专业

刘明才2010年6月1日

目 录

实验项目指导书 ............................................................................................................................... 1

1.实验目的 ............................................................................................................................. 3 2.实验准备 ............................................................................................................................. 3 3.实验内容 ............................................................................................................................. 3 4.实验步骤 ............................................................................................................................. 3

4.1分析问题 ..................................................................................................................... 3 4.2编写主函数 ................................................................................................................. 4 4.3编写输入记录函数 ..................................................................................................... 8 4.4编写显示记录函数 ..................................................................................................... 9 4.5编写排序函数 ........................................................................................................... 10 4.6编写统计数据函数 ................................................................................................... 11 4.7编写向文件中写记录函数 ....................................................................................... 13 4.8编写从文件中读记录函数 ....................................................................................... 14 5.功能扩充 ........................................................................................................................... 15 6.撰写实验报告 ................................................................................................................... 16

1.实验目的

(1)通过实验了解较大程序的设计方法。 (2)掌握结构化程序设计方法。

2.实验准备

(1)预习第9章结构体类型的定义和结构体变量的定义与引用。 (2)预习第10章文件指针变量的定义以及与文件操作有关的函数 (2)了解实验内容。

3.实验内容

编写一个综合的学生成绩管理程序。学生信息包括:学号、姓名、成绩。一个学生的信息称为一个记录,程序要求实现以下功能:

(1)输入记录 (2)显示记录

(3)按学号排序记录

(4)输出统计信息:总记录数、最高分、最低分及平均分 (5)从文件读取记录 (6)将记录写入文件

4.实验步骤

4.1分析问题

从题目要求可知,每个学生的记录包括下面3个属性:学号、姓名和成绩。每个属性需要用不同的数据类型表示,学号可以用整数表示,也可以用字符串表示,本题用字符串表示,姓名必须用字符串表示,成绩可用整数表示。所以每个学生的记录可用一个结构体表示:

struct student { char num[10]; char name[20]; int score; }

所有学生的记录用一个结构体数组表示。从题目所要求的功能看,可编写六个函数分别完成相应的功能,如图1所示:

根据以上分析,程序设计步骤如下:

(1)编写主函数,由主函数调用其它函数。 (2)编写输入记录的函数。 (3)编写显示记录的函数。 (4)编写记录排序的函数。 (5)编写统计数据函数。

(6)编写从文件读取记录函数。 (7)编写将记录写入文件函数。

4.2编写主函数

1.编写主函数main

为了使程序即能在TC2.0环境运行,又能在VC++6.0环境下运行,提示信息用英文表示。主函数运行时,首先在屏幕上显示如下提示(菜单):

***************************************** Students' score management system 1. Input records

2. Display all records 3. Sort by number 4. Statistic

5. Read from a Text File 6. Write to a Text file 0. Exit

***************************************** Input your choice(0-9):

程序根据用户输入的选择(0—9)调用相应的函数。 程序如下:

#include<stdio.h> #include<stdlib.h> #include<string.h>

/* 定义结构体类型STU */

图1

typedef struct { char num[10]; /* 学号 */ char name[20]; /* 姓名 */ int score; /* 成绩 */ }STU;

STU stu[80]; /* 定义结构体数组 */ /* 输入记录函数Input */ /* 显示记录函数Display */ /*记录排序函数Sort_by_num */ /*统计数据函数Statistic */

/*从文件读记录函数Read_from_file */ /*向文件写记录函数Write_to_file */

void main() /* 主函数 */

{ int n=0; /* 存放记录个数 */

char c; /* 存放用户选择的数字字符 */

for(;;) { do{

system("cls"); /* 清屏幕函数 */

printf("*****************************************\n"); printf(" Students' score management system \n"); printf(" 1. Input records \n");

printf(" 2. Display all records \n"); printf(" 3. Sort by number\n"); printf(" 4. Statistic \n");

printf(" 5. Read from a Text File\n");

printf(" 6. Write to a Text file \n"); printf(" 0. Exit \n");

printf("*****************************************\n"); printf("Input your choice(0-9):"); c=getchar();

}while(c<'0'||c>'9'); /* 若输入的不是数字字符,则重新输入 */

switch(c) { case '1':

printf("Input Records\n"); /* 输入若干条记录 */ /* 调用输入记录函数*/ system("pause"); break; case '2':

printf("Display All Records\n"); /* 显示所有记录 */ /* 调用显示记录函数*/ system("pause");

break; case '3':

printf("Sort\n");

/* 调用排序函数*/

printf("Sort Succeeded!\n"); system("pause"); break; case '4':

printf("Statistic\n");

/* 调用统计数据函数*/ system("pause"); break; case '5':

printf("Read from a file\n"); /* 调用读文件函数*/ system("pause"); break; case '6':

printf("Write to a Text file\n"); /* 调用写文件函数*/ system("pause"); break; case '0':

printf("Have a Good Luck,Bye-bye!\n"); /* 结束程序 */ system("pause"); exit(0); } } }

2.调试主函数

将上述程序在TC2.0环境下进行调试运行。

程序运行后,屏幕显示如图2所示的主菜单选项:

图2

输入1并按回车键后,屏幕显示如图3所示:

图3

按任意键后,回到主菜单,如图2所示。 输入2并按回车键后,屏幕显示如图4所示:

图4

按任意键后,回到主菜单,如图2所示。 输入3并按回车键后,屏幕显示如图5所示:

图5

按任意键后,回到主菜单,如图2所示。 输入4并按回车键后,屏幕显示如图6所示:

图6

按任意键后,回到主菜单,如图2所示。 输入5并按回车键后,屏幕显示如图7所示:

图7

按任意键后,回到主菜单,如图2所示。 输入6并按回车键后,屏幕显示如图8所示:

图8

按任意键后,回到主菜单,如图2所示。 输入0并按回车键后,屏幕显示如图9所示:

图9

按任意键后,退出程序。

4.3编写输入记录函数

1.编写输入记录函数Input 函数编写如下: /* Input函数

功能:输入若干个记录。

参数:从结构体数组元素stu[n]开始输入,n表示原有记录个数。 返回值:输入的记录个数。 */

int Input(STU stu[],int n)

{ int i=0; /* 统计输入记录的个数 */

char sign; /* 存放用户输入的选择Y/N */ char x[10]; /* x[10]为清除多余的数据所用 */ while(sign!='n'&&sign!='N') { printf("student's num:"); scanf("%s",stu[n+i].num); printf("student's name:"); scanf("%s",stu[n+i].name); printf("student's score:"); scanf("%d",&stu[n+i].score); gets(x); /* 清除多余的输入 */

printf("any more records?(Y/N)"); /* 选Y输入下一个记录,选N输入结束 */ scanf("%c",&sign); i++; }

return(n+i); }

2.调试程序

(1)将输入记录函数Input插入到main函数前的注释部分

/* 输入记录函数Input */

处。

(2)在main函数中的switch语句中的注释部分

/* 调用输入记录函数*/

处插入语句

n=Input(stu,n);

(3)程序运行结果如图10所示。

图10

按任意键后,返回主菜单,如图2所示。

4.4编写显示记录函数

1.编写显示记录函数Display 函数编写如下: /* Display函数

功能:显示记录

参数:从结构体数组元素stu[0]开始输出n个记录 返回值:无 */

void Display(STU stu[],int n) { int i;

printf("%-15s%-15s%-15s\n","number","name","score"); for(i=0;i<n;i++)

{ printf("%-15s%-15s%-15d\n",stu[i].num,stu[i].name,stu[i].score);

if(i>0&&i%20==0) system("pause"); /* 每输出20个记录暂停 */ }

system("pause"); }

2.调试程序

(1)将显示记录函数Display插入到main函数前的注释部分

/* 显示记录函数Display */

处。

(2)在main函数中的switch语句中的注释部分

/* 调用显示记录函数*/

处插入语句

Display(stu,n);

(3)程序运行后,按图10所示输入3个记录,按任意键后,返回主菜单。当输入2后,屏幕显示结果如图11所示。

图11

按任意键后,返回主菜单,如图2所示。

4.5编写排序函数

1.编写排序函数Sort_by_num /* Sort_by_num函数 功能:按学号排序

参数:对结构体数组stu的前n个元素排序 返回值:无 */

void Sort_by_num(STU *stu,int n) { int i,j;

STU temp;

for(i=0;i<n-1;i++) /*冒泡法排序*/ for(j=0;j<n-1-i;j++)

if(strcmp(stu[j].num,stu[j+1].num)>0) { temp=stu[j]; stu[j]=stu[j+1]; stu[j+1]=temp; } }

2.调试程序

(1)将排序函数Sort_by_num 插入到main函数前的注释部分

/*记录排序函数Sort_by_num */

处。

(2)在main函数中的switch语句中的注释部分

/* 调用排序函数*/

处插入语句

Sort_by_num(stu,n);

(3)程序运行后,按图10所示输入3个记录,按任意键后,返回主菜单。当输入3后,屏幕显示结果如图12所示。

图12

按任意键后,返回主菜单,如图2所示。再输入2,屏幕显示如图13所示。

图13

4.6编写统计数据函数

1.编写统计数据函数Statistic /* Statistic函数

功能:输出统计信息:总记录数、最高分、最低分及平均分 参数:统计结构体数组stu的前n个记录 返回值:无 */

void Statistic(STU stu[],int n)

{ int i,j=0,k=0,sum=0; float aver;

for(i=0;i<n;i++) { sum+=stu[i].score;

if(stu[j].score>stu[i].score) j=i; if(stu[k].score<stu[i].score) k=i; }

aver=1.0*sum/n;

printf("there are %d records.\n",n); /*总记录数*/ printf("the hignest score:\n"); /*最高分*/

printf("number:%s name:%s score:%d\n",stu[k].num,stu[k].name,stu[k].score); printf("the lowest score:\n"); /*最低分*/

printf("number:%s name:%s score:%d\n",stu[j].num,stu[j].name,stu[j].score); printf("the average score is %5.2f\n",aver); /*平均分*/ }

2.调试程序

(1)将统计数据函数Statistic插入到main函数前的注释部分

/*统计数据函数Statistic */

处。

(2)在main函数中的switch语句中的注释部分

/* 调用统计数据函数*/

处插入语句

Statistic(stu,n);

(3)程序运行后,按图10所示输入3个记录,按任意键后,返回主菜单。当输入4后,屏幕显示结果如图14所示。

图14

按任意键后,返回主菜单,如图2所示。

4.7编写向文件中写记录函数

1.编写向文件中写记录函数Write_to_file /* Write_to_file函数

功能:将记录写入文件

参数:将数组stu的前n个记录写入文件 返回值:无 */

void Write_to_file(STU stu[],int n) { int i=0;

FILE *fp; /* 定义文件指针 */ char filename[20]; /* 定义文件名 */

printf("Write Records to a Text File\n"); /* 输入文件名 */ printf("Input the filename:"); scanf("%s",filename);

if((fp=fopen(filename,"w"))==NULL) /* 打开文件 */ { printf("cann't open the file\n"); system("pause"); return; }

fprintf(fp,"%d\n",n); /* 写入记录个数 */ while(i<n)

{ fprintf(fp,"%-16s%-15s%d\n",stu[i].num,stu[i].name,stu[i].score); i++; }

fclose(fp); /* 关闭文件 */

printf("Successed!\n"); /* 返回成功信息 */ }

2.调试程序

(1)将向文件中写记录函数Write_to_file插入到main函数前的注释部分

/*向文件写记录函数Write_to_file */

处。

(2)在main函数中的switch语句中的注释部分

/* 调用写文件函数*/

处插入语句

Write_to_file(stu,n);

(3)程序运行后,按图10所示输入3个记录,按任意键后,返回主菜单。当输入6后,屏幕提示输入存放数据的文件名,如输入student,并按回车,屏幕显示结果如图15所示。

图15

按任意键后,返回主菜单,如图2所示。

4.8编写从文件中读记录函数

1.编写从文件中读记录函数Read_from_file /* Read_from_file函数

功能:从文件中读取数据

参数:从数组元素stu[n]开始输入 返回值:记录个数 */

int Read_from_file(STU stu[],int n) { int i=0,num; FILE *fp; /* 定义文件指针 */ char filename[20]; /*定义文件名*/ printf("Input the filename:");

scanf("%s",filename); /*输入文件名*/ if((fp=fopen(filename,"r"))==NULL) /*打开文件*/ { printf("cann't open the file\n"); /*打开失败信息*/ system("pause"); return(n); } fscanf(fp,"%d",&num); /*读入总的记录个数*/ while(i<num)

{ fscanf(fp,"%s%s%d",stu[n+i].num,stu[n+i].name,&stu[n+i].score); i++; }

n+=num; fclose(fp); /*关闭文件*/ printf("Successed!\n"); system("pause");

return(n); }

2.调试程序

(1)将从文件中读记录函数Read_from_file插入到main函数前的注释部分

/*从文件读记录函数Read_from_file */

处。

(2)在main函数中的switch语句中的注释部分

/* 调用读文件函数*/

处插入语句

n=Read_from_file(stu,n);

(3)程序运行后,出现主菜单。当输入5后,屏幕出现提示信息:输入文件名,如输入文件名student,并按回车后,屏幕显示结果如图16所示。

图16

按任意键后,返回主菜单,如图2所示。 至此,整个程序输入并调试完毕。

5.功能扩充

同学们可在上述实验的基础上进行修改和功能扩充。例如: (1) 编写函数,其功能是删除用户指定的记录。 (2) 编写函数,其功能是查找某记录。 (3) 编写函数,其功能是按成绩排序。 以及其它功能。

本例采用静态结构体数组存放学生记录,其优点是程序设计简单,思路清楚,容易实现,缺点是数组的大小是在程序中固定的,要想改变大小,就要改写程序。如果用链表存放学生记录,则灵活性较大,通用性强,学生可尝试用动态链表方式编写学生成绩管理程序。

6.撰写实验报告

学生做完该实验后要撰写实验报告,其格式如下:

计算机程序设计基础(C)实验报告

一、实验目的

二、实验内容

三、设计方法

四、源程序

五、测试数据

六、实验心得

七、教师评语

本文来源:https://www.bwwdw.com/article/mdhi.html

Top