《學生成績管理系統(tǒng) C語言.doc》由會員分享,可在線閱讀,更多相關《學生成績管理系統(tǒng) C語言.doc(22頁珍藏版)》請在裝配圖網(wǎng)上搜索。
______________________________________________________________________________________________________________
福建工程學院計算機與信息科學系
實驗報告
2012 – 2013 學年第 1 學期 任課老師: 章靜
課程名稱
結構化程序綜合設計
班級
計算機1001
座號
3100301114
姓名
張揚文
實驗題目
學生成績管理系統(tǒng)
實驗時間
實驗開始日期:2012/2/24
報告提交日期:2012/3/10
實驗目的、要求
1.該實驗的課內(nèi)學時是4個課時。
2.程序完成后應該完成如下基本功能:
1)用自定義結構體typedef struct設計該軟件的數(shù)據(jù)結構;
2)用數(shù)組或指針鏈表將所有學生的數(shù)據(jù)按照學號順序鏈接起來;
3)程序能夠按照學號順序輸入學生的三門成績,并計算平均成績和總成績。
4)程序能夠顯示已經(jīng)輸入的指定學號的學生成績以及平均成績和總成績。
5)程序能夠按要求顯示指定分數(shù)段的學生成績以及平均成績和總成績。
6)能夠統(tǒng)計班級總人數(shù)、班級平均成績。
7)能夠增加和刪除指定學生的成績。
8)按照指定的要求以及順序(升序或降序)顯示學生成績以及平均成績和總成績。
實驗步驟與內(nèi)容
按如下順序?qū)懀?
1、 主要設計思想;
學生成績管理系統(tǒng)包含多種功能,可以輸入學生成績,刪除,插入,排序,查找等等。。。輸入的信息又包含學生姓名,學號,各科成績。。所以首先要定義一個結構體:
typedef struct node
{
char id[20];
char name[15];
int score[MAXCOURSE];
int sum;
double average;
struct node *next;
}Student;
根據(jù)結構體中的內(nèi)容飆血程序。
2、 主要數(shù)據(jù)結構及其解釋
在此次程序設計中用了鏈表來實現(xiàn)對數(shù)據(jù)的處理,并設計了菜單界面如圖,根據(jù)switch語句來對用戶的選擇:
3、 模塊關系圖;
主函數(shù)
輸入學生信息
打印成績
計算平均分和總分
查找學生成績
插入學生成績
顯示分數(shù)段的學生
按總分平均分降序排列
菜單
4、 所有函數(shù)的簡要說明;
1) 插入函數(shù)Insert_Before();主要是要重新加入學生的信息,通過頭插法。
2) 計算平均分和總分Count_Score();將輸入的數(shù)據(jù)計算出學生的平均分和總分。
3) 刪除學生信息Del_Student();刪除某個學生的成績。
4) 按姓名查找Searchname_Student();通過輸入學生的姓名找到學生的成績。
5) 計算班級總人數(shù)people=Count_People();將總的輸入學生人數(shù)打印出來。
6) 顯示某分數(shù)段學生信息Section_Score();首先選擇你要某科目的成績并輸入成績的范圍,按條件輸出學生成績。
7) 按總分,平均分降序排列Descend_English();將輸入的全部學生成績按總分排序。
5、 所有源代碼;
/*
學生成績管理系統(tǒng) C語言
*/
#include
#include
#include
#define MAXID 10
#define MAXNAME 20
#define MAXCOURSE 3
/* 學生數(shù)據(jù)結構 */
typedef struct node
{
char id[20];
char name[15];
int score[MAXCOURSE];
int sum;
double average;
struct node *next;
}Student;
/* 頭指針 */
Student *head = NULL;
/*課程名稱*/
char ClassName[MAXCOURSE][20]={"數(shù)學","英語","計算機"};
/* 菜單 */
int Menu()
{
system("cls");
fflush(stdin);
printf(" 計算機1001 張揚文 3100301114 \n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("************學生成績管理系統(tǒng)****************\n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf(" 1-初始化\n");
printf(" 2-輸入學生信息\n");
printf(" 3-計算所有學生的總分和平均分\n");
printf(" 4-打印全部學生信息\n");
printf(" 5-查找學號或姓名刪除學生信息\n");
printf(" 6-按姓名查找學生信息\n");
printf(" 7-按學號查找學生信息\n");
printf(" 8-查找某一科成績段學生信息\n");
printf(" 9-插入學生信息到鏈表中\(zhòng)n");
printf(" 10-按總分或平均分降序排列學生成績\n");
printf(" 0-退出\n");
return 0;
}
/*初始化*/
Student *Init()
{
int i;
Student *head;
head=(Student *)malloc(sizeof(Student));
head->next=NULL;
return head;
}
/*檢查學號*/
char Check_ID(char *s)
{
int i;
if(strlen(s)==0||strlen(s)>MAXID)return 0;
for(i=0;i '0' && s[i] < '9') return 1;
}
return 0;
}
/*檢查姓名*/
char Check_Name(char *s)
{
int i;
if(strlen(s)==0||strlen(s)>MAXNAME) return 0;
for(i=0; i= 'a' && s[i] < 'z') || (s[i] >= 'A' && s[i] <= 'Z'))
return 1;
}
return 0;
}
/*檢查分數(shù)*/
int Check_Score(int s)
{
if( s>=0 && s<=100 ) return 1;
return 0;
}
/*檢查學號是否相同*/
char Is_SameID(char *s)
{
Student *p= head->next;
while(p!=NULL)
{
if(strcmp(s,p->id)==0) return 1;
p=p->next;
}
return 0;
}
/* 輸入學生信息 */
void Input_Score(Student *p)
{
/* 學號 */
printf("\n請輸入學號: ");
do
{
gets(p->id);
if (!Check_ID(p->id))
{
printf("輸入不正確!請重新輸入學號: ");
}
else if (Is_SameID(p->id))
{
printf("存在已學號!請重新輸入學號: ");
}
}while (!(Check_ID(p->id) && !Is_SameID(p->id)));
/* 姓名 */
printf("請輸入姓名: ");
do
{
gets(p->name);
if (!Check_Name(p->name))
{
printf("輸入不正確!請重新輸入姓名: ");
}
}while (!Check_Name(p->name));
//輸入成績
int i;
for(i=0; iscore[i]);
if(!Check_Score(p->score[i]))
printf("輸入成績不正確!\n請重新輸入%s成績:",ClassName[i]);
}while(!Check_Score(p->score[i]));
}
p->average = -1;
p->sum = -1;
}
/* 頭插法插入節(jié)點 */
void Insert_Before()
{
Student *s =(Student*) malloc(sizeof(Student));
Input_Score(s);
s->next = head->next;
head->next = s;
}
/*輸出學生成績信息*/
void Output_Score(Student *p)
{
int i;
printf("\n姓名:%s, 學號:%s \n",p->name,p->id);
for(i=0; iscore[i]);
}
printf("總分:%d 平均分:%.2f \n",p->sum,p->average);
}
/*刪除節(jié)點q*/
void Del_Node(Student *q)
{
Student *p=head;
while(p->next!=q)
{
p=p->next;
}
p->next=q->next;
free(q);
}
/*插入學生成績*/
void Insert_List()
{
int x;
printf("輸入你要插入的學生數(shù):");
scanf("%d",&x);
while(x!=0)
{
getchar();
Student *p =(Student*) malloc(sizeof(Student));
printf("\n請輸入學號: ");
do
{
gets(p->id);
if (!Check_ID(p->id))
{
printf("輸入不正確!請重新輸入學號: ");
}
else if (Is_SameID(p->id))
{
printf("存在已學號!請重新輸入學號: ");
}
}while (!(Check_ID(p->id) && !Is_SameID(p->id)));
/* 姓名 */
printf("請輸入姓名: ");
do
{
gets(p->name);
if (!Check_Name(p->name))
{
printf("輸入不正確!請重新輸入姓名: ");
}
}while (!Check_Name(p->name));
//輸入成績
int i;
for(i=0; iscore[i]);
do{
if(!Check_Score(p->score[i]))
printf("輸入成績不正確!請重新輸入%s成績:",ClassName[i]);
}while(!Check_Score(p->score[i]));
}
p->average = -1;
p->sum = -1;
p->next = head->next;
head->next = p;
x--;
}
}
/*按學號查找*/
Student *Search_ID(char *id)
{
Student *p=head->next;
while(p!=NULL)
{
if(strcmp(p->id,id)==0)break;
p=p->next;
}
return p;
}
/*按姓名查找節(jié)點*/
Student *Search_Name(char *name)
{
Student *p=head->next;
while(p!=NULL)
{
if(strcmp(p->name,name)==0)break;
p=p->next;
}
return p;
}
/*輸出鏈表*/
void Output_List()
{
Student *p;
p=head->next;
while(p!=NULL)
{
Output_Score(p);
p=p->next;
}
}
/*刪除指定學生信息*/
void Del_Student()
{
Student *p;
fflush(stdin);
char str[15];
char judge[10];
printf("請輸入要刪除的學生的 學號或姓名:");
do{
gets(str);
if(!(Check_ID(str)||Check_Name(str)))
{
printf("輸入錯誤!請重新輸入:");
}
}while(!(Check_ID(str)||Check_Name(str)));
//判斷是否為學號還是姓名
if(str[0]>'0'&&str[0]<'9')
{
p=Search_ID(str);
if(p==NULL)
{
printf("此學號不存在!\n");
}
else
{
Output_Score(p);
printf("是否要刪除此學號!(確認按y,任意鍵取消):");
gets(judge);
if(strcmp(judge,"y")==0)
{
Del_Node(p);
printf("刪除成功!");
}
}
}
else
{
p=Search_Name(str);
if(p==NULL)
{
printf("此姓名不存在!\n");
}
else
{
Output_Score(p);
printf("是否要刪除此姓名!(確認按y,任意鍵取消):");
gets(judge);
if(strcmp(judge,"y")==0)
{
Del_Node(p);
printf("刪除成功!");
}
}
fflush(stdin);
}
}
/* 退出 */
void Quit()
{
Student *p;
p=head->next;
while(p != NULL)
{
Quit(p->next);
free(p);
}
exit(0);
}
/*計算個人平均分和總分*/
void Count_Score()
{
Student *p;
int i;
p=head->next;
while(p!=NULL)
{
for(i=0;isum = p->sum + p->score[i];
}
p->average = p->sum * 1.0 / MAXCOURSE;
p=p->next;
}
}
/*計算班級總人數(shù)*/
int Count_People()
{
Student *p;
int people=0;
p=head->next;
while(p!=NULL)
{
people=people+1;
p=p->next;
}
return people;
}
/*計算班級平均分*/
void Count_Mark()
{
Student *p;
int m;
float avecla=0;
p=head->next;
while(p!=NULL)
{
avecla=avecla+p->sum;
p=p->next;
}
m=Count_People();
printf("班級平均分為:%.2f",avecla/m);
}
/*根據(jù)某科成績段顯示成績*/
void Section_Score()
{
char x;
int m,n,i,flag=0;
Student *p;
p=head->next;
printf("請輸入指定分數(shù)段的科目(A:數(shù)學 B:英語 C:計算機):\n");
scanf("%c",&x);
printf("請輸入你要顯示的分數(shù)段(從n到m):");
scanf("%d",&n);
scanf("%d",&m);
switch(x)
{
case 'A': while(p!=NULL)
{
if(n <= p->score[0] && p->score[0]<= m)
{
flag=1;
printf("\n姓名:%s, 學號:%s \n",p->name,p->id);
for(i=0; iscore[i]);
}
printf("總分為:%d 平均分:%.2f\n",p->sum,p->average);
}
p = p->next;
}
break;
case 'B': while(p!=NULL)
{
flag=1;
if(n <= p->score[1] && p->score[1]<= m)
{
printf("\n姓名:%s, 學號:%s \n",p->name,p->id);
for(i=0; iscore[i]);
}
printf("總分為:%d 平均分:%.2f\n",p->sum,p->average);
}
p = p->next;
}
break;
case 'C': while(p!=NULL)
{
flag=1;
if(n <= p->score[2] && p->score[2] <= m)
{
printf("\n姓名:%s, 學號:%s \n",p->name,p->id);
for(i=0; iscore[i]);
}
printf("總分為:%d 平均分:%.2f\n",p->sum,p->average);
}
p = p->next;
}
break;
default:
printf("輸入無效!\n");
fflush(stdin);
}
if(flag==0)
printf("在%d到%d的分數(shù)段學生為零!");
}
/*比較成績大小*/
Student *Descby_English(Student *Newhead,Student *sort)
{
Student *p,*q;
p=Newhead;
while(p!=NULL)
{
if(sort->sum > p->sum)
break;
q=p;
p=p->next;
}
if(p==Newhead)
{
sort->next = p;
return sort;
}
else
{
q->next = sort;
sort->next = p;
return Newhead;
}
}
/*按總分或平均分降序排列*/
void Descend_English()
{
Student *p,*q,*Newhead;
int i,j=1,people;
Newhead = NULL;
p = head;
while(p != NULL)
{
q = p->next;
Newhead = Descby_English(Newhead,p);
p = q;
}
if(p == head)
printf("學生信息庫為空!??!\n");
else
{
p = Newhead->next;
people=Count_People();
printf("按總分和平均分排序如下:\n");
while(p!=NULL)
{
if(j<=people)
{
printf("第%d名 ",j);
printf("姓名:%s 學號:%s ",p->name,p->id);
for(i=0; i<=people-1;i++)
{
printf("%s:%d ",ClassName[i],p->score[i]);
}
printf("總分:%d 平均分:%.2f ",p->sum,p->average);
}
j++;
printf("\n");
p=p->next;
}
}
}
/*按姓名查找學生成績*/
void *Searchname_Student()
{
char name[10];
int i=0;
Student *p=head->next;
getchar();
printf("請輸入你要查找的學生姓名:");
do{
gets(name);
if(!Check_Name(name))
printf("輸入姓名不正確!重新輸入:");
}while(!Check_Name(name));
while(p!=NULL)
{
if(strcmp(p->name,name)==0)
{
Output_Score(p);
i=1;
}
p=p->next;
}
if(i==0)
{
printf("找不到此姓名!");
}
}
/*按學號查找學生成績*/
void *SearchID_Student()
{
char id[10];
int i=0;
Student *p=head->next;
getchar();
printf("請輸入你要查找的學生學號:");
do{
gets(id);
if(!Check_ID(id))
printf("輸入學號不正確!重新輸入:");
}while(!Check_ID(id));
while(p!=NULL)
{
if(strcmp(p->id,id)==0)
{
Output_Score(p);
i=1;
}
p=p->next;
}
if(i==0)
{
printf("找不到此學號!");
}
}
/*主函數(shù)*/
void main()
{
int x,n,people;
Student *q;
Menu();
while(1)
{
printf("\n請輸入命令編號: ");
scanf("%d", &x);
switch(x)
{
case 1: //初始化
head = Init();
printf("初始化成功!!!\n");
break;
case 2: //輸入成績
printf("輸入序號:");
scanf("%d",&n);
getchar();
while(n!=-1)
{
Insert_Before();
printf("輸入序號:");
scanf("%d",&n);
getchar();
}
break;
case 3: //計算平均分和總分
Count_Score();
printf("計算平均分和總分成功!");
break;
case 4: //打印出所有成績
Output_List();
break;
case 5: Del_Student();
break;
case 6: //按姓名查找學生成績
Searchname_Student();
break;
case 7: //按學號查找學生成績
SearchID_Student();
break;
case 8: //計算班級人數(shù)
people=Count_People();
printf("班級總人數(shù)為:%d \n",people);
break;
case 9: /*插入學生成績*/
Insert_List();
break;
case 10: /*顯示某科分數(shù)段的學生*/
getchar();
Section_Score();
break;
case 11: /*按總分或平均分降序排列*/
Descend_English();
break;
case 0: /*結束*/
Quit();
break;
default:printf("輸入錯誤!\n\n");
}
}
}
試驗過程記錄
記錄試驗中遇到的困難及解決方法;
實驗結果記錄以及與預期結果比較以及分析
記錄每次實驗結果以及分析情況
初始化
輸入學生成績
計算平均分 總分
打印學生成績
刪除學生成績
查找學生成績
插入學生成績
顯示某分數(shù)段學生成績
總結以及心得體會
實驗總體還是比較順利,但也遇到了一些困難,通過與同學交流和查找資料已經(jīng)解決了。
在做實驗之前,一定要把課本上的知識吃透,因為這是做實驗的基礎,否則,在老師講解時久聽不懂,這會使實驗難度加大,浪費做實驗的寶貴時間。
做實驗一定要親力親為,務必要將每個細節(jié),每個步驟弄清楚,弄明白,還要復習,思考。這樣,你的印象才深刻,才記得牢固,否則,過后就忘了還不如不做。
每次的實驗都讓我受益非淺,這次課程設計更使我有了更大的收獲。明白了字符串的很多操作算法的編寫和理解,并且查閱了大量的資料,對字符串的相關知識有了很大的了解。
期間遇到了很多的問題,其實我覺得編寫程序,調(diào)試,遇到問題耐心的查錯,總會有解決辦法的,比較困難的錯誤其實是能夠運行之后結果不穩(wěn)定,有時候?qū)?,有時候錯,這樣的問題往往是程序設計的算法的問題,雖然這次程序沒有太復雜的算法,但是一些小的地方?jīng)]有考慮到,往往會給運行結果造成很多難以解釋的錯誤。我覺得我的程序在經(jīng)過很多種情況的測試后,基本上能滿足我自己的要求了,可能還有很多不完善的地方,但是確實收獲了很多東西,隨著以后的學習運用,估計會有更深入的認識。
指導老師評閱意見
指導老師: 年 月 日
填寫內(nèi)容時,可把表格擴大。實驗的源程序代碼(要有注釋)附在表后。
THANKS !!!
致力為企業(yè)和個人提供合同協(xié)議,策劃案計劃書,學習課件等等
打造全網(wǎng)一站式需求
歡迎您的下載,資料僅供參考
-可編輯修改-
鏈接地址:http://www.820124.com/p-1557134.html