學生成績管理系統實驗報告
㈠ 簡單的VF實驗報告 4選1做 (學生成績管理系統,圖書管理信息系統職工工資管理系統,產品銷售管理系統)
收費製作,非誠勿擾
㈡ 管理信息系統實驗報告
實驗目的: 學習LMIS的設計方法和思想
實驗內容: 1、能從GIS平台進行設計軟體,網路平台
2、選擇你最熟悉的業務畫功能圖
3、畫頁面設計
4、編碼模型設計
5、選擇模塊設計
實驗過程:
1. 學生信息管理系統功能結構圖
根據系統分析階段得到的數據流圖,採用軟體設計的概念和原理,以上一次參照的學生信息管理信息系統為實例,給出學生信息管理系統功能結構圖(圖1.1)。
2.系統運行平台設計
2.1系統運行平台設計的依據與基本原則
系統運行平台是指管理信息系統運行所依賴的硬體和軟體,因此其設計就是針對新系統的目標,在各種技術手段和實施方法中權衡利弊,合理地利用各種資源,選擇適當的計算機硬體,網路通信設備及其他輔助設備,軟體,以滿足新系統邏輯模型的需要和技術需求。系統運行平台設計的內容主要包括系統網路配置,硬體平台選擇,軟體平台選擇等。系統運行平台設計是每一個企業在開發管理系統時都要遇到的問題,影響著整個系統的成敗。
操作系統的選擇可以選擇Window NT、Windows 2000 Server、Windows Server 2003
2.2系統平台設計方案
本系統採用Windows NT 4.0作為網路操作系統,後台資料庫管理採用Microsoft Access,採用PowerBuilder 8.0作為前台卡發工具,採用C/S計算模式,資料庫伺服器設置在信息中心。
學生檔案管理系統
系統
學籍管理
班級管理
專業與課程
成績管理
圖1.1 學生信息管理系統功能圖
3.代碼設計
為了方便學生的管理,方便數據的輸入和輸出,為每個學生編制了學號代碼。左起兩位代表入學時間,左起3~4為表示招生類型,左起5~6位表示所屬院系,7~8表示所屬專業,後兩位表示學生序號(圖4.1)。
N N N N N N N N N N
學生序號
所屬專業
所屬院系
招生類型
入學時間
圖4.1 代碼設計圖
例如,學號0307241081表示此學生為2003年入學,二級學院經濟管理學院信息管理與信息系統專業序號為81號
4.資料庫設計
4.1資料庫的邏輯
在完成數據的概念模型設計即E-R圖後,即可進入資料庫的邏輯設計階段。資料庫的邏輯設計即把得到的滿足第三範式的關系轉化為特定的資料庫管理系統下的數據表。根據前面得到的各個關系,現把它們轉化為數據表。
(1)學生信息表:學號、姓名、性別、政治面貌、出生日期、專業、班級、家庭住址、聯系電話、備注。此表共有10個欄位,由於在校所有學生中,不可能存在兩個學生的學號相同,所以在本表中學號作為學生信息表的主鍵。
(2) 課程信息表:課程名稱、所屬專業。
(3)專業信息表:專業編號、專業名稱。此表以專業編號為主鍵。
(4) 班級信息表:班級名稱、所屬院系、輔導員、教室、人數。此表共有5個欄位,以班級名稱為主鍵,用於記錄學生所在班級的信息。
(5) 成績信息表:學號、姓名、專業、課程名稱、成績。此表共有5個欄位,以學號和課程名稱共同為主鍵,用於記錄學生在校期間的各科考試成績。
(6) 用戶表:用戶名稱、密碼、用戶ID。此表用於系統對操作員的設置。
4.2 資料庫的物理設計
在完成資料庫的邏輯設計後,就可以開始資料庫的物理設計。本學生信息管理系統採用Access資料庫。並在以下創建幾個數據表,其結構如下:
表5.2.1 學生信息表結構
欄位名
數據類型
欄位長度與格式
關鍵字
學號
文本
15
是
姓名
文本
20
否
性別
文本
5
否
政治面貌
文本
12
否
出生日期
日期型
YYYY-MM-DD
否
專業
文本
20
否
班級
文本
20
否
家庭住址
文本
50
否
聯系電話
文本
15
否
備注
文本
50
否
表5.2.2 課程信息表結構
欄位名
數據類型
欄位長度與格式
關鍵字
課程名稱
文本
20
是
所屬專業
文本
20
否
表5.2.3 專業信息表結構
欄位名
數據類型
欄位長度與格式
關鍵字
班級名稱
文本
20
是
所屬院系
文本
20
否
輔導員
文本
10
否
教室
文本
15
否
人數
文本
3
否
表5.2.4 班級信息表結構
欄位名
數據類型
欄位長度與格式
關鍵字
專業名稱
文本
20
是
所屬院系
文本
20
否
表5.2.5 成績信息表結構
欄位名
數據類型
欄位長度與格式
關鍵字
學號
文本
15
是
姓名
文本
20
否
成績專業
文本
20
否
課程名稱
文本
20
是
成績
文本
5
否
5. 模塊設計
採用SD法和模塊說明數,完成系統模塊設計。圖5.1給出了系統「班級管理」
表5.2為其模塊說明書。
班級管理
添加班級
修改班級
修改班級信息成功
出錯信息
圖5.1「班級管理」結構圖
表5.2 「班級管理」模塊的描述
模塊編號
F-bjgl
名稱
班級管理
功能
對班級進行添加和修改
輸入
專業名,所屬院系
輸出
0:操作失敗;1:操作成功
相關表
班級信息表
調用的模塊
班級添加;班級修改
實驗收獲:
通過在上機的實驗過程的操作中,認識到並且了解到了系統分析與系統設計過程中從物理模型上到概念模型上的轉換的實現。同時也學習了在數據設計過程中的一些比較重要的和關鍵的步驟與信息。在製作實驗報告的過程中通過操作WORD進行作圖分析的過程,也加深了對系統設計過程的理解
自己修改一下就得了。
㈢ VF銀行賬戶管理系統課程設計的實驗報告怎麼寫
可以藉助Baihi示意我們
有機會能夠處理你所遇到的工作
差不多的要求也能夠示意我們
ES:\\
㈣ 學生成績管理系統c語言實驗報告
這個學生成績管理系統實現了哪些功能
有程序嗎 有的話 發給我 我按程序寫報告
如果沒有我就先寫程序
look my name and jia me
㈤ 求一份學生成績管理系統實驗報告
C語言課程設計任務書
一、題目: 學生成績管理
二、目的與要求
1. 目的:
(1)基本掌握面向過程程序設計的基本思路和方法;
(2)達到熟練掌握C語言的基本知識和技能;
(3)能夠利用所學的基本知識和技能,解決簡單的程序設計問題
2. 要求
基本要求:
1. 要求利用C語言面向過程的編程思想來完成系統的設計;
2. 突出C語言的函數特徵,以多個函數實現每一個子功能;
3. 畫出功能模塊圖;
4. 進行簡單界面設計,能夠實現友好的交互;
5. 具有清晰的程序流程圖和數據結構的詳細定義;
6. 熟練掌握C語言對文件的各種操作。
創新要求:
在基本要求達到後,可進行創新設計,如系統用戶功能控制,對管理員級和一般級別的用戶系統功能操作不同
三、信息描述
輸入一個班10個學生的學號和每個學生考試三門功課(數學、英語、計算機基礎)的成績。編程計算出每個學生的總分和平均分,並按學生成績優劣排序,最後列印一張按高分到低分名次排序的成績單。要求:
1)排序用一個函數實現。
2)列印的成績單表項包括:序號,學號、數學、英語、計算機、總分、平均分。
3)按實驗報告電子模板格式填寫實驗內容。
四、功能描述
1. 學生基本信息及成績所選科目成績的錄入。
2. 基本信息的查詢(分系、班級;分科目)與修改。
3. 對每系或每班各科成績進行分析(即求單科平均成績、及格率和優秀率);
4. 對所開課程的成績分析(求其平均成績,最高分和最低分);
5. 對學生考試成績進行排名(單科按系別或班級進行排名,對每一個班級,同一學期學生總體成績進行排名,並顯示各科成績信息)
五、解決方案
1. 分析程序的功能要求,劃分程序功能模塊。
2. 畫出系統流程圖。
3. 代碼的編寫。定義數據結構和各個功能子函數。
4. 程序的功能調試。
5. 完成系統總結報告以及使用說明書
六、進度安排
此次課程設計時間為兩周,分四個階段完成:
1. 分析設計階段。指導教師應積極引導學生自主學習和鑽研問題,明確設計要求,找出實現方法,按照需求分析、總體設計、詳細設計這幾個步驟進行。
2. 編碼調試階段:根據設計分析方案編寫C代碼,然後調試該代碼,實現課題要求的功能。
3. 總結報告階段:總結設計工作,寫出課程設計說明書,要求學生寫出需求分析、總體設計、詳細設計、編碼、測試的步驟和內容。
4. 考核階段。
#include <stdio.h>
#include <stdlib.h>
#define STU_NUM 10 /*宏定義學生的數量*/
struct student /*定義一個結構體用來存放學生學號、三門課成績、總分及平均成績*/
{
char stu_id[20]; /*學生學號;*/
float score[3]; /*三門課成績;*/
float total; /*總成績;*/
float aver; /*平均成績;*/
};
/*排序用一個函數來實現*/
void SortScore(student *stu,int n)
{
student stud;
for(int i = 0; i < n-1; i++)
for(int j = i+1 ; j < n; j++)
{
if(stu[i].total < stu[j].total)
{
stud = stu[i];
stu[i] = stu[j];
stu[j] = stud;
}
}
}
int main( )
{
student stu[STU_NUM]; /*創建結構體數組中有10個元素,分別用來保存這10個人的相關信息。*/
/*輸入這十個學生的相關信息*/
for(int i = 0; i<STU_NUM; i++)
{
printf("請輸入第%d個學生的學號:",i+1);
scanf("%s",&stu[i].stu_id);
printf("輸入第%d個學生的數學成績:",i+1);
scanf("%f",&stu[i].score[0]);
printf("輸入第%d個學生的英語成績:",i+1);
scanf("%f",&stu[i].score[1]);
printf("輸入第%d個學生的計算機成績:",i+1);
scanf("%f",&stu[i].score[2]);
stu[i].total = stu[i].score[0]+stu[i].score[1]+stu[i].score[2];
stu[i].aver = stu[i].total/3;
}
printf("\n");
SortScore(stu,STU_NUM);/*調用排序函數*/
/*輸出排序後的各學生的成績*/
for(i = 0 ; i < STU_NUM; i++)
{
printf("序號: %d\t",i);
printf("學號:%s\t",stu[i].stu_id);
printf("數學:%f\t",stu[i].score[0]);
printf("英語:%f\t",stu[i].score[1]);
printf("計算機:%f\t",stu[i].score[2]);
printf("平均成績:%f\t",stu[i].aver);
printf("總分:%f\t",stu[i].total);
printf("\n\n");
}
return 0;
}
註:(源程序中主要標識符含義說明)
#define STU_NUM 10 /*宏定義學生的數量*/
struct student /*定義一個結構體用來存放學生學號、三門課成績、總分及平均成績*/
{
char stu_id[20]; /*學生學號;*/
float score[3]; /*三門課成績;*/
float total; /*總成績;*/
float aver; /*平均成績;*/
}
實驗結果:
輸入 :(只輸入後面的數字,前面的文字是自己產生的)。
請輸入第1個學生的學號:001
輸入第1個學生的數學成績:1
輸入第1個學生的英語成績:1
輸入第1個學生的計算機成績:1
請輸入第2個學生的學號:002
輸入第2個學生的數學成績:2
輸入第2個學生的英語成績:2
輸入第2個學生的計算機成績:2
請輸入第3個學生的學號:003
輸入第3個學生的數學成績:3
輸入第3個學生的英語成績:3
輸入第3個學生的計算機成績:3
請輸入第4個學生的學號:004
輸入第4個學生的數學成績:4
輸入第4個學生的英語成績:4
輸入第4個學生的計算機成績:4
請輸入第5個學生的學號:005
輸入第5個學生的數學成績:5
輸入第5個學生的英語成績:5
輸入第5個學生的計算機成績:5
請輸入第6個學生的學號:006
輸入第6個學生的數學成績:6
輸入第6個學生的英語成績:6
輸入第6個學生的計算機成績:6
請輸入第7個學生的學號:007
輸入第7個學生的數學成績:7
輸入第7個學生的英語成績:7
輸入第7個學生的計算機成績:7
請輸入第8個學生的學號:008
輸入第8個學生的數學成績:8
輸入第8個學生的英語成績:8
輸入第8個學生的計算機成績:8
請輸入第9個學生的學號:009
輸入第9個學生的數學成績:9
輸入第9個學生的英語成績:9
輸入第9個學生的計算機成績:9
請輸入第10個學生的學號:010
輸入第10個學生的數學成績:10
輸入第10個學生的英語成績:10
輸入第10個學生的計算機成績:10
輸出:
序號: 0 學號:010 數學:10.000000 英語:10.000000 計算機:10.000000
平均成績:10.000000 總分:30.000000
序號: 1 學號:009 數學:9.000000 英語:9.000000 計算機:9.000000
平均成績:9.000000 總分:27.000000
序號: 2 學號:008 數學:8.000000 英語:8.000000 計算機:8.000000
平均成績:8.000000 總分:24.000000
序號: 3 學號:007 數學:7.000000 英語:7.000000 計算機:7.000000
平均成績:7.000000 總分:21.000000
序號: 4 學號:006 數學:6.000000 英語:6.000000 計算機:6.000000
平均成績:6.000000 總分:18.000000
序號: 5 學號:005 數學:5.000000 英語:5.000000 計算機:5.000000
平均成績:5.000000 總分:15.000000
序號: 6 學號:004 數學:4.000000 英語:4.000000 計算機:4.000000
平均成績:4.000000 總分:12.000000
序號: 7 學號:003 數學:3.000000 英語:3.000000 計算機:3.000000
平均成績:3.000000 總分:9.000000
序號: 8 學號:002 數學:2.000000 英語:2.000000 計算機:2.000000
平均成績:2.000000 總分:6.000000
序號: 9 學號:001 數學:1.000000 英語:1.000000 計算機:1.000000
平均成績:1.000000 總分:3.000000
七、撰寫課程設計報告或課程設計總結
課程設計報告要求:
總結報告包括需求分析、總體設計、詳細設計、編碼(詳細寫出編程步驟)、測試的步驟和內容、課程設計總結、參考資料等,不符合以上要求者,則本次設計以不及格記。
C語言常見錯誤
書寫標識符時,忽略了大小寫字母的區別
main()
{
int a=5;
printf("%d",A);
}
編譯程序把a和A認為是兩個不同的變數名,而顯示出錯信息。C認為大寫字母和小寫字母是兩個不同的字元。習慣上,符號常量名用大寫,變數名用小寫表示,以增加可讀性。
2.忽略了變數的類型,進行了不合法的運算。
main()
{
float a,b;
printf("%d",a%b);
}
%是求余運算,得到a/b的整余數。整型變數a和b可以進行求余運算,而實型變數則不允許進行「求余」運算。
3.將字元常量與字元串常量混淆。
char c;
c="a";
在這里就混淆了字元常量與字元串常量,字元常量是由一對單引號括起來的單個字元,字元串常量是一對雙引號括起來的字元序列。C規定以「\」作字元串結束標志,它是由系統自動加上的,所以字元串「a」實際上包含兩個字元:『a'和『\',而把它賦給一個字元變數是不行的。
4.忽略了「=」與「==」的區別。
在許多高級語言中,用「=」符號作為關系運算符「等於」。如在BASIC程序中可以寫
if (a=3) then …
但C語言中,「=」是賦值運算符,「==」是關系運算符。如:
if (a==3) a=b;
前者是進行比較,a是否和3相等,後者表示如果a和3相等,把b值賦給a。由於習慣問題,初學者往往會犯這樣的錯誤。
5.忘記加分號。
分號是C語句中不可缺少的一部分,語句末尾必須有分號。
a=1
b=2
編譯時,編譯程序在「a=1」後面沒發現分號,就把下一行「b=2」也作為上一行語句的一部分,這就會出現語法錯誤。改錯時,有時在被指出有錯的一行中未發現錯誤,就需要看一下上一行是否漏掉了分號。
{ z=x+y;
t=z/100;
printf("%f",t);
}
對於復合語句來說,最後一個語句中最後的分號不能忽略不寫(這是和PASCAL不同的)。
6.多加分號。
對於一個復合語句,如:
{ z=x+y;
t=z/100;
printf("%f",t);
};
復合語句的花括弧後不應再加分號,否則將會畫蛇添足。
又如:
if (a%3==0);
I++;
本是如果3整除a,則I加1。但由於if (a%3==0)後多加了分號,則if語句到此結束,程序將執行I++語句,不論3是否整除a,I都將自動加1。
再如:
for (I=0;I<5;I++);
{scanf("%d",&x);
printf("%d",x);}
本意是先後輸入5個數,每輸入一個數後再將它輸出。由於for()後多加了一個分號,使循環體變為空語句,此時只能輸入一個數並輸出它。
7.輸入變數時忘記加地址運算符「&」。
int a,b;
scanf("%d%d",a,b);
這是不合法的。Scanf函數的作用是:按照a、b在內存的地址將a、b的值存進去。「&a」指a在內存中的地址。
8.輸入數據的方式與要求不符。①scanf("%d%d",&a,&b);
輸入時,不能用逗號作兩個數據間的分隔符,如下面輸入不合法:
3,4
輸入數據時,在兩個數據之間以一個或多個空格間隔,也可用回車鍵,跳格鍵tab。
②scanf("%d,%d",&a,&b);
C規定:如果在「格式控制」字元串中除了格式說明以外還有其它字元,則在輸入數據時應輸入與這些字元相同的字元。下面輸入是合法的:
3,4
此時不用逗號而用空格或其它字元是不對的。
3 4 3:4
又如:
scanf("a=%d,b=%d",&a,&b);
輸入應如以下形式:
a=3,b=4
9.輸入字元的格式與要求不一致。
在用「%c」格式輸入字元時,「空格字元」和「轉義字元」都作為有效字元輸入。
scanf("%c%c%c",&c1,&c2,&c3);
如輸入a b c
字元「a」送給c1,字元「 」送給c2,字元「b」送給c3,因為%c只要求讀入一個字元,後面不需要用空格作為兩個字元的間隔。
10.輸入輸出的數據類型與所用格式說明符不一致。
例如,a已定義為整型,b定義為實型
a=3;b=4.5;
printf("%f%d\n",a,b);
編譯時不給出出錯信息,但運行結果將與原意不符。這種錯誤尤其需要注意。
11.輸入數據時,企圖規定精度。
scanf("%7.2f",&a);
這樣做是不合法的,輸入數據時不能規定精度。
12.switch語句中漏寫break語句。
例如:根據考試成績的等級列印出百分制數段。
switch(grade)
{ case 'A':printf("85~100\n");
case 'B':printf("70~84\n");
case 'C':printf("60~69\n");
case 'D':printf("<60\n");
default:printf("error\n");
由於漏寫了break語句,case只起標號的作用,而不起判斷作用。因此,當grade值為A時,printf函數在執行完第一個語句後接著執行第二、三、四、五個printf函數語句。正確寫法應在每個分支後再加上「break;」。例如
case 'A':printf("85~100\n");break;
13.忽視了while和do-while語句在細節上的區別。
(1)main()
{int a=0,I;
scanf("%d",&I);
while(I<=10)
{a=a+I;
I++;
}
printf("%d",a);
}
(2)main()
{int a=0,I;
scanf("%d",&I);
do
{a=a+I;
I++;
}while(I<=10);
printf("%d",a);
}
可以看到,當輸入I的值小於或等於10時,二者得到的結果相同。而當I>10時,二者結果就不同了。因為while循環是先判斷後執行,而do-while循環是先執行後判斷。對於大於10的數while循環一次也不執行循環體,而do-while語句則要執行一次循環體。
14.定義數組時誤用變數。
int n;
scanf("%d",&n);
int a[n];
數組名後用方括弧括起來的是常量表達式,可以包括常量和符號常量。即C不允許對數組的大小作動態定義。
15.在定義數組時,將定義的「元素個數」誤認為是可使的最大下標值。
main()
{static int a[10]={1,2,3,4,5,6,7,8,9,10};
printf("%d",a[10]);
}
C語言規定:定義時用a[10],表示a數組有10個元素。其下標值由0開始,所以數組元素a[10]是不存在的。
16.初始化數組時,未使用靜態存儲。
int a[3]={0,1,2};
這樣初始化數組是不對的。C語言規定只有靜態存儲(static)數組和外部存儲(exterm)數組才能初始化。應改為:
static int a[3]={0,1,2};
17.在不應加地址運算符&的位置加了地址運算符。
scanf("%s",&str);
C語言編譯系統對數組名的處理是:數組名代表該數組的起始地址,且scanf函數中的輸入項是字元數組名,不必要再加地址符&。應改為:
scanf("%s",str);
18.同時定義了形參和函數中的局部變數。
int max(x,y)
int x,y,z;
{z=x>y?x:y;
return(z);
}
形參應該在函數體外定義,而局部變數應該在函數體內定義。應改為:
int max(x,y)
int x,y;
{int z;
z=x>y?x:y;
return(z);
}
C語言心得體會
通過這次實訓,增加了我學習軟體技術的興趣,雖然還不明確軟體技術包含的具體內容,但從C語言這門課程開始,已發現程序設計的樂趣,在學習C語言的過程中也學到了許多計算機應用基礎知識,對計算機的機體也有了一個大體的了解。
這次實訓是老師給了范常式序,經過自己的改寫,實現要求。先做簡單的輸出,一步步的再做其它圖案,在實際操作過程中犯的一些錯誤還會有意外的收獲,感覺實訓很有意思。在具體操作中對這學期所學的C語言的理論知識得到鞏固,達到實訓的基本目的,也發現自己的不足之出,在以後的上機中應更加註意,同時體會到C語言具有的語句簡潔,使用靈活,執行效率高等特點。發現上機實訓的重要作用,特別是對數組和循環有了深刻的理解。
通過實際操作,學會 C語言程序編程的基本步驟、基本方法,開發了自己的邏輯思維能力,培養了分析問題、解決問題的能力。深刻體會到「沒有做不到的,只有想不到的」,「團結就是力量」,「實踐是檢驗真理的標准」,「不恥下問」……的寓意。
計時在此希望以後應多進行這樣的實訓,加長設間,培養學生獨立思考問題的能力,提高實際操作水平。
八、參考資料 :《C語言程序設計教程》
㈥ 求c++程序 學生成績管理系統 詳細的實驗報告
#include<iostream>
#include<string>
#include <fstream>
#include<sstream>
#include<iomanip>
#include <stdlib.h>
using namespace std;
//結點類,用於存放學生的各種數據
class Node{
public:
int id;
//學號
string name;
//姓名
string grade;
//等級
double english;
//英語
double math;
//數學
double c;
//C++
double sum;
//總分
double average;
Node *next;
//指向下一結點的指針
Node(int nid=0,string nname="noname",
//構造函數,初始化變數
double e=0,double m=0,double cl=0,double s=0 ,double a=0,string g="ng");
};
Node::Node(int nid,string nname,double e,double m,double cl,double s,double a,string g)
{
id=nid;
name=nname;
next=NULL;
english=e;
math=m;c=cl;
sum=s;
average=a;
grade=g;
}
//class NOde結束//Link類,把數據以鏈表的形式存儲,鏈表的每個結點為一個Node對象
class Link{
private:
Node *head;
//鏈表的頭指針,為Node對象類型的指
public :
Link();//構造函數,初始化變數
bool linkIsEmpty();//判斷鏈表是否為空
void linkInsert(Node *newnode);//向鏈表中插入新的結點
bool linkDelete(int nid);//從鏈表中刪除的結點
void linkClear();//清空鏈表中數據
void linkView();//查看鏈表中數據
void linkGrade(Node *p1);//計算等級
void linkAverageTotle();//按平均分統計
Node* linkFind(int nid);//在鏈表中查找id為nid結點,返回指向該結點的指針
Node* getHead();//獲取頭指針
};
Link::Link()
{ //構造函數,初始化鏈表為空
head=NULL;
}
bool Link::linkIsEmpty()
{ //判斷鏈表是否為空,空則返回
true; return(head==NULL);
}
void Link::linkInsert(Node *newnode)
{//按id值從小到大的順序,插入新的結點
Node *p1;if(!head)//鏈表為空的情況
head=newnode;else if((head->id)>(newnode->id))
{//插入到第一個結點的情況
newnode->next=head;
head=newnode;
}
else
{//插入到第二個及以後情況
p1=head;
while(1)
{if(!(p1->next))
{p1->next=newnode;break;}
else if((p1->next)->id>newnode->id)
{newnode->next=p1->next;p1->next=newnode;break;}
p1=p1->next;}
}
}
bool
Link::linkDelete(int nid)
{//刪除結點,成功則返回
true; Node *p;
if(head==NULL)
//鏈表為空的情況
return false;
if(head->id==nid)
{//刪除的為第一個結點的情況
head=head->next;
return true;
}p=head;
while(p->next)
{//刪除的為第二個及以後結點的情況
if((p->next)->id==nid)
{p->next=(p->next)->next;
return true;
}
p=p->next;
}
return false;
}
void Link::linkClear()
{//清空鏈表
head=NULL;
}
void Link::linkView()
{//顯示鏈表數據
Node *p=head;
cout<<setw(10)<<"學號"<<setw(8)<<"姓名"<<setw(8)<<"英語"<<setw(8)<<"數學"<<setw(8)<<"C++"<<setw(8)<<"總分"<<setw(8)<<"平均分"<<setw(8)<<"等級"<<endl;while(p){ (p->sum)=(p->english)+(p->math)+(p->c);
//計算總分
(p->average)=((p->english)+(p->math)+(p->c))/3;
//計算平均成績
linkGrade(p);
//計算等級
cout<<setw(10)<<p->id<<setw(8)<<p->name<<setw(8)<<p->english<<setw(8)<<p->math<<setw(8)<<p->c<<setw(8)<<p->sum<<setw(8)<<p->average<<setw(8)<<p->grade<<endl; p=p->next;}}void Link::linkGrade(Node *p1)
{
// 計算等級
while(p1){
if(p1->average>=90&&p1->average<=100)
p1->grade="優";
else if(p1->average>=80&&p1->average<90)
p1->grade="良好";
else if(p1->average>=70&&p1->average<80)
p1->grade="中等";
else if(p1->average>=60&&p1->average<=70)
p1->grade="合格";
else
p1->grade="不合格";p1=p1->next;
}
}
void Link::linkAverageTotle()
{//按學生平均分統計
int a=0,b=0,c=0,d=0,e=0,f=0;
double averagesum=0,asum=0,aaverage=0,paverage=0;
Node *p3=head;
while(p3)
{
if(p3->average>=90&&p3->average<=100) a+=1;
else if(p3->average>=80&&p3->average<90)b+=1;
else if(p3->average>=70&&p3->average<80) c+=1;
else if(p3->average>=60&&p3->average<70) d+=1;
else e+=1;
asum+=p3->sum;
aaverage+=p3->average;p3=p3->next;
}
f=a+b+c+d+e;
averagesum=asum/f;
paverage=aaverage/f;
cout<<"|-------------------------------------------------------|"<<endl;
cout<<"| 總 人 數:"<<f<<endl;
cout<<"|-------------------------------------------------------|"<<endl;
cout<<"| 優 人 數:"<<a<<" | "<<"優 秀 率: "<<a*100/f<<"%"<<endl;
cout<<"|-------------------------------------------------------|"<<endl;
cout<<"| 良 好 的人數:"<<b<<" | "<<"良 好 率: "<<b*100/f<<"%"<<endl;
cout<<"|-------------------------------------------------------|"<<endl;
cout<<"| 中 等 的人數:"<<c<<" | "<<"中 等 率: "<<c*100/f<<"%"<<endl;
cout<<"|-------------------------------------------------------|"<<endl;
cout<<"| 所有合格人數:"<<a+b+c+d<<" | "<<"合 格 率: "<<(a+b+c+d)*100/f<<"%"<<endl;
cout<<"|-------------------------------------------------------|"<<endl;
cout<<"| 不 合 格 數:"<<e<<" | "<<"不合格率: "<<e*100/f<<"%"<<endl;
cout<<"|-------------------------------------------------------|"<<endl;
cout<<"| 總分的平均分:"<<averagesum<<" | "<<"所有科目的平均分:"<<paverage<<endl;
cout<<"|-------------------------------------------------------|"<<endl;
}
Node* Link::linkFind(int nid)
{//查找id值為nid的結點,返回該結點的指針
Node *p=head;
//沒找到符合條件的結點的話,返回的指針值為
NULL; while(p)
{if(p->id==nid)break;
else
p=p->next;
}return p;
}
Node* Link::getHead()
{return head;}
//class Link 結束
//類Student,用於包裝Link類及菜單操作
class Student
{
private:
Link slink;
//Link對象成員
bool k;
//記錄數據是否被修改
public:
Student();
void studentClear();
void studentInsert();
void studentDelete();
void studentFind();
void studentView();
void studentLoad();
void studentSave();
void studentAverageTotle();
//按平均分數統計等級
void Exit();
//退出程序
void showMenu();
//顯示菜單
void showTip();
//顯示操作提示
void doMenu(char n);
//執行相應菜單項功能
};
Student::Student()
{
Link();
//調用成員對象的構造函數
studentLoad();
//從文件中讀取數據,創建鏈表
k=false;
//設置數據被修改
}
void Student::studentClear()
{
//清空學生記錄
slink.linkClear();
cout<<"成功清空學生記錄!"<<endl;
}
void Student::studentInsert()
{
//插入學生記錄
Node *p=new Node();
cout<<"請輸入學號:";
cin>>p->id;
cout<<"請輸入姓名:";
cin>>p->name;
if(!slink.linkFind(p->id))
{
//判斷學號是否存在
slink.linkInsert(p);
k=true;
}
else
cout<<"學號為"<<p->id<<"的學生已存在,插入失敗!";
cout<<"請輸入成績:"<<endl;
cout<<"英語:"; cin>>p->english;
cout<<endl; cout<<"數學:";
cin>>p->math;
cout<<endl;
cout<<"C++:";
cin>>p->c;
cout<<endl;
(p->sum)=(p->english)+(p->math)+(p->c);
//計算總分
(p->average)=((p->english)+(p->math)+(p->c))/3;
//計算平均成績
}
void Student::studentDelete()
{
//刪除學生記錄
int i;
if(slink.linkIsEmpty())
//鏈表為空的情況
cout<<"沒有學生記錄!"<<endl;
else{
cout<<"請輸入學號:";
cin>>i;
if(slink.linkDelete(i))
{
cout<<"成功刪除學號為"<<i<<"的學生記錄!"<<endl;
k=true;
}
else
cout<<"沒有找到學號為"<<i<<"的學生!"<<endl;
}
}
void Student::studentFind()
{
//查找某學號的學生記錄
int n;
Node *p;if(slink.linkIsEmpty())
//鏈表為空的情況
cout<<"沒有學生記錄!"<<endl;
else{cout<<"請輸入要查找的學號:";
cin>>n;p=slink.linkFind(n);
//獲得找到的結點的指針
if(p)
{
//指針值不為NULL時
(p->sum)=(p->english)+(p->math)+(p->c);
//計算總分
(p->average)=((p->english)+(p->math)+(p->c))/3;
//計算平均成績
slink.linkGrade(p);
cout<<setw(6)<<"學號"<<setw(8)<<"姓名"<<setw(8)<<"英語"<<setw(8)<<"數學"<<setw(8)<<"C++"<<setw(8)<<"總分"<<setw(8)<<"平均分"<<setw(8)<<"等級"<<endl;
cout<<setw(6)<<p->id<<setw(8)<<p->name<<setw(8)<<p->english<<setw(8)<<p->math<<setw(8)<<p->c<<setw(8)<<p->sum<<setw(8)<<p->average<<setw(8)<<p->grade<<endl;
}
else
//指針值為NULL時
cout<<"沒有找到學號為"<<n<<"的學生記錄!"<<endl;
}
}
void Student::studentView()
{
//顯示所有學生的記錄
if(slink.linkIsEmpty())
cout<<"沒有學生記錄!"<<endl;
else
slink.linkView();
}
void Student::studentLoad()
{//從文件中讀入數據,創建鏈表
Node *p;int nid;
ifstream infile("data.txt");
if(!infile)cerr<<"錯誤:數據文件不能打開!\n";
else while(infile>>nid)
{
//讀取學號,直到讀空
p=new Node();
p->id=nid;
infile>>p->name>>p->english>>p->math>>p->c>>p->sum>>p->average>>p->grade;
//讀取姓名
slink.linkInsert(p);
}
infile.close();
//關閉文件
}
void Student::studentSave()
{
//將數據保存到文件
Node *p=slink.getHead();
ofstream outfile("data.txt");
if(!outfile)cerr<<"錯誤:數據文件不能打開!\n";
else
{
while(p)
{
outfile<<p->id<<' '<<p->name<<' '<<p->english<<' '<<p->math<<' '<<p->c<<' '<<p->sum<<' '<<p->average<<' '<<p->grade<<endl;
p=p->next;
}
k=false;
cout<<"保存成功!"<<endl;
}
}
void Student::studentAverageTotle()
{
if(slink.linkIsEmpty());//執行語句;
else
slink.linkAverageTotle();
}
void Student::Exit()
{
char s='Y';
if(k){
//判斷數據是否修改
cout<<"數據已經改變,是否保存?(y/n):";
cin>>s;if(s=='y'||s=='Y')studentSave();
}
cout<<"已安全退出,";
system("pause");
exit(0);
}
void Student::showMenu()
{
cout<<" "<<"|------------------------------------------------|"<<endl;
cout<<" "<<"| 學生信息管理系統 |"<<endl;
cout<<" "<<"|------------------------------------------------|"<<endl;
cout<<" "<<"| 1. 清空:清除所有學生數據 |"<<endl;
cout<<" "<<"|------------------------------------------------|"<<endl;
cout<<" "<<"| 2. 添加:插入一條學生數據 |"<<endl;
cout<<" "<<"|------------------------------------------------|"<<endl;
cout<<" "<<"| 3. 刪除:刪除指定學生數據 |"<<endl;
cout<<" "<<"|------------------------------------------------|"<<endl;
cout<<" "<<"| 4. 查找:查找指定學生數據 |"<<endl;
cout<<" "<<"|------------------------------------------------|"<<endl;
cout<<" "<<"| 5. 顯示:顯示所有學生數據 |"<<endl;
cout<<" "<<"|------------------------------------------------|"<<endl;
cout<<" "<<"| 6. 保存:保存所有學生數據 |"<<endl;
cout<<" "<<"|------------------------------------------------|"<<endl;
cout<<" "<<"| 7. 統計:按學生平均分統計 |"<<endl;
cout<<" "<<"|------------------------------------------------|"<<endl;
cout<<" "<<"| 0. 退出:安全的退出本系統 |"<<endl;
cout<<" "<<"|------------------------------------------------|"<<endl<<endl;
}
void Student::showTip()
{
cout<<endl;
cout<<"-------------------操作完成---------------------"<<endl;
cout<<"-----------------選擇0-7繼續-------------------"<<endl;
cout<<"請選擇:";
}
void Student::doMenu(char n)
{
switch(n)
{
case '1':studentClear();break;
case '2':studentInsert();break;
case '4':studentFind();break;
case '3':studentDelete();break;
case '5':studentView();break;
case '6':studentSave();break;
case '7':studentAverageTotle();break;
case '0':Exit();break;
default:cout<<"輸入錯誤!";
}
}
int main()
{
Student s;
char i='9';
s.showMenu();
cout<<"選擇對應數字進行操作:";
while(1)
{cin>>i;
system("cls");
//清除屏幕
s.showMenu();
s.doMenu(i);
s.showTip();
}
return 0;
}
希望能對你有幫助