高校社团助手

#include"iostream"
#include"string"
#include"windows.h"
#include<fstream>
#include<iomanip>
#define MAXs 30
#define MAX 10000000
#define MAX_VERTEX_NUM 20
using namespace std;
/*1

实验五 高校社团助手设计与实现
实验要求:
1、
项目服务对象 : 高校社团负责人或管理人员;高校校方社团管理机构负责人
	项目功能 : 该项目共实现了8个功能模块.
	实验内容:
	模块一:通讯录管理
	包含建立通讯录、查询、插入、删除、排序、查找等功能。
	模块二:成员等级管理
	对成员的积分进行管理,通过活动获得积分,若违规则相应扣除积分,积分达到设定的阈值,可实现成员等级的变迁。包括积分添加、修改、查询、排序、求平均分等各种操作。
	模块三:社团基本信息管理
	对社团名称,口号,宗旨,章程,发起人,社团性质等信息增删改操作。
	模块四:组织机构管理
	成员人事管理:招新,退社等操作;干部管理:选举等操作;
	机构管理:完成社团组织机构的创建、修改、删除、查询等功能。
	模块五:赞助商管理
	赞助商基本信息的增删改操作;赞助商与社团关系的管理。
	模块六:活动计划管理
	可行性分析
	模块七:活动筹备管理
	拉赞助,活动经费与场地,校园导航
	模块八:活动评价管理
	对每次活动的参与人员评分并总结。*/
struct Level
{
	int socre;
	string name;
	string No;
	string level;
	void show()
	{
		cout<< No<<setw(8) <<name << setw(8) <<socre << setw(8) << level <<endl;
	}
};
typedef struct 
{
	string ActivityName;
	int Peopelsum;
	int Socre;
	void showe()
	{
		cout << ActivityName<< setw(8)<<Peopelsum<<setw(14) << Socre<<endl;
	}
}Activity;
typedef struct
{
	Activity *base;
	int length;
}AList;

typedef struct
{
	string *Bases;
	int Lengthes;
}PList;
class Map {
public:
	Map() {
		Read("Map.txt");
	}
	~Map() {
		for (int i = 0; i < MAXs; i++)
		{
			for (int j = 0; j < MAXs; j++)
			{
				D[i][j] = 0;
				arcs[i][j] = 0;

			}
			vexs[i] = "";
		}
	}
	void Read(char *FileName);
	int LocateVex(string x) { int i; for (i = 0; i < VexNum; ++i)if (vexs[i] == x)return i; return -1; }
	void Path(int i, int j)
	{
		if (i >= 26 || j >= 26 || i*j<0)
		{
			cout << "错误的地点" << endl;
			return;
		}
		bool p[100];
		int k, n, m = i;
		int a;
		if (i == j)
		{
			cout << "\t已到达" << endl;
			return;
		}
		if (i != j)
			for (k = 0; k < VexNum; k++)
				p[k] = P[i][j][k];

		cout << endl;
		if (D[i][j] < 10000)
		{
			while (m != j)
			{
				a = 10000;
				for (k = 0; k < VexNum; k++)
					if (arcs[m][k] < a&&p[k])
					{
						a = arcs[m][k];
						n = k;
					}
				cout << vexs[n];
				if (n != j)
					cout << "->";
				p[n] = false;
				m = n;
			}
			cout << " : " << D[i][j] << "米" << endl;
		}
		else
			cout << vexs[i] << "->" << vexs[j] << "没有路" << endl;
	}

	void ShortestPath_FLOYD()
	{
		int u, v, w, i;
		for (v = 0; v < VexNum; v++)
			for (w = 0; w < VexNum; w++)
			{
				D[v][w] = arcs[v][w];
				for (u = 0; u < VexNum; u++)
					P[v][w][u] = false;
				if (D[v][w] < 10000)
					P[v][w][v] = P[v][w][w] = true;
			}
		for (u = 0; u < VexNum; u++)
			for (v = 0; v < VexNum; v++)
				for (w = 0; w < VexNum; w++)
					if (D[v][u] < 10000 && D[u][w] < 10000 && D[v][u] + D[u][w] < D[v][w])
					{
						D[v][w] = D[v][u] + D[u][w];
						for (i = 0; i < VexNum; i++)
							P[v][w][i] = P[v][u][i] || P[u][w][i];
					}
	}
	void Findway();
private:
	bool P[MAXs][MAXs][MAXs];
	int D[MAXs][MAXs];
	int VexNum;
	string vexs[MAXs];
	int ArcNum;
	int arcs[MAXs][MAXs];
};
struct Sponser
{
	string SponserName;
	int Money;
	void shows()
	{
		cout << SponserName << setw(15) << Money << endl;
	}
};
typedef struct
{
	Sponser*Base;
	int Lengths;
}SList;
void Map::Read(char *FileName)
{
	int i, j, k;
	string v1, v2;
	int w = 0;
	ifstream fin;

	fin.open(FileName, ios::in);

	fin >> VexNum;

	for (int i = 0; i < VexNum; i++)
	{
		fin >> vexs[i];
	}

	fin >> ArcNum;
	for (i = 0; i < VexNum; i++)
		for (j = 0; j < VexNum; j++)
			arcs[i][j] = 10000;
	for (int i = 0; i < VexNum; i++)
		arcs[i][i] = 0;
	for (int k = 0; k < ArcNum; ++k)
	{
		fin >> v1 >> v2 >> w;
		i = LocateVex(v1);
		j = LocateVex(v2);
		arcs[i][j] = w;
		arcs[j][i] = w;
	}

	fin.close();
}
//校园导航
void Map::Findway()
{
	ShortestPath_FLOYD();
	int i, j, q = 1;


	cout << endl << "地址如下" << endl;
	for (i = 0; i < VexNum; i++)
	{
		cout.setf(ios::left);
		cout << setw(2) << i << ":" << setw(10) << vexs[i] << "  ";
		if (i % 4 == 5)
			cout << endl;
	}
	cout << endl;
	while (q)
	{
		cout << "1:开启导航 " << endl;
		cout << "0:退出" << endl;
		cin >> q;
		if (q)
		{
			cout << "输入导航的起点和终点 : " << endl;
			cin >> i >> j;
			Path(i, j);
		}
	}
}

