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