[C++] Doklejanie stringu do już istniejącego

Forum dotyczące ogólnie pojętego programowania - algorytmów, struktur danych, narzędzi programistycznych, itp - głównie w kontekście komputerów PC.
ODPOWIEDZ
Awatar użytkownika
Luminofor
Użytkownik
Posty: 1373
Rejestracja: 27 lis 2007, 17:17
Lokalizacja: Polska

[C++] Doklejanie stringu do już istniejącego

Post autor: Luminofor » 14 lip 2009, 21:28

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 :)

Kod: Zaznacz cały

#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
	}
}

Awatar użytkownika
c4r0
Moderator
Posty: 2150
Rejestracja: 13 kwie 2004, 19:56
Lokalizacja: z lasu
Kontakt:

Post autor: c4r0 » 15 lip 2009, 7:34

Co do programu to chyba powinieneś jeszcze następny bajt tablicy za ostatnim znakiem ustawić na 0. Ale tak ogólnie to ... Pedagogiem nie jestem, ale wydaje mi się że nie tędy droga. Takie pisanie przykładów z książki ani nie jest przyjemne (przynajmniej mnie szlag by jasny trafił jak by mi ktoś kazał coś takiego robić, to jak obliczanie całki na matmie tylko po to żeby poznać wynik...), ani nie nauczy Cię skutecznie programowania. Nie lepiej wymyślić sobie jakiś ciekawy programik i pisać, a do książki zaglądać po to co akurat potrzebujesz zrobić a nie wiesz jak? Sorry jeśli masz inne podejście niż ja ale jak tak patrzę że już dość długo klepiesz te suche przykłady i ciągle piszesz na forum żeby Ci to sprawdzać to mi się aż serce kraja.

Awatar użytkownika
Luminofor
Użytkownik
Posty: 1373
Rejestracja: 27 lis 2007, 17:17
Lokalizacja: Polska

Post autor: Luminofor » 15 lip 2009, 12:04

c4r0 pisze:Co do programu to chyba powinieneś jeszcze następny bajt tablicy za ostatnim znakiem ustawić na 0.
Racja, dzięki.
Poprawiony kod:

Kod: Zaznacz cały

#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
        } 
c4r0 pisze:Ale tak ogólnie to ... Pedagogiem nie jestem, ale wydaje mi się że nie tędy droga. Takie pisanie przykładów z książki ani nie jest przyjemne (przynajmniej mnie szlag by jasny trafił jak by mi ktoś kazał coś takiego robić, to jak obliczanie całki na matmie tylko po to żeby poznać wynik...), ani nie nauczy Cię skutecznie programowania. Nie lepiej wymyślić sobie jakiś ciekawy programik i pisać, a do książki zaglądać po to co akurat potrzebujesz zrobić a nie wiesz jak? Sorry jeśli masz inne podejście niż ja ale jak tak patrzę że już dość długo klepiesz te suche przykłady i ciągle piszesz na forum żeby Ci to sprawdzać to mi się aż serce kraja.
Akurat robię powtórkę Symfonii na poprawkę z informy i te przykłady.
A i nie chcę żebyście mi sprawdzali tylko oceniali, podpowiedzieli jak można to inaczej zrobić, pomogli pozbyć się złych nawyków.
Bo kompilowałem debuggowałem i działa.
Ale dzięki za szczerość, nie wszyscy się tak szybko uczą jak Ty.

ODPOWIEDZ