[C++] Drzewko binarne - poprawa kodu

Bawoly
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 3 sty 2016, o 22:29
Płeć: Kobieta
Lokalizacja: Kraków

[C++] Drzewko binarne - poprawa kodu

Post autor: Bawoly »

Witam, napisałam program, który robi drzewko binarne z listy studentów. Tylko oczywiście coś jest źle, a nawet więcej niż coś. Generalnie wiem, że nie powinno się robić pewnych rzeczy - bo błędy mi mówią, że tak nie wolno, ale nie wiem jak niektóre rzeczy zmienić, jedyne wyjścia wydają mi się zbyt skomplikowane. Anyway, będę zadowola ze wszelkich rad i uwag.
Kod jest raczej przejrzysty, ale długi... . Tak wiem, mieszam polskim z angielskim.

Kod: Zaznacz cały

#include <iostream>
#include <windows.h>
#include<vector>
#include<string>
#include<ctime>
#include<cstdlib>
#include <cstdio>
#include<cmath>
#include <algorithm>
//Jeszcze moze jaka biblioteka
//wyswietl drzewo - popraw polozenie, jak sie juz pokompiluje

using namespace std;

const size_t maxStudent = 16;


void Kolorek(int kolorek)
{
	HANDLE kolor;
    kolor = GetStdHandle( STD_OUTPUT_HANDLE );
    SetConsoleTextAttribute(kolor, kolorek);
}

void BrakKolorku()
{
	HANDLE kolor;
    kolor = GetStdHandle( STD_OUTPUT_HANDLE );
    SetConsoleTextAttribute(kolor, 15);
}

struct Student
{
	string name;
	float grade;
};

/*struct Node //No dobrze by było cos na wskaźnkach zrobić, ale.... ale ale.
{
	Student student;
	Node *left;
	Node *right;
};*/

void polozenie(int x, int y)
{
  COORD c;
  c.X=x-1;
  c.Y=y-1;
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}

void pustekoleczka()
{
		Kolorek(14);
		cout<<" ******************"<<endl;
		cout<<"*                   *"<<endl;
		cout<<" ******************"<<endl;
	}

Student add()
{
	Student nowy;
	cout<<"Podaj nazwisko nowego studenta:"<<endl;
	cin>>nowy.name;
	cout<<"Podaj jego ocene z poprzedniego semestru:"<<endl;
	cin>>nowy.grade;
	return nowy;		
}					

void Grade(vector<Student>students)
{
	Student rodzice_na_boju;
	cout<<"Podaj nazwisko studenta, ktorego chcesz sprawdzic ocene:";
	cin>>rodzice_na_boju.name;
	for(int i=0; i<students.size();i++)
	{
		if(students[i].name==rodzice_na_boju.name)
		{
			cout<<students[i].grade<<endl;
		}
		else
		{
			cout<<"Nie ma takiego studenta"<<endl;
		}
	}
}

vector<Student> sortuj(vector<Student>students)
{
	students.sort(students.begin(), students.end());
	return students;
}

Student Korzen(vector<Student>students)
{
	students = sortuj(students);
	int korzen=0;
	if (students[students.size()/2]=NULL)
	{
		int korzen = students.size()/4;
	}
	else
	{
		int korzen= students.size()/2;
	}
	return students[korzen];
}	


//No to drzewko

class BinaryTree
{
//private:
//	const size_t maxStudent = 16;
public:
	vector<Student> students[maxStudent];
	bool empty[maxStudent];
	vector<Student>dane[maxStudent];
	void wyswietl_drzewo();
	void pelnekoleczka(int i);
	vector<Student> UsunSkubanca();	
	void LetsMakeNodes();
};

vector<Student> BinaryTree::UsunSkubanca()
{
	Student bezboznik;
	cout<<"Kogo Ci przywolac?";
	cin>>bezboznik.name;
	for(int ilosc=0; ilosc<=students.size();ilosc++)
	{
		if (students[ilosc].name==bezboznik.name)
		{
			Student temp;
			temp=students[ilosc];
			students[ilosc]=students[ilosc+1];
			students[ilosc+1]=temp;
		}
	}
	students[maxStudent]=NULL;
	return students;
}

/////////////////////////////////////////////////////////////////////////////////
//Drzewkowe perypetie

