第二次作業
學生信息包括:學號,姓名,年齡,性別,出生年月,學號,成績,排名等。試設計一學生信息管理系統,使之能提供以下功能:
1、系統以菜單方式工作。
2、學生信息錄入功能——輸入。
3、學生信息瀏覽功能——輸出。
4、學生信息查詢功能——算法。
按學號查詢;
按姓名查詢。
5、 學生信息的刪除與修改
設計一個能實現學生信息管理系統,讓它來運行和管理學生信息。它在現實生活中運用方便的、管理方便。它能輸入學生學號、年齡、性別、出生年月、成績、排名。系統以菜單的方式進行工作,進入子菜單後,還可以返回主菜單。在子菜單中的各種操作都有中文說明,操作簡單、易懂。只要我們正確的操作系統,系統就無異常現在,當然系統也能對一些基本的錯誤做出提示,並能讓使用者重新進行操作。
對各個操作的成功,如:添加學生信息、修改學生信息、刪除學生信息,系統都輸出“…….的成功”的字樣。系統對刪除和修改前,還進行“確定”和“取消”。系統對不存在的學號和姓名系統能判斷是否存在。對已存在的學號,操作者不能添加和這個學號一樣的學生信息,同時系統還提示已有此學號。對於修改、刪除和查詢,系統遇到不存在的學生能提示沒有這個信息。
按照函數功能,將不同的代碼放到一起,用大括號括起來,然後給這段代碼起個名字表示,然後還要設置上參數,一遍使用這個函數的時候向裏傳遞實際的值,類似一個加法的函數,完成兩個數的相加,我們可以寫成
myadd(int a, int b)
{
int c;
c=a+b;
return c;
}
myadd就是我們給這個函數起的名字,以便使用,a和b的作用接收調用者傳遞過來的數,然後把接收的兩個數相加後返回,這個函數的值在調用後就是返回的值c,所以如果我們想算99+23等於多少,只要調用我們寫好的函數
myadd(99,23),這個時候函數的值就是99+23了,如果把結果保存在變量d中,可以寫成
d=myadd(99,23);
有了函數,我們就可以把不同功能的代碼組織到一起,不僅自己方便,而且程序特別簡單明瞭,便於修改,其他人寫的函數我們還可以直接拿來用。
所以我們的這個學生信息管理系統形式就非常簡單了,一共用到了三個函數
int main()
{
int i,sum;
pagedis();
check();
以下是完整的學生管理系統的總程序:
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"conio.h"
#define PAGE 3
#define MAX 1000
#define N 5
int k=0;
/*結構體類型*/
typedef struct
{ int num;/*學號*/
char name[20];/*姓名*/
charsex[5];/*性別*/
intage;/*年齡*/
charstudentclass[20];/*班級*/
intscore;/*成績*/
}STUDENTS;
int read_file(STUDENTS stu[])
{ FILE*fp;
int i=0;
if((fp=fopen("stu.txt","rt"))==NULL)
{printf("\n\n*****庫存文件不存在!請創");
return 0;
}
while(feof(fp)!=1)
{
fread(&stu[i],sizeof(STUDENTS),1,fp);
if(stu[i].num==0)
break;
else
i++;
}
fclose(fp);
returni;
}
void save_file(STUDENTS stu[],int sum)
{FILE*fp;
inti;
if((fp=fopen("stu.txt","wb"))==NULL)
{printf("寫文件錯誤!\n");
return;
}
for(i=0;i<sum;i++)
if(fwrite(&stu[i],sizeof(STUDENTS),1,fp)!=1)
printf("寫文件錯誤!\n");
fclose(fp);
}
/*創建學生信息*/
int input(STUDENTS stu[])
{ int i,x;
for(i=0;i<1000;i++)
{
system("cls");
printf("\n\n 錄入學生信息 (最多%d個)\n",MAX);
printf(" ----------------------------\n");
printf("\n 第%d個學生",k+1);
printf("\n 請輸入學生的學號:");
scanf("%d",&stu[k].num);
printf("\n 請輸入學生的姓名:");
scanf("%s",stu[k].name);
printf("\n請輸入學生的性別:");
scanf("%s",stu[k].sex);
printf("\n 請輸入學生的年齡:");
scanf("%d",&stu[k].age);
printf("\n 請輸入學生的班級:");
scanf("%s",stu[k].studentclass);
printf("\n 請輸入學生的成績:");
scanf("%d",&stu[k++].score);
printf("\n 請按1鍵返回菜單或按0鍵繼續創建");
scanf("%d",&x);
if(x)
break;
}
return k;
}
/*刪除學生信息*/
void deletel(STUDENTS stu[])
{system("cls");
char Stuname2[20];
int i,j;
printf("請輸入學生姓名:");
scanf("%s",Stuname2);
printf("\n");
for(i=0;i<k;i++)
if(strcmp(stu[i].name,Stuname2)==0)
for(j=0;j<20;j++)
stu[i].name[j]=stu[i+1].name[j];
k--;
printf("刪除成功\n");
printf("按任意鍵加回車返回主菜單!");
scanf("%d",&i);
getchar();
}
/*打印學生信息*/
void output(STUDENTS stu[])
{ system("cls");
int i;
for(i=0;i<k;i++)
printf("學號:%d,姓名:%s,性別:%s,年齡:%d,班級:%s,成績: %d\n",stu[i].num,stu[i].name,
stu[i].sex,stu[i].age,stu[i].studentclass,stu[i].score);
printf("按任意鍵加回車返回主菜單!");
scanf("%d",&i);
getchar();
}
/*查詢學生信息*/
void inquire(STUDENTS stu[])
{int i;
int num;
system("cls");
printf(" \n\n請輸入您要查找的學生的學號");
scanf("%d",&num);
for(i=0;i<k;i++)
if(num==stu[i].num)
printf("\n\n\n學號:%d,姓名:%s,性別:%s,年齡:%d,班級:%s,成績: %d\n",stu[i].num,stu[i].name,
stu[i].sex,stu[i].age,stu[i].studentclass,stu[i].score);
printf("按任意鍵加回車返回主菜單!");
scanf("%d",&i);
getchar();
}
/*修改學生信息*/
void change(STUDENTS stu[])
{ int num,i,choice;
system("cls");
printf("\n\n\n 請輸入您要修改的學生的學號");
scanf("%d",&num);
for(i=0;i<k;i++)
{ if(num==stu[i].num)
printf("\n學號:%d,姓名:%s,性別:%s,年齡:%d,班級:%s,成績: %d\n",stu[i].num,stu[i].name,
stu[i].sex,stu[i].age,stu[i].studentclass,stu[i].score);
printf("\n\n\n ********請輸入您想要修改的數據********\n\n");
printf(" 1. 學號\n\n");
printf(" 2. 姓名\n\n");
printf(" 3. 性別\n\n");
printf(" 4. 年齡\n\n");
printf(" 5. 班級\n\n");
printf(" 6. 成績\n\n");
printf(" 請選擇(1-6):");
scanf("%d",&choice);
switch(choice)
{case 1:{
printf("\n 請輸入你改的新學號");
scanf("%d",&stu[i].num);
break;
}
case 2:{
printf("\n 請輸入你改的新姓名");
scanf("%s",stu[i].name);
break;
}
case 3:{
printf("\n 請輸入你改的新性別");
scanf("%s",stu[i].sex);
break;
}
case 4:{
printf("\n 請輸入你改的新年齡");
scanf("%d",&stu[i].age);
break;
}
case 5:{
printf("\n 請輸入你改的新班級");
scanf("%s",stu[i].studentclass);
break;
}
case 6:{
printf("\n 請輸入你改的新成績");
scanf("%d",&stu[i].score);
break;
}
}
printf("學號:%d,姓名:%s,性別:%s,年齡:%d,班級:%s,成績:%d\n",stu[i].num,stu[i].name,
stu[i].sex,stu[i].age,stu[i].studentclass,stu[i].score);
printf("按任意鍵加回車返回主菜單!");
scanf("%d",&i);
break;
}
}
/*學生成績信息排名*/
void sort(STUDENTS stu[])
{ int i,j,n=1,x;
system("cls");
int t;
for(i=0;i<k-1;i++)
for(j=i+1;j<k;j++)
if(stu[i].score<stu[j].score)
{t=stu[i].score;
stu[i].score=stu[j].score;
stu[j].score=t;
t=stu[i].num;
stu[i].num=stu[j].num;
stu[j].num=t;
}
for(i=0;i<k;i++)
printf("排名 學號 成績\n %d %d %d\n",n++,stu[i].num,stu[i].score);
printf("按任意鍵加回車返回主菜單!");
scanf("%d",&x);
getchar();
}
void pagedis()
{
printf(" \n\n\n **********************************\n");
printf(" * *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * 歡迎進入學生信息管理系統 *\n");
printf(" * *\n");
printf(" * *\n");
printf(" * *\n");
printf(" **********************************\n");
}
void check()
{
char userName[5];/*用戶名*/
char userPWD[5];/*密碼*/
int i,sum;
system("color 4E");
for(i = 1; i < 4; i++)
{
/*用戶名和密碼均爲abcde;*/
printf(" 用戶名和密碼均爲abcde\n\n");
printf("\n 請輸入您的用戶名:");
gets(userName);
printf("\n 請輸入您的密碼:");
gets(userPWD);
if ((strcmp(userName,"abcde")==0) &&(strcmp(userPWD,"abcde")==0))/*驗證用戶名和密碼*/
{
printf("用戶名和密碼正確,顯示主菜單");
return;
}
else
{
if (i < 3)
{
printf("用戶名或密碼錯誤,提示用戶重新輸入");
printf("用戶名或密碼錯誤,請重新輸入!");
}
else
{
printf("連續3次輸錯用戶名或密碼,退出系統。");
printf("您已連續3次將用戶名或密碼輸錯,系統將退出!");
exit(1);
}
}
}
}
void menu()
{
STUDENTS stu[20];
intchoice,k,sum;
sum=read_file(stu);
if(sum==0)
{ printf("首先錄入基本庫存信息!按回車後進入*****\n");
getch();
sum=input(stu);
}
do
{ system("cls");
printf("\n\n\n ********學生信息管理系統********\n\n");
printf(" 1. 創建學生信息\n\n");
printf(" 2. 打印學生信息\n\n");
printf(" 3. 查詢學生信息\n\n");
printf(" 4. 修改學生信息\n\n");
printf(" 5. 刪除學生信息\n\n");
printf(" 6. 學生成績信息排名\n\n");
printf(" 0. 退出系統\n\n");
printf(" 請選擇(0-6):");
scanf("%d",&choice);
switch(choice)
{
case 1: k=input(stu); break;/*創建學生信息*/
case 2: output( stu) ; break;/*打印學生信息*/
case 3: inquire(stu); break;/*查詢學生信息*/
case 4: change(stu); break;/*修改學生信息*/
case 5: deletel(stu); break;/*刪除學生信息*/
case 6: sort(stu); break;/*學生成績信息排名*/
case 0: break;
}
}while(choice!=0);
save_file(stu,sum);
}
int main()
{
inti,sum;
pagedis();
check();
menu();
}
下面是一個職工工資管理系統的程序,此程序類似於上方學生管理系統程序,代碼如下:
#include "stdafx.h"
#include "iostream"
#include "string"
#include "list"
#include "cassert"
using namespace std;
/*
編號、姓名、部門、應付工資、保險、稅金、實付工資。
其中實付工資由公式計算得到:實付工資=應付工資 - 保險- 稅金
*/
struct employee{
string m_num;//編號
string m_name;//姓名
string m_dep;//部門
double m_salary;//應付工資
double m_insurance;//保險
double m_tax;//稅金
};
/*
(1)錄入:輸入職工數據,其中“實付工資”通過計算得到;
(2)刪除:刪除指定的職工信息(輸入姓名,若找到則刪除該信息)
(3) 修改:允許對已經錄入的數據重新進行編輯、修改;
(4) 顯示:顯示全體職工數據;
(5)查詢:
a. 輸入職工姓名,顯示該職工的全部數據;
b. 輸入某部門值,顯示該部門職工的數據、工資總額、平均工資。
(6) 退出程序。
*/
list<employee> emps;
int _tmain(int argc, _TCHAR* argv[])
{
voidprint(const employee &e);
voidinput();
voiddel();
voidmod();
voidshow_all();
voidshow_name();
voidshow_dep();
cout<<"簡易職工薪水管理程序 by做他\n";// delete this line
cout<<"版權沒有請隨意複製或修改任何代碼\n";//deletethis line
cout<<"請選擇操作:1.錄入 2.刪除 3.修改 4.查詢 5.顯示所有員工 6.退出 :";
int choose=0;
cin>>choose;
assert(!cin.fail());
while (choose!=6)
{
if(choose==1) input();
if(choose==2) del();
if(choose==3) mod();
if(choose==4)
{
intchoice=0;
cout<<"請選擇操作 1.按姓名查詢 2.按部門查詢 3.退出:";
cin>>choice;
if(choice==1) show_name();
if(choice==2) show_dep();
if(choice==3)
{
cout<<"請選擇操作:1.錄入 2.刪除 3.修改 4.查詢 5.顯示所有員工 6.退出 :";
cin>>choose;
assert(!cin.fail());
continue;
}
}
if(choose==5) show_all();
cout<<"請選擇操作:1.錄入 2.刪除 3.修改 4.查詢 5.顯示所有員工 6.退出 :";
cin>>choose;
assert(!cin.fail());
}
return 0;
}
void print(const employee &e)
{
cout<<"編號:"<<e.m_num<<endl;
cout<<"姓名:"<<e.m_name<<endl;
cout<<"部門:"<<e.m_dep<<endl;
cout<<"保險:"<<e.m_insurance<<endl;
cout<<"稅金:"<<e.m_tax<<endl;
cout<<"應付工資:"<<e.m_salary<<endl;
cout<<"實付工資:"<<e.m_salary-e.m_insurance-e.m_tax<<endl;
}
void input()
{
string num,name,dep;
double salary,ins,tax;
cout<<"請輸入員工編號:";
cin>>num;
cout<<"請輸入員工姓名:";
cin>>name;
cout<<"請輸入員工部門:";
cin>>dep;
cout<<"請輸入員工保險:";
cin>>ins;
assert(!cin.fail());
cout<<"請輸入員工稅金:";
cin>>tax;
assert(!cin.fail());
cout<<"請輸入員工應付工資:";
cin>>salary;
assert(!cin.fail());
employee temp;
temp.m_dep=dep;
temp.m_insurance=ins;
temp.m_name=name;
temp.m_num=num;
temp.m_salary=salary;
temp.m_tax=tax;
emps.push_back(temp);
cout<<"員工錄入操作完畢.\n";
}
void del()
{
if(emps.size()==0)
{
cout<<"沒有員工記錄.\n";
return;
}
string name;
boolisfind=false;
cout<<"請輸入要刪除的員工姓名:";
cin>>name;
list<employee>::iterator iter;
for(iter=emps.begin();iter!=emps.end();iter++)
{
if(iter->m_name==name)
{
isfind=true;
emps.erase(iter);
cout<<"姓名爲\""<<name<<"\"的員工記錄已刪除.\n";
return;
}
}
if(!isfind)
{
cout<<"沒有找到姓名爲\""<<name<<"\"的員工.\n";
return;
}
}
void mod()
{
if(emps.size()==0)
{
cout<<"員工記錄爲空.\n";
return;
}
boolisfind=false;
string name;
cout<<"請輸入要修改的員工姓名:";
cin>>name;
list<employee>::iterator iter;
for(iter=emps.begin();iter!=emps.end();iter++)
{
if(iter->m_name==name)
{
isfind=true;
cout<<"姓名爲\""<<name<<"\"的員工記錄已找到.\n";
break;
}
}
if(isfind)
{
string num,name,dep;
double tax,ins,salary;
print(*iter);
cout<<endl;
cout<<"請輸入新的員工編號:";
cin>>num;
cout<<"請輸入新的員工姓名:";
cin>>name;
cout<<"請輸入新的員工部門:";
cin>>dep;
cout<<"請輸入新的員工保險:";
cin>>ins;
assert(!cin.fail());
cout<<"請輸入新的員工稅金:";
cin>>tax;
assert(!cin.fail());
cout<<"請輸入新的員工工資:";
cin>>salary;
assert(!cin.fail());
iter->m_dep=dep;
iter->m_insurance=ins;
iter->m_name=name;
iter->m_num=num;
iter->m_salary=salary;
iter->m_tax=tax;
cout<<"1 員工記錄被成功修改.\n";
}
else
{
cout<<"沒有找到姓名爲\""<<name<<"\"的員工記錄.\n";
}
}
void show_all()
{
if(emps.size()==0)
{
cout<<"員工記錄爲空.\n";
return;
}
cout<<"顯示全體員工數據:\n";
cout<<"--------------------\n";
list<employee>::iterator iter;
for(iter=emps.begin();iter!=emps.end();iter++)
{
cout<<endl;
print(*iter);
cout<<endl;
}
cout<<"--------------------\n";
}
void show_name()
{
if(emps.size()==0)
{
cout<<"員工記錄爲空.\n";
return;
}
boolisfind=false;
string name;
cout<<"請輸入要查詢的員工姓名:";
cin>>name;
list<employee>::iterator iter;
for(iter=emps.begin();iter!=emps.end();iter++)
{
if(iter->m_name==name)
{
isfind=true;
cout<<"姓名爲\""<<name<<"\"的員工記錄已找到.\n";
print(*iter);
break;
}
}
if(!isfind)
{
cout<<"沒有找到姓名爲\""<<name<<"\"的員工.\n";
return;
}
}
void show_dep()
{
if(emps.size()==0)
{
cout<<"員工記錄爲空.\n";
return;
}
double isfind=0.00;
double total_salary=0.00;
string dep;
cout<<"請輸入要查詢的部門名稱:";
cin>>dep;
cout<<"部門["<<dep<<"]的員工信息:\n";
cout<<"--------------------\n\n";
list<employee>::iterator iter;
for(iter=emps.begin();iter!=emps.end();iter++)
{
if(iter->m_dep==dep)
{
isfind++;
total_salary+=iter->m_salary;
print(*iter);
cout<<endl;
continue;
}
}
cout<<"--------------------\n";
if(isfind==0)
{
cout<<"沒有找到名稱爲["<<dep<<"]的部門.\n";
}
else
{
cout<<"部門["<<dep<<"]工資統計:\n";
cout<<"工資總額:"<<total_salary<<endl;
cout<<"平均工資:"<<total_salary/isfind<<endl;
}
}
150206216