学生信息管理系统(做完大作业发一发自己的代码)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
const int N = 40;
typedef struct node
{
	int num;
	char name[15];
	int grade1;
	int grade2;
	int grade3;
	double aver;
}STU;

void menu();			
void stu_sort();		
void stu_emptyfile();	
void stu_openfile();	
void stu_savefile();	
void stu_readfile();	
void stu_find();		
void stu_insert();		
void stu_del();			
void stu_input();			
void stu_update();		
void stu_aver();

int n;
STU a[N], stdinfo[20];
FILE* fp;

int main()
{
	int i=0,x=1;

	while (1) 
	{
		menu();
		scanf("%d", &i);
		switch (i) 
		{
		case 0: 
		{
			printf("退出系统");exit(0); 
		}
		case 1:stu_input(); break;
		case 2:stu_find(); break; 
		case 3:stu_del(); break;
		case 4:stu_insert(); break;
		case 5:stu_update();break;
		case 6:stu_aver(); break;
		case 7:stu_readfile();break;
		
		default:printf("请输入0-7:");
		}
	}
	return 0;
}
//菜单打印函数
void menu()
{
	printf("----------------------------------------------------------\n");
	printf("             |*******学生信息管理系统*******|\n");
	printf("|1.创建学生信息     2.查询学生信息     3.删除学生信息    |\n");
	printf("|4.插入学生信息     5.修改学生信息     6.输出不到60分学生|\n");
	printf("|7.从文件读取数据   0.退出系统                           |\n");
	printf("----------------------------------------------------------\n");
}
//输入学生信息并输入学生个数
void stu_input()
{
	printf("输入存入学生信息个数:");
	scanf("%d", &n);
	printf("学号\t姓名\t成绩1\t成绩2\t成绩3\n");
	for (int i = 0; i < n; i++)
	{
		scanf("%d %s %d %d %d", &a[i].num, a[i].name, &a[i].grade1, &a[i].grade2, &a[i].grade3);
		for (int j = 0; j < i; j++) {
			if (a[i].num == a[j].num)
			{
				printf("学号相同,请重新输入");
				scanf("%d %s %d %d %d", &a[i].num, a[i].name, &a[i].grade1, &a[i].grade2, &a[i].grade3);
			}
		}
	}
	stu_sort();
	stu_openfile();	//创建表头
	stu_savefile();
}
//查询学生信息
void stu_find()//查询学生信息
{
	int i,x;
	printf("使用学号查询请按1,使用姓名请按0:");
	scanf("%d", &x);
	if (x)
	{                //学号查询的功能
		int num = 0,flag=0;
		printf("请输入所要查询学生的学号");
		scanf("%d", &num);
		for (i = 0; i < n; i++) {
			if (a[i].num == num)
			{
				printf("学号\t姓名\t成绩1\t成绩2\t成绩3\n");
				printf("%d  \t%s  \t%d   \t%d   \t%d\n", a[i].num, a[i].name, a[i].grade1, a[i].grade2, a[i].grade3);
				flag = 1;//表示找到
			}
		}
		if(!flag)
			printf("没有找到对应学号学生\n");
	}
	else
	{                //姓名查询的功能
		char name[15];
		int flag = 0;
		printf("请输入所要查询学生的姓名");
		scanf("%s", name);
		for (i = 0; i < n; i++) {
			if ((strcmp(a[i].name, name)) == 0)
			{
				printf("学号\t姓名\t成绩1\t成绩2\t成绩3\n");
				printf("%d  \t%s  \t%d   \t%d   \t%d\n", a[i].num, a[i].name, a[i].grade1, a[i].grade2, a[i].grade3);
				flag = 1;
			}
		}
		if(!flag)
			printf("没有找到对应姓名学生\n");
	}
}
//删除学生信息
void stu_del()
{
	int i = 0, j = 0, num = 0;
	char ch;
	printf("请输入要删除学员的学号:");
	scanf("%d", &num);
	//循环遍历找位置
	for (i = 0; i < n; i++)
	{
		if (num == a[i].num)
		{
			j = i;
			break;
		}
	}

	if (i < n)
	{
		a[j] = a[n + 1];	//清除第i位的学生信息
		n--;				//实际人数自减一个
		for (int i = j; i < n; i++)	//移位把空缺位置补上
		{
			a[i] = a[i + 1];
		}
		printf("\n已删除\n");
		stu_emptyfile();
		stu_savefile();
	}
	else
	{
		printf("没有找到您要删除的学员学号,请重新选择功能!\n");
	}
}
//插入学生信息
void stu_insert()
{
	int i = 0, j = 0;
	STU newStu;//定义实行插入功能时输入的类型

	if (n >= 20)	//学生信息大于等于20,不能插入
	{
		printf("空间已满不能继续插入信息");
		exit(0);
	}

	do
	{
		printf("学号:");
		scanf("%d", &newStu.num);

		// 
		//循环遍历输入的学号是否重复
		for (i = 0; i < n; i++)
		{
			if (a[i].num == newStu.num)
			{
				printf("\t学号重复,请重新输入!\n");
				break;
			}
		}
	} while (i < n);
	//输入剩下所有信息
	printf("输入姓名以及三科成绩");
	scanf("%s %d %d %d", newStu.name, &newStu.grade1, &newStu.grade2, &newStu.grade3);

	a[n] = newStu;
	n++;	//人数加一
	stu_sort();//调用排序函数
	//两函数组合更新文件内容
	stu_emptyfile();
	stu_savefile();
	printf("信息插入完成\n");
}
//修改学生信息
void stu_update()
{
	STU t, m;
	printf("请输入要修改的学生学号:");
	scanf("%d", &t.num);
	for (int i = 0; i < n; i++)
	{
		if (t.num == a[i].num)
		{
			printf("请输入修改的学生学号姓名和三科成绩:\n");
			printf("学号\t姓名\t成绩1\t成绩2\t成绩3\n");
			scanf("%d %s %d %d %d", &t.num, t.name, &t.grade1, &t.grade2, &t.grade3);

			m = t;
			t = a[i];
			a[i] = m;
		}
	}

	stu_sort();
	//两函数组合更新文件内容
	stu_emptyfile();
	stu_savefile();
	printf("修改完成\n");
}
//排序函数(按照由小到大升序排列)
void stu_sort()
{
	int i = 0, j = 0;
	STU temp;
	for (i = 0; i < n - 1; i++) {
		for (j = 0; j < n - i - 1; j++) {
			if (a[j].num > a[j + 1].num)
			{
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
	printf("按学号排序完成\n");
	return;
}
//输出平均分不到60分的学生信息
void stu_aver()
{
	printf("学号\t姓名\t成绩1\t成绩2\t成绩3\n");
	for (int i = 0; i < n; i++)
	{
		a[i].aver = (a[i].grade1 + a[i].grade2 + a[i].grade3) / 3.0;;
		if (a[i].aver < 60)
		{
			printf("%d \t%s \t%d \t%d \t%d\n", a[i].num, a[i].name, a[i].grade1, a[i].grade2, a[i].grade3);
		}
	}
}
//清空文件
void stu_emptyfile()
{
	fp = fopen("D:/student/file1.txt", "w+");
	if (!fp)
	{
		printf("打开文件失败");
		exit(0);
	}
	fclose(fp);

}
//给文件创建表头
void stu_openfile()
{
	fp = fopen("D:/student/file1.txt", "r");
	if (!fp) {
		printf("不能打开文件");
		exit(0);
	}
	fprintf(fp, "%s %s %s %s %s\n", "学号", "姓名", "成绩1", "成绩2", "成绩3");
	fclose(fp);
}
//保存最新的数据
void stu_savefile()
{
	fp = fopen("D:/student/file1.txt", "a");
	if (!fp)
	{
		printf("不能打开文件");
		exit(0);
	}
	for (int i = 0; i < n; i++)
	{
		fprintf(fp, "%d %s %d %d %d\n", a[i].num, a[i].name, a[i].grade1, a[i].grade2, a[i].grade3);
	}
	fclose(fp);
}
//读取文件数据
void stu_readfile()
{
	fp = fopen("D:/student/file1.txt", "r");
	if (!fp) {
		printf("打开文件失败");
		exit(0);
	}
	for (int i = 0; i < n; i++)
	{
		fscanf(fp, "%d %s %d %d %d", &stdinfo[i].num, stdinfo[i].name, &stdinfo[i].grade1, &stdinfo[i].grade2, &stdinfo[i].grade3);
	}
	printf("学号\t姓名\t成绩1\t成绩2\t成绩3\n");
	for (int i = 0; i < n; i++)
	{
		printf("%d \t%s \t%d \t%d \t%d\n", stdinfo[i].num, stdinfo[i].name, stdinfo[i].grade1, stdinfo[i].grade2, stdinfo[i].grade3);
	}
	printf("读取成功\n");
	//两函数组合更新文件内容
	stu_emptyfile();
	stu_savefile();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的示例代码,演示了如何使用Qt实现两个线程之间的通信,一个线程用于送数据,另一个线程用于接收数据。 ``` #include <QtWidgets> #include <QThread> // 数据送线程 class SenderThread : public QThread { Q_OBJECT public: SenderThread(QObject *parent = nullptr) : QThread(parent) {} signals: void dataReady(const QString &data); protected: void run() override { // 送数据 for (int i = 0; i < 10; i++) { QString data = QString("Data %1").arg(i); emit dataReady(data); QThread::msleep(500); } } }; // 数据接收线程 class ReceiverThread : public QThread { Q_OBJECT public: ReceiverThread(QObject *parent = nullptr) : QThread(parent) {} signals: void dataReceived(const QString &data); protected: void run() override { // 接收数据 for (int i = 0; i < 10; i++) { QString data = QString("Data %1").arg(i); emit dataReceived(data); QThread::msleep(500); } } }; // 主窗口 class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { // 创建送线程和接收线程 senderThread = new SenderThread(this); receiverThread = new ReceiverThread(this); // 连接信号和槽 connect(senderThread, &SenderThread::dataReady, receiverThread, &ReceiverThread::dataReceived); // 启动线程 senderThread->start(); receiverThread->start(); } private: SenderThread *senderThread; ReceiverThread *receiverThread; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow window; window.show(); return app.exec(); } #include "main.moc" ``` 在这个示例中,我们创建了一个 `SenderThread` 类和一个 `ReceiverThread` 类,分别用于送和接收数据。这两个线程都定义了一个信号,用于在数据准备好时出通知。在主窗口中,我们创建了这两个线程的实例,并将它们的信号和槽连接起来。这样,当 `SenderThread` 送数据时,它会出 `dataReady` 信号,然后 `ReceiverThread` 就会接收到这个信号,并调用 `dataReceived` 槽来接收数据。最后,我们启动了这两个线程,并且在主窗口中显示出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荻花瑟瑟秋凉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值