学生成绩管理系统 C语言课程设计报告
发布时间:2024-11-10
发布时间:2024-11-10
《学生成绩管理系统》
课程设计报告
专 业:班 级:姓 名:指导教师:学 号: 信息科学与工程学院 电气信息类0916班 曹坤 汤哲 0909091612
课程设计报告
一、课程设计题目 学生成绩管理系统 1、需要处理的基础数据
学生基本信息:如班级、学号、姓名、性别、年龄等。
学生选修课程的基本信息:课程编号、课程名称、学分、考试成绩、平
时成绩、综合成绩(考试成绩*0.7+平时成绩*0.3)等。
主菜单
2、系统的基本功能
数据的录入:如录入学生的基本信息,以及该学生选修课程的基本信息; 数据的修改:如修改指定学号、或者指定姓名的学生信息,或者修改其
选修课程信息;
数据的插入:插入某个学生信息;
数据的查询:如按学号查询、按姓名查询等;
数据的删除:如删除指定学号、或者指定姓名的学生及其选修课程信息; 平均成绩的计算:计算每个学生各门功课的平均成绩,并按平均成绩从
高到低的次序输出学生信息;
列出不及格学生清单(学号、姓名、不及格的课程和成绩)。 考虑用文件把数据保存起来(可选)。
3、链表
struct stu /*定义学生基本信息结构体*/ {
int i; /*以输入的顺序来确定的学生序号*/ char num[11];
char classnum[5]; char name[128]; char sex[32]; int age; float ave;
struct stu *next; };
int n=0; /*学生人数*/ struct stu *head=0;
struct stu1 /*定义学生选修课信息结构体*/ {
char lessonnum[11]; char lessonname[256]; float score;
float testgrade; float commongrade; float grade;
struct stu1 *next; };
int m;
struct stu1 *a[max_num] ;/*定义一个指针数组来记住课程链表地址*/ /*---------------------- 数据的录入程序 -----------------------*/
void create(void) /*建立学生基本信息链表*/ {
n=0;
struct stu *p1,*p2; char ch,ch1;
struct stu1 *create1(void); do {
n=n+1; a[n]=0;
system("cls");
p1=(struct stu *)malloc(LEN); printf("\n学号:"); scanf("%s",p1->num); printf("\n班级:");
scanf("%s",p1->classnum); printf("\n姓名:"); scanf("%s",p1->name) ; printf("\n性别:"); scanf("%s",p1->sex); printf("\n年龄:"); scanf("%d",&p1->age); if(n==1)head=p1; else p2->next=p1; p2=p1;
printf("\n是否输入选修课信息(y/n)\n");
fflush(stdin); /*清空输入缓冲区*/ ch1=getchar();
if(ch1=='y'||ch1=='Y')
a[n]=create1(); /*根据序号来记忆课程链表地址*/ p1->i=n;
system("cls");
printf("\n是否继续输入另一学生信息(y/n)\n"); fflush(stdin); /*清空输入缓冲区*/ ch=getchar();
}while(ch=='y'||ch=='Y'); p2->next=0; }
struct stu1 *create1(void) /*建立课程链表*/ {
m=0;
struct stu1 *p1,*p2; char ch;
struct stu1 *head=0; do {
m=m+1;
system("cls");
p1=(struct stu1 *)malloc(LEM); printf("\n课程编号:");
scanf("%s",p1->lessonnum);
printf("\n课程名称:");
scanf("%s",p1->lessonname); printf("\n学分:");
scanf("%f",&p1->score); printf("\n考试成绩:");
scanf("%f",&p1->testgrade); printf("\n平时成绩:");
scanf("%f",&p1->commongrade);
p1->grade=p1->testgrade*0.7+p1->commongrade*0.3; printf("\n综合成绩:%-6.1f",p1->grade); if(m==1)head=p1; else p2->next=p1; p2=p1;
printf("\n是否继续输入另一课程信息(y/n)\n"); fflush(stdin); /*清空输入缓冲区*/ ch=getchar();
}while(ch=='y'||ch=='Y'); p2->next=0; return(head); }
二、设计思路
界面:界面的显示由循环语句和switch语句来控制完成。
数据的录入:运用链表进行数据的存储,由于要录入的数据有两种即学生的基本信息和学生的选修课程信息,本系统采用两个链表分别存储数据,采用数组将两个链表联系起来,运用循环语句和判断语句来进行数据的录入。作者感到本功能设计中的难点在于
将两个链表联系起来,解决方案是采用一个指针数组来将第二个链表中每个节点地址存储起来,进而将两个链表联系起来。
信息的修改:本系统采用的是按学号查找信息,系统采用一个由判断语句和循环语句构成的查询函数struct stu *findnum(void)来提供信息存储地址;再按照地址来进行修改,其中采用switch语句和循环语句来控制使系统能够提供选择修改的功能。在这
一功能的设计中,作者感到课程信息的修改中的添加课程信息功能是一个难点,解决方案是按插入方案来进行设计。
插入信息:本系统采用的是按学号顺序来进行插入的,在这一功能的设计中,首先在开辟一个结构体空间将插入学生的信息存储于其中,在采用判断语句和循环语句来查找该条信息应该插入位置的地址,将上一结点的下行指针指向本结点,再将该节点的下行
指针指向下一个结点从而达到插入信息的目的。在这一功能的设计中作者感到插入的具体算法是个难点,本系统采用的教材书本上的方法。
查询信息:本功能实现是调用struct stu *findnum(void)函数查找该条信息的地址,然后再采用for循环进行信息的输出,本功能的实现比较简单,难点在于对函数的调用的灵活运用。
删除信息:系统采用按学号删除的方案,在这一功能的设计中我没有采用直接调用struct stu *findnum(void)函数,而是又重写查找地址程序,这是出于考虑系统功能的更好实现而采用的举措。具体删除算法采用该节点上一个结点的下行指针直接指向该结点下一个结点从而达到删除该结点的目的。在此功能的设计中,本作者感到难点不在于算法而在于思维设计的是否缜密。
计算平均成绩:本功能的实现需要首先计算各个学生的平均成绩,再按照平均成绩进行排序。这两个过程的设计排序是个难点,因为本系统存储结构为链表,在排序方面较数组有很大区别,在作者看来比较困难,解决方案是运用一个指针型数组将每个结点的地址存在其中,再按照该指针指向的平均成绩来排序数组中的地址,再按照数组中的地址顺序来输出信息,间接达到排序的目的。
不及格学生清单:判断语句和循环语句的结合运用以达到列出清单的目的,本功能的实
现
不
难
,
难
在
于
准
确
控
制
。
三、系统流程
四、程序代码 #include<stdio.h> #include<stdlib.h> #include<string.h>
#define LEN sizeof(struct stu) #define LEM sizeof(struct stu1) #define max_num 256
struct stu /*定义学生基本信息结构体*/ {
int i; /*以输入的顺序来确定的学生序号*/ char num[11]; char classnum[5]; char name[128]; char sex[32]; int age; float ave; struct stu *next; };
int n=0; /*学生人数*/ struct stu *head=0;
struct stu1 /*定义学生选修课信息结构体*/ {
char lessonnum[11]; char lessonname[256]; float score; float testgrade; float commongrade; float grade; struct stu1 *next;
}; int m;
struct stu1 *a[max_num] ;/*定义一个指针数组来记住课程链表地址*/ /*---------------------- 数据的录入程序 -----------------------*/ void create(void) /*建立学生基本信息链表*/ { n=0;
struct stu *p1,*p2; char ch,ch1;
struct stu1 *create1(void); do { n=n+1; a[n]=0; system("cls");
p1=(struct stu *)malloc(LEN); printf("\n学号:"); scanf("%s",p1->num); printf("\n班级:"); scanf("%s",p1->classnum); printf("\n姓名:"); scanf("%s",p1->name) ; printf("\n性别:"); scanf("%s",p1->sex); printf("\n年龄:"); scanf("%d",&p1->age); if(n==1)head=p1; else p2->next=p1; p2=p1;
printf("\n是否输入选修课信息(y/n)\n"); fflush(stdin); /*清空输入缓冲区*/ ch1=getchar(); if(ch1=='y'||ch1=='Y')
a[n]=create1(); /*根据序号来记忆课程链表地址*/ p1->i=n; system("cls");
printf("\n是否继续输入另一学生信息(y/n)\n"); fflush(stdin); /*清空输入缓冲区*/ ch=getchar();
}while(ch=='y'||ch=='Y'); p2->next=0; }
struct stu1 *create1(void) /*建立课程链表*/ { m=0;
struct stu1 *p1,*p2; char ch;
struct stu1 *head=0; do { m=m+1; system("cls");
p1=(struct stu1 *)malloc(LEM); printf("\n课程编号:"); scanf("%s",p1->lessonnum); printf("\n课程名称:"); scanf("%s",p1->lessonname);
printf("\n学分:"); scanf("%f",&p1->score); printf("\n考试成绩:"); scanf("%f",&p1->testgrade); printf("\n平时成绩:");
scanf("%f",&p1->commongrade);
p1->grade=p1->testgrade*0.7+p1->commongrade*0.3; printf("\n综合成绩:%-6.1f",p1->grade); if(m==1)head=p1; else p2->next=p1; p2=p1;
printf("\n是否继续输入另一课程信息(y/n)\n"); fflush(stdin); /*清空输入缓冲区*/ ch=getchar();
}while(ch=='y'||ch=='Y'); p2->next=0; return(head); }
/*-----------------------------------------------------------*/ struct stu *findnum(void) {
char num[11]; struct stu *p1; struct stu1 *p2; char c;
printf("\n输入学生学号:"); fflush(stdin); gets(num); struct stu *fa; fa=head;
if(head==0) {
printf("\nlist null\n");goto end; }
while(strcmp(fa->num,num)!=0) {
if(fa->next==0)break; fa=fa->next; }
if(strcmp(fa->num,num)==0)return fa; else printf("%s can't be found!\n",num); end: return 0; }
/*------------------------ 查询信息模块 ----------------------------------*/ void search(void) {
system("cls"); char ch2;
struct stu *findnum(void); struct stu *p; struct stu1 *p1; p=findnum(); if(p==0) goto end; p1=a[p->i];
printf("\n%17s","学号"); printf("%15s","班级");