c++新生基本信息統計軟件

Ly0. 2022-01-08 05:20:59 阅读数:673

c++ 新生 基本信息 基本 信息

目錄

 軟件基本功能:

1.錄入新生個人信息

2.後續新增新生的信息

3.根據新生的姓名删除其全部信息

4.展示已經錄入和新增的新生信息

​ 5.根據學生的姓名搜索信息

6.按照新生的英語入學成績用冒泡排序進行從高到低的排序

​7.根據學生的專業、性別或年齡進行信息的統計

​ 8.將已輸入鏈錶內的數據按一定的格式保存到指定的文件內

 9.退出

 主菜單


 軟件基本功能:

定義結構體

typedef struct StuNode {
char Name[20];
char sex[10];
int birthday;
char zhuanye[20];
char add[100];
int score;
struct StuNode *next;
} Student, *StuPtr;

結構體的數據域存放了學生的姓名,性別,專業,出生日期,家庭地址,英語入學成績,指針域存放的next為指針類型的成員,它指向struct類型的數據 。

 根據面向對象的思想和方法創建一個學生單鏈錶類

class StuListLink {
public:
StuListLink() {};
void Luru();
void Liulan();
void Shanchu();
void Chaxun();
void Paixu();
void Tongji();
void Baocun();
void tuichu();
private:
StuPtr head;
StuPtr tail;
int count;
};

 定義了單鏈錶的頭指針和尾指針,公有類裏為程序需要實現的功能函數,包括單鏈錶類的構造函數,創建一個帶頭結點的單鏈錶函數,利用頭插法插入到鏈錶結點,從頭結點遍曆鏈錶找到需要删除的結點,輸出單鏈錶的結點,遍曆鏈錶找到對應的節點輸出,利用冒泡排序對鏈錶地節點排序,保存鏈錶內的數據域到文件內。

1.錄入新生個人信息

void StuListLink::Luru() {
system("cls");
StuPtr p,pre;
StuPtr PNode;
int n;
cout<<"第一次錄入請輸入1"<<endl<<"後續新增學生輸入2"<<endl;
cout<<"******";
cin>>n;
switch (n) {
case 1:
cout<<"輸入學生總數:";
cin>>count;
if(count<0) {
cout<<"ERROR MESSAGE!"<<endl;
return;
}
head=new Student;
head->Name[0]='\0';
head->sex[0]='\0';
head->zhuanye[0]='\0';
head->birthday=0;
head->add[0]='\0';
head->score='\0';
head->next=NULL;
tail=head;
for(int i=0; i<count; i++) {
p=new Student;
cout<<"輸入第"<<i+1<<"個學生的信息:"<<endl;
cout<<"姓名:";
cin>>p->Name;
cout<<"性別:";
cin>>p->sex;
while(strcmp(p->sex,"男")!=0&&strcmp(p->sex,"女")!=0) {
cout<<"輸入的學生性別不符合規定,請重新輸入!!"<<endl;
cout<<"請重新輸入學生性別:";
cin>>p->sex;
}
cout<<"專業:";
cin>>p->zhuanye;
cout<<"生日(示例:20000000):";
cin>>p->birthday;
cout<<"家庭地址:";
cin>>p->add;
cout<<"英語分數:";
cin>>p->score;
while(p->score<0) {
cout<<"輸入的分數不符合規定,請重新輸入!!"<<endl;
cout<<"請重新輸入學生的英語分數:";
cin>>p->score;
}
p->next=NULL;
tail->next=p;
tail=p;
}
cout<<"錄入成功,一共"<<count<<"個學生"<<endl;
system("pause");
getchar();
system("cls");
return;

新增學生信息的函數中首先定義一個p指針,然後用switch函數選擇是否為第一次錄入學生信息,若為首次錄入輸入”1“,否則後續新增學生信息都輸入”2“。首次錄入輸入需要錄入的學生總數,如果數量少於0個,會提示錯誤信息,然後給head頭指針開辟內存空間,將頭指針的數據域全為空值,頭結點指針域指向空數據,並且錶頭也是錶尾,然後用for循環,循環的次數為輸入的學生總數,然後為p指針開辟新的內存空間,依次輸入新生的信息並存入到鏈錶的數據域內,輸入學生性別時利用strcmp比較只能為男或女,英語分數的格式只能為正數,然後將p接到錶尾,結點p成為新的錶尾。後續增加時開辟了PNode的內存空間,用頭插法插入新添加的結點。

2.後續新增新生的信息

 case 2:
StuPtr p,pre;
StuPtr PNode;
PNode=new Student;
cout<<"姓名:";
cin>>PNode->Name;
cout<<"性別:";
cin>>PNode->sex;
while(strcmp(PNode->sex,"男")!=0&&strcmp(PNode->sex,"女")!=0) {
cout<<"輸入的學生性別不符合規定,請重新輸入!!"<<endl;
cout<<"請重新輸入學生性別:";
cin>>PNode->sex;
}
cout<<"專業:";
cin>>PNode->zhuanye;
cout<<"生日(示例:20010101):";
cin>>PNode->birthday;
cout<<"家庭地址:";
cin>>PNode->add;
cout<<"英語分數:";
cin>>PNode->score;
while(PNode->score<0) {
cout<<"輸入的分數不符合規定,請重新輸入!!"<<endl;
cout<<"請重新輸入學生英語分數:";
cin>>PNode->score;
}
p=head->next;
pre=head;
PNode->next=pre->next;
pre->next=PNode;
cout<<"新增成功!"<<endl;
}
}

