Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Przekazywanie tablic i wartości między procedurami void

Ostatnio zmodyfikowano 2014-03-27 02:03
Autor Wiadomość
Borowicz
Temat założony przez niniejszego użytkownika
[C++] Przekazywanie tablic i wartości między procedurami void
» 2014-03-26 10:28:55
Witam,
mam napisać program "Dziennik nauczyciela" który obejmuje 10 pozycji. Musi on zawierać 3 przykładowe rekordy, które już zawarłem, a także możliwość dodawania, usuwania, modyfikowania i wyświetlania całej listy. Na razie chciałbym poprosić o pomoc w wyświtlaniu listy, dodawaniu nowych elementów i wyświetlaniu tak zmodyfikowanej listy. Program nie chce mi się kompilować ponieważ niektóre zmienne są zawarte tylko w konkretnych funkcjach i nie wiem jak przekazywać je i ich wartości między funkcjami. Mam problem z lista_studentow i liczba_wpisow. Po dodatniu wpisu do dziennika powinien być on też wyświtlany.  A może lepiej zrobić to w 1 funkcji? Tylko jak wtedy zapewnić wybór działań użytkownikowi? Oto mój kod:

C/C++
#include <iostream>
#include <cstdlib>
using namespace std;

void przykladowi_studenci();
void dodawanie();
void menu();

struct Student
{
    int nr_indeksu;
    float ocena;
};

int main()
{
    menu();
}

void menu()
{
    int nr_zad;
    int przelaczanie = 0;
   
    while( przelaczanie == 0 )
    {
        cout << "Wybierz zadanie:" << endl;
        cout << "dodawanie studenta - 1" << endl;
        cout << "usuwanie studenta - 2" << endl;
        cout << "modyfikacja studenta - 3" << endl;
        cout << "wyswietlanie listy studetow - 4" << endl;
        cout << "koniec programu - 4" << endl;
        cin >> nr_zad;
       
        switch( nr_zad )
        {
        case 1:
            { przykladowi_studenci(); }
            break;
        case 2:
            { dodawanie(); }
            break;
            default:
            cout << "Wybierz liczbe od 1 do 4" << endl;
            break;
        }
    }
}

int liczba_wpisow = 3;

void przykladowi_studenci()
{
    struct Student
    {
        int nr_indeksu;
        float ocena;
    };
   
    Student lista_studentow[ 10 ];
   
    lista_studentow[ 0 ].nr_indeksu = 191414;
    lista_studentow[ 0 ].ocena = 3.5;
   
   
    lista_studentow[ 1 ].nr_indeksu = 191415;
    lista_studentow[ 1 ].ocena = 4.0;
   
   
    lista_studentow[ 2 ].nr_indeksu = 191416;
    lista_studentow[ 2 ].ocena = 4.5;
   
   
    cout << "NAZWISKO" << "    " << "NR INDEKSU" << "   " << "OCENA" << endl;
   
   
   
    for( int i = 0; i < liczba_wpisow; i++ )
    {
        cout << lista_studentow[ i ].nr_indeksu << " | "
        << " | " << lista_studentow[ i ].ocena << " | " << i << endl;
    }
   
}

void dodawanie()
{
    liczba_wpisow++;
    cout << "Podaj indeks: ";
    cin >> lista_studentow.nr_indeksu[ liczba_wpisow ] >> endl;
    cout << "Podaj ocene: ";
    cin >> lista_studentow.ocena[ liczba_wpisow ] >> endl;
    if(
    lista_studentow.ocena[ liczba_wpisow ] != 2.0 or
    lista_studentow.ocena[ liczba_wpisow ] != 2.5 or
    lista_studentow.ocena[ liczba_wpisow ] != 3.0 or
    lista_studentow.ocena[ liczba_wpisow ] != 3.5 or
    lista_studentow.ocena[ liczba_wpisow ] != 4.0 or
    lista_studentow.ocena[ liczba_wpisow ] != 4.5 or
    lista_studentow.ocena[ liczba_wpisow ] != 5.0
    )
    {
        cout << "Format oceny niepoprawny. Wpisz 1 z nastepujacych liczb: 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0: ";
        cin >> Student.ocena[ liczba_wpisow ] >> endl;
    }
   
}


 