class ListMembers
{
public:
	ListMembers()  
	{
		Root = new Leveltree();
		m_pHead = new Member(1);
		m_pTail = m_pHead;
		Alist.base = new Activity[MAXs];
		Slist.Base = new Sponser[MAXs];
		Alist.length = 1;
		Slist.Lengths = 1;
		Plist.Bases = new string[MAXs];
		Plist.Lengthes = 1;
	}
	~ListMembers()
	{
		for (Member* pNode = m_pHead, *pNext; pNode; pNode = pNext)
		{
			pNext = pNode->m_pNext;
			delete pNode;
		}
	}
	bool AddSponser()
	{
		Sponser S;
		cout << "请输入赞助商名:" << endl;
		cin >> S.SponserName;
		cout << "请输入赞助总金额:" << endl;
		cin >> S.Money;
		Slist.Base[Slist.Lengths] = S;
		Slist.Lengths++;
		return true;
	}
	bool AddActivity()
	{
		Activity A;
		cout << "请输入活动名称:" << endl;
		cin >> A.ActivityName;
		cout << "请输入活动限制人数:" << endl;
		cin >> A.Peopelsum;
		cout << "请输入活动分数:" << endl;
		cin >> A.Socre;
		Alist.base[Alist.length] = A;
		Alist.length++;
		return true;
	}
	bool AddPinjia()
	{
		string S;
		cout << "请发表你的意见:" << endl;
		cin >> S;
		Plist.Bases[Plist.Lengthes] = S;
		Plist.Lengthes++;
		return true;
	}
	
