[C++] błąd w zapisie wewnątrz struktury???

0

robie program sumulujący przydzielanie miejsc w sejmie po wyborach, to jego pierwsza częć, kompiluje się ale kiedy go uruchamiam zapisuje pierwszą nazwe i sie zawiesza, nie moge znaleźć przyczyny problemu :( help me!

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

typedef struct {
 string nazwa;
 int ilosc_glosow;
 } partia;

 int i = 0;

 int main() {
  cout << "Wprowadz nazwy partii i ilosci oddanych na nie glosow." << endl;
  vector<partia> a;
  int licznik_partii=0;
  do {
        cout << "nazwa partii: ";
        cin >> a[i].nazwa;
        cout << endl;
        cout << "ilosc glosow: ";
        cin >> a[i].ilosc_glosow;
        cout << endl;
        char tn;
        cout << "Chcesz dodac nastepna partie? (t/n) ";
        cin >> tn;
        cout << endl;
        if(tn == 'n')
         break;
        licznik_partii++;
        } while (true);
  for(int i = licznik_partii; i < 0; i--)
        cout << a[i].nazwa << endl << a[i].ilosc_glosow << endl;
        getch();  }
0

A dodałeś coś do tego vector'a, że sobie go tak wypełniasz??? ;P

0

Ekhem...nie znam się wektorach ale nie udosępniają one "tablicowego" sposobu dodaawania do nich wartości...nawet na pewno, bo po skompilowaniubtego kodu:

vector<int>huh;
huh[0] == 2;

Wylatuje błąd podczas wykonywania programu...o ile się orientuje do dodawania do wektora służy kilka funkcji na czele z push_back i chyba tej będziesz używał...a nie łatwiej zrobic tak, nazwyczajniej(prawie) w świecie ;) ?:

#include <iostream>
#include <conio.h>
#include <string>
#include <vector>
using namespace std;
int main(){
    vector<string> nazwy;
    vector<int> glosy;
    while(1){
    cout << "Czy chcesz dodac nowa partie?\n TAK - t, NIE - n " <<endl;
    char odp;
    cin >> odp;
    if(odp == 'n'){
           break;
           }
           
    cout <<"Podaj nawę partii..." << endl;
    string nazwa;
    cin >> nazwa;
    nazwy.push_back(nazwa);
    cout << "Ile bylo glosow? " << endl;
    int glosow;
    cin >> glosow;
    glosy.push_back(glosow);
}
    for(int i = 0; i < nazwy.size(); i++){
            cout << nazwy[i] << "   " <<glosy[i] << endl;
            }
    getch();
}
0
arcktos napisał(a)

Ekhem...nie znam się wektorach ale nie udosępniają one "tablicowego" sposobu dodaawania do nich wartości...nawet na pewno, bo po skompilowaniubtego kodu:

vector<int>huh;
huh[0] == 2;

Wylatuje błąd podczas wykonywania programu...

Bzdura. Poczytaj troszke o wektorach. Jak bys dobrze napisal, to by dobrze dzialalo ;)

vector<int> huh (1);
huh[0] == 2;

i hula :)

Pamietaj, ze musisz najpierw miec przydzielona pamiec na elementy zebys w ogole mogl je wstawic. Tak w twoim przykladzie po prostu definiujesz zmienna typu vector, ktora akurat w twojej bibliotece stl nie przydziela pamieci na elementy, wiec ty musisz okreslic dla ilu elementow zarezerwowac pamiec.

0
Malcolm napisał(a)
arcktos napisał(a)

Ekhem...nie znam się wektorach ale nie udosępniają one "tablicowego" sposobu dodaawania do nich wartości...nawet na pewno, bo po skompilowaniubtego kodu:

vector<int>huh;
huh[0] == 2;

Wylatuje błąd podczas wykonywania programu...

Bzdura. Poczytaj troszke o wektorach. Jak bys dobrze napisal, to by dobrze dzialalo ;)

vector<int> huh (1);
huh[0] == 2;

i hula :)

[wstyd]

racja. :] but o wektorkach wiem tyle co czytałem w Thinking in C++ więc absolutne podstawy... :]
Aha i co znaczy to owe (1)?

0

No dalbys dokonczyc posta :) wlasnie dopisalem.
To (1) oznacza dla ilu elementow na dziendobry chcesz przydzielic pamieci.
Dodatkowo w zaleznosci od biblioteki stl vector przy np. push_back przydziela pamiec dla 2, 4 a czasem 8 elementow, po dojsciu do tej ilosci jest zwiekszany przydzial najczesciej razy 2. No chyba, ze sam sobie bedziesz to nadzorowal :)

0
Malcolm napisał(a)