Kompilator: TDM-GCC 4.8.1 64-bit Release
Wykonywanie g++.exe...
g++.exe "F:\Semestr 1 - informatyka\Algorytmy i struktury danych\lab3.cpp" -o "F:\Semestr 1 - informatyka\Algorytmy i struktury danych\lab3.exe" -g3 -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.8.1\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib" -static-libgcc -g3
F:\Semestr 1 - informatyka\Algorytmy i struktury danych\lab3.cpp: In function 'void dodawanie()':
F:\Semestr 1 - informatyka\Algorytmy i struktury danych\lab3.cpp:90:7: error: 'lista_studentow' was not declared in this scope
  cin>>lista_studentow.nr_indeksu[liczba_wpisow]>>endl;
       ^

F:\Semestr 1 - informatyka\Algorytmy i struktury danych\lab3.cpp:104:15: error: expected primary-expression before '.' token
   cin>>Student.ocena[liczba_wpisow]>>endl;
               ^

Compilation failed after 1.31 seconds with errors

.

Mam nadzieję, że teraz w porządku? Przepraszam za zamieszanie.
P-107216
akwes
» 2014-03-26 12:50:20
Przeczytaj o formatowaniu wiadomości w ramce pod Twoim postem oraz załącz błędy kompilatora :)
P-107217
michal11
» 2014-03-26 17:14:32
Dlaczego traktujesz ocenę ze Studenta jako tablicę ?
I co w ogóle twoim zdaniem ma robić to
cin >> Student.ocena[ liczba_wpisow ] >> endl;
 ?


I jeżeli chodzi o problem to http://cpp0x.pl/kursy/Kurs-C++​/Poziom-2​/Przekazywanie-tablic-jednowym​iarowych-do-funkcji​/324
P-107230
Borowicz
Temat założony przez niniejszego użytkownika
» 2014-03-26 18:35:34
Co masz na myśli, mówiąc, że traktuję ocenę ze studenta jako tablicę? Indeksy są po to, żeby iterować przy wyświetlaniu. A zapis
C/C++
cin >> Student.ocena[ liczba_wpisow ] >> endl;
został zmieniony na
C/C++
cin >> lista_studentow.ocena[ liczba_wpisow ] >> endl;

Przy jego pomocy chcę wprowadzać nowe wpisy do dziennika.
Cała trudność dla mnie polega na tym, że nie wiem jak wyświetlić te 3 przykładowe rekordy, dodawać wpisy i ponownie wyświetlać. Najlepiej jakbym mógł przełączać między wyświetlaniem, a dokonywaniem nowych wpisów.

Poprawiony program
C/C++
#include <iostream>
#include <cstdlib>
using namespace std;

void przykladowi_studenci();
void dodawanie();
void menu();

struct Student
{
    int nr_indeksu;
    float ocena;
};

int main()
{
    menu();
}

void menu()
{
    int nr_zad;
    int przelaczanie = 0;
   
    while( przelaczanie == 0 )
    {
        cout << "Wybierz zadanie:" << endl;
        cout << "dodawanie studenta - 1" << endl;
        cout << "usuwanie studenta - 2" << endl;
        cout << "modyfikacja studenta - 3" << endl;
        cout << "wyswietlanie listy studetow - 4" << endl;
        cout << "koniec programu - 4" << endl;
        cin >> nr_zad;
       
        switch( nr_zad )
        {
        case 1:
            { przykladowi_studenci(); }
            break;
        case 2:
            { dodawanie(); }
            break;
            default:
            cout << "Wybierz liczbe od 1 do 4" << endl;
            break;
        }
    }
}