	bool DeleteSponser()
	{
		int i;
		cout << "请输入要删除赞助商的序号:" << endl;
		cin >> i;
		for (int j = i+1; j < Slist.Lengths; j++)
		{
			Slist.Base[j - 1] = Slist.Base[j];
			
		}
		--Slist.Lengths;
		return true;
	}
	bool DeleteActivity()
	{
		int i;
		cout << "请输入要删除活动的序号:" << endl;
		cin >> i;
		for (int j = i+1; j < Alist.length; j++)
		{
			Alist.base[j - 1] = Alist.base[j];
		}
		--Alist.length;
		return true;
	}
	void showSponser()
	{
		cout << "赞助商" << setw(8)<<"      " << "赞助总金额" <<endl;
		for (int i = 1; i < Slist.Lengths; i++)
		{
			cout <<"第"<<i<<"个:"; Slist.Base[i].shows();
		}
	}
	void showPinjia()
	{
		for (int i = 1; i < Plist.Lengthes; i++)
		{
			cout << "第" << i << "个人评价:"; cout << Plist.Bases[i] << endl;
		}
	}
	int GetMoney()
	{
		int moneys=0;
		for (int i = 1; i < Slist.Lengths; i++)
		{
			moneys+= Slist.Base[i].Money;
		}
		return moneys;
	}
	bool GiveMoney()
	{
		int money;
		int i = 1;
		while (i != 0)
		{
			if (Slist.Lengths == 1) { cout << "没有赞助商!" << endl; return false; }
			showSponser();
			cout << "请输入要投资赞助商:" << endl;
			cin >> i;
			switch (i)
			{
			case 1:cout << "请输入赞助金额:"; cin >> money; if (Slist.Base[1].Money < money) { cout << "钱不够!" << endl; return false; }
				   else { Slist.Base[1].Money -= money; return true; }
			case 2:cout << "请输入赞助金额:"; cin >> money; if (Slist.Base[1].Money < money) { cout << "钱不够!" << endl; return false; }
				   else { Slist.Base[1].Money -= money; return true; }
			case 3:cout << "请输入赞助金额:"; cin >> money; if (Slist.Base[1].Money < money) { cout << "钱不够!" << endl; return false; }
				   else { Slist.Base[1].Money -= money; return true; }
			case 4:cout << "请输入赞助金额:"; cin >> money; if (Slist.Base[1].Money < money) { cout << "钱不够!" << endl; return false; }
				   else { Slist.Base[1].Money -= money; return true; }
			case 5:cout << "请输入赞助金额:"; cin >> money; if (Slist.Base[1].Money < money) { cout << "钱不够!" << endl; return false; }
				   else { Slist.Base[1].Money -= money; return true; }
			case 6:cout << "请输入赞助金额:"; cin >> money; if (Slist.Base[1].Money < money) { cout << "钱不够!" << endl; return false; }
				   else { Slist.Base[1].Money -= money; return true; }
			default:break;
			}
			return false;
		}
	}
	void showActivity()
	{
		cout << "活动名" <<"       " << "限制人数" <<"       "<< "活动积分" <<  endl;
		for (int i = 1; i < Alist.length; i++)
		{
			cout << "第" << i << "个:"; Alist.base[i].showe();
		}
	}
	void CleerPingjia()
	{
		Plist.Lengthes = 0;
	}
	void Baoming()
	{
		Level T;
		string no;
		int socres;
		int n;
		cout << "请输入参加的活动序号:" << endl;
		cin >> n;
		cout << "请输入参加活动的学号和积分" << endl;
		cin >> no >> socres;
		T=Root->deletetree(Root,no,socres);
		T.socre += Alist.base[n].Socre;
		Root->insert(T);

	}
	//接口:追加
	void Addend()  
	{
		Member* pNode = new Member(m_pTail);
		pNode->Setmebmer();
		Level N;
		N.name = pNode->M_sName;
		N.No = pNode->M_sNo;
		cout << "*******************请输入成员的积分******************" << endl;
		cin >> N.socre; system("cls");
		if (N.socre <= 50)
		{
			pNode->SetPost("一级");
			N.level = "一级";
		}
		else if (N.socre <= 100)
		{
			pNode->SetPost("二级");
			N.level = "二级";
		}
		else if ( N.socre <= 150)
		{
			pNode->SetPost("三级");
			N.level = "三级";
		}
		else
		{
			pNode->SetPost("四级");
			N.level = "四级";
		}
		if (m_pHead->m_pNext!=NULL)
		{
			cout << "come" << endl;
			pNode->m_pPrev->m_pNext = pNode;
			pNode->m_pNext = NULL;
		}
		else
		{
			m_pHead->m_pNext=pNode  ;
			pNode->m_pPrev = m_pHead;
			pNode->m_pNext = NULL;
		}
		m_pTail = pNode;
		pNode->Sort(m_pHead);
		Root->insert(N);
	}

	void Insert() //利用尾插法向双向链表中插入1个(默认)或n个(用户指定)结点  
	{
		Member *t;
		if (m_pHead->m_pNext == NULL)    //查找尾结点  
			t = m_pHead;
		else
		{
			t = m_pHead->m_pNext;
			while (t->m_pNext != NULL)
				t = t->m_pNext;
		}
			Member *p = 0;
			p = new Member(1);
			p->Setmebmer();
			t->m_pNext = p;
			p->m_pPrev = t;
			p->m_pNext = NULL;
			t = t->m_pNext;
			m_pTail = p;
			p->Sort(m_pHead);
	}
	void TravelTree()
	{
		int n=1;
		while (n != 0)
		{
			cout << "1.升序;2.降序" << endl;
			cin >> n; system("cls");
			switch (n)
			{
			case 1:	cout << "学号" << "        " << "姓名" << "        " << "积分" << "        " << "等级" << "        " << endl; Root->inorder(Root); system("pause");
				system("cls"); break;
			case 2:	cout << "学号" << "        " << "姓名" << "        " << "积分" << "        " << "等级" << "        " << endl; Root->rinorder(Root); system("pause");
				system("cls"); break;
			default:break;
			}
		}
	}
	void  Search()
	{
		int n = 1;
		while (n != 0)
		{
			cout << "1.姓名查找;2.学号查找";
				cin >> n;
			switch (n)
			{
			case 1:searchname(); break;
			case 2:searchno(); break;
			default:break;
			}
		}
		
	}
	void searchno()
	{
		string no;
		cout << "请输入查找的学号:"; cin >> no;
		for (Member* pFind = m_pHead->m_pNext; pFind; pFind = pFind->m_pNext)
			if (pFind->M_sNo == no)
			{
				pFind->show();
			}
			else if (pFind == NULL)
			{
				cout << "查无此人!" << endl;
			}
	}
	void searchname()
	{
		string name;
		cout << "请输入查找的姓名:"; cin >> name;
		for (Member* pFind = m_pHead->m_pNext; pFind; pFind = pFind->m_pNext)
			if (pFind->M_sName == name)
			{
				pFind->show();
			}
			else if (pFind == NULL)
			{
				cout << "查无此人!" << endl;
			}
	}
	//接口:删除

