ws89 Temat założony przez niniejszego użytkownika |
Problem z kompilacją programu na komputerach innych niż mój » 2017-06-01 18:45:57 Dzień dobry, na zaliczenie miałem napisać program, w którym użytkownik wczytuje N elementów do listy jednokierunkowej. Użytkownik następnie wpisuje wiek, a program usuwa co trzeci element z listy o wieku większym niż wiek wpisany. Po sprawdzeniu czy działa poprawnie przesłałem ten program do sprawdzenia i okazało się, że mimo, że u mnie program działa to jest błąd w 200 linijce tj. "wyszwiek(&*glowa)". Mógłby mi ktoś podpowiedzieć co napisałem źle? Mile widziane również rozwiązanie z objaśnieniem. Pozdrawiam #include <cstdlib> #include <iostream> #include <string>
using namespace std;
struct SElement { int wiek; string gatunek; double cena; SElement * nast; };
void pisz( SElement * adres ) { while( adres ) { cout << "Wiek rosliny : \n"; cout << adres->wiek << endl; cout << "Gatunek rosliny : \n"; cout << adres->gatunek << endl; cout << "Cena rosliny : \n"; cout << adres->cena << endl; adres = adres->nast; cout << endl; }; };
void wyszwiek( SElement *& adres ) { int licznik = 0; int wiek; SElement * pierwszy; pierwszy = adres; cout << "Podaj wiek roslin, z ktorych co trzecia zostanie usunieta z listy\n"; cin >> wiek; if( adres->wiek > wiek ) licznik = 1; while( adres->nast != NULL ) { adres = adres->nast; if( adres->wiek > wiek ) licznik++; }; int * A = new int[ licznik ]; int la = 0; adres = pierwszy; if( adres->wiek > wiek ) { A[ la ] = 1; la++; } int us = 1; while( adres->nast != NULL ) { adres = adres->nast; us++; if( adres->wiek > wiek ) { A[ la ] = us; la++; }; }; if( la > 0 ) { int ul = la / 3; int * B = new int[ ul ]; int dousun = 2; for( int i = 0; i < ul; i++ ) { B[ i ] = A[ dousun ]; dousun += 3; }; SElement * usun, * aktualny; adres = pierwszy; if( B[ ul - 1 ] == A[ licznik - 1 ] ) { while( adres->nast->nast != NULL ) adres = adres->nast; usun = adres->nast; adres->nast = adres->nast->nast; delete usun; adres = pierwszy; if( ul > 1 ) { for( int i = ul - 2; i > - 1; i-- ) { for( int j = 2; j < B[ i ]; j++ ) adres = adres->nast; usun = adres->nast; adres->nast = adres->nast->nast; delete usun; adres = pierwszy; }; }; } else { for( int i = ul - 1; i > - 1; i-- ) { for( int j = 2; j < B[ i ]; j++ ) adres = adres->nast; usun = adres->nast; adres->nast = adres->nast->nast; delete usun; adres = pierwszy; }; }; adres = pierwszy; delete[] A; delete[] B; cout << "liczba usunietych elementow: " << ul << endl; }; };
void usun_liste( SElement *& adres ) { SElement * aktualny; aktualny = adres; while( aktualny ) { adres = aktualny; aktualny = aktualny->nast; delete adres; }; adres = NULL; };
int main( int argc, char * argv[] ) { SElement * glowa, * ogon, * aktualny, * usun; int n; cout << "Wpisz ile roslin chcesz dodac do listy ?\n"; cin >> n; if( n != 0 ) { glowa = new SElement; cout << "Podaj wiek rosliny: \n"; cin >> glowa->wiek; cout << "Podaj gatunek rosliny: \n"; cin.ignore(); getline( cin, glowa->gatunek ); cout << "Podaj cene rosliny: \n"; cin >> glowa->cena; glowa->nast = NULL; ogon = glowa; cout << endl; for( int i = 1; i < n; i++ ) { aktualny = new SElement; cout << "Podaj wiek rosliny: \n"; cin >> aktualny->wiek; cout << "Podaj gatunek rosliny: \n"; cin.ignore(); getline( cin, aktualny->gatunek ); cout << "Podaj cene rosliny: \n"; cin >> aktualny->cena; aktualny->nast = NULL; ogon->nast = aktualny; ogon = aktualny; }; pisz( glowa ); wyszwiek( &* glowa ); }; cout << "Lista po usunieciu \n"; pisz( glowa ); usun_liste( glowa ); if( glowa ) { cout << "lista po usunieciu\n"; pisz( glowa ); } else cout << "lista zostala usunieta\n"; system( "Pause" ); return 0; }
|
|
Paitius |
» 2017-06-01 18:56:27 Dlaczego jedną funkcję wywołujesz tak: pisz( glowa ), a drugą wywołujesz tak: wyszwiek( &* glowa ) mimo tych samych argumentów?
Dzięki '&' w definicji funkcji przy argumencie operujesz na oryginale zmiennej. Bez funkcja operuje na kopii. Wywołując funkcję nie dodajesz '&', więc: wyszwiek(glowa)
|
|
Kinexity |
» 2017-06-01 19:00:24 void wyszwiek( SElement *& adres ); wyszwiek( &* glowa ); Co w tych dwóch zapisach ma dać ampersand i gwiazdka obok siebie, bo albo nie znam tej magicznej techniki albo to jest błąd... |
|
ws89 Temat założony przez niniejszego użytkownika |
» 2017-06-01 19:12:30 Dziękuję za podpowiedzi. Usunąłem z wywołania gwiazdkę i ampersand ale zostawiłem w deklaracji funkcji i teraz też mi działa. Czy teraz jest dobrze ? void wyszwiek( SElement *& adres )
|
|
Kinexity |
» 2017-06-01 19:27:39 Ujmę pytanie tak: jak ty w ogóle chcesz przekazać argument do funkcji: przez wskaźnik, referencję, czy normalnie? |
|
jankowalski25 |
» 2017-06-01 20:06:34 |
|
Kinexity |
» 2017-06-01 20:14:40 Szczerze mówiąc wydaje mi się, że można by było uniknąć takiego ewenementu. |
|
jankowalski25 |
» 2017-06-01 20:18:18 @Kinexity: Zapewne tak, ale w ten sposób można sprawić, że zmiana wartości wskaźnika będzie widoczna po wywołaniu funkcji. Czasem to się przydaje, ale oczywiście można użyć chociażby podwójnego wskaźnika. Samo wywołanie tak, "ale to nie znaczy, że nie ma innych błędów". sh: Pause: nie znaleziono polecenia
U mnie nie ma polecenia pause , ani tym bardziej Pause . Włącz zatrzymywanie konsoli w IDE, którego używasz lub wywołuj program bezpośrednio z terminala. Dopisano:Wiesz, że to pomija tylko jeden znak? Dopisano:Można napisać funkcję zamiast powtarzać niemal identyczny kod. |
|
« 1 » 2 |