int liczba_wpisow = 3;

void przykladowi_studenci()
{
    struct Student
    {
        int nr_indeksu;
        float ocena;
    };
   
    Student lista_studentow[ 10 ];
   
    lista_studentow[ 0 ].nr_indeksu = 191414;
    lista_studentow[ 0 ].ocena = 3.5;
   
   
    lista_studentow[ 1 ].nr_indeksu = 191415;
    lista_studentow[ 1 ].ocena = 4.0;
   
   
    lista_studentow[ 2 ].nr_indeksu = 191416;
    lista_studentow[ 2 ].ocena = 4.5;
   
   
    cout << "NAZWISKO" << "    " << "NR INDEKSU" << "   " << "OCENA" << endl;
   
   
   
    for( int i = 0; i < liczba_wpisow; i++ )
    {
        cout << lista_studentow[ i ].nr_indeksu << " | "
        << " | " << lista_studentow[ i ].ocena << " | " << i << endl;
    }
   
}

void dodawanie()
{
    liczba_wpisow++;
    cout << "Podaj indeks: ";
    cin >> lista_studentow.nr_indeksu[ liczba_wpisow ] >> endl;
    cout << "Podaj ocene: ";
    cin >> lista_studentow.ocena[ liczba_wpisow ] >> endl;
    if(
    lista_studentow.ocena[ liczba_wpisow ] % 0.5 != 2.0 or
    lista_studentow.ocena[ liczba_wpisow ] % 0.5 != 2.5 or
    lista_studentow.ocena[ liczba_wpisow ] % 0.5 != 3.0 or
    lista_studentow.ocena[ liczba_wpisow ] % 0.5 != 3.5 or
    lista_studentow.ocena[ liczba_wpisow ] % 0.5 != 4.0 or
    lista_studentow.ocena[ liczba_wpisow ] % 0.5 != 4.5 or
    lista_studentow.ocena[ liczba_wpisow ] % 0.5 != 5.0
    )
    {
        cout << "Format oceny niepoprawny. Wpisz 1 z nastepujacych liczb: 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0: ";
        cin >> Student.ocena[ liczba_wpisow ] >> endl;
    }
   
}

Nowe logi

Kompilator: TDM-GCC 4.8.1 64-bit Release
Wykonywanie g++.exe...
g++.exe "F:\Semestr 1 - informatyka\Algorytmy i struktury danych\lab3.cpp" -o "F:\Semestr 1 - informatyka\Algorytmy i struktury danych\lab3.exe" -g3 -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.8.1\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib" -static-libgcc -g3
F:\Semestr 1 - informatyka\Algorytmy i struktury danych\lab3.cpp: In function 'void dodawanie()':
F:\Semestr 1 - informatyka\Algorytmy i struktury danych\lab3.cpp:90:7: error: 'lista_studentow' was not declared in this scope
  cin>>lista_studentow.nr_indeksu[liczba_wpisow]>>endl;
       ^

F:\Semestr 1 - informatyka\Algorytmy i struktury danych\lab3.cpp:104:15: error: expected primary-expression before '.' token
   cin>>Student.ocena[liczba_wpisow]>>endl;
               ^

Compilation failed after 0.41 seconds with errors

Pozdrawiam
P-107240
Monika90
» 2014-03-26 18:41:23

In function 'void dodawanie()': 'lista_studentow' was not declared in this scope
Czego tu nie rozumiesz?

cin >> Student.ocena[ liczba_wpisow ] >> endl;

Student to typ a nie obiekt, a ocena to nie tablica.

operacja cin >> endl nie ma sensu.
P-107241
Borowicz
Temat założony przez niniejszego użytkownika
» 2014-03-26 19:02:46
Rozumiem, że powinienem zadeklarować lista_studentów w void dodawanie, ale ja bym chciał żeby studenci byli dodawani do listy 3 zadeklarowanych domyślnie studentów. I nie wiem jak to zrobić.

