IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> c++新生基本信息统计软件 -> 正文阅读

[数据结构与算法]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);
		}
	}
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-03 16:22:02  更:2022-01-03 16:24:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 17:47:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码