《C語言課程設(shè)計(jì)學(xué)生成績(jī)管理系統(tǒng).doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《C語言課程設(shè)計(jì)學(xué)生成績(jī)管理系統(tǒng).doc(29頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
______________________________________________________________________________________________________________
信息技術(shù)工程學(xué)院
C語言課程設(shè)計(jì)報(bào)告
題目:學(xué)生成績(jī)管理系統(tǒng)(student achievement management system)
目錄
一 設(shè)計(jì)目的 3
二 課程設(shè)計(jì)的內(nèi)容 3
三 課程設(shè)計(jì)的要求與數(shù)據(jù) 4
四 課程設(shè)計(jì)應(yīng)完成的工作 4
五 總體設(shè)計(jì)(包含幾大功能模塊) 5
六 詳細(xì)設(shè)計(jì) 6
6.1各個(gè)模塊的功能和實(shí)現(xiàn) 6
6.2 流程圖 7
(管理員模式流程圖) 7
(來賓模式流程圖) 8
8
七 調(diào)試分析(各模塊測(cè)試結(jié)果) 9
7.1源代碼 9
7.2 各模塊測(cè)試結(jié)果 24
八 總結(jié) 29
九 參考資料 30
一 設(shè)計(jì)目的
通過本課程設(shè)計(jì)鞏固《C語言程序設(shè)計(jì)》課程的教學(xué)成果,深入理解結(jié)構(gòu)體、指針、鏈表、動(dòng)態(tài)分配內(nèi)存和文件操作的等C程序設(shè)計(jì)中的中高級(jí)技術(shù),通過課程設(shè)計(jì)的綜合訓(xùn)練,培養(yǎng)學(xué)生實(shí)際分析問題、編程和動(dòng)手能力、提高學(xué)生利用C語言進(jìn)行程序設(shè)計(jì)的能力,初步培養(yǎng)良好的編程習(xí)慣和編程風(fēng)格,初步學(xué)習(xí)程序的文檔的撰寫方法。
二 課程設(shè)計(jì)的內(nèi)容
通過C語言程序系統(tǒng),設(shè)計(jì)一個(gè)可以對(duì)學(xué)生的成績(jī)信息進(jìn)行管理的程序,其中學(xué)生的信息可以包括:學(xué)號(hào)、各科目的成績(jī)的平均分排序等,其功能可以包括學(xué)生成績(jī)的輸入、輸出、查詢、排序、刪除、統(tǒng)計(jì)、退出等。
三 課程設(shè)計(jì)的要求與數(shù)據(jù)
1、用C語言實(shí)現(xiàn)系統(tǒng);
2、對(duì)學(xué)生信息(包括學(xué)號(hào)、姓名、語文、數(shù)學(xué)、英語、平均分)進(jìn)行管理,包括學(xué)生成績(jī)的信息輸入、輸出、查詢、刪除、排序、統(tǒng)計(jì)、退出、顯示,以及整個(gè)程序的切換登錄模式和修改管理員的信息.
3、學(xué)生信息包括:
(1)、每一條記錄包括一個(gè)學(xué)生的學(xué)號(hào)、姓名、3門課成績(jī)
(2)、成績(jī)信息錄入功能:(成績(jī)信息用文件保存,可以一次完成若干條記錄的輸入。)
(3)、成績(jī)信息顯示瀏覽功能:完成全部學(xué)生記錄的顯示。
(4)、查詢功能:完成按姓名查找學(xué)生記錄,并顯示。
(5)、成績(jī)信息的刪除:按學(xué)號(hào)進(jìn)行刪除某學(xué)生的成績(jī).
(6)、排序功能:按學(xué)生平均成績(jī)進(jìn)行排序。
(7)、應(yīng)提供一個(gè)界面來調(diào)用各個(gè)功能,調(diào)用界面和各個(gè)功能的操作界面應(yīng)盡可能清晰美觀!
四 課程設(shè)計(jì)應(yīng)完成的工作
(1)編寫算法;
(2)算法測(cè)試,并有具體的測(cè)試結(jié)果和結(jié)果分析;
(3)撰寫課程設(shè)計(jì)報(bào)告。內(nèi)容包括:
1) 封面扉頁(yè)
2) 設(shè)計(jì)任務(wù)書
3) 目錄
4) 總體設(shè)計(jì)方案(包括流程圖)
5) 使用說明及運(yùn)行實(shí)例(包括界面)
6) 成員設(shè)計(jì)內(nèi)容簡(jiǎn)介
7) 項(xiàng)目源程序代碼(注意注釋的使用)
8) 指導(dǎo)教師評(píng)語
五 總體設(shè)計(jì)(包含幾大功能模塊)
1、成績(jī)錄入功能
2、成績(jī)輸出功能
3、成績(jī)查詢功能
4、刪除模塊
5、排序功能
6、統(tǒng)計(jì)功能
7、退出系統(tǒng)
六 詳細(xì)設(shè)計(jì)
6.1各個(gè)模塊的功能和實(shí)現(xiàn)
(1)整個(gè)成績(jī)管理系統(tǒng)設(shè)計(jì)分為9個(gè)模塊:
1.輸入學(xué)生成績(jī)
2.刪除學(xué)生成績(jī)
3.查詢學(xué)生成績(jī)
4.修改學(xué)生成績(jī)
5.排序?qū)W生成績(jī)
6.保存記錄
7.顯示所有
8.退出系統(tǒng)
9.修改管理員信息
(2)(主要函數(shù)的功能)
1.主函數(shù)main():定義學(xué)生結(jié)構(gòu)體數(shù)組,調(diào)用錄入,統(tǒng)計(jì)等函數(shù)對(duì)成績(jī)表進(jìn)行處理。
2.輸入數(shù)據(jù)函數(shù)input():輸入學(xué)號(hào)、成績(jī)。
3.排序函數(shù)sort():對(duì)總成績(jī)或者平均成績(jī),進(jìn)行排序,按從高到低或者從低到高。
4.顯示數(shù)據(jù)函數(shù)display():顯示各個(gè)學(xué)生的總成績(jī)
5.新增數(shù)據(jù)函數(shù)insert():增加學(xué)生學(xué)生記錄。
6.刪除數(shù)據(jù)函數(shù)del():由于各種原因,刪除某些同學(xué)的成績(jī)、學(xué)號(hào)等。
7.平均值函數(shù)average():求各個(gè)同學(xué)總成績(jī)的平均值。
8.查詢數(shù)據(jù)函數(shù)qur():查詢學(xué)生的信息。
9.保存數(shù)據(jù)函數(shù)save():再一次打開界面是,仍有上次所找的訊息。
10.退出系統(tǒng)函數(shù)exit():當(dāng)要退出整個(gè)系統(tǒng)時(shí)。
6.2 流程圖
(管理員模式流程圖)
輸出菜單
輸入
根據(jù)菜單輸入n的值選擇程序
結(jié)束
開始
保存
查找
退出
刪除
統(tǒng)計(jì)
插入
排序
輸出
開始
(來賓模式流程圖)
輸出菜單
根據(jù)菜單,
選擇程序
退出程序
切換登錄
排序
成績(jī)
顯示
成績(jī)
查詢
成績(jī)
結(jié)束
七 調(diào)試分析(各模塊測(cè)試結(jié)果)
7.1源代碼
#include
#include
#include
#include
#include
#define HEADER2 " 學(xué)號(hào) 姓名 數(shù)學(xué) 英語 C語言 總分 平均分\n"
#define FORMAT " %s %s %d %d %d %d %.2f\n"
#define DATA p->data.num,p->data.name,p->data.mgrade,p->data.egrade,p->data.cgrade,p->data.total,p->data.ave
int saveflag=0;
typedef unsigned short WORD;
struct student{
char num[10];
char name[15];
int mgrade;
int egrade;
int cgrade;
int total;
float ave;
};
typedef struct node{
struct student data;
struct node *next;
}Node,*Link;
void menu(){
time_t now;
now=time(NULL);
printf(" 學(xué)生成績(jī)管理系統(tǒng) \n");
printf("\n");
printf(" *******************************************************************\n");
printf(" * *\n");
printf(" * 1 輸入成績(jī) 2 刪除成績(jī) *\n");
printf(" * *\n");
printf(" * 3 查詢成績(jī) 4 修改成績(jī) *\n");
printf(" * *\n");
printf(" * 5 排序成績(jī) 6 保存記錄 *\n");
printf(" * *\n");
printf(" * 7 顯示所有 0 退出系統(tǒng) *\n");
printf(" * *\n");
printf(" *******************************************************************\n");
printf(" * 8 切換登錄模式 9 修改管理員信息 *\n");
printf(" *******************************************************************\n");
printf("\n 請(qǐng)你選擇操作命令前的的數(shù)字(0~9):");
}
int menu2(){
//int select;
time_t now;
now=time(NULL);
system("cls"); //清屏
printf("\n 學(xué)生模式\n\n\n");
printf(" 學(xué)生成績(jī)管理系統(tǒng) \n");
printf("\n");
printf(" *******************************************************************\n");
printf(" * *\n");
printf(" * 1 查詢成績(jī) 2 排序成績(jī) *\n");
printf(" * *\n");
printf(" * 3 顯示所有 0 退出系統(tǒng) *\n");
printf(" * *\n");
printf(" *******************************************************************\n");
printf(" * 4 切換登錄模式 *\n");
printf(" *******************************************************************\n");
printf("\n 請(qǐng)你選擇操作命令前的數(shù)字(0~4):");
return 0;
}
void printheader()
{
printf(HEADER2);
}
void printdata(Node *pp){
Node *p;
p=pp;
printf(FORMAT,DATA);
}
void Wrong(){
printf("\n\n\n\n************錯(cuò)誤:輸入不合法!!!*********\a\n");
getch();
}
void Nofind(){
printf("\n沒有該學(xué)生!!\n");
}
Node* locate(Link l,char findmess[],char nameornum[])
{
Node *r;
if(strcmp(nameornum,"num")==0)
{
r=l->next;
while(r)
{
if(strcmp(r->data.num,findmess)==0)
return r;
r=r->next;
}
}
else if(strcmp(nameornum,"name")==0)
{
r=l->next;
while(r)
{
if(strcmp(r->data.name,findmess)==0)
return r;
r=r->next;
}
}
return 0;
}
void stringinput(char*t,int lens,char*notice)
{
char n[225];
do
{
printf(notice);
scanf("%s",n);
if(strlen(n)>lens)
printf("\n超出寬度!!!\n");
}while(strlen(n)>lens);
strcpy(t,n);
}
int numberinput(char *notice)
{int t=0;
do
{
printf(notice);
scanf("%d",&t);
if(t>100||t<0) printf("\n 分?jǐn)?shù)必須在0~100之間!!!\n");
}while(t>100||t<0);
return t;
}
void Disp(Link l){
Node *p;
system("cls");
p=l->next;
if(!p)
{
printf("\n目前無學(xué)生成績(jī)記錄!!\n");
getch();
return;
}
printf("\n\n");
printheader();
while(p)
{
printdata(p);
p=p->next;//移至下一個(gè)結(jié)點(diǎn)
}
}
void Add(Link l){
//printf("增加學(xué)生記錄模塊\n");
//system("PAUSE");}
Node *p,*r,*s;
char ch,flag=0,num[10];
r=l;
system("cls");
Disp(l);//先打印已有的學(xué)生信息
while(r->next!=NULL)
r=r->next;//將只指針移至鏈表末尾,準(zhǔn)備添加記錄
while(1)//一次可輸入條記錄,直至輸入的學(xué)號(hào)我0的記錄節(jié)點(diǎn)添加操作
{
s=l->next;
while(1)
{
stringinput(num,10,"學(xué)號(hào)(按0退出):");
flag=0;
if(strcmp(num,"0")==0)
return;
s=l->next;
while(s)//查詢學(xué)號(hào)是否存在,若存在則要求重新輸入
{
if(strcmp(s->data.num,num)==0)
{
flag=1;
break;
}
s=s->next;
}
if(flag==1)//提示用戶是否重新輸入
{
getchar();
printf("=====>學(xué)號(hào)%s已存在,是否重新輸入?(y/n)\a:",num);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
continue;
else
return ;
}
else
break;
}
p=(Node *)malloc(sizeof(Node));
strcpy(p->data.num,num);//將字符串mun拷貝到p->data.num中
stringinput(p->data.name,15,"name:");
p->data.cgrade=numberinput("c語言[0-100]:");
p->data.mgrade=numberinput("數(shù)學(xué)[0-100]:");
p->data.egrade=numberinput("英語[0-100]:");
p->data.total=p->data.cgrade+p->data.mgrade+p->data.egrade;
p->data.ave=(float)(p->data.total/3);
p->next=NULL;
while(r->next!=NULL)
r=r->next;
r->next=p;
saveflag=1;
}
}
void Del(Link l){
// printf("刪除學(xué)生記錄模塊\n");
//system("PAUSE");
int sel;
Node *p,*r;
char findmess[20];
if(!l->next)
{
system("cls");
printf("\n======>暫無學(xué)生記錄!!\n");
getch();
return;
}
system("cls");
Disp(l);
printf("\n 1通過學(xué)號(hào)刪除 2通過姓名刪除\n");
printf(" 請(qǐng)選擇[1,2]");
scanf("%d",&sel);
if(sel==1)
{
stringinput(findmess,10,"請(qǐng)輸入學(xué)號(hào):");
p=locate(l,findmess,"num");
if(p)
{
r=l;
while(r->next!=p)
r=r->next;
r->next=p->next;
free(p);//釋放內(nèi)存空間
printf("\n刪除成功!\n");
saveflag=1;
}
else
Nofind();
}
else if(sel==2)
{
stringinput(findmess,15,"請(qǐng)輸入學(xué)生姓名:");
p=locate(l,findmess,"name");
if(p)
{
r=l;
while(r->next!=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n刪除成功!!\n");
saveflag=1;
}
else
Nofind();
}
else
Wrong();
getch();
}
void Qur(Link l){
int select;
char searchinput[20];
Node *p;
system("cls");
if(!l->next)
{
printf("\n暫無學(xué)生記錄!!\n");
return;
}
printf("\n=======>1通過學(xué)號(hào)查找 =======>2通過姓名查找\n");
printf("請(qǐng)選擇[1~2]:");
scanf("%d",&select);
if(select==1)
{
stringinput(searchinput,10,"請(qǐng)輸入要查找的學(xué)號(hào):");
p=locate(l,searchinput,"num");
if(p)
{printheader();
printdata(p);
}
else
Nofind();
}
else if(select==2)
{
stringinput(searchinput,15,"請(qǐng)輸入學(xué)生姓名:");
p=locate(l,searchinput,"name");
if(p)
{
printheader();
printdata(p);
}
else
Nofind();
}
else
Wrong();
system("PAUSE");
}
void Modify(Link l){
Node *p;
char findmess[20];
if(!l->next)
{
system("cls");
printf("\n沒有該學(xué)生記錄!\n");
getch();
return;
}
system("cls");
printf("修改學(xué)生記錄");
Disp(l);
stringinput(findmess,10,"請(qǐng)輸入學(xué)號(hào):");
p=locate(l,findmess,"num");
if(p)
{
printf("學(xué)號(hào):%s,\n",p->data.num);
printf("姓名:%s,",p->data.name);
stringinput(p->data.name,15,"輸入新的姓名:");
printf("c語言:%d,",p->data.cgrade);
p->data.cgrade=numberinput("c語言[0~100]:");
printf("數(shù)學(xué):%d,",p->data.mgrade);
p->data.mgrade=numberinput("數(shù)學(xué)[0~100]:");
printf("英語:%d,",p->data.egrade);
p->data.egrade=numberinput("英語[0~100]:");
p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=(float)(p->data.total)/3;
printf("\n===>修改成功!");
saveflag=1;
}
else
Nofind();
getch();
}
void Sort(Link l){
Link ll;
Node *p,*rr,*s;
int i=0;
system("cls");
if(l->next==NULL)
{
printf("\n暫無學(xué)生記錄!\n");
return;
}
ll=(Node*)malloc(sizeof(Node));//用于創(chuàng)建新的節(jié)點(diǎn)
ll->next=NULL;
printf("當(dāng)前狀態(tài):\n");
Disp(l);
system("PAUSE");
p=l->next;
while(p)
{
s=(Node*)malloc(sizeof(Node));
s->data=p->data;
s->next=NULL;
rr=ll;
while(rr->next!=NULL &&rr->next->data.total>=p->data.total)
{
rr=rr->next;
}
if(rr->next==NULL)
rr->next=s;
else
{
s->next=rr->next;
rr->next=s;
}
p=p->next;
}
l->next=ll->next;
p=l->next;
while(p!=NULL)
{
i++;
p=p->next;
}
printf("\n******************************\n");
Disp(l);
saveflag=1;
printf("\n ******排序完成******* \n");
system("PAUSE");
}
void Save(Link l){
//printf("保存模塊\n");
//system("PAUSE");
FILE *fp;
Node *p;
int count=0;
fp=fopen("student.txt","wb");
p=l->next;
while(p)
{
if(fwrite(p,sizeof(Node),1,fp)==1)
{
p=p->next;
count++;
}
else
break;
}
if(count>0)
{
printf("\n\n\n\n\n 保存完畢,當(dāng)前共有%d名學(xué)生記錄\n",count);
saveflag=0;
}
else
printf("空文件,保存失敗!!\n");
fclose(fp);//關(guān)閉文件
getch();
}
int login()
{
FILE *fp1,*fp2;
int state;
char str1[20],str2[20],str_z[20],str_m[7];
if((fp1=fopen("admin.txt","rb"))==NULL)
{
printf("本系統(tǒng)無管理員,請(qǐng)創(chuàng)建!\n\n請(qǐng)輸入管理員賬號(hào):");
scanf("%s",str_z);
printf("請(qǐng)?jiān)O(shè)置一個(gè)六位數(shù)密碼:");
fp2=fopen("admin.txt","wb");
fprintf(fp2,"%s%c",str_z,'\n');
fprintf(fp2,"%s%c",str_m,' ');
fclose(fp2);
}
fp1=fopen("admin.txt","rb");
fscanf(fp1,"%s",str1);
fscanf(fp1,"%s",str2);
fclose(fp1);
while(1)
{
printf("請(qǐng)選擇你的登錄方式:\n\n");
printf("1.管理員模式 0.來賓模式\n");
printf("請(qǐng)選擇:(0~1)");
scanf("%d",&state);
if(state==0)
return 0;
else if(state==1)
{
printf("請(qǐng)輸入賬號(hào):");
scanf("%s",str_z);
if (strcmp(str1,str_z)==0&&strcmp(str2,str_m)==0)
return 1;
else
{
printf("賬號(hào)或密碼錯(cuò)誤!!!\a\n");
system("PAUSE");
system("cls");
}
}
else
{
printf("輸入不合法!!!\a\n");
exit(0);
}
}
}
void Modify_admin()
{
FILE *fp;
char str_z[20],str_m[7]="";
fp=fopen("admin.txt","wb");
printf("請(qǐng)輸入管理員賬號(hào):");
scanf("%s",str_z,'\n');
printf("請(qǐng)輸入密碼:");
fprintf(fp,"%s%c",str_z,'\n');
fprintf(fp,"%s%c",str_m,' ');
fclose(fp);
printf("管理員信息更新完畢!! \a\n");
getch();
}
int main()
{
Link L;
FILE *fp;
int select,State=0;
char ch,admin[20],admin_p[20];
int count=0;
Node *p,*r;
system("color 0A");
L=(Node*)malloc(sizeof(Node));
L->next=NULL;
r=L;
fp=fopen("student.txt","ab+");
Loop:{
State=login();
}
while(!feof(fp))
{p=(Node*)malloc(sizeof(Node));
if(fread(p,sizeof(Node),1,fp)==1)
{
p->next=NULL;
r->next=p;
r=p;
count++;
}
}
fclose(fp);
if(State==1)
{
while(1)
{
system("cls");
printf("\n 管理員模式\n\n");
menu();
p=r;
scanf("%d",&select);
if(select==0)
{
if(saveflag==1)
{
getchar();
printf("\n記錄已修改,是否保存當(dāng)時(shí)記錄?(y/n):");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
Save(L);
}
printf("謝謝您的使用!!!\n");
break;
}
switch(select)
{
case 1:Add(L);break;//增加模塊
case 2:Del(L);break;//刪除記錄
case 3:Qur(L);break;//查詢模塊
case 4:Modify(L);break;//修改模塊
case 5:Sort(L);break;//排序模塊
case 6:Save(L);break;//保存成績(jī)
case 7:Disp(L);system("PAUSE");break;//顯示成績(jī)
case 8:system("cls");goto Loop;
case 9:Modify_admin();break;
default:Wrong();getch();break;
}
}
}
else
{
while(1)
{
system("cls");
menu2();
scanf("%d",&select);
if(select==0)
{
printf("謝謝您的使用??!\n");
exit(1);
}
switch(select)
{
case 1:Qur(L);break;
case 2:Sort(L);break;
case 3:Disp(L);system("PAUSE");break;
case 4:system("cls");goto Loop;
default:Wrong();getch();break;
}
}
}
return 0;
}
7.2 各模塊測(cè)試結(jié)果
創(chuàng)建管理員模塊
主界面模塊
輸入成績(jī)模塊
刪除成績(jī)模塊
查詢成績(jī)模塊
修改成績(jī)模塊
排序成績(jī)模塊
保存記錄模塊
切換登陸模式
修改管理員信息
退出系統(tǒng)
八 總結(jié)
本次的課程設(shè)計(jì)已接近尾聲,經(jīng)過兩周的課程設(shè)計(jì)的學(xué)習(xí),讓我從中收獲了許多的東西,課程開始,由于許多東西的在大一學(xué)習(xí)C語言時(shí)理解不深入,在此次設(shè)計(jì)中遇到許許多多的問題,調(diào)試分析時(shí)會(huì)出現(xiàn)各種各樣的錯(cuò)誤,也就需要自己查閱更多的資料。通過查資料,修改源代碼,調(diào)試分析,再到逐步完善的過程,似乎每一次的實(shí)驗(yàn)結(jié)果的成功,我都把它當(dāng)做是一次成長(zhǎng)。
回想起這兩周的課程學(xué)習(xí),讓我真正體會(huì)到了理論與實(shí)踐相結(jié)合的重要性,從拿到一個(gè)設(shè)計(jì)題目,再到對(duì)題目的構(gòu)思、畫流程圖,到最后的編寫源代碼、調(diào)試分析、逐步完善、最后的整個(gè)程序的完成,看似一個(gè)很簡(jiǎn)單的過程,但是對(duì)于一個(gè)初次接觸的我來說,每次似乎都是遇到了一個(gè)大困難。但是越是遇到困難,就越有解決問題的決心,每當(dāng)遇到問題時(shí),我都會(huì)及時(shí)的向老師、同學(xué)、還有圖書館的相關(guān)書籍尋求幫助。努力做到問題的及時(shí)解決。
通過這次課程設(shè)計(jì)收獲知識(shí),提高能力的同時(shí),我也學(xué)到了很多人生的哲理,懂得怎么樣去制定計(jì)劃,怎么樣去實(shí)現(xiàn)這個(gè)計(jì)劃,并掌握了在執(zhí)行過程中怎么樣去克服心理上的不良情緒。因此在以后的生活和學(xué)習(xí)的過程中,我一定會(huì)把課程設(shè)計(jì)的精神帶到生活中,不畏艱難,勇往直前使我對(duì)C語言有了更進(jìn)一步的認(rèn)識(shí)和了解,要想學(xué)好它要重在實(shí)踐,要通過不斷的上機(jī)操作才能更好地學(xué)習(xí)它、利用它來為自己創(chuàng)造財(cái)富。
在這里,感謝帶我我們做課程設(shè)計(jì)的張老師!
九 參考資料
《C語言程序設(shè)計(jì)》 主編:譚浩強(qiáng);
《C程序設(shè)計(jì)教程》 主編:李麗娟;
《C語言程序設(shè)計(jì)》 主編:樓永強(qiáng),吳鵬,徐思友;
《C語言程序設(shè)計(jì)》 主編:吳紅慶,李春萍;
網(wǎng)絡(luò)相關(guān)資料。
-可編輯修改-
鏈接地址:http://www.820124.com/p-1128530.html