	void Delete()
	{
		string no;
		cout << "请输入要删除的成员学号:";
		cin >> no;
		for (Member* pFind = m_pHead->m_pNext; pFind; pFind = pFind->m_pNext)
			if (pFind->M_sName == no)
			{
				if (pFind->m_pPrev)
					pFind->m_pPrev->m_pNext = pFind->m_pNext;
				else
					m_pHead = pFind->m_pNext;
				if (pFind->m_pNext)
					pFind->m_pNext->m_pPrev = pFind->m_pPrev;
				else
					m_pTail = pFind->m_pPrev;
				delete pFind;
				return;
			}
		
	}
	void DeleteTree()
	{
		Root->deletetree(Root);
	}

	//接口:遍历
	void Travel()
	{
		cout << "学号:" << setw(8) << "姓名:" << setw(8) << "性别:" << setw(8) << "班级:" << setw(8) << "职务:" << setw(8) << "入社时间:" << setw(8) << "手机:" << setw(8)<< endl;
		for (Member* pNode = m_pHead->m_pNext; pNode; pNode = pNode->m_pNext)
		{
			cout << pNode->M_sNo<<setw(8)<< pNode->M_sName << setw(8) << pNode->M_sSex << setw(8) << pNode->M_sClass << setw(8) << pNode->M_sPost << setw(8) << pNode->M_sTime << setw(8) << pNode->M_sTele << setw(8) << endl;
		}
		system("pause");
		system("cls");
	}

private:
	
	class Leveltree
	{
	public:
		Leveltree *left;
		Leveltree *right;
		Level L;
		Leveltree() :left(NULL), right(NULL) 
		{
			L.name = "周恬";
			L.No = "0154075";
			L.socre =5000;
			L.level = "四级";
		}
		Leveltree(Level T) :left(NULL), right(NULL)
		{
			L = T;
		}
		~Leveltree()
		{
			if (left)
				delete left;
			if (right)
				delete right;
		}
		
		
		void insert(Level a)
		{
			if (a.socre<=L.socre && left)
			{
				left->insert(a);
			}
			else if (a.socre <=L.socre && !left)
			{
				left = new Leveltree(a);
			}
			else if (a.socre > L.socre && right)
			{
				right->insert(a);
			}
			else if (a.socre>L.socre && !right)
			{
				right = new Leveltree(a);
			}
			
		}
		Leveltree* binary_search(Leveltree* point, string node,int socres, int *postion)
		{

			Leveltree* parent;

			parent = point;
			*postion = 0;

			while (point != NULL)
			{
				if (point->L.No == node)
					return parent;
				else
				{
					parent = point;
					if (point->L.socre>socres)
					{
						point = point->left;
						*postion = -1;
					}
					else
					{
						point = point->right;
						*postion = 1;
					}
				}

			}
			return NULL;

		}
		Level  deletetree(Leveltree*  root,string node, int socres)
		{
			Level T;
			Leveltree*  parent;
			Leveltree*  point = new Leveltree;
			Leveltree*  child;
			int postion;
			parent = binary_search(root, node, socres, &postion);

			//二叉树为空的情况
			if (parent == NULL)
				return T;
			else
			{
				switch (postion)
				{
				case -1:point = parent->left; T = point->L ; break;

				case 1:point = parent->right;  T = point->L; break;

				case  0:point = parent;  T = point->L; break;
				}

				if (point->left == NULL&&point->right == NULL)
				{
					switch (postion)
					{
					case -1:parent->left = NULL; break;
					case 1:parent->right = NULL; break;
					case 0:parent = NULL; break;
					}
					
					free(point);
					return T;
				}

				if (point->left == NULL&&point->right != NULL)
				{
					if (postion == -1)
						parent->left = point->right;
					else
						if (postion == 1)
							parent->right = point->right;
						else
							root = root->right;
					
					free(point);
					return T;
				}

				if (point->left != NULL&&point->right == NULL)
				{
					if (postion == -1)
						parent->left = point->left;
					else
						if (postion == 1)
							parent->right = point->left;
						else
							root = root->left;
					return T;
				}

				if (point->left != NULL&& point->right != NULL)
				{
					parent = point;
					child = point->left;
					while (child->right != NULL)
					{
						parent = child;
						child = child->right;
					}
					point->L = child->L;
					if (parent->left = child)
						parent->left = child->left;
					else
						parent->right = child->left;

					free(child);

					return T;
				}
			}

		}
		Leveltree*  deletetree(Leveltree*  root )
		{
			string node; int socres;
			cout << "请输入要删除的学号和对应积分:" << endl;
			cin >> node>>socres;
			Leveltree*  parent;
			Leveltree*  point=new Leveltree;
			Leveltree*  child;
			int postion;
			parent = binary_search(root, node,socres, &postion);
			//二叉树为空的情况
			if (parent == NULL)
				return root;
			else
			{
				switch (postion)
				{
				case -1:point = parent->left; break;

				case 1:point = parent->right; break;

				case  0:point = parent; break;
				}

				if (point->left == NULL&&point->right == NULL)
				{
					switch (postion)
					{
					case -1:parent->left = NULL; break;
					case 1:parent->right = NULL; break;
					case 0:parent = NULL; break;
					}

					free(point);
					return root;
				}

				if (point->left == NULL&&point->right != NULL)
				{
					if (postion == -1)
						parent->left = point->right;
					else
						if (postion == 1)
							parent->right = point->right;
						else
							root = root->right;

					free(point);
					return root;
				}

				if (point->left != NULL&&point->right == NULL)
				{
					if (postion == -1)
						parent->left = point->left;
					else
						if (postion == 1)
							parent->right = point->left;
						else
							root = root->left;
					return root;
				}

				if (point->left != NULL&& point->right != NULL)
				{
					parent = point;
					child = point->left;
					while (child->right != NULL)
					{
						parent = child;
						child = child->right;
					}
					point->L = child->L;
					if (parent->left = child)
						parent->left = child->left;
					else
						parent->right = child->left;

					free(child);
					return root;
				}
			}

		}
		static void inorder( Leveltree*b)//中序遍历  
		{
			
			if (b != NULL)
			{
				inorder(b->left);
				b->L.show();//cout<<b->L.name<<" ";
				inorder(b->right);
			}
		}
		static void rinorder( Leveltree*b)//中序遍历,先遍历右子树  
		{
		
			if (b != NULL)
			{
				rinorder(b->right);
				b->L.show();//cout << b->L.name << " ";
				rinorder(b->left);
			}
		}

	};
	
