教師信息管理系統(tǒng)
本題目設(shè)計(jì)目的是訓(xùn)練學(xué)生的基本編程能力,了解管理信息系統(tǒng)的開發(fā)流程,熟悉C語言的文件和單鏈表的各種基本操作。本程序中涉及結(jié)構(gòu)體、數(shù)組、文件等方面的知識(shí)。通過本程序的訓(xùn)練,使學(xué)生能對(duì)C語言的文件操作有一個(gè)更深刻的了解,掌握利用數(shù)組結(jié)構(gòu)實(shí)現(xiàn)對(duì)教師信息管理的原理,為進(jìn)一步開發(fā)出高質(zhì)量的管理信息系統(tǒng)打下堅(jiān)實(shí)的基礎(chǔ)。
1、問題定義
創(chuàng)建一個(gè)教師信息管理系統(tǒng)。系統(tǒng)中包括教師的信息錄用,每個(gè)教師的總工資,教師的性別,出生年月,教師津貼等。程序的運(yùn)行效果如下圖所示,選擇任任意菜單后,實(shí)現(xiàn)相應(yīng)功能。
圖1.1? 教師信息管理系統(tǒng)功能
2、系統(tǒng)設(shè)計(jì)
2.1 總體設(shè)計(jì)
采用模塊化的程序設(shè)計(jì)方法,即將較大的任務(wù)按照一定的原則分為一個(gè)個(gè)較小的任務(wù),然后分別設(shè)計(jì)各個(gè)小任務(wù)。需要注意的是劃分出來的模塊應(yīng)該相對(duì)獨(dú)立但又相關(guān),且容易理解??梢杂媚K化層次結(jié)構(gòu)圖(即模塊圖)來分析其任務(wù)的劃分,一般從上到下進(jìn)行,最上面一層是主模塊,下面各層是其上一層模塊的逐步細(xì)化描述。
本教師信息管理系統(tǒng)要求采用單鏈表實(shí)現(xiàn),如圖2.1所示,它由如下五大功能模塊組成:
- 輸入記錄模塊。完成將數(shù)據(jù)存入單鏈表的工作。記錄可以從以二進(jìn)制形式存儲(chǔ)的數(shù)據(jù)文件中讀入,也可從鍵盤逐個(gè)輸入教師信息記錄。教師記錄由教師的基本信息構(gòu)成。當(dāng)從數(shù)據(jù)文件中讀入記錄時(shí),也就是把在以記錄為單位存儲(chǔ)的數(shù)據(jù)文件中,將記錄逐條復(fù)制到單鏈表中。
- 查詢記錄模塊。完成在單鏈表中查找滿足相關(guān)條件的教師記錄。在此教師信息管理系統(tǒng)中,用戶可以按照教師的工號(hào)或姓名在單鏈表中進(jìn)行查找。若找到該教師的記錄,則返回指向該教師的記錄的指針。否則返回一個(gè)值為NULL的空指針,并打印出未找到該學(xué)生記錄的提示信息。
- 更新記錄模塊。完成對(duì)教師記錄的維護(hù)。在此教師信息管理系統(tǒng)中,它實(shí)現(xiàn)了對(duì)教師記錄的修改、刪除、插入和排序操作,并將修改后的數(shù)據(jù)存入源數(shù)據(jù)文件。
- 統(tǒng)計(jì)記錄模塊。完成對(duì)教師最高工資和最低工資人數(shù)的統(tǒng)計(jì)。
- 輸出記錄模塊。一是實(shí)現(xiàn)對(duì)教師信息記錄的存盤,即將記錄寫入數(shù)據(jù)文件中;二是實(shí)現(xiàn)將記錄信息以表格的形式在屏幕上打印出來。
2.2 詳細(xì)設(shè)計(jì)
2.2.1數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
- 教師信息管理結(jié)構(gòu)體
struct data
{
int year;
int month;
int day;
};
struct teacher
{
char num[15];
char name[30];
struct data bir;
char sex;
float jbgz;
float jt;
};? 結(jié)構(gòu)體struct teacher將用于存儲(chǔ)教師的基本信息,它將作為單鏈表的數(shù)據(jù)域。
2.2.2 主控main()函數(shù)執(zhí)行流程
程序總體結(jié)構(gòu)圖
2.2.3函數(shù)功能描述
- input()
函數(shù)原型:void input()
void input()此函數(shù)功能是輸入教師信息。
struct data 函數(shù)原型:void struct data stringinput ()函數(shù)用于輸入字符串,并進(jìn)行字符串
- Conio 函數(shù)原型:#include <conio.h>,是函數(shù)預(yù)處理。
- 主函數(shù)main()
整個(gè)成績(jī)管理系統(tǒng)控制部分,其詳細(xì)說明可參考圖二。
完成在上述系統(tǒng)設(shè)計(jì)后,即可著手進(jìn)行系統(tǒng)實(shí)現(xiàn)的工作,開始程序代碼的編寫。
3、系統(tǒng)實(shí)現(xiàn)
3.1 編碼
3.1.1 部分實(shí)訓(xùn)原始代碼
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
/*函數(shù)聲明*/
void input(); // 此函數(shù)功能是輸入教師信息
int menu();//此函數(shù)是一個(gè)菜單
//學(xué)號(hào):1352100129
struct data
{
int year;
int month;
int day;
};
struct teacher
{
char num[15];
char name[30];
struct data bir;
char sex;
float jbgz;
float jt;
};
int menu()
{
int n;
printf("1. 實(shí)現(xiàn)教師信息的錄入n");
printf("2. 求每個(gè)教師的總工資,并輸出n");
printf("3. 按總工資從高到低排序,輸出教師信息n");
printf("4. 查找指定姓名的教師信息,若不存在,給出提示信息n");
printf("5. 查找基本工資最高的教師信息n");
printf("6. 修改指定職工號(hào)的職工信息n");
printf("7. 程序結(jié)束n");
printf("************************************************n");
printf("請(qǐng)輸入你要執(zhí)行的操作:n");
scanf("%d",&n);
while( n<1 || n>7)
{
printf("請(qǐng)重新輸入n");
scanf("%d",&n);
}
return n;
}
//實(shí)現(xiàn)教師信息錄入
void input(struct teacher a[],int n)
{
int i;
printf("n");
for(i=0;i<n;i++)
{
printf("請(qǐng)輸入教師工作號(hào):");
scanf("%s",a[i].num);
printf("請(qǐng)輸入教師姓名:");
scanf("%s",a[i].name);
printf("請(qǐng)輸入教師出生日期:");
scanf("%d%d%d",&a[i].bir.year,&a[i].bir.month,&a[i].bir.day);
printf("請(qǐng)輸入教師性別:");
getchar();
scanf("%c",&a[i].sex);
printf("請(qǐng)輸入教師基本工資:");
scanf("%f",&a[i].jbgz);
printf("請(qǐng)輸入教師津貼:");
scanf("%f",&a[i].jt);
}
}
//實(shí)現(xiàn)教師信息輸出
void output(struct teacher a[],int n)
{
int i;
printf("工作號(hào),姓名,出生日期,性別,基本工資,津貼,總工資:n");
for(i=0;i<n;i++)
printf("%s %s %d %d %d %c %f %f %fn",a[i].num,a[i].name,a[i].bir.year,a[i].bir.month,a[i].bir
.day,a[i].sex,a[i].jbgz,a[i].jt,a[i].jbgz+a[i].jt);
}
//按工資從高到低排序,輸出教師信息
void sortbyzgz (struct teacher a[],int n)
{
int i,j,k;
struct teacher temp;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if((a[j].jbgz+a[j].jt)>(a[i].jbgz+a[i].jt))
k=j;
if(k!=i)
{
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
}
output(a,n);
}
//查找指定姓名的教師信息,若不存在,給出提示信息
void searchbyname(struct teacher a[],int n)
{
char name[20];
int flag=0;
int i;
printf("請(qǐng)輸入要查找的教師姓名:n");
getchar();
gets(name);
for(i=0;i<n;i++)
{
if(strcmp(name,a[i].name)==0)
{
printf("工作號(hào),姓名,出生日期,性別,基本工資,津貼,總工資:n");
printf("%s%s%d%d%d%c%f %f %fn",a[i].num,a[i].name,a[i].bir.year,a[i].bir.month,a[i].bir.day,
a[i].sex,a[i].jbgz,a[i].jt,a[i].jbgz+a[i].jt);
flag=1;
}
}
if(flag==0)
printf("查無此人!n");
}
//查找基本工資最高的教師信息
void searchbyjbgz(struct teacher a[],int n)
{
struct teacher temp;
int i;
temp=a[0];
for(i=1;i<n;i++)
{
if(a[i].jbgz>temp.jbgz)
temp=a[i];
}
printf("工作號(hào),姓名,出生日期,性別,基本工資,津貼,總工資:n");
printf("%s%s%d%d%d%c%f%f%fn",temp.num,temp.name,temp.bir.year,temp.bir.month,temp.bir.day,temp.sex,temp.jbgz,temp.jt,temp.jbgz+temp.jt);
}
void main()
{
int num;
struct teacher tea[3];
while(num=menu())
{
switch(num)
{
case 1: input(tea,3); break;
case 2: output(tea,3);break;
case 3: sortbyzgz(tea,3);break;
case 4: searchbyname(tea,3);break;
case 5: searchbyjbgz(tea,3);break;
case 6: repeat(tea,3);break;
case 7: exit(0);
}
getch();? //按任意鍵繼續(xù)
system("cls");? //清屏
}
3.2 測(cè)試與調(diào)試
3.2.1 程序測(cè)試
- 在主菜單中選擇1
圖3.1? 輸入教師的信息
2.在主菜單中選擇2
圖3.2? 查找教師的基本信息
3.在主菜單中選擇3
當(dāng)用戶輸入3并按回車鍵后,即可進(jìn)入記錄查找界面。其查找記錄過程如圖3.3所示,可按工號(hào)或姓名進(jìn)行查找。
圖3.3? 查找指定的教師信息
4.在主菜單中選擇4
當(dāng)用戶輸入4并按回車鍵后,即可進(jìn)入記錄修改界面。其修改記錄過程如圖3.4所示,查找指定姓名的教師信息,入部存在則退出。
圖3.4? 查找指定姓名的教師信息
5.在主菜單中選擇5
當(dāng)用戶輸入5并按回車鍵后,即可進(jìn)入記錄插入界面。其插入記錄過程如圖3.5所示,這里是查找教師最高的教師基本信息記錄。
圖3.5? 查找工資最高的教師記錄
6.在主菜單中選擇6
當(dāng)用戶輸入6并按回車鍵后,即可進(jìn)入記錄統(tǒng)計(jì)界面。其統(tǒng)計(jì)結(jié)果如圖3.6所示,查找不到教職工本人信息。
圖3.6? 修改教師的的信息
7.在主菜單中選擇7
當(dāng)用戶輸入7并按回車鍵后,即可執(zhí)行退出管理程序的操作,返回操作系統(tǒng)。其操作結(jié)果提示信息如圖3.7所示。
圖3.7? 按任意鍵退出
4、系統(tǒng)維護(hù)
通過程序調(diào)試成功后,結(jié)果很快就完成了,這時(shí)可以交付軟件供用戶使用,但是在軟件的使用過程中還會(huì)面臨更加漫長(zhǎng)的工作,即軟件維護(hù)。一般維護(hù)的工作有:更改使用中發(fā)現(xiàn)的錯(cuò)誤;為適應(yīng)實(shí)際環(huán)境而對(duì)程序進(jìn)行修改;為滿足新的需求而對(duì)程序作必要的改進(jìn)等等。所以我認(rèn)為程序的編寫與調(diào)試及其重要,必須要牢固掌握。
5、歸納總結(jié)
5.1 開發(fā)經(jīng)驗(yàn)
用C語言編寫具有以下功能的程序:
1 錄入教師信息,并將信息保存在teachers.txt文件中。
2 教師信息的瀏覽功能(輸出)。
3 教師信息的查詢功能,應(yīng)分別能夠按照工資和學(xué)歷查詢。
4 教師信息包括教師號(hào)、姓名、性別、年齡、學(xué)歷、工資、電話等(教師號(hào)不重復(fù))。
5.2 實(shí)訓(xùn)中遇到的問題及解決方法
在這次的實(shí)訓(xùn)中,主要遇到的問題是編譯環(huán)境的不同對(duì)程序也不同。本來我們的程序是不支持在VC++里面編譯的,因此一直都處在編譯失敗,該函數(shù)未定義的錯(cuò)誤中。后來經(jīng)過自己反復(fù)的程序調(diào)試,終于找到了根源,就是把“clrscr()”改為“system("cls")”就可以了。