ďťż

Ładny brzuch

Mam taki oto program:

#include <iostream> using namespace std; int * mnoznik(int * tablica1,int * tablica2, int * tablica3, int rozmiar) { int * poczatek = tablica3; while(*tablica1 && *tablica2 && *tablica3) { *(tablica3++) = *(tablica2++) * *(tablica1++); } return poczatek; } int main() { int * kreator_tablicy(int rozmiar, bool uzupelnic = false); int * tablica1 = kreator_tablicy(25, true); cout << endl; int * tablica2 = kreator_tablicy(29, true); cout << endl; int * tablica3 = kreator_tablicy(20); tablica3 = mnoznik(tablica1, tablica2, tablica3, 25); for(int i=0; i<20; i++) cout << tablica3[i] << endl; system("Pause"); } int * kreator_tablicy(int rozmiar, bool uzupelnic) { srand(time(0)); int * tablica = new int[rozmiar]; for(int i=0; i<rozmiar; i++) { if (uzupelnic) tablica[i]=rand()%100; else tablica[i]=0; cout << tablica[i] << endl; } return tablica; }

Program miał za zadanie stworzyć (posługująć się funkcją kreator tablicy) trzy tablice (zarezerwować dla nich pamięć) i przypisać 2-óm z nich jakieś wartości (wyświetlić je też). Potem do każdego z elementów trzeciej tablicy powinien wpisać iloczyn elementów tablicy 2 i 3 o tym samym indeksie. Potem ma wyświetlić tablicę 3. Wie ktoś może dlaczego to nie działa? Byłbym wdzięczny za pomoc. A może ktoś ma jakiś inny pomysł na napisanie takiego programu?
Użytkownik artur-owczarek edytował ten post 03 kwiecień 2007, 07:24


program wieszał się w tym momencie:

while(tablica1 && tablica2 && tablica3)
{
*(tablica3++) = *(tablica2++) * *(tablica1++);
}

należało to zmienić na:

while(*tablica1 && *tablica2 && *tablica3)
{
*(tablica3++) = *(tablica2++) * *(tablica1++);
}

ale dlaczego teraz nie wyświetla mi 25 linijek z pętli:

for(int i=0; i<25; i++)
cout << tablica3[i] << endl;

?

Moim zdaniem to warunek dla whila jest tak czy siak bez sensu. Takie coś może działać pieknie dla napisów w stylu C gdzie zawsze ostatni znak to NULL, zatem kod typu:
if(*napis) //czy while(*napis++)jest na porządku dziennym. W przypadku tablic int albo wykorzystasz analogiczną metodę czyli pozostawienie strażnika na końcu, albo przekazujesz do funkcji wraz z tablicą jej wielkość.
Co do pętli for to jak możesz wyświetlić 25 elementów skoro tablica3 ma ich tylko 20? Wychodzisz poza zakres tablicy i wszystko się psuje, a jak się nie psuje to masz tylko chwilowe szczęście i prędzej czy później coś się posypie. Tak to już jest, pod tym względem z tablicami trzeba ostrożnie.
Użytkownik reVis edytował ten post 02 kwiecień 2007, 22:12
Wreszcie doszedłem do rozwiązania. Cuda tam popisałem że aż wstyd gadać. Tak powinien wyglądać poprawny kod.

#include <iostream> using namespace std; int * mnoznik(int * tablica1,int * tablica2, int * tablica3, int rozmiar) { int * poczatek = tablica3; for(int i=0; i<20; i++) { *(tablica3++) = *(tablica2++) * *(tablica1++); } return poczatek; } int main() { srand(time(0)); int * kreator_tablicy(int rozmiar, bool uzupelnic = false); cout << "TABLICA 1:" << endl; int * tablica1 = kreator_tablicy(25, true); cout << endl; cout << "TABLICA 2:" << endl; int * tablica2 = kreator_tablicy(29, true); cout << endl; int * tablica3 = kreator_tablicy(20); tablica3 = mnoznik(tablica1, tablica2, tablica3, 25); for(int i=0; i<20; i++) cout << tablica3[i] << endl; system("Pause"); } int * kreator_tablicy(int rozmiar, bool uzupelnic) { int * tablica = new int[rozmiar]; for(int i=0; i<rozmiar; i++) { if (uzupelnic) { tablica[i]=rand()%100; cout << tablica[i] << endl; } else tablica[i]=1; } return tablica; }

temat do zamknięcia
Użytkownik artur-owczarek edytował ten post 03 kwiecień 2007, 13:23


Hmm... Kod który podałeś, szczerze mówiąc nie jest ani poprawny ani optymalny, choć na pewno lepszy od wcześniejszego.
    ltworzysz obiekty w pamięci, ale potem ich nie usuwasz
    l
    lnie wiedzieć po co w funkcji mnożącej parametr rozmiar
    l
    lkreator można napisać nieco lepiej (1 if i 2 razy for, zamiast 1 for i n if)l


oprocz tego co napisal reVis,..

zastanawia mnie zmienna uzupelnij??

po co wypelniac tablice3 "1" jesli i tak bedzie ona wypelniona iloczynem tablica1 i tablica2 ??

nawet ten Twoj kreator do tej tablicy Ci nie jest potrzebny bo i tak zwracasz do niej wskaznik (oczywiscie bez pewnych modyfickaji nie zadziala, obiekty i tak trzeba stworzyc)
Użytkownik fernandez edytował ten post 03 kwiecień 2007, 19:36
"po co wypelniac tablice3 "1" jesli i tak bedzie ona wypelniona iloczynem tablica1 i tablica2 ??"
to pozostałość po moim wcześniejszym wymyśle ze sprawdzaniem kiedy element tablicy będzie równy 0 to zakończ wpisywanie do niej iloczynów (jak by nie było to nie działał).

"tworzysz obiekty w pamięci, ale potem ich nie usuwasz"
bo to program testowy jest. Taki do nauki a nie do działania. Ale jak najbardziej trafna uwaga.

"nie wiedzieć po co w funkcji mnożącej parametr rozmiar"
zamiast tej dwudziestki miała być zmienna rozmiar

"kreator można napisać nieco lepiej (1 if i 2 razy for, zamiast 1 for i n if)"
no można. również mądra uwaga.

Dzięki za uwagi odnośnie programu.

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •