c语言程序设计课程设计指导书
一、课程设计性质、目的和任务
1、性质
本课程设计是计算机应用专业的专业技术实践课。
2、目的和任务
(1)利用单链表存储结构完成对学生成绩的动态管理。
(2)了解数据库管理的基本功能。
(3)掌握C语言中的结构体、指针、函数(系统函数、自定义函数)、文件操作等知识。
(4)注意其中的难点,指针变量作函数参数、函数值为指向结构体的指针以及单链表结构的应用等知识。
二、课程设计的主要内容与要求
1.课程设计教学要求:
1 要完成本实训,需要掌握结构体的定义、单链表的各种操作、数据验证、顺序查找方法、链式存储的直接插入排序方法、函数调用、函数参数、函数返回值类型、窗口技术、菜单的实现和功能调用。
2功能模块包括:初始化、输入、显示、删除、查找、插入、排序、计数、退出。
3学生成绩的动态管理要完成测试,直至得到运行稳定的程序。
4写出完整的设计报告。
2.课程设计基本内容及课程设计进程安排
具体的时间安排表格:
序号 | 课 题 内 容 | 时间(天) |
1 | 系统分析与设计 | 1 |
2 | 设计算法、画出系统程序的流程图(N-S) | 1 |
3 | 各函数的程序编写 | 6 |
4 | 整合、测试系统 | 1 |
5 | 撰写设计报告、答辩 | 1 |
总计 |
| 10 |
3、课程设计报告要求
1.通过资料查阅和学习掌握利用单链表存储结构完成对学生成绩的动态管理的方法。
2.设计算法完成实训要求,并画出整个系统的程序流程图,如N-S图。
3.根据程序流程图编写各函数的程序。
4.调试系统,使之能正确的实现系统功能。
5.准备并完成答辩过程
三、课程设计考核
1、考核办法
上机占70%,论文撰写占20%,答辩10%。
2、成绩评定办法
(1)算法与数据结构设计:30分
(2)软件编程及调试:30分
(3)总结论文:20分
(4)答辩:10分
(5)设计期间表现:10分
四、主要功能描述
学 生 成 绩 管 理
一.编程环境
Turbo C是在微机上广泛使用的编译程序。它具有方便、直观、易用的界面和丰富的库函数。它向用户提供了一个集成环境,把程序的编辑、编译、连接和运行等操作全部集中在一界面上进行,使用十分方便。故本实训的编程环境设定为Turbo C 2.0。
二.程序功能
本程序利用单链表存储结构完成对学生成绩的动态管理,其基本功能模块图如图1:
主程序 |
输入 |
显示
|
删除
|
查找
|
插入
|
排序 |
计数 |
初始化 |
退出 |
图1:基本功能模块图
三.程序设计目的
利用单链表结构实现学生成绩管理,交接数据库管理的基本功能。掌握c 语言的结构体,指针,函数(系统函数,自定义函数),文件操作等知识,是一个c 语言知识的综合应用,注意其中的难点,指针变量作函数参数,函数值为指向结构体的指针及单链表结构的应用等知识。
四.程序设计
4.1 设计思路
1.数据结构
将一个学生当作一个结点,这个结点的类型为结构体,结构体中的域表示学生的属性,每个结点除了存放属性外,还存放结点之间的关系,即存放指向后继结点的指针,所以定义表结点的结构如下:
#define N 3 /*定义课程门数,可以根据实际情况设定*/
typedef struct z1
{ char no[11]; /*学号由10个字符组成*/
char name[15]; /* 学生姓名*/
int score[N]; /*各门课成绩*/
float sum; /*总分*/
float average; /*平均分*/
int order; /*名次*/
struct z1 *next; /*指向后继结点的指针*/
}STUDENT; /*定义结构体类型*/
2.main()主函数
主函数是程序的入口,采用模块化设计,主函数不宜复杂,功能尽量在各模块中实现
首先声明一些必要的变量,然后坐一些无限循环程序,循环体作为一个开关语句,该语句的条件值是通过调用主菜单函数得到的妇女绘制,根据该值,调用相应的各功能函数,同时设置一个断点,即当返回值为一定条件时运行exit()函数结束程序,以免造成死循环。
3.menu_select() 主菜单
为更好的调用功能选项,突出菜单效果,突出窗口,制作了一个双边框的窗口,在窗口中显示主菜单,界面如图2所示:
图2:菜单界面
4.init()初始化
单链表需要一个头指针指向的第一个结点,对单链表的访问是从头文件开始的。初始化空链表为空(即设头指针为空)。空用NULL表示,该值在头文件stdio.h中定义为常数0。
5.crate()创建单链表
单在主菜单中输入了字符1时,进入创建链表函数,即输入学生信息,按照提示信息输入学号(字符串不超过10位)、姓名(字符串不超过14位)三门课程的成绩(整数0-100),每输入一个数就按一下回车键,当在输入学号首字符为@时结束输入,返回主函数,单链表创建完毕,输入界面如下图3:
图3:输入界面
对于数据库管理,为避免数据出错的概率,应考虑数据完整性的验证,该功能由两个函数create ()和inputs()完成。设置头指针为空,申请内存如果申请不到,则内存空间满,无法保存数据,则返回主程序,否则输入数据,并进行相应的校验,(学号和姓名调用函数inputs()输入和校验),成绩就在create()中边输入边验证,以输入合法数据,这是很必要的。当成绩输入后,系统自动计算该生的总分和平均分,并将名次数据先置0,待排序后再赋予新值。数据输入后,将其后继结点指针指向当前头结点,新头指针指向新插入结点,这样新赋予的结点总在头。数据输入结束后返回链表的头指针到主函数。
6.print()显示单链表
学生成绩表见路好后,更频繁地操作是显示和查找记录,本函数实现显示链表数据功能,输出界面如下图5所示:
图5:输出界面
由于单链表只能采取顺序访问的方法,所以定义一个指向结点的临时变量p,初值为单链表的头指针,输出指针所指记录三数据后,将指针后移一个记录,直到p指针值为空,则所有记录输出完毕。
7.delete()删除结点
删除指定学号学生的记录。首先输入要删除结点的学号,输出后根据学号顺序查找结点,如果没有找到,则输出没找到信息,否则显示找到的结点信息,按任意键后显示已删除信息。
8.find()查找结点
按照姓名查找结点,从头结点开始顺序查找,成功显示记录信息,失败,显示没有找到。姓名是字符串,比较功能利用字符串比较函数strcmp()实现。
9.insert()插入结点
插入结点需要插入位子和新结点信息。输入某个结点的学号,新结点将插入在这个指定结点之前。申请空间得到指针info,输入新结点信息,存放在新申请的空间info中。设链表头指针为h, p为指定结点的指针,q为p的前趋指针,从头结点开始循环移动指针p查找结点,查找和插入时分以下几种情况处理:
10.sort()排序
对于学生成绩管理,一个很重要的运算是将学生按照分数由高到低排名 ,本函数实现按照总分排序功能,读者可以参照此算法作出单科排序算法。
我自己编了一点,但不怎么全,编译没错,但运行总不好
#include<stdio.h>
#include<malloc.h>
#include<graphics.h>
#define null 0
#define N 3
struct student
{
long no;
char name[15];
float score[N];
float sum;
float average;
struct student *next;
};
int n;
struct student *head;
void main()
{
int c;
struct student *del(struct student *head,long no);
struct student *creat(void);
struct student *print(struct student *head);
void xiangmu();
loop:xiangmu();
scanf("%d/n",&c);
if(c==0)
creat();
if(c==1)
print(head);
else
{
goto loop;
}
}
struct student *creat(void)
{
int i;
struct student *p1,*p2;
n=0;
p1=p2=(struct student *)malloc(sizeof(struct student));
printf("/n please input the number of student(six numbers):");
scanf("%ld",&p1->no);
while(p1->no!=0)
{
printf("/n input name of student:");
scanf("%s",p1->name);
for(i=0;i<N;i++)
{
printf("/n input the stu's %d scores",N);
scanf("%f",&p1->score[i]);
}
p1->sum=0;
for(i=0;i<N;i++)
{
p1->sum+=p1->score[i];
}
p1->average=p1->sum/(N*1.0);
head=null;
n=n+1;
if(p1->no!=0)
{
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
}
p1=(struct student *)malloc(sizeof(struct student));
printf("/n please input the number of student(six numbers):");
scanf("%ld",&p1->no);
}
p2->next=null;
return(head);
}
struct student *del(struct student *head,long no)
{
struct student *p1,*p2;
if(head==null)
{printf("list null!/n");goto end;}
p1=head;
while(no!=p1->no&&p1->no!=null)
{
p2=p1;
p1=p1->next;
}
if(no==p1->no)
{if(p1==head)head=p1->next;
else
p2->next=p1->next;
printf("delete:%d/n",no);
n=n-1;
}
else printf("%ld not been found!/n,num");
end:
return(head);
}
struct student *print(struct student *head)
{
int a,b;
struct student *p;
printf("/nnow,there %d records are:/n",n);
p=head;
if(head!=null)
{
printf("*************************student***************************************");
printf("rec no name sco1 sco2 sco3 sum ave ");
printf("-----------------------------------------------------------------------");
do
{
b=1;printf("%5d",b);
b++;
printf("%12d%15s",p->no,p->name);
for(a=0;a<N;a++)
printf("%7.3f",p->score[a]);
printf("%6.4f%6.4f/n",p->sum,p->average);
p=p->next;
}while(p!=0);
}
}
void xiangmu()
{
int gdriver, gmode;
gdriver=DETECT;
initgraph(&gdriver, &gmode, "");
setbkcolor(BLUE);
cleardevice();
setviewport(100, 100, 450, 350, 1); /*定义一个图形窗口*/
setfillstyle(1, 2); /*绿色以实填充*/
setcolor(YELLOW);
rectangle(0, 0, 439, 279);
floodfill(50, 50, 14);
setcolor(1);
settextstyle(1, 0, 1); /*三重笔划字体*/
outtextxy(20, 20, "**************menu****************");
outtextxy(20, 30, "0 .init list/n");
outtextxy(20, 40, "1 .enter list/n");
outtextxy(20, 50, "2 .delete a record from list/n");
outtextxy(20, 60, "3 .print list/n");
outtextxy(20, 70, "4 .search record on name/n");
outtextxy(20, 80, "5 .save thefile/n");
outtextxy(20, 90, "6 .load the file/n");
outtextxy(20, 100, "7 .compute the score/n");
outtextxy(20, 110, "8 .insert record to list/n");
outtextxy(20, 120, "9 .copy the file to new file/n");
outtextxy(20, 130, "10 .sort to make new file/n");
outtextxy(20, 140, "11 .append record to file/n");
outtextxy(20, 150, "12 .index on nomber/n");
outtextxy(20, 160, "13 .total on nomber/n");
outtextxy(20, 170, "14 .quit/n/n");
outtextxy(20, 180, "enter you choice(0~14):");
outtextxy(20, 190, "(press any butten to go on)");
getch();
}