3.根據新生的姓名删除其全部信息

void StuListLink::Shanchu() {
system("cls");
char n[20];
StuPtr p,pre;
cout<<"請輸入想要删除學生的姓名:";
cin>>n;
pre=head;
p=head->next;
while(p!=NULL) {
if(strcmp(p->Name,n)==0) {
pre->next=p->next;
delete p;
p=NULL;
cout<<"删除成功!";
return;
}
pre=p;
p=p->next;
}
cout<<"未找到該學生,删除失敗!";
}

輸入學生姓名删除該學生的全部信息,定義p為當前遍曆到的結點,pre為其前趨結點,利用while循環遍曆學生鏈錶到末尾,如果找到指定的學生姓名,就將其前趨結點的指針域指向待删結點的後續結點,並釋放待删結點,給其賦值為NULL,删除該結點,若未找到該姓名的學生,則輸出相關提示信息。

4.展示已經錄入和新增的新生信息

void StuListLink::Liulan() {
system("cls");
StuPtr p;
int n=1;
p=head->next;
if(p==NULL) {
cout<<"學生不存在!"<<endl;
return;
}
while(p!=NULL) {
cout<<"第"<<n<<"個學生信息:"<<endl;
cout<<"姓名:"<<p->Name<<"\t"<<"性別:"<<p->sex<<"\t"<<"專業:"<<p->zhuanye<<"\t"<<"生日:"<<p->birthday<<"\t"<<"家庭住址:"<<p->add<<"\t"<<"英語成績:"<<p->score<<endl;
p=p->next;
n++;
}
cout<<"共用學生"<<n-1<<"名!";
}

瀏覽學生信息,定義一個int類型的n,並賦值為0,利用指針變量p從頭到尾依次指向鏈錶中每個結點,當指針指向結點時就輸出該結點數據域中的內容,每循環一次,n都會自加一,直到遇到鏈錶結束標志NULL為止,最後輸出共有幾個學生。如果是空鏈錶,就只輸出”學生不存在!“並且退回到主函數內。

 5.根據學生的姓名搜索信息