	class Member
	{
	public:
		Member(string Name = "null", string Post = "null", string Tele = "null", Member* pPrev = NULL, Member* pNext = NULL) :M_sName(Name), M_sPost(Post), M_sTele(Tele), m_pPrev(pPrev), m_pNext(pNext) {}
		Member(Member* pPrev = NULL, Member* pNext = NULL)
		{
			m_pPrev = pPrev; m_pNext = pNext;
			M_sName = "null";
			M_sPost = "null";
			M_sTele = "null";
			M_sNo = "null";
			M_sSex = "null";;
			M_sClass = "null";
			M_sTime = "null";
		}
		void show()
		{
			cout << "学号:" << M_sNo << "  " << "姓名:" << M_sName << "  " << "性别:" <<M_sSex << "  " << "班级:" << M_sClass << "  " << "职务:" <<M_sPost << "  " << "入社时间:" << M_sTime << "  " << "手机:" << M_sTele << endl;
		}
		

		Member(int) {}
		Member() {}
		string M_sNo;
		string M_sName;
		string M_sSex;
		string M_sClass;
		string M_sTime;
		string M_sPost;
		string M_sTele;	//数据
		Member* m_pPrev;	//前指针
		Member* m_pNext;	//后指针
		void Setmebmer()
		{
			cout << "********请输入学号,姓名,性别,班级,入团时间,联系方式:***********"<<endl;
			cin >> M_sNo >> M_sName >> M_sSex >> M_sClass >> M_sTime  >> M_sTele;
		}
		void SetPost(string post)
		{
			M_sPost = post;
		}
		void swap(Member *p, Member *t)  //p,t结点有序,p为前结点,t为后结点  
		{
			cout << "come in swap" << endl;
			Member *temp;
			if (t->m_pNext == NULL) //t结点是否为尾结点  
			{
				if (p->m_pNext == t) //p,t结点是否相邻  
				{
					//与尾结点相邻的交换代   
					t->m_pNext = p;
					t->m_pPrev = p->m_pNext;
					p->m_pNext = NULL;
					p->m_pPrev->m_pNext = t;
					p->m_pPrev = t;
				}
				else
				{
					//与尾结点不相邻的交换代   
					t->m_pNext = p->m_pNext;
					t->m_pPrev->m_pNext = p;
					temp = t->m_pPrev;
					t->m_pPrev = p->m_pPrev;
					p->m_pNext->m_pPrev = t;
					p->m_pNext = NULL;
					p->m_pPrev->m_pNext = t;
					p->m_pPrev = temp;
				}
			}
			else
			{
				if (p->m_pNext == t) //p,t结点是否相邻  
				{
					//相邻的交换代   
					t->m_pNext->m_pPrev = p;
					temp = t->m_pNext;
					t->m_pNext = p;
					t->m_pPrev = p->m_pPrev;
					p->m_pNext = temp;
					p->m_pPrev->m_pNext = t;
					p->m_pPrev = t;
				}
				else
				{
					//不相邻的交换代   
					t->m_pNext->m_pPrev = p;
					temp = t->m_pNext;
					t->m_pNext = p->m_pNext;
					p->m_pNext->m_pPrev = t;
					p->m_pNext = temp;
					t->m_pPrev->m_pNext = p;
					temp = t->m_pPrev;
					t->m_pPrev = p->m_pPrev;
					p->m_pPrev->m_pNext = t;
					p->m_pPrev = temp;
				}
			}
		}
		void Sort(Member *H)  //选择排序算法  
		{
			//cout << "come in" << endl;
			Member *i, *j, *k;
			if (!H->m_pNext)  //双向链表为空则返回  
				return;
			for (i = H->m_pNext; i->m_pNext != NULL; i = k->m_pNext)   
			{
				for (j = i->m_pNext, k = i; j != NULL; j = j->m_pNext)
					if (k->M_sName > j->M_sName)
						k = j;
				if (k != i)
					swap(i, k);
			}
		}
		};
		Member* m_pHead;	//头节点
		Member* m_pTail;	//尾节点
		Leveltree *Root;   //等级管理
		AList Alist;//活动列表
		SList Slist;//赞助商列表
		PList Plist;//评价列表
	};


	/*顺序栈的定义*/