void BinaryTree::LetsMakeNodes()
{
	
	for(int j=0; j<empty.size(); j++)
	{
		empty[j]=true;
	}
	//BinaryTree *left = new lewa_galaz(int indeks);
	//BinaryTree *right = new prawa_galaz(int indeks);
	vector<Student> true_students[maxStudent];
	true_students[0]=NULL;
	true_students[1]=Korzen(students);
	for (Student el : students)
	{
		if (el!=true_students[1])
		true_students.push_back(el);	
	}
	
	
	if (empty[1]==true)
	{
		dane[1]=true_students[1];
		empty[1]=false;
	}
	
	for (int i=2; i<=true_students.size(); i++)
	{
		for (int k=1; k<=log2(students.size()); k++)
		if (true_students[i.name]<true_students[k].name)
		{
			dane[i]=Lewa_galaz(k, i, dane, true_students);
		}
		else if (true_students[i].name<true_students[k].name)
		{
			dane[i]=Prawa_galaz(k, i, dane, true_students);
		}
		else dane[i]=random(k, i, dane, true_students);
	}
}

Student Lewa_galaz(int k, int i, vector<Student> dane, vector<Student> true_students)
{
	
	k=k*2;
	if (k<=dane.size())
	{
		if (empty[k]==true)
		{
			dane[k]=true_students[i];
			empty[k]=false;
			return dane[k];
		}
		else if (true_students[i].name<true_students[k].name)
		{
			Lewa_galaz(k, i, dane, true_students);
		}
		else if (true_students[i].name>true_students[k].name)
		{
			Prawa_galaz(k, i, dane, true_students);
		}
		else random(k, i, dane, true_students);
	}
	else cout<<"Brak miejsca"<<endl;
}
	
Student Prawa_galaz(int k, int i, vector<Student> dane, vector<Student> true_students)
{
		
	k=k*2+1;
	if (k<=dane.size())
	{
		if (empty[k]==true)
		{
			dane[k]=true_students[i];
			empty[k]=false;
			return dane[k];
		}
		else if (true_students[i].name<true_students[k].name)
		{
			Lewa_galaz(k, i, dane, true_students);
		}
		else if (true_students[i].name>true_students[k].name)
		{
			Prawa_galaz(k, i, dane, true_students);
		}
		else random(k, i, dane, true_students);
	}
	else cout<<"Brak miejsca"<<endl;
}

Student random(int k, int i, vector<Student> dane, vector<Student> true_students)
{
	
	srand( time( NULL ) );
	int x=rand()*2;
	if (x=0) Lewa_galaz(k, i, dane, true_students);
	else Prawa_galaz(k, i, dane, true_students);
}
	
//Koniec drzewkowych perypetii
///////////////////////////////////////////////////////
	
/*class lewa_galaz: public Binary Tree //Ladnie by bylo jakby byl jaki interfejs
{
	int szukaj(int indeks)
	return indesk*2;
}
					int k
 class prawa_galaz(int indeks): public Binary Tree
{}*
	int szukaj(int indeks)
	return indeks*2+1;
}*/


void BinaryTree::pelnekoleczka (int i)
{
		Kolorek(14);
		cout<<" ******************"<<endl;
		cout<<"*";
		Kolorek(5);
		cout<<dane[i].name<<"*"<<endl;
		Kolorek(14);
		cout<<" ******************"<<endl;
}

void BinaryTree::wyswietl_drzewo()
{
	LetsMakeNodes();
	system("CLS");
	polozenie(40,1); if (empty[1]==true) pustekoleczka(); else pelnekoleczka(1);
	polozenie(20,5); if (empty[2]==true) pustekoleczka(); else pelnekoleczka(2);
	polozenie(60,5); if (empty[3]==true) pustekoleczka(); else pelnekoleczka(3);
	polozenie(10,9); if (empty[4]==true) pustekoleczka(); else pelnekoleczka(4);
	polozenie(30,9); if (empty[5]==true) pustekoleczka(); else pelnekoleczka(5);
	polozenie(50,9); if (empty[6]==true) pustekoleczka(); else pelnekoleczka(6);
	polozenie(70,9); if (empty[7]==true) pustekoleczka(); else pelnekoleczka(7);
	polozenie(5,13); if (empty[8]==true) pustekoleczka(); else pelnekoleczka(8);
	polozenie(15,13); if (empty[9]==true) pustekoleczka(); else pelnekoleczka(9);
	polozenie(25,13); if (empty[10]==true) pustekoleczka(); else pelnekoleczka(10);
	polozenie(35,13); if (empty[11]==true) pustekoleczka(); else pelnekoleczka(11);
	polozenie(45,13); if (empty[12]==true) pustekoleczka(); else pelnekoleczka(12);
	polozenie(55,13); if (empty[13]==true) pustekoleczka(); else pelnekoleczka(13);
	polozenie(65,13); if (empty[14]==true) pustekoleczka(); else pelnekoleczka(14);
	polozenie(75,13); if (empty[15]==true) pustekoleczka(); else pelnekoleczka(15);
	cout<<endl<<endl<<endl;
	BrakKolorku();
}



