• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Niedziałajacy sort.

VPS Starter Arubacloud
0 głosów
237 wizyt
pytanie zadane 22 maja 2015 w C i C++ przez Ins0mniaC Obywatel (1,400 p.)
zamknięte 23 maja 2015 przez Ins0mniaC

Witam. Jak w temacie. Problem jest taki, że vector nie jest sortowany. 

#include <iostream>
#include <vector>
#include <string>
#include <time.h>
#include <algorithm> 
#include "Zwierz.h"
#include "Pies.h"
#include "Kot.h"

using namespace std;

void f_glos(Zwierz &f)
{
	f.daj_glos();
}

void f_roczek(Zwierz &f)
{
	f.rok_urodzenia();
}

void f_imi(Zwierz &f)
{
	f.imie();
}

inline bool porownaj(const Zwierz *f1,const Zwierz *f2)
{
	return (f1->rok<f2->rok);
}


int main()
{
	srand((unsigned int)time(NULL));
	vector<Zwierz*> zwierzoki;
	Kot k1;
	Kot k2;
	Kot k3;
	Pies p1;
	Pies p2;
	Pies p3;
	zwierzoki.push_back(&k1);
	zwierzoki.push_back(&k2);
	zwierzoki.push_back(&k3);
	zwierzoki.push_back(&p1);
	zwierzoki.push_back(&p2);
	zwierzoki.push_back(&p3);
	for(unsigned i=0;i<zwierzoki.size();i++)
	{
		f_glos(*zwierzoki[i]);
	}
	for(unsigned i=0;i<zwierzoki.size();i++)
	{
		f_imi(*zwierzoki[i]);
	}
	for(unsigned i=0;i<zwierzoki.size();i++)
	{
		f_roczek(*zwierzoki[i]);
	}
	cout<<"W vectorze jest: "<<zwierzoki.size()<<" zwierzakow!"<<endl;
	cout<<"Daty urodzenia przed posortowaniem: "<<endl;
	for(unsigned int i=0;i<zwierzoki.size();i++)
	{
		f_roczek(*zwierzoki[i]);
	}
	sort(zwierzoki.begin(),zwierzoki.end(),porownaj);
	cout<<"Daty urodzenia po posortowaniu: "<<endl;
	for(unsigned int i=0;i<zwierzoki.size();i++)
	{
		f_roczek(*zwierzoki[i]);
	}
	cout<<"CZYSZCZENIE VECTORA!!!"<<endl;
	zwierzoki.clear();
	system("pause");
	return 0;
}

 

komentarz zamknięcia: Problem rozwiązany.

1 odpowiedź

0 głosów
odpowiedź 22 maja 2015 przez Dorion300 Szeryf (90,250 p.)
edycja 22 maja 2015 przez Dorion300

Jak deklarujesz kota to randomuje wartość wiekową?

Nie musisz tworzyć tyle funkcji...

Można takie coś zrobić.

for(unsigned i=0;i<zwierzoki.size();i++)
    {
        (*zwierzoki[i]).daj_glos();
    }

Jeśli chodzi o sortowanie, spróbuj takie coś, może pomoże:

inline bool porownaj(const Zwierz *f1,const Zwierz *f2)
{
    return ((f1->rok)<(f2->rok));
}

 

komentarz 22 maja 2015 przez Ins0mniaC Obywatel (1,400 p.)
Nie pomogło niestety.
komentarz 23 maja 2015 przez Ins0mniaC Obywatel (1,400 p.)
Aha i tak, wiek kota i psa to wartość randomowa od 2000 do 2015
komentarz 23 maja 2015 przez Dorion300 Szeryf (90,250 p.)

Przekopiowałem, dodałem własne klasy i działa prawdiłowo.

Dobrze sprawdzałeś?

wynik przed sortowaniem drukowałeś dwa razy....

#include <iostream>
#include <vector>
#include <string>
#include <time.h>
#include <algorithm>
using namespace std;

class Zwierz
{
    public:
    int rok;
    string nazwa;
    void daj_glos()
    {

    }
    void rok_urodzenia()
    {
        cout << rok << " ";
    }
    void imie()
    {
        cout << nazwa << " ";
    }
};

class Kot : public Zwierz{
    public:
    Kot()
    {
        rok = (rand()%3999+1);
        nazwa = "def";
    }
};

void f_glos(Zwierz &f)
{
    f.daj_glos();
}

void f_roczek(Zwierz &f)
{
    f.rok_urodzenia();
}

void f_imi(Zwierz &f)
{
    f.imie();
}

inline bool porownaj(const Zwierz *f1,const Zwierz *f2)
{
    return (f1->rok<f2->rok);
}


int main()
{
    srand((unsigned int)time(NULL));
    vector<Zwierz*> zwierzoki;
    const int wielk = 10;
    Kot kl[wielk];
    for(int i=0;i<wielk;i++)
        zwierzoki.push_back(&kl[i]);

    cout<<"W vectorze jest: "<<zwierzoki.size()<<" zwierzakow!"<<endl;
    cout<<"Daty urodzenia przed posortowaniem: "<<endl;
    for(unsigned int i=0;i<zwierzoki.size();i++)
    {
        f_roczek(*zwierzoki[i]);
    }
    sort(zwierzoki.begin(),zwierzoki.end(),porownaj);
    cout<<endl<<"Daty urodzenia po posortowaniu: "<<endl;
    for(unsigned int i=0;i<zwierzoki.size();i++)
    {
        f_roczek(*zwierzoki[i]);
    }
    cout<<endl<<"CZYSZCZENIE VECTORA!!!"<<endl;
    zwierzoki.clear();
    system("pause");
    return 0;
}

 