#define Stack_Size 100
	typedef struct sqStack
	{
		int *elem;
		int top;
		int stackSize;//栈数组长度
	}sqStack;


	/*顺序栈的初始化*/
	void initStack_Sq(sqStack &S)
	{
		S.elem = new int[Stack_Size];
		S.top = -1;
		S.stackSize = Stack_Size;
	}
	/*入栈*/
	void push(sqStack &S, int x)
	{
		if (S.top == Stack_Size - 1)
			cout << "Stack Overflow!";
		S.elem[++S.top] = x;
	}

	/*出栈*/
	int pop(sqStack &S)
	{
		int x;
		if (S.top == -1)
			cout << "Stack Empty!";
		x = S.elem[S.top--];
		return x;
	}
	typedef struct EdgeNode
	{//边表结点的定义
		int adjvex;//存放邻接点在顶点表中的位置
		struct EdgeNode * nextedge;//指向下一个边表结点
	}EdgeNode;
	typedef struct VexNode
	{//顶点表结点的定义
		string vex;//存放顶点信息
		int sure;
		EdgeNode * firstedge;//指向第一个边表结点
		int indegree;
	}VexNode;
	typedef struct
	{//顶点表的定义	
		VexNode vexs[MAX_VERTEX_NUM];
		int vexnum, edgenum;
	}LGraph;
	/*构造有向图的邻接表*/
	void CreateDG_AL(LGraph &G)
	{

		char* FileName;
		FileName = "in.txt";
		ifstream Fin;
		Fin.open(FileName, ios::in);
		int i, j, k;
		int n, e;
		//cout << "请输入节点数和边数:" << endl;
		Fin >> n >> e;
		G.vexnum = n;
		G.edgenum = e;
		for (i = 0; i<n; i++)
		{
			//cout << "输入结点信息:" << endl;
			Fin >> G.vexs[i].vex >> G.vexs[i].sure;
			G.vexs[i].firstedge = NULL;//初始化为空
		}
		for (k = 0; k<e; k++)
		{
			EdgeNode *p;
			//cout << "输入相邻结点i,j" << endl;
			Fin >> i >> j;
			p = new EdgeNode;
			p->adjvex = j;
			p->nextedge = G.vexs[i].firstedge;
			G.vexs[i].firstedge = p;//采用头插法
		}
		Fin.close();
	}
	//拓扑排序
	bool TopoSort(LGraph &G)
	{
		sqStack S;
		initStack_Sq(S);
		EdgeNode *p;
		int count = 0;
		int i, j;
		for (i = 0; i<G.vexnum; i++)
			G.vexs[i].indegree = 0;//初始化为0
		for (i = 0; i<G.vexnum; i++)
		{//计算各个顶点的入度
			p = G.vexs[i].firstedge;
			while (p)
			{
				G.vexs[p->adjvex].indegree++;
				p = p->nextedge;
			}
		}
		for (i = 0; i < G.vexnum; i++)
			if (G.vexs[i].indegree == 0)
				if (G.vexs[i].sure == 1)
					push(S, i);//将度为0的顶点入栈
				else
				{
					cout << "请先完成" << G.vexs[i].vex << endl;
					return false;
				}
		while (S.top != -1)
		{
			j = pop(S);
			//if(G.vexs[j].sure==1)
			cout << G.vexs[j].vex << "->";//将栈顶的元素出栈且输出
			count++;//计数器加1
			p = G.vexs[j].firstedge;//让p指向入度为0的顶点的第一个边表结点
			while (p)
			{
				G.vexs[p->adjvex].indegree--;//将入度为0的顶点的邻接点的入度减1
				if (G.vexs[p->adjvex].indegree == 0)
					if (G.vexs[p->adjvex].sure == 1)
						push(S, p->adjvex);
					else
					{
						cout << G.vexs[p->adjvex - 1].vex << "已经完成!" << endl;
						cout << "请再完成" << G.vexs[p->adjvex].vex << endl;
						return false;
					}
				p = p->nextedge;
			}
		}
		return true;
		if (count<G.vexnum)
			cout << "有回路!" << endl;
		return false;
	}
	
		

	class Shetuan
	{
	private:
		string ShetuanName;
		string Shetuankouhao;
		string Shetuanzongzhi;
		string Shetuanzhangcheng;
		string Shetuanfaqiren;
		string Shetuanxinzhi;
	public:
		Shetuan()
		{
			ShetuanName = "霸王社团";
			Shetuankouhao = "信霸王,得永生!";
			Shetuanzhangcheng = "1.服从上级指挥!\n          2.认真完成工作!";
			Shetuanzongzhi = "一切为了同学!";
			Shetuanxinzhi = "学生会";
			Shetuanfaqiren = "周恬";
		}
		void Set()
		{
			cout << "社团名称:" << endl;
			cin >> ShetuanName;
			cout << "社团口号:" << endl;
			cin >> Shetuankouhao;
			cout << "社团宗旨:" << endl;
			cin >> Shetuanzongzhi;
			cout << "社团章程:" << endl;
			cin >> Shetuanzhangcheng;
			cout << "社团发起人:" << endl;
			cin >> Shetuanfaqiren;
			cout << "社团性质:" << endl;
			cin >> Shetuanxinzhi;
		}
		void show()
		{
			cout << "社团名称:" << ShetuanName << endl;
			cout << "社团口号:" << Shetuankouhao << endl;
			cout << "社团宗旨:" << Shetuanzongzhi << endl;
			cout << "社团章程:" << Shetuanzhangcheng << endl;
			cout << "社团发起人:" << Shetuanfaqiren << endl;
			cout << "社团性质:" << Shetuanxinzhi << endl;
		}
	};
	void munemain()
	{
		cout << "****************************************1.成员信息管理***************************************" << endl;
		//cout << "********************2.社团助手************************" << endl;
		//cout << "********************3.社团活动管理********************" << endl;
	}
	void mune1()
	{
		cout << "*****************************************1.通讯录管理*****************************************" << endl;
		//cout << "********************2.成员等级管理********************" << endl;
	}
	void mune2()
	{
		cout << "*****************************************4.社团基本信息管理***********************************" << endl;
		cout << "*****************************************5.组织机构管理***************************************" << endl;
		cout << "*****************************************6.赞助商管理*****************************************" << endl;
	}
	void mune3()
	{
		cout << "*****************************************7.活动计划管理***************************************" << endl;
		//cout << "********************11.活动筹备管理********************" << endl;
		cout << "*****************************************8.活动评价管理***************************************" << endl;
	}
	void mune4()
	{
		cout << "*****************************************1.添加联系人******************************************" << endl;
		cout << "*****************************************2.查找联系人******************************************" << endl;
		cout << "*****************************************3.删除联系人******************************************" << endl;
		cout << "*****************************************4.查看通讯录******************************************" << endl;

	}
	void mune5()
	{
		cout << "*****************************************2.查看成员信息***************************************" << endl;
		cout << "*****************************************3.删除成员*******************************************" << endl;
	}
	void mune6()
	{
		cout << "*****************************************9.活动计划分析***************************************" << endl;
		cout << "****************************************10.活动经费*******************************************" << endl;
		cout << "****************************************11.校园导航*******************************************" << endl;
	}
	
	bool Huodonfenxi(ListMembers &S,LGraph &G)
	{
		int i = 1;
		
		if (TopoSort(G))
		{
			cout << "活动已经完美进行!!!!" << endl; return true;
		}
		else
		{
			while (i != 0)
			{
				cout << "1.拉赞助" << endl;
				cout << "2.采购" << endl;
				cout << "3.布置" << endl;
				cout << "4.报名" << endl;
				cout << "5.开始进行活动" << endl;
				cin >> i; Sleep(1000); system("cls");
				switch (i)
				{
				case 1:if (S.GiveMoney()) { G.vexs[0].sure = 1; cout << "已经拉到赞助!" << endl; }Sleep(1000); system("cls"); break;
				case 2:if (G.vexs[0].sure == 1)
				{
					G.vexs[1].sure = 1;
					cout << "采购完成!" << endl; Sleep(1000); system("cls");
				}
					   else
					   {
						   cout << "没有钱!" << endl; Sleep(1000); system("cls");
					   }break;
				case 3:if (G.vexs[1].sure == 1)
				{
					G.vexs[2].sure = 1; cout << "完成布置!" << endl; Sleep(1000); system("cls");
				}
					   else {
						   cout << "没有东西可以布置,还没有采购" << endl; Sleep(1000); system("cls");
					   } break;
				case 4:if (G.vexs[2].sure == 1) { G.vexs[3].sure = 1; cout << "完成报名!" << endl; }
					   else {
						   cout << "东西还没有布置好,先去布置!" << endl; Sleep(1000); system("cls");
					   } break;
				case 5:if (G.vexs[3].sure == 1) { G.vexs[4].sure = 1; cout << "活动可以开始进行!" << endl; }
					   else {
						   cout << "没有人报名,活动无法进行!" << endl; Sleep(1000); system("cls");
					   } break;
				default:break;
					   }
				}
			}
		return false;
		}
			void jihuaguanli(ListMembers &S)
			{
				int i = 1;
				while (i != 0)
				{
					cout << "1.添加活动" << endl;
					cout << "2.删除活动" << endl;
					cout << "3.显示活动" << endl;
					cout << "4.报名参加" << endl;
					cin >> i; Sleep(1000); system("cls");
					switch (i)
					{
					case 1:S.AddActivity(); break;
					case 2:S.DeleteActivity(); break;
					case 3:S.showActivity(); break;
					case 4:S.Baoming(); break;

					default:break;
					}
				}
			}
	void pinhjiaguanli(ListMembers &S,LGraph &G,bool y)
	{
		if (y)
		{
			int i = 1;
			while (i != 0)
			{
				cout << "1.添加评价" << endl;
				cout << "2.显示评价" << endl;
				cout << "3.清空评价" << endl;
				cin>> i; Sleep(1000); system("cls");
				switch (i)
				{
				case 1:S.AddPinjia(); break;
				case 2:S.showPinjia(); break;
				case 3:S.CleerPingjia(); break;
				default:break;
				}
			}
			S.AddPinjia();
			S.showPinjia();

		}
		else
		{
			cout << "活动并未成功举办,不能评价!" << endl; Sleep(1000); system("cls");
		}
	}

	void stjibxinxi(Shetuan &S)
	{
		
		S.show();
		int i = 1;
			cout << "1.更改社团信息;0.返回" << endl;
			cin >> i; Sleep(1000); system("cls");
			if (i == 1)
			{
				S.Set();
			}
	}
	void zuzhijigou()
	{
		cout << " 正在与学习进行激烈的洽谈,敬请期待!" << endl; Sleep(1000); system("cls");
	}
	void zanzhushang(ListMembers &S)
	{
		int i = 1;
		while (i != 0)
		{
			cout << "1.添加赞助商" << endl;
			cout << "2.删除赞助商" << endl;
			cout << "3.显示赞助商" << endl;
			cin >> i; Sleep(1000); system("cls");
			switch (i)
			{
			case 1:S.AddSponser(); break;
			case 2:S.DeleteSponser(); break;
			case 3:S.showSponser(); break;
			default:break;
			}
		}
		
	}
	void shetuanzhushou(Shetuan &S)
	{
		int l = 1;
		while (l != 0)
		{
			mune2();
			cin >> l;
			switch (l)
			{
			case 1:stjibxinxi(S); break;
			case 2:zuzhijigou(); break;
			//case 3:zanzhushang(); break;
			default:break;
			}
		}
	}
	void dengji(ListMembers &List)
	{
		int k = 1;
		while (k!= 0)
		{
			mune5();
			cin >> k;system("cls");
			switch (k)
			{
			case 1:List.TravelTree(); break;
			case 2:List.DeleteTree(); break;
			default:break;
			}
		}
	}
	void tongxun(ListMembers &List)
	{
		int j = 1;
		while (j != 0)
		{
			mune4();
			cin >> j;system("cls");
			switch (j)
			{
			case 1:List.Addend(); break;
			case 2:List.Search(); break;
			case 3:List.Delete(); break;
			case 4:List.Travel(); break;
			default:break;
			}
		}
	}
	void xinxiguanli(ListMembers &List)
	{
		int i = 1;
		while (i != 0)
		{
			mune1();
			cin >> i; system("cls");
			switch (i)
			{
			case 1:tongxun(List); break;
			case 2:dengji(List); break;
			default:break;
			}
		}
	}
	int main()
	{
		bool Y = false;
		LGraph G;
		CreateDG_AL(G);
		Shetuan S;
		Map M;
		ListMembers List;
		int n=1;
		while (n != 0)
		{
			mune1();
			
			mune5();
			mune2();
			mune3();
			mune6();
			cin >> n; system("cls");
			switch (n)
			{
			case 1:tongxun(List);/*xinxiguanli(List);*/ break;
			//case 2:List.Search();/*shetuanzhushou(); */break;
			//case 3:List.Delete();/*shetuanhuodon();*/ break;
			//case 4:List.Travel(); break;
			//case 2:dengji(List); break;
			case 2:List.TravelTree(); break;
			case 3:List.DeleteTree(); break;
			case 4:stjibxinxi(S); break;
			case 5:zuzhijigou(); break;
			case 6:zanzhushang(List); break;
			case 7:jihuaguanli(List); break;
//case 11:choubeiguanli(); break;
			case 8:pinhjiaguanli(List,G,Y); break;
			case 9:Y=Huodonfenxi(List,G); break;
			case 10:cout << "当前共有活动经费:" << List.GetMoney() << "元" << endl; cout << "是否进行拉赞助?1/0" << endl; int i; cin >> i; Sleep(1000); system("cls"); if(i!=0)zanzhushang(List); break;
			case 11: M.Findway(); break;
			default:break;
			}
		}
		return 0;
	}

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值