void StuListLink::Chaxun() {
system("cls");
StuPtr p;
char n[20];
bool flag=false;
cout<<"輸入查詢的姓名:"<<endl;
cin>>n;
p=head;
while(p->next!=NULL) {
if(strcmp(p->next->Name,n)==0) {
cout<<"姓名:";
cout<<p->next->Name;
cout<<"性別:";
cout<<p->next->sex;
cout<<"專業:";
cout<<p->next->zhuanye;
cout<<p->next->birthday;
cout<<"生日:";
cout<<"家庭地址:";
cout<<p->next->add;
cout<<"英語成績:";
cout<<p->next->score<<endl;
flag=true;
}
p=p->next;
continue;
}
if(!flag) {
cout<<"無此姓名!"<<endl;
return;
}
}

按照學生的姓名進行查詢:將bool類型的flag賦值為false,輸入需要查詢的學生姓名,利用while循環遍曆鏈錶,比較學生的姓名,然後輸出該生的全部信息,若出現重名,則會將該姓名的全部學生信息輸出,若找到該生,flag賦值為true,則輸出相關提示信息。

6.按照新生的英語入學成績用冒泡排序進行從高到低的排序

void StuListLink::Paixu() {
system("cls");
StuPtr p,pre,q;
StuPtr end=NULL;
while(head->next!=end) {
pre=head;
p=head->next;
q=p->next;
while(p->next!=end) {
if(p->score>q->score) {
pre->next=q;
p->next=q->next;
q->next=p;
} else {
p=p->next;
}
q=p->next;
pre=pre->next;
}
end=p;
cout<<"姓名:";
cout<<p->Name;
cout<<"性別:";
cout<<p->sex;
cout<<"專業:";
cout<<p->zhuanye;
cout<<"生日:";
cout<<p->birthday;
cout<<"家庭地址:";
cout<<p->add;
cout<<"英語成績:";
cout<<p->score<<endl;
}
}

 按照學生的英語入學成績進行排序,定義三個結構體類型的指針,pre定義為頭結點,p為頭結點的後趨節點,q為p的後趨節點,然後用while循環進行從大到小的冒泡排序,直到遍曆到結尾,並且輸出排序後的新鏈錶。

7.根據學生的專業、性別或年齡進行信息的統計

void StuListLink::Tongji() {
system("cls");
StuPtr p,pre;
p=head;
char i[20];
int n;
int k=0;
int nl;
cout<<"統計方式:"<<endl<<"1.按專業統計"<<endl<<"2.按性別統計"<<endl<<"3.按年齡統計"<<endl;
cout<<"請輸入統計方式:";
cin>>n;
switch (n) {
case 1:
cout<<"請輸入學生專業:";
cin>>i;
while(p->next!=NULL) {
if(strcmp(p->next->zhuanye,i)==0) {
cout<<"姓名:";
cout<<p->next->Name;
cout<<"性別:";
cout<<p->next->sex;
cout<<"專業:";
cout<<p->next->zhuanye;
cout<<"生日:";
cout<<p->next->birthday;
cout<<"家庭地址:";
cout<<p->next->add;
cout<<"英語成績:";
cout<<p->next->score<<endl;
k++;
}
p=p->next;
continue;
if(p->next==NULL) {
cout<<"該專業學生不存在!";
return;
}
}
break;
case 2:
cout<<"請輸入學生性別:";
cin>>i;
while(p->next!=NULL) {
if(strcmp(p->next->sex,i)==0) {
cout<<"姓名:";
cout<<p->next->Name;
cout<<"性別:";
cout<<p->next->sex;
cout<<"專業:";
cout<<p->next->zhuanye;
cout<<"生日:";
cout<<p->next->birthday;
cout<<"家庭地址:";
cout<<p->next->add;
cout<<"英語成績:";
cout<<p->next->score<<endl;
k++;
}
p=p->next;
continue;
if(p->next==NULL) {
cout<<"該性別的學生不存在!";
return;
}
}
break;
case 3:
cout<<"請輸入學生年齡:";
cin>>nl;
while(p->next!=NULL) {
if(2021-p->next->birthday/10000==nl) {
cout<<"姓名:";
cout<<p->next->Name;
cout<<"性別:";
cout<<p->next->sex;
cout<<"專業:";
cout<<p->next->zhuanye;
cout<<"生日:";
cout<<p->next->birthday;
cout<<"家庭地址:";
cout<<p->next->add;
cout<<"英語成績:";
cout<<p->next->score<<endl;
k++;
}
p=p->next;
continue;
if(p->next==NULL) {
cout<<"該年齡的學生不存在!";
return;
}
}
break;
}
cout<<"該方式的學生共有"<<k<<"名!";
}

