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

question-closed Niedziałajacy sort.

0 głosów
95 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,110 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,110 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,110 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,110 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
0 odpowiedzi 41 wizyt
pytanie zadane 27 grudnia 2018 w Java przez Piotr Kusnierkiewicz Użytkownik (670 p.)
0 głosów
1 odpowiedź 102 wizyt
pytanie zadane 2 sierpnia 2017 w C i C++ przez Jakub 0 Stary wyjadacz (13,480 p.)
0 głosów
1 odpowiedź 1,145 wizyt
pytanie zadane 2 sierpnia 2017 w C i C++ przez Jakub 0 Stary wyjadacz (13,480 p.)
Porady nie od parady
Zadając pytanie postaraj się o poprawną pisownię i czytelne formatowanie tekstu.Kompozycja

67,210 zapytań

114,169 odpowiedzi

241,978 komentarzy

45,754 pasjonatów

Przeglądających: 325
Pasjonatów: 13 Gości: 312

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...