No dalbys dokonczyc posta :) wlasnie dopisalem.
To (1) oznacza dla ilu elementow na dziendobry chcesz przydzielic pamieci.
Dodatkowo w zaleznosci od biblioteki stl vector przy np. push_back przydziela pamiec dla 2, 4 a czasem 8 elementow, po dojsciu do tej ilosci jest zwiekszany przydzial najczesciej razy 2. No chyba, ze sam sobie bedziesz to nadzorowal :)

Mhmm...no to już wiem... :] ale i tak nipotzrebnie zamotał z tym programem... ;)

0
arcktos napisał(a)

[...] o ile się orientuje do dodawania do wektora służy kilka funkcji na czele z push_back i chyba tej będziesz używał...a nie łatwiej zrobic tak, nazwyczajniej(prawie) w świecie ;) ?:

#include <iostream>
#include <conio.h>
#include <string>
#include <vector>
using namespace std;
int main(){
    vector<string> nazwy;
    vector<int> glosy;
    while(1){
    cout << "Czy chcesz dodac nowa partie?\n TAK - t, NIE - n " <<endl;
    char odp;
    cin >> odp;
    if(odp == 'n'){
           break;
           }
           
    cout <<"Podaj nawę partii..." << endl;
    string nazwa;
    cin >> nazwa;
    nazwy.push_back(nazwa);
    cout << "Ile bylo glosow? " << endl;
    int glosow;
    cin >> glosow;
    glosy.push_back(glosow);
}
    for(int i = 0; i < nazwy.size(); i++){
            cout << nazwy[i] << "   " <<glosy[i] << endl;
            }
    getch();
}

A nie prościej użyć jednego vector'a i struktury(z odpowiednimi polami) zamiast dwóch???

0

dzięki! rzeczywiście nie wiedziałem że koniecznie trzeba przydzielić pamięć, myślałem że to tak jak z tablicami tylko mogą być dynamiczne, moja wiedza o vektorach też polegała na Thinking in C++</email>

0

No to ja nie wiem jak ty czytałeś tą książkę ;) Przecież tam wszystko jest ładnie opisane co i jak.

0

wiesz,czasami sam się nad tym zastanawiam...

mam nadzieje że wasza cierpliwość się jeszcze nie skończyła, bo musze teraz zrobić część sortującą, kiedyś udało mi się wydumać z pomocą netu, całkiem zgrabny programik sortujący ale gdzieś mi wsiąkł, próbowałem go odtworzyć ale mam wrażenie że o czymś zapomniałem...

#include <iostream>
#include <vector>
#include <conio.h>
using namespace std;

int main() {
        int h;
        vector<int> t;
        while(1){
                cout << "Czy chcesz dodac nastepna liczbe?\n TAK - t, NIE - n " << endl;
                char odp;
                cin >> odp;
                if(odp == 'n'){
                        break;
                              }
                int liczba;
                cin >> liczba;
                t.push_back(liczba);
                }
        for(int i = 0; i < t.size() ; i++)
                {
                int j = i + 1;
                if(t[j] < t[i])
                        h = t[i];
                        t[i] = t[j];
                        t[j] = h ;
                }
        for(int i = 0; i < t.size(); i++){
            cout << t[i] << '\t';
            }
        getch();

            }
0

Jak zobaczylem ten kod nie dosc, ze rece mi opadly nizej niz gleba to jeszcze cierpliwosci zostalo 1hp ;)

Popatrz na to i wyciagnij wnioski :)

class sort_base
{
public:
	operator()(int b1, int b2)
	{
		return b1 < b2;
	}
};

// i gdzies tam w kodzie gdzie musimy sortowac
	sort(nasz_vector.begin(), nasz_vector.end(), sort_base());

Prawda, ze latwiej, prosciej i w ogole cool ;)

Co prawda nie jest to idealne rozwiazanie, 100 mln losowo rozlozonych elementow sortowalo jakies 20 sekund, ale mysle, ze ujdzie.

//Edit
I polecam ksiazeczke http://helion.pl/ksiazki/cp50sp.htm. Tania (ok. 30zl), trzeba znac podstawy, ale kilka ciekawych bajerow w stl mozna sie poduczyc.

0

obawiam się, że tego nie rozumiem :( używam ale jakby chciało, a nie mogło

[C++ Error] dalej.cpp(52): E2034 Cannot convert 'int *' to 'sort_base'
[C++ Error] dalej.cpp(52): E2293 ) expected
[C++ Warning] dalej.cpp(54): W8004 'sort' is assigned a value that is never used

0

Cos standardowo popsulem ;)
Poczytaj tutoriale, tego jest mase na sieci.

Zapomnialem o dorzuceniu
#include <algorithm>

1 użytkowników online, w tym zalogowanych: 0, gości: 1