Leogict Opublikowano 14 Lipca 2009 Zgłoś Opublikowano 14 Lipca 2009 Witam. Napisałem program z Symfonii C++ Standard, wyd. 3 z 2008r, ćwiczenie XXIII/218, w skrócie: mamy napisać funkcję, która do końca stringu będącego w jednej tablicy dołączy string będący w innej tablicy, funkcja powinna przerwać w przypadku zapełnienia całej tablicy. Jak zwykle będę wdzięczny za uwagi, spostrzeżenia, komentarze i wskazówki. Ćwiczenie było po rozdziale o tablicach, więc nie piszcie o żadnych vectorach, klasach itp :) #include <iostream>using namespace std;void dolacz(char docelowa[], int rozmiar_docelowej, char zrodlowa[]);int main(){ const int rozmiar=30; // rozmiar tablicy docelowej char tablica_docelowa[rozmiar]={"Czym sie rozni kaczka"}; char tablica_zrodlowa[]={" od labedzia?"}; dolacz(tablica_docelowa, rozmiar, tablica_zrodlowa); // here we go;) return 0;}//***********************************************************************//funkcja do dolaczania stringu z tablicy zrodlowej do tablicy docelowej://***********************************************************************void dolacz(char docelowa[], int rozmiar_docelowej, char zrodlowa[]){ int i=0,j=0,licznik_doc=0,licznik_zro=0; while(docelowa[i++]) ++licznik_doc; //ilosc liter w tablicy docelowej, od tego indeksu zaczynamy doklejanie while(zrodlowa[j++]) ++licznik_zro; //ilosc liter w tablicy zrodlowej for(int i=licznik_doc; i<licznik_doc+licznik_zro; i++) { if(i>=rozmiar_docelowej) break; // zapelniona cala tablica, przerywamy dzialanie funkcji docelowa[i]=zrodlowa[i-licznik_doc]; // wlasciwe doklejanie }} Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Drainer Opublikowano 15 Lipca 2009 Zgłoś Opublikowano 15 Lipca 2009 nie ma odpowiedzi do tych zadan z symfonii, zebys mogl sprawdzic jak to zostalo rozwiazane? void dolacz(char docelowa[], int rozmiar_docelowej, char zrodlowa[]) { int i=0,j=0; while(docelowa[i]) i++; while(zrodlowa[j] || (i < rozmiar_docelowej)){ docelowa[i] = zrodlowa[j]; i++; j++; }} Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Leogict Opublikowano 15 Lipca 2009 Zgłoś Opublikowano 15 Lipca 2009 (edytowane) Nie ma odpowiedzi, bo nie ma jednego pasującego rozwiązania, można to zrobić na wiele sposobów. Twój kod wygląda ok, ale nie masz terminowania zerem w przypadku przepełnienia tablicy. Mój kod poprawiony: #include <iostream>using namespace std;void dolacz(char docelowa[], int rozmiar_docelowej, char zrodlowa[]);int main(){ const int rozmiar=30; // rozmiar tablicy docelowej char tablica_docelowa[rozmiar]={"Czym sie rozni kaczka"}; char tablica_zrodlowa[]={" od labedzia?"}; dolacz(tablica_docelowa, rozmiar, tablica_zrodlowa); // here we go Wink return 0;}//***********************************************************************//funkcja do dolaczania stringu z tablicy zrodlowej do tablicy docelowej://***********************************************************************void dolacz(char docelowa[], int rozmiar_docelowej, char zrodlowa[]){ int i=0,j=0,licznik_doc=0,licznik_zro=0; while(docelowa[i++]) ++licznik_doc; //ilosc liter w tablicy docelowej, od tego indeksu zaczynamy doklejanie while(zrodlowa[j++]) ++licznik_zro; //ilosc liter w tablicy zrodlowej for(int i=licznik_doc; i<licznik_doc+licznik_zro; i++) { if(i>=rozmiar_docelowej) { docelowa[i-1]=0; // terminowanie zerem w przypadku przedwczesnego zapełnienia tablicy break; // zapelniona cala tablica, przerywamy dzialanie funkcji } docelowa[i]=zrodlowa[i-licznik_doc]; // wlasciwe doklejanie }} Edytowane 15 Lipca 2009 przez Leogict Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Drainer Opublikowano 15 Lipca 2009 Zgłoś Opublikowano 15 Lipca 2009 Nie ma odpowiedzi, bo nie ma jednego pasującego rozwiązania, można to zrobić na wiele sposobów. Twój kod wygląda ok, ale nie masz terminowania zerem w przypadku przepełnienia tablicy. w takim razie co jesli tablica docelowa nie bedzie pelna? (: Mój kod poprawiony:chodzilo mi raczej o optymalizacje przez redukcje zbednych warunkow Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Leogict Opublikowano 15 Lipca 2009 Zgłoś Opublikowano 15 Lipca 2009 (edytowane) w takim razie co jesli tablica docelowa nie bedzie pelna? (:To if się nie wykona. Twoje rozwiązanie wygląda ok, tylko to terminowanie zerem jak mamy przepełnienie, dzięki. Piszcie dalej. Edytowane 15 Lipca 2009 przez Leogict Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Drainer Opublikowano 15 Lipca 2009 Zgłoś Opublikowano 15 Lipca 2009 To if się nie wykona.no to to widac, pytanie mialo brzmiec: czy zero powinno byc tylko kiedy tablica jest pelna, czy zawsze konczyc string? (; Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Leogict Opublikowano 15 Lipca 2009 Zgłoś Opublikowano 15 Lipca 2009 (edytowane) Zawsze, ale jak nie ma przepełnienia, to dokleja string źródłowy z NULL-em przecież, więc jest wszystko si. Edit: chociaż jak tak teraz patrzę pod debuggerem, to dokleja string źródłowy bez nulla, ale że tablica docelowa była wstępnie zainicjalizowana, to wszystko jest ok. Drainer dzięki, miałeś rację, zwracam honor. Teraz powinno kończyć zerem w każdym przypadku: zmienna licznik_zro poprostu zliczała znaki w tablicy źródłowej bez uwzględnienia nulla, stąd to niedopatrzenie. :) #include <iostream>using namespace std;void dolacz(char docelowa[], int rozmiar_docelowej, char zrodlowa[]);int main(){ const int rozmiar=30; // rozmiar tablicy docelowej char tablica_docelowa[rozmiar]={"Czym sie rozni kaczka"}; char tablica_zrodlowa[]={" od labedzia?"}; cout << tablica_docelowa; dolacz(tablica_docelowa, rozmiar, tablica_zrodlowa); // here we go Wink cout << endl << tablica_docelowa << endl; return 0;}//***********************************************************************//funkcja do dolaczania stringu z tablicy zrodlowej do tablicy docelowej://***********************************************************************void dolacz(char docelowa[], int rozmiar_docelowej, char zrodlowa[]){ int i=0,j=0,licznik_doc=0,licznik_zro=0; while(docelowa[i++]) ++licznik_doc; //ilosc liter w tablicy docelowej, od tego indeksu zaczynamy doklejanie while(zrodlowa[j++]) ++licznik_zro; //ilosc liter w tablicy zrodlowej for(int i=licznik_doc; i<licznik_doc+licznik_zro+1; i++) { if(i>=rozmiar_docelowej) { docelowa[i-1]=0; // terminowanie zerem w przypadku przedwczesnego zapełnienia tablicy break; // zapelniona cala tablica, przerywamy dzialanie funkcji } docelowa[i]=zrodlowa[i-licznik_doc]; // wlasciwe doklejanie }} Edytowane 15 Lipca 2009 przez Leogict Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...