A operacja cin > endlo której mówiła Monika90 została już poprawiona.

C/C++
#include <iostream>
#include <cstdlib>
using namespace std;

void przykladowi_studenci();
void dodawanie();
void menu();

struct Student
{
    int nr_indeksu;
    float ocena;
};

int main()
{
    menu();
}

void menu()
{
    int nr_zad;
    int przelaczanie = 0;
   
    while( przelaczanie == 0 )
    {
        cout << "Wybierz zadanie:" << endl;
        cout << "dodawanie studenta - 1" << endl;
        cout << "usuwanie studenta - 2" << endl;
        cout << "modyfikacja studenta - 3" << endl;
        cout << "wyswietlanie listy studetow - 4" << endl;
        cout << "koniec programu - 4" << endl;
        cin >> nr_zad;
       
        switch( nr_zad )
        {
        case 1:
            { przykladowi_studenci(); }
            break;
        case 2:
            { dodawanie(); }
            break;
            default:
            cout << "Wybierz liczbe od 1 do 4" << endl;
            break;
        }
    }
}

int liczba_wpisow = 3;

void przykladowi_studenci()
{
    struct Student
    {
        int nr_indeksu;
        float ocena;
    };
   
    Student lista_studentow[ 10 ];
   
    lista_studentow[ 0 ].nr_indeksu = 191414;
    lista_studentow[ 0 ].ocena = 3.5;
   
   
    lista_studentow[ 1 ].nr_indeksu = 191415;
    lista_studentow[ 1 ].ocena = 4.0;
   
   
    lista_studentow[ 2 ].nr_indeksu = 191416;
    lista_studentow[ 2 ].ocena = 4.5;
   
   
    cout << "NAZWISKO" << "    " << "NR INDEKSU" << "   " << "OCENA" << endl;
   
   
   
    for( int i = 0; i < liczba_wpisow; i++ )
    {
        cout << lista_studentow[ i ].nr_indeksu << " | "
        << " | " << lista_studentow[ i ].ocena << " | " << i << endl;
    }
   
}