//Po drzewku






int main()
{
	BinaryTree tree;
	Student student1{ "Adamiak", 3.0 };
	Student student2{ "Piotrkowski", 4.5 };
	Student student3{ "Misiak", 3.0 };
	Student student4{ "Raciborski", 5.0 };
	Student student5{ "Faradowski", 3.5 };
	Student student6{ "Zabik", 5.0 };
	Student student7{ "Kokoszanel", 4.0 };
	tree.students.push_back(student2);
	tree.students.push_back(student3);
	tree.students.push_back(student4);
	tree.students.push_back(student5);
	tree.students.push_back(student6);
	tree.students.push_back(student7);
	
	tree.wyswietl_drzewo();
	
	int CzyGrac=1;
	while(CzyGrac)
	{
		int wybor = 0; 
    	do
    	{
    		Kolorek(5);
    		cout<<"*******************************MENU********************************"<<endl;
    		cout<<"Witaj w cudownym programie - programie szczesliwosci i beztroski!"<<endl;
    		cout<<"Otoz w tym programie tworzymy drzewko, skaladajace sie ze studentow /n Studentow na laboratoriach moze byc maksymalnie 15 osob /n Mam nadzieje, ze znasz dzialanie takiego drzewka, bo ja ci opowiadac o tym nie bede - domysl sie /n Generelanie jest pare rzeczy ktore mozesz zrobic, wcisnij odpowiedni nr"<<endl;
    		cout<<"1.Dodaj studenta"<<endl;
    		cout<<"2.Usun studenta"<<endl;
    		cout<<"3.Sprawdz ocene"<<endl;
    		cout<<"4.Krokiety"<<endl;
    		cout<<"5.Wyjscie z programu."<<endl;
    		cout<<"Wybieram : ";
    		cin>>wybor;
    		BrakKolorku();
    
   			 switch (wybor)
    {
    	case 1: 
    		Student do_dodania =add();
			tree.students.push_back(do_dodania);
			tree.wyswietl_drzewo();	
			break;
    	case 2: 
			tree.students = tree.students(UsunSkubanca());
			tree.wyswietl_drzewo();
			break;
		case 3: 
			Grade(tree.students);
			break;
		case 4: 
			int przycisk=0;
			while(przycisk!=0)
			{
				system("cls");
				cout<<"Wcisnij [1] , by powrocic: "<<endl;
				cin>>przycisk;
				srand(time(NULL));
				int a = rand();
				int b = rand();
				polozenie(a,b);
				cout<<"Krokiety";
			}
			break;
		default :
			cout<<"Wcisnales zla liczbe"<<endl;
			cout<<"Wcisnij cokolwiek"<<endl;
			system("PAUSE");
			break;
	}
    
		}while(wybor!=5);
	CzyGrac=0;
	}
	
	return 0;
}
Andreas
Użytkownik
Użytkownik
Posty: 1130
Rejestracja: 1 lis 2008, o 22:33
Płeć: Mężczyzna
Podziękował: 72 razy
Pomógł: 156 razy

[C++] Drzewko binarne - poprawa kodu

Post autor: Andreas »

W 91. powinno być
sort(students.begin(), students.end());

99: if (students[students.size()/2]=NULL)
po pierwsze: operator przypisania zamiast równości - to dość częsty błąd.
po drugie: jakiego typu jest zmienna po lewej?

Ogólnie błędów jest tyle, że więcej nie chce mi się poprawiać. Niektóre z nich mogą wynikać z poprzednich i czasami wystarczy poprawić jedną linijkę, żeby wszystko było dobrze, mimo że wskazuje błędy w wielu miejsach.

Ten program wygląda jakbyś go napisała na raz, a dopiero potem kompilowała. Program piszę się kawałkami, kompiluje i jak coś nie działa to wiadomo co i gdzie.

Poza tym błędy typu
'random' was not declared in this scope
których jest mnóstwo w twoim kodzie, są łatwe do poprawienia.
ODPOWIEDZ