komentarz 23 maja 2015 przez Ins0mniaC Obywatel (1,400 p.)

Twój mi działa, mój nie. Nie wiem co tutaj się wyprawia szczerze powiedziawszy. Za cholerę nie mogę znaleźć błędu. Może to coś w klasach zepsułem? 

Zwierz.h

#pragma once

class Zwierz
{
public:
	Zwierz();
	virtual void rok_urodzenia()=0;
	virtual void imie()=0;
	virtual void daj_glos()=0;
	~Zwierz();
};

Zwierz.cpp

#include "Zwierz.h"

Zwierz::Zwierz()
{
}

Zwierz::~Zwierz()
{
}

 

Pies.h

#pragma once
#include "Zwierz.h"
#include <string>
#include <iostream>

using namespace std;

class Pies:public Zwierz
{
public:
	int rok;
	string glos;
	string im;
	Pies();
	void rok_urodzenia();
	void imie();
	void daj_glos();
	~Pies();
};

 

Pies.cpp

#include "Pies.h"
#include "Zwierz.h"
#include <string>
#include <iostream>

Pies::Pies():rok((rand()%15)+2000),glos("WOW"),im("Piesel")
{
}

void Pies::rok_urodzenia()
{
	cout<<"Rok urodzenia tego psa to: "<<rok<<endl;
}

void Pies::imie()
{
	cout<<"Imie tego psa to: "<<im<<endl;
}
void Pies::daj_glos()
{
	cout<<"Ten pies robi: "<<glos<<endl;
}

Pies::~Pies()
{
}

 

Kot.h

#pragma once
#include "Zwierz.h"
#include <string>
#include <iostream>

using namespace std;

class Kot:public Zwierz
{
public:
	int rok;
	string glos;
	string im;
	Kot();
	void rok_urodzenia();
	void imie();
	void daj_glos();
	~Kot();
};

 

Kot.cpp

#include "Kot.h"
#include "Zwierz.h"
#include <string>
#include <iostream>

Kot::Kot():rok((rand()%15)+2000),glos("MRR"),im("Kotel")
{
}

void Kot::rok_urodzenia()
{
	cout<<"Rok urodzenia tego kota to: "<<rok<<endl;
}

void Kot::imie()
{
	cout<<"Imie tego kota to: "<<im<<endl;
}
void Kot::daj_glos()
{
	cout<<"Ten Kot robi: "<<glos<<endl;
}

Kot::~Kot()
{
}
komentarz 23 maja 2015 przez Dorion300 Szeryf (90,250 p.)
Już wiem dlaczego.

Odwołujesz się do zmiennej w "Zwierz". a w Zwierz jest TYLKO <Tu wstaw randomową liczbę>.

Trzeba zrobić Funkcję virtualną która zwraca typ int.

Następnie przy każdej klasie stworzyć tą funkcję.

Trochę skopałeś, ale spróbuję zrobić optymalny kod.
komentarz 23 maja 2015 przez Dorion300 Szeryf (90,250 p.)

Albo bazowe zmienne zrobić w Zwierz.

Tu masz prawidłowy kod na Kota I Zwierza.

Zwierz.h (cpp pusty jest.)

#ifndef ZWIERZ_H
#define ZWIERZ_H

using namespace std;

#include <string>

class Zwierz
{
public:
    int rok;
    string glos;
    string im;
    virtual void rok_urodzenia()=0;
    virtual void imie()=0;
    virtual void daj_glos()=0;
};

#endif // ZWIERZ_H

 

Kot.h

#ifndef KOT_H
#define KOT_H


#include "Zwierz.h"
#include <string>
#include <iostream>

using namespace std;

class Kot:public Zwierz
{
public:
    Kot();
    void rok_urodzenia();
    void imie();
    void daj_glos();
    ~Kot();
};

#endif // KOT_H

 

Kot.cpp

#include "Kot.h"
#include "Zwierz.h"
#include <string>
#include <iostream>
#include <stdlib.h>

Kot::Kot()
{
    rok = (rand()%15)+2000;
    glos = "MRR";
    im = "Kotel";
}

void Kot::rok_urodzenia()
{
    cout<<"Rok urodzenia tego kota to: "<<rok<<endl;
}

void Kot::imie()
{
    cout<<"Imie tego kota to: "<<im<<endl;
}
void Kot::daj_glos()
{
    cout<<"Ten Kot robi: "<<glos<<endl;
}

Kot::~Kot()
{
}

 

 

Kod w Mainie jest taki sam jak u góry w moim wpisie

komentarz 23 maja 2015 przez Ins0mniaC Obywatel (1,400 p.)
Wszystko działa, dzięki za wszystko :)

Podobne pytania

0 głosów
3 odpowiedzi 519 wizyt
pytanie zadane 30 czerwca 2022 w C i C++ przez diedassel Użytkownik (570 p.)
0 głosów
1 odpowiedź 185 wizyt
pytanie zadane 11 stycznia 2022 w C i C++ przez HUBSON2912 Obywatel (1,300 p.)
0 głosów
1 odpowiedź 141 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...