void dodawanie()
{ Student lista_studentow[ 10 ];
    liczba_wpisow++;
    cout << "Podaj indeks: ";
    cin >> lista_studentow.nr_indeksu[ liczba_wpisow ] >> endl;
    cout << "Podaj ocene: ";
    cin >> lista_studentow.ocena[ liczba_wpisow >> endl;
    if(
    lista_studentow.ocena[ liczba_wpisow ] != 2.0 or
    lista_studentow.ocena[ liczba_wpisow ] != 2.5 or
    lista_studentow.ocena[ liczba_wpisow ] != 3.0 or
    lista_studentow.ocena[ liczba_wpisow ] != 3.5 or
    lista_studentow.ocena[ liczba_wpisow ] != 4.0 or
    lista_studentow.ocena[ liczba_wpisow ] != 4.5 or
    lista_studentow.ocena[ liczba_wpisow ] != 5.0
    )
    {
        cout << "Format oceny niepoprawny. Wpisz 1 z nastepujacych liczb: 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0: ";
        cin >> lista_studentow.ocena[ liczba_wpisow ] >> endl;
    }
   
}


Kompilator: TDM-GCC 4.8.1 64-bit Release
Wykonywanie g++.exe...
g++.exe "F:\Semestr II - informatyka\Podstawy programowania\lab3.cpp" -o "F:\Semestr II - informatyka\Podstawy programowania\lab3.exe" -g3 -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.8.1\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib" -static-libgcc -g3
F:\Semestr II - informatyka\Podstawy programowania\lab3.cpp: In function 'void dodawanie()':
F:\Semestr II - informatyka\Podstawy programowania\lab3.cpp:90:23: error: request for member 'nr_indeksu' in 'lista_studentow', which is of non-class type 'Student [10]'
  cin>>lista_studentow.nr_indeksu[liczba_wpisow]>>endl;
                       ^

F:\Semestr II - informatyka\Podstawy programowania\lab3.cpp:92:23: error: request for member 'ocena' in 'lista_studentow', which is of non-class type 'Student [10]'
  cin>>lista_studentow.ocena[liczba_wpisow>>endl;
                       ^
F:\Semestr II - informatyka\Podstawy programowania\lab3.cpp:92:44: error: invalid operands of types 'int' and '<unresolved overloaded function type>' to binary 'operator>>'
  cin>>lista_studentow.ocena[liczba_wpisow>>endl;
                                            ^
F:\Semestr II - informatyka\Podstawy programowania\lab3.cpp:92:48: error: expected ']' before ';' token
  cin>>lista_studentow.ocena[liczba_wpisow>>endl;
                                                ^
F:\Semestr II - informatyka\Podstawy programowania\lab3.cpp:94:20: error: request for member 'ocena' in 'lista_studentow', which is of non-class type 'Student [10]'
    lista_studentow.ocena[liczba_wpisow] != 2.0 or
                    ^
F:\Semestr II - informatyka\Podstawy programowania\lab3.cpp:95:19: error: request for member 'ocena' in 'lista_studentow', which is of non-class type 'Student [10]'
   lista_studentow.ocena[liczba_wpisow] != 2.5 or
                   ^
F:\Semestr II - informatyka\Podstawy programowania\lab3.cpp:96:19: error: request for member 'ocena' in 'lista_studentow', which is of non-class type 'Student [10]'
   lista_studentow.ocena[liczba_wpisow] != 3.0 or
                   ^
F:\Semestr II - informatyka\Podstawy programowania\lab3.cpp:97:19: error: request for member 'ocena' in 'lista_studentow', which is of non-class type 'Student [10]'
   lista_studentow.ocena[liczba_wpisow] != 3.5 or
                   ^
F:\Semestr II - informatyka\Podstawy programowania\lab3.cpp:98:19: error: request for member 'ocena' in 'lista_studentow', which is of non-class type 'Student [10]'
   lista_studentow.ocena[liczba_wpisow] != 4.0 or
                   ^
F:\Semestr II - informatyka\Podstawy programowania\lab3.cpp:99:19: error: request for member 'ocena' in 'lista_studentow', which is of non-class type 'Student [10]'
   lista_studentow.ocena[liczba_wpisow] != 4.5 or
                   ^
F:\Semestr II - informatyka\Podstawy programowania\lab3.cpp:100:19: error: request for member 'ocena' in 'lista_studentow', which is of non-class type 'Student [10]'
   lista_studentow.ocena[liczba_wpisow]!= 5.0
                   ^
F:\Semestr II - informatyka\Podstawy programowania\lab3.cpp:104:24: error: request for member 'ocena' in 'lista_studentow', which is of non-class type 'Student [10]'
   cin>>lista_studentow.ocena[liczba_wpisow]>>endl;
                        ^

Compilation failed after 0.53 seconds with errors


Próbowałem zamienić
C/C++
lista_studentow.ocena[ liczba_wpisow ]

na
C/C++
lista_studentow[ liczba_wpisow ].ocena
ale wyskakuje jeszcze więcej błędów.
P-107244
OczkoSX
» 2014-03-26 19:07:06
Po co dwa razy tworzysz strukture Student? W case nei dajemy klamer. zamiast while(przelaczanie == 0) mozesz zrobić while(1) albo while(true).
Eh, poczytaj lepiej o strukturach/klasach. robisz lista_studentow.ocena[], co jest nie poprawne. Powinno byc lista_studentow[].ocena. Nie pamiętam dokładnie twoich nazw ale coś w tym stylu
P-107245
Borowicz
Temat założony przez niniejszego użytkownika
» 2014-03-26 19:13:43
Próbowałem zamienić na lista_studentów[].ocena ale jest jeszcze więcej błędów
P-107247
« 1 » 2
  Strona 1 z 2 Następna strona