数据结构课设预习(一)

文章描述了一个用于管理参赛队伍信息的系统设计,包括从文件读取数据、增加、删除和修改队伍信息的功能。通过结构体存储队伍详情,使用线性查找进行操作,对文件team.txt中的数据进行处理并提供用户交互界面。
摘要由CSDN通过智能技术生成

目录

1、问题定义

2、问题分析

3、概要设计


1、问题定义

从team.txt中读取参赛队伍的基本信息,能够管理各参赛队的基本信息(包含参赛队编号,参赛作品名称,参赛学校,赛事类别,参赛者,指导老师),赛事类别共11项(参见大赛官网jsjds.blcu.edu.cn);包括增加、删除、修改参赛队伍的信息。

2、问题分析

在问题中要求能够管理各参赛队的基本信息,因此在结构体定义时,结构体中的成员列表就应该包含指向这些信息的成员数据。在读取文件时,将每个队伍的基本信息保存在结构体数组中,在此基础上创建可以增加、删除、修改参赛队伍信息的函数以实现对队伍的增加、删除、修改参赛队伍的信息等操作。

任务中当用户需要增加队伍时,可以直接定义一个结构体变量来存储要添加的队伍信息,然后将该变量放在队伍数组末尾。

任务中当用户需要删除队伍时,先输入要删除队伍的编号,通过线性表按值查找算法,找到该队伍在数组中的位置,然后将其删除。因为线性表是随机存取,因此删除操作的时间复杂度是O(n^2)。

任务中当用户需要修改队伍的信息时,先输入要修改的队伍的编号,通过线性表按值查找,找到该队伍数组中的位置,然后修改队伍的基本信息。该算法最好的时间复杂度是O(1),最坏的时间复杂度是O(n)。在等概率情况下,平均比较次数比表长即元素个数的一半多一点,故T(n)=O(n)。

3、概要设计

定义结点信息的数据结构,包含各参赛队的基本信息

struct Team {
	 //参赛作品编号
	int number;
	//参赛作品名称
	string offering;
	//参赛学校
	string school;
	//赛事类别
	string category;
	//参赛者
	string name;
	//指导老师
	string teacher;
	//答辩时间
	int time;
}teams[Max];

去除字符串中的空格

void Del_space(string& s) {    //去除字符串中的空格
	int index = 0;
	if (!s.empty()) {
	while ((index = s.find('\t', index)) != string::npos) { 
			s.erase(index, 1);
		}
	}
}

读取文件中队伍基本信息

//读取文件
void Read() {
	ifstream file("team.txt");
	if (!file){
		cout << "打开文件失败" << endl;
	}
	string line;
	while (getline(file, line)) {
		Team t;
		string s;
		Del_space(line);				//去除该行空格
		stringstream ss(line);			//实现字符串的输入,初始化ss
		getline(ss >> std::ws, s, '#');
		getline(ss >> std::ws, t.offering, '#');
		getline(ss >> std::ws, t.school, '#');
		getline(ss >> std::ws, t.category, '#');
		getline(ss >> std::ws, t.name, '#');
		getline(ss >> std::ws, t.teacher, '#');
		t.number = atoi(s.c_str());			//将编号转化为整形
		teams[Count] = t;
		Count++;
	}
	for (int i = 0; i < Count - 1; i++) {		//去除首行,整体前移一位
		teams[i] = teams[i + 1];
	}
	Count--;
	for (int i = 0; i < Count; i++)
		cout << "参赛队编号:" << teams[i].number 
		<< "参赛作品名称:" << teams[i].offering 
		<< "参赛学校:" << teams[i].school 
		<< "赛事类别:" << teams[i].category 
		<< "参赛者:" << teams[i].name 
		<< "指导老师:" << teams[i].teacher << endl;
	file.close();
	cout << "总共有 " << Count << " 个队伍" << endl;
}

添加队伍


//插入队伍
void Insert() {
	Team a;
	cout << "请输入添加队伍编号:";
	cin >> a.number;
	cout << "请输入添加队伍的作品名称:";
	cin >> a.offering;
	cout << "请输入添加队伍学校:";
	cin >> a.school;
	cout << "请输入添加队伍的赛事类别:";
	cin >> a.category;
	cout << "请输入添加参赛者:";
	cin >> a.name;
	cout << "请输入添加队伍指导老师:";
	cin >> a.teacher;
	teams[Count] = a;
	cout << "添加成功" << '\n';
	cout << "参赛队编号:" << teams[Count].number << "参赛作品名称:" << teams[Count].offering 
		<< "参赛学校:" << teams[Count].school << "赛事类别:" << teams[Count].category 
		<< "参赛者:" << teams[Count].name << "指导老师:" << teams[Count].teacher << endl;
	Count++;

}

删除队伍

//删除队伍
void Delete(){
	int num;
	cout << "请输入要删除的队伍编号:" << endl;
	cin >> num;
	for(int i=0;i<Count;i++){
		if (teams[i].number == num){
			cout << "删除队伍信息:" << endl;
			cout << "参赛队编号:" << teams[i].number << '\t' << "参赛作品名称:" << teams[i].offering<< '\t' 
				<< "参赛学校:" << teams[i].school << '\t' << "赛事类别:" << teams[i].category << '\t' 
				<< "参赛者:" << teams[i].name << '\t' << "指导老师:" << teams[i].teacher << endl;
			for (int j = i; j < Count; j++) {
				teams[j] = teams[j + 1];
		}
			Count--;
			cout << "删除成功" << endl;
			return;
		}
	}
	 	cout << "不存在此队伍" << endl;
}

修改队伍基本信息

//更改队伍信息
void Exchange() {
	int num;
	cout << "输入你要修改那个队伍的信息(输入编号):";
	cin >> num;
	for (int i = 0; i < Count; i++) {
		if (teams[i].number == num) {
			string s1,s2,s3,s4,s5;
			cout << "请输入更改后参赛作品名称:";
			cin >> s1;
			teams[i].offering = s1;
			cout << "请输入更改后队伍学校:";
			cin >> s2;
			teams[i].school = s2;
			cout << "请输入更改后的队伍的赛事类别:";
			cin >> s3;
			teams[i].category = s3;
			cout << "请输入更改后参赛者:";
			cin >> s4;
			teams[i].name = s4;
			cout << "请输入更改后队伍指导老师:";
			cin >> s5;
			teams[i].teacher = s5;
			break;
		}
	}
	cout << "修改成功" << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

pp盼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值