Example #1
0
	unsigned long long int DFS(Vertex* input, Vertex* sourceMinistry) { //Depth-First Search bāzēts algoritms
		input->TaggedBy.Reset();
		if (input->TaggedBy.FindInVP(sourceMinistry->ID)) { //Meklē, vai dotā izd. pozīcija ir jau reiz "apmeklēta", skatoties no dotās ministrijas (meklē ciklus)
			Error* E3 = new Error(sourceMinistry->ID);
			E3List.AddSort(E3);
			return 0;
		}
		input->TaggedBy.Reset();
		input->Visited = true;
		VertexPointer* TB = new VertexPointer(sourceMinistry);
		input->TaggedBy.AddSort(TB); //Pievieno virsotnei, ka tā ir tikusi apmeklēta, skatoties no dotās ministrijas.
		input->Subs.Reset();
		if (input->Subs.Size() == 0) { //Ja nav apakšpozīciju, jāatgriež šīs pozīcijas Amount
			return input->Amount;
		}
		unsigned long long int sum = 0;
		while (VertexPointer* C = input->Subs.Current()) {
			sum += DFS(C->PointsTo, sourceMinistry); //Atrod apakšpozīciju kopsummu
			input->Subs.Next();
		}
		unsigned long long int tmpDiff = sum > input->Amount ? sum - input->Amount : input->Amount - sum;
		if (tmpDiff > 4000000000) tmpDiff = 4000000001;
		input->Difference = (unsigned int)tmpDiff;
		input->Subs.Reset();
		return sum;
	}
Example #2
0
	void DoAll() {
		VertexList.Reset();
		for (int i = 0; i < ministryCount; i++) {
			DFS(VertexList.Current(), VertexList.Current());
			VertexList.Next();
		}
		VertexList.Reset();
		while (Vertex* C = VertexList.Current()) {
			if (!C->Visited) {	//Ja virsotne nav tikusi apmeklēta, tai nav ministrijas
				Error* E2 = new Error(C->ID);
				E2List.AddSort(E2);
			}
			if (C->Difference > 0) {
				Error_4* E4 = new Error_4(C->ID, C->Difference);
				E4List.AddSort(E4);
			}
			if (C->TaggedBy.Size() > 1) { //Ja virsotni apmeklējusi vairāk kā viena ministrija, ir kopīga pozīcija
				VertexPointer* vp = new VertexPointer(C);
				CPList.AddSort(vp);
			}
			VertexList.Next();
		}
		VertexList.Reset();
	}
Example #3
0
	void AddVertex(int parent, int child, unsigned int amount) {
		VertexList.Reset();
		Vertex* NewSub = new Vertex(child, amount);
		Vertex* ParentV = NULL;
		Vertex* ChildV = NULL;
		VertexPointer* ParentToSub;
		bool SubIsNew = true;
		while(Vertex* C = VertexList.Current()) {
			if(C->ID == child) { SubIsNew = false; ChildV = C; if(ParentV) break; } //Atrod pozīciju un apakšpozīciju, ja tādas eksistē
			if(C->ID == parent) { ParentV = C; if(!SubIsNew) break; }
			VertexList.Next();
		}
		VertexList.Reset();
		if(ParentV) {
			if(SubIsNew) ParentToSub = new VertexPointer(NewSub); //Norāde uz apakšpozīciju
			else {
				ParentToSub = new VertexPointer(ChildV);
				if(ChildV->Amount == 4000000100) ChildV->Amount = amount; //Apakšpozīcija iepriekš bija bez virspozīcijas
			}
			if (ParentV->Subs.FindInVP(child)) return; //Ja apakšpozīcija jau ir pievienota, to ignorē
			ParentV->Subs.Add(ParentToSub); //Pievieno apakšpozīciju dotajai virspozīcijai
			if(SubIsNew) VertexList.Add(NewSub); //Pievieno apakšpozīciju virsotņu sarakstam (ja tā ir jauna)
		} else {
			ParentV = new Vertex(parent, 4000000100); //Norāda, ka pozīcijai nav virspozīcijas (neattiecas uz ministrijām)
			if(SubIsNew) ParentToSub = new VertexPointer(NewSub);
			else {
				ParentToSub = new VertexPointer(ChildV);
				ChildV->Amount = amount; //Tā kā, ja pievieno jau eksistējošu apakšpozīciju, Amount nemainās, to var piešķirt. 
			}
			ParentV->Subs.Add(ParentToSub);
			VertexList.Add(ParentV);
			if(SubIsNew) VertexList.Add(NewSub);
		}
		if (child <= ministryCount) {
			Error* e1 = new Error(child); //Mēģina pievienot ministriju kā apakšpozīciju
			E1List.AddSort(e1);
		}
	}
Example #4
0
File: User.cpp Project: wuwm/keshe
void User::Add(List &list)									//添加物流信息,其中调用异常处理
{
	Node *head,*p;
	string name,jijian_phone,Note,shoujian_phone;
	string num_t,money_t,baojia_t;							//"_t"表示临时变量
	int num,money,baojia;
	int tag1=0,tag2=0,tag3=0,i;
	head=list.Gethead();									//调用Gethead函数(AddrList中),取首指针
	p=new Node;
		cout<<"包裹单号 收件人名称 收件人电话 寄件人电话 备注 邮费 保价金额,空格隔开"<<endl;
		cin>>num_t>>name>>shoujian_phone>>jijian_phone>>Note>>money_t>>baojia_t;
		cin.ignore(1024,'\n');								//将键盘输入的数据暂时保存到临时变量中

/***********以下的代码用来判断输入的数据是否合理,不合理将抛出异常************/
		for(i=0;i<num_t.length();i++){
			if(num_t[i]<='9'&&num_t[i]>='0')
			{
			
			}
			else
			{
				tag1=1;	
			}
			
		}
		for(i=0;i<money_t.length();i++)
		{
			if(money_t[i]<='9'&&money_t[i]>='0')				//判断输入是否合法
			{
			
			}
			else
			{
				tag2=1;
			}
			
		}
		for(i=0;i<baojia_t.length();i++){
			if(baojia_t[i]<='9'&&baojia_t[i]>='0')				//判断输入是否合法
			{
			
			}
			else
			{
				tag3=1;
			}
			
		}
		
	if(tag1==1||tag2==1||tag3==1)
		throw "运单号,运费,保价金额必须都为数字!请重新输入:";		//如果输入不合理将抛出异常
/***********以上的代码用来判断输入的数据是否合理,不合理将抛出异常************/
	
	num=atoi(num_t.c_str());					//如果输入的输入验证为合理,就从string转换为int
	money=atoi(money_t.c_str());
	baojia=atoi(baojia_t.c_str());
	p->SetPackageNum(num);						//调用SetPackageNum函数(Node中),修改运单号码
	p->SetShoujian_Name(name);					//调用SetShoujian_Name函数(Node中),修改收件人姓名
	p->SetShoujian_Phone(shoujian_phone);       //调用SetShoujian_Phone函数(Node中),修改寄件人电话
	p->SetJijian_Phone(jijian_phone);           //调用SetJijian_Phone函数(Node中),修改收件人号码
	p->SetNote(Note);							//调用SetNote函数(Node中),修改备注
	p->SetMoney(money);							//调用SetMoney函数(Node中),修改价格
	p->SetBaojia(baojia);						//调用SetBaojia函数(Node中),修改保价金额
	list.AddSort(p);							//调用AddSort函数(AddrList中),将p指向的结点按包裹号的顺序插入到链表中
}