Ĺ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.
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
#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
llnie wiedzieć po co w funkcji mnożącej parametr rozmiar
llkreator 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.