按一定方式統計相關學生信息,定義p為頭結點,利用switch選擇統計方式。輸入1為按學生專業統計,輸入2為按性別統計,輸入3為按年齡統計。三個方式利用的方法相同,皆利用while循環遍曆學生鏈錶,找到選擇的方式地相關結點,用continue將符合方式的新生信息全部輸出,若p為空鏈錶,則輸出相關提示信息。

輸入1按專業統計,輸入專業,該專業的學生全部打印,並顯示共有多少名學生

輸入2按性別統計,輸入性別該性別的學生全部打印,並顯示共有多少名學生

輸入3按年齡統計,輸入年齡,該年齡的學生全部打印,並顯示共有多少名學生

 8.將已輸入鏈錶內的數據按一定的格式保存到指定的文件內

void StuListLink::Baocun() {
system("cls");
ofstream outfile("D:\\新生信息管理系統.txt");
StuPtr p;
p=head->next;
while(p!=NULL) {
outfile<<"姓名:"<<p->Name<<"\t"<<"性別:"<<p->sex<<"\t"<<"專業:"<<p->zhuanye<<"\t"<<"生日:"<<p->birthday<<"\t"<<"家庭住址:"<<p->add<<"\t"<<"英語成績:"<<p->score<<endl;
p=p->next;
}
outfile.close();
cout<<"學生信息保存成功!"<<endl;
}

保存學生信息到文件內,打開文件《新生信息管理系統.txt》,定義p的指針,p的指針域指向頭結點的next結點,當p不為空時,向文件內寫入鏈錶數據域內的數據,直到p為空指針,循環結束,關閉文件。

保存的文件

 9.退出

 主菜單

int main() {
StuListLink stuListLink;
system("color b4");
int a;
system("cls");
while(1) {
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<" \t\t\t\t*******新生信息統計管理系統*****"<<endl;
cout<<" \t\t\t\t********************************"<<endl;
cout<<" \t\t\t\t* 1.新增學生信息 *"<<endl;//*
cout<<" \t\t\t\t* 2.删除學生信息 *"<<endl;//*
cout<<" \t\t\t\t* 3.導入學生信息 *"<<endl;//*
cout<<" \t\t\t\t* 4.學生信息搜索 *"<<endl;//*
cout<<" \t\t\t\t* 5.學生信息統計 *"<<endl;//*
cout<<" \t\t\t\t* 6.英語成績排序 *"<<endl;//*
cout<<" \t\t\t\t* 7.學生信息保存 *"<<endl;//*
cout<<" \t\t\t\t* 8.退出 *"<<endl;//*
cout<<" \t\t\t\t********************************"<<endl;
cout<<"******請選擇:";
cin>>a;
switch(a) {
case 1:
stuListLink.Luru();
system("pause");
system("cls");
break;
case 2:
stuListLink.Shanchu();
system("pause");
system("cls");
break;
case 3:
stuListLink.Liulan();
system("pause");
system("cls");
break;
case 4:
stuListLink.Chaxun();
system("pause");
system("cls");
break;
case 5:
stuListLink.Tongji();
system("pause");
system("cls");
break;
case 6:
stuListLink.Paixu();
system("pause");
system("cls");
break;
case 7:
stuListLink.Baocun();
system("pause");
system("cls");
break;
case 8:
exit(0);
}
}
}

版权声明:本文为[Ly0.]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201080520586929.html