高级语言程序设计实训报告

江 西 科 技 师 范 大 学

实 验 报 告

课 程 高级语言程序

系 别 数计学院

班 级 计算机(职教)

学 号 20122071

姓 名 乐四芳

告 规

一、实验目的

四、实验方法及步骤

二、实验原理

五、实验记录及数据处理

三、实验仪器

六、误差分析及问题讨论

1. 实训一 学生管理系统

2.

3.

4.

5.

6.

7.

8.

9. 目 录

10.

11.

12.

13.

14.

15.

每次实验课必须带上此本子,以便教师检查预习情况和记录实验原始数据。

实验时必须遵守实验规则。用正确的理论指导实践袁必须人人亲自动手实验,但反 对盲目乱动,更不能无故损坏仪器设备。

这是一份重要的不可多得的自我学习资料袁它将记录着你在大学生涯中的学习和学 习成果。请你保留下来,若干年后再翻阅仍将感到十分新鲜,记忆犹新。它将推动你在 人生奋斗的道路上永往直前

实训一 学生成绩管理系统

一、实训目的和要求

江 西 科 技 师 范 大 学 实 验 报 告

班 姓名

利用单链表结构实现学生成绩管理,了解数据库管理的基本功能,掌握C语言中的结构体、指针、函数、文件操作等知识,是一个C语言知识的综合应用。注意其中的难点,指针变量作函数参数、函数值为指向结构体的指针及单链表机构的应用等知识。

二、主要仪器设备

安装了Windows操作系统、Turbo C 或Visual C++的计算机。

三、实训内容和原理

设计一个学生成绩管理系统,该系统使用单链表结构管理学生成绩,具有输入记录、查询记录、更新记录、统计记录及输出记录等功能。

四、实训小结

1、功能描述如下图:

指导老师: 第 页

江 西 科 技 师 范 大 学 实 验 报 告

班 姓名

2、总体设计

(1)功能模块设计

(2)数据结构设计

1.数据录入:数据录入的功能是将需要的数据进行录入,用于后面的 各项操作。实现:用输入函数对数据进行录入,先确定学生的个数,再用一个循环进行输入,选修课程数量亦然。

2.数据插入:数据插入的主要功能是在数据录入之后,为防止数据输入的遗漏,实现:分为两个部分,第一个是插入第一个位置,第二是插入第一个位置之后,把当前的位置赋给后面的加以实现。

3.数据查询: 数据查询的主要功能是在数据输入之后进行分类再现,实 现:分为输出所有数据,按学号查询,按姓名查询,当输入的数据满足条件时即输出所要求的。

4.数据删除:数据删除的主要功能是在数据录入、数据插入和数据修改完成之后对无用数据进行删除,实现:输入学号,满足条件时即把后一个数值赋给前一个数值,达到删除的目的。

5.平均值计算:平均值计算的主要功能是求平均值,再对其进行排序,实现:用公式进行计算求平均值,之后便是排序问题,求最大值,然后依次输出各最大值,即实现了排序功能。

(3)函数功能描述

1. Meu函数

是定义一个菜单函数,其功能在于输出菜单界面供使用者选择。

2.input

是定义用于输入学生信息

3 . void print data ()

指导老师: 第 页

江 西 科 技 师 范 大 学 实 验 报 告

班 姓名 n 待打印的学生在数组中的下标。

4.void count score

计算平均成绩和总成绩

5.void search infor

查询学生成绩信息

6. Int search num (char numbet [8])

按学生的学号查询学生的基本信息。

7. void sort date ()

按学生的不同成绩进行排序操作

8. Void delete data ()

删除某个学生的基本信息

9. Void modify data()

修改学生的基本信息

10. Void save data()

保存更新过的数据

3、程序实现

(1)源码分析

#include "stdio.h" /*I/O函数*/

#include "stdlib.h" /*其它说明*/

#include "string.h" /*字符串函数*/

#include "conio.h" /*屏幕操作函数*/

#include "mem.h" /*内存操作函数*/

