Elvis_ Opublikowano 6 Listopada 2004 Zgłoś Opublikowano 6 Listopada 2004 witam mam pytanie jesli chodzi o c++, moze banalne, ale dopiero sie ucze, otoz oto kawalek kodu: --- kat hir -- cout << "Podaj rozmiar dynamicznej tablicy : " << endl; int n; cin >> n; float *tab = new float[n]; for (int i=0; i < n; i++) { cout << "Podaj element nr: " << i+1 << endl; cin >> *(tab++); } for (int i=0; i < n; i++) { cout << "Element tablicy o nr: " << i+1 << " ma wartosc : " << *(tab++) << endl; } --- kat hir -- druga petla wyswietla elementy tablicy, jednak wyswietlaja sie glupoty bo 'tab' wskazuje na ostatni element tablicy, co zrobic aby wskazywal na pierwszy? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 6 Listopada 2004 Zgłoś Opublikowano 6 Listopada 2004 Zmienna tab to u Ciebie jedyne odwolanie do dynamicznie stworzonej tablicy, wiec nie mozesz go stracic. Albo po wprowadzeniu danych cofniesz wskaznik na poczatek, albo dodeklaruj sobie drugi wskaznik, ktorym bedziesz sobie "jezdzil" po tablicy, a ten orginalny niech zawsze stoi na jej poczatku. Polecam raczej ta druga metode. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Elvis_ Opublikowano 6 Listopada 2004 Zgłoś Opublikowano 6 Listopada 2004 [...]Albo po wprowadzeniu danych cofniesz wskaznik na poczatek[...]jak to zrobic? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
K3310pH Opublikowano 6 Listopada 2004 Zgłoś Opublikowano 6 Listopada 2004 jak to zrobic?no w tym wypadku zinkrementowales wskaznik n razy to go trzeba teraz potraktowac: tab -= n; Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Elvis_ Opublikowano 6 Listopada 2004 Zgłoś Opublikowano 6 Listopada 2004 jak to zrobic?no w tym wypadku zinkrementowales wskaznik n razy to go trzeba teraz potraktowac: tab -= n; dzieki, o to mi chodzilo Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 7 Listopada 2004 Zgłoś Opublikowano 7 Listopada 2004 Mimo wszystko radzilbym trzymac osobny wskaznik (to tylko 4 bajty...), ktory zawsze pokazuje na poczatek tej tablicy, poniewaz kiedys mozesz zapomnac cofnac i bedziesz dlugo szukal bledu.. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
marcinEc Opublikowano 7 Listopada 2004 Zgłoś Opublikowano 7 Listopada 2004 witam mam pytanie jesli chodzi o c++, moze banalne, ale dopiero sie ucze, otoz oto kawalek kodu: --- kat hir -- cout << "Podaj rozmiar dynamicznej tablicy : " << endl; [...] for (int i=0; i < n; i++) { cout << "Podaj element nr: " << i+1 << endl; cin >> *(tab++); } for (int i=0; i < n; i++) { cout << "Element tablicy o nr: " << i+1 << " ma wartosc : " << *(tab++) << endl; } --- kat hir -- druga petla wyswietla elementy tablicy, jednak wyswietlaja sie glupoty bo 'tab' wskazuje na ostatni element tablicy, co zrobic aby wskazywal na pierwszy? Mimo, że już podano Ci rozwiązanie, ja mam pytanie: po co Ci zwiększanie wskaźnika?? Czy już nie możesz zastosować zwykłego indeksowania tablicy przez nawiasy []?? Skoro używasz przynajmniej dwukrotnie tej tablicy to jaki jest sens zwiększania wskaźnika i trzymania dodatkowo drugiej kopi albo jeszcze odejmowania?? A propos zapominania o wskaźnikach: możesz zapomnieć, że wogóle masz taki wskaźnik, możesz go podwójnie dealokować, itd. itd. Zwiększanie wskaźnika ma sens w krótkich funkcjach, najczęściej operujących na tłańcuchach znakowych, w celu zwiększenia prędkości działania (teoretycznie... kiedyś tak na pewno było) ale powoduje zaciemnienie kodu oraz właśnie problem z ponownym użyciem tablicy. Czy nie lepiej zastosować prostsze rozwiązanie niż na siłę dokładać kod do dość specyficznego...? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Elvis_ Opublikowano 7 Listopada 2004 Zgłoś Opublikowano 7 Listopada 2004 witam mam pytanie jesli chodzi o c++, moze banalne, ale dopiero sie ucze, otoz oto kawalek kodu: [...] co zrobic aby wskazywal na pierwszy? Mimo, że już podano Ci rozwiązanie, ja mam pytanie: po co Ci zwiększanie wskaźnika?? Czy już nie możesz zastosować zwykłego indeksowania tablicy przez nawiasy []?? [...] Czy nie lepiej zastosować prostsze rozwiązanie niż na siłę dokładać kod do dość specyficznego...? w zasadzie masz racje, ale tego progsa pisze w celach edukacyjnych, natrafilem na cos z czym nie moglem sobie poradzic, sposob z tablicami jest rzeczywiscie wygodniejszy i bardziej przejrzysty, zreszta zobaczcie mojego progsa, juz go zrobilem ale moze cos sie da w nim ulepszyc: // TRESC ZADANIA://// zdefiniowac dynamicznie jednowymiarowa tablice o dlugosci 'n' z liczb rzeczywistych// przeczytac z klawiatury wartosci elementow tablicy, wyznaczyc najwiekszy element,// srednia jej elementow, wylistowac elementy tablicy, operacje wykonac w funkcjach// wywolanych przez wskaznik.// --------------------------#include "stdafx.h" //kompilacja pod: Visual Studio .NET (C++) //ew: #include <iostream.h>#include "conio.h" //dla getch();using namespace std;//DEKLARACJE FUNKCJI:void wyswietl(float *w, int n);void srednia(float *w, int n);void najw_elem(float *w, int n);int main(){ cout << "Podaj rozmiar dynamicznej tablicy : "; int n; cin >> n; float *tab = new float[n]; void (*ws)(float *, int); //wskaznik do funkcji //wczytywanie elementow tablicy for (int i=0; i < n; i++) { cout << "Podaj element nr " << i+1 << " : "; cin >> tab[i]; //*(tab++), ale wtedy potrzbne jest: tab = tab - n; <=>tab -= n: //powrot wsk na piewszy (zerowy) element tablicy,zeby moc znowu z nia cos zrobic } char znak; do { cout << endl << "***************************************" << endl << "Program do obslugi dynamicznej tablicy!" << endl << "***************************************" << endl << "Co chcesz zrobic z tablica ? " << endl << "'N' - najwiekszy element tablicy " << endl << "'S' - srednia z elementow tablicy " << endl << "'W' - wyswietl elementy tablicy " << endl << endl << "'K' - aby zakonczyc " << endl; znak = getch(); switch(znak) { case 'N': { ws = najw_elem; (*ws)(tab, n); break; } case 'S': { ws = srednia; (*ws)(tab, n); break; } case 'W': { ws = wyswietl; (*ws)(tab, n); break; } case 'K': break; default: cout << "Wybierz jedna z mozliwych opcji!" << endl; break; } cout << endl; } while ( znak != 'K'); delete [] tab; //wywala nieraz access violation nie wiem na razie dlaczego?}void najw_elem(float *w, int n){ float tmp = w[0]; //tmp wskazuje na 1. element tablicy for (int i=0; i < n; i++) { if (w[i] > tmp) tmp = w[i]; } cout << "Najwiekszy element tablicy ma wartosc : " << tmp << endl;}void srednia(float *w, int n){ float suma = 0; for (int i = 0; i < n; i++) { suma += w[i]; } cout << "Srednia wartosci elementow tablicy : " << suma/n << endl;}void wyswietl(float *w, int n){ for (int i=0; i < n; i++) { cout << "Element tablicy o nr: " << i+1 << " ma wartosc : " << w[i] << endl; }} Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...