#include "ctype.h" /*字符操作函数*/

#include "alloc.h" /*动态地址分配函数*/

#define N 3 /*定义常数*/

typedef struct z1 /*定义数据结构*/

{

char no[11];

char name[15];

int score[N];

float sum;

float average;

int order;

struct z1 *next;

}STUDENT;

/*以下是函数原型*/

STUDENT *init(); /*初始化函数*/

STUDENT *create(); /*创建链表*/

STUDENT *delete(STUDENT *h); /*删除记录*/

指导老师: 第 页

江 西 科 技 师 范 大 学 实 验 报 告

班 姓名 void print(STUDENT *h); /* 显示所有记录*/

void search(STUDENT *h); /*查找*/

void save(STUDENT *h); /*保存*/

STUDENT *load(); /*读入记录*/

void computer(STUDENT *h); /*计算总分和均分*/

STUDENT *insert(STUDENT *h); /*插入记录*/

void append(); /*追加记录*/

void copy(); /*复制文件*/

STUDENT *sort(STUDENT *h); /*排序*/

STUDENT *index(STUDENT *h); /*索引*/

void total(STUDENT *h); /*分类合计*/

int menu_select(); /*菜单函数*/

/******主函数开始*******/

main()

{

int i;

STUDENT *head; /*链表定义头指针*/

head=init(); /*初始化链表*/

clrscr(); /*清屏*/

for(;;) /*无限循环*/

{

switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/

{ /*值不同,执行的函数不同,break 不能省略*/

case 0:head=init();break; /*执行初始化*/

case 1:head=create();break; /*创建链表*/

case 2:head=delete(head);break; /*删除记录*/

case 3:print(head);break; /*显示全部记录*/

case 4:search(head);break; /*查找记录*/

case 5:save(head);break; /*保存文件*/

case 6:head=load(); break; /*读文件*/

case 7:computer(head);break; /*计算总分和均分*/

case 8:head=insert(head); break; /*插入记录*/

case 9:copy();break; /*复制文件*/

case 10:head=sort(head);break; /*排序*/

case 11:append();break; /*追加记录*/

case 12:head=index(head);break; /*索引*/

case 13:total(head);break; /*分类合计*/

case 14:exit(0); /*如菜单返回值为14程序结束*/

}

}

}

/*菜单函数,返回值为整数*/

menu_select()

指导老师: 第 页

江 西 科 技 师 范 大 学 实 验 报 告

班 姓名 {

char *menu[]={"***************MENU***************", /*定义菜单字符串数组*/

" 0. init list", /*初始化*/

" 1. Enter list", /*输入记录*/

" 2. Delete a record from list", /*从表中删除记录*/

" 3. print list ", /*显示单链表中所有记录*/

" 4. Search record on name", /*按照姓名查找记录*/

" 5. Save the file", /*将单链表中记录保存到文件中*/

" 6. Load the file", /*从文件中读入记录*/

" 7. compute the score", /*计算所有学生的总分和均分*/

" 8. insert record to list ", /*插入记录到表中*/

" 9. copy the file to new file", /*复制文件*/

" 10. sort to make new file", /*排序*/

" 11. append record to file", /*追加记录到文件中*/

" 12. index on nomber", /*索引*/

" 13. total on nomber", /*分类合计*/

" 14. Quit"}; /*退出*/

char s[3]; /*以字符形式保存选择号*/

int c,i; /*定义整形变量*/

gotoxy(1,25); /*移动光标*/

printf("press any key enter menu......\n"); /*压任一键进入主菜单*/

getch(); /*输入任一键*/

clrscr(); /*清屏幕*/

gotoxy(1,1); /*移动光标*/

textcolor(YELLOW); /*设置文本显示颜色为黄色*/

textbackground(BLUE); /*设置背景颜色为蓝色*/

gotoxy(10,2); /*移动光标*/

putch(0xc9); /*输出左上角边框┏*/

for(i=1;i<44;i++)

putch(0xcd); /*输出上边框水平线*/

putch(0xbb); /*输出右上角边框 ┓*/

for(i=3;i<20;i++)

{

gotoxy(10,i);putch(0xba); /*输出左垂直线*/

gotoxy(54,i);putch(0xba);

} /*输出右垂直线*/

gotoxy(10,20);putch(0xc8); /*输出左上角边框┗*/

for(i=1;i<44;i++)

putch(0xcd); /*输出下边框水平线*/

putch(0xbc); /*输出右下角边框┛*/

window(11,3,53,19); /* 制作显示菜单的窗口,大小根据菜单条数设计*/

clrscr(); /*清屏*/

指导老师: 第 页

江 西 科 技 师 范 大 学 实 验 报 告

班 姓名 for(i=0;i<16;i++) /*输出主菜单数组*/

{

gotoxy(10,i+1);

cprintf("%s",menu[i]);

}

textbackground(BLACK); /*设置背景颜色为黑色*/

window(1,1,80,25); /*恢复原窗口大小*/

gotoxy(10,21); /*移动光标*/

do{

printf("\n Enter you choice(0~14):"); /*在菜单窗口外显示提示信息*/

scanf("%s",s); /*输入选择项*/

c=atoi(s); /*将输入的字符串转化为整形数*/

}while(c<0||c>14); /*选择项不在0~14之间重输*/

return c; /*返回选择项,主程序根据该数调用相应的函数*/

}

STUDENT *init()

{

return NULL;

}

/*创建链表*/

STUDENT *create()

{

int i; int s;

STUDENT *h=NULL,*info; /* STUDENT指向结构体的指针*/

for(;;)

{

info=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/

if(!info) /*如果指针info为空*/

{

printf("\nout of memory"); /*输出内存溢出*/

return NULL; /*返回空指针*/

}

inputs("enter no:",info->no,11); /*输入学号并校验*/

if(info->no[0]=='@') break; /*如果学号首字符为@则结束输入*/

inputs("enter name:",info->name,15); /*输入姓名,并进行校验*/

printf("please input %d score \n",N); /*提示开始输入成绩*/

s=0; /*计算每个学生的总分,初值为0*/

for(i=0;i<N;i++) /*N门课程循环N次*/

{

do{

printf("score%d:",i+1); /*提示输入第几门课程*/

scanf("%d",&info->score[i]); /*输入成绩*/

if(info->score[i]>100||info->score[i]<0) /*确保成绩在0~100之间*/

指导老师: 第 页

江 西 科 技 师 范 大 学 实 验 报 告

班 姓名 printf("bad data,repeat input\n"); /*出错提示信息*/

}while(info->score[i]>100||info->score[i]<0);

s=s+info->score[i]; /*累加各门课程成绩*/

}

info->sum=s; /*将总分保存*/

info->average=(float)s/N; /*求出平均值*/

info->order=0; /*未排序前此值为0*/

info->next=h; /*将头结点做为新输入结点的后继结点*/

h=info; /*新输入结点为新的头结点*/

}

return(h); /*返回头指针*/

}

/*输入字符串,并进行长度验证*/

inputs(char *prompt, char *s, int count)

{

char p[255];

do{

printf(prompt); /*允鞠提示信息*/

scanf("%s",p); /*输入字符串*/

if(strlen(p)>count)printf("\n too long! \n"); /*进行长度校验,超过count值重输入*/ }while(strlen(p)>count);

strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/

}

/*输出链表中结点信息*/

void print(STUDENT *h)

{

int i=0; /* 统计记录条数*/

STUDENT *p; /*移动指针*/

clrscr(); /*清屏*/

p=h; /*初值为头指针*/

printf("\n\n\n****************************STUDENT********************************\n"); printf("|rec|nO | name | sc1| sc2| sc3| sum | ave |order|\n");

printf("|---|----------|---------------|----|----|----|--------|-------|-----|\n");

while(p!=NULL)

{

(2)运行结果

指导老师: 第 页

相关推荐