Ładny brzuch
Hi. Mam nastepujacy problem : Musze Podac napis i ma byc wyswietlany, puzniej mam do niego co trzeci znak wstawiac "%&*" i ma wyswietlac to juz po zmianie np. psze : "a b c d e f g h" i z tego ma wyjsc"a b c % & * d e f % & * g h" nie zabardzo wiem jak mam to zrobic . Prosze o pomoc :P:D (bez uzycia <cstring>)
#include <iostream> using namespace std; //wypelania tablice void tab(char *tab,int n) { for(int i=0;i<n;++i) { cin>>tab[i]; } } //wypisuje tablice char wyp(char *tab,int n) { for(int i=0;i<n;++i) { cout<<" "<<tab[i]; } } //funkcja kopiuje z jednej do drugiej tablicy znaki char * copy(char * tab2, char * tab1) { char x,z,y; int i = 0; for (; tab1[i]!= 0; ++i) { if((i%3)!=0) { tab2[i] = tab1[i]; tab2[i] = 0; } else { tab2[i] = '%'; tab2[i+1] = '&'; tab2[i+2] = '*'; // tab2[i]=0; } } return tab2; } int main() { char *tab1,*tab2; int n; cout<<"Podaj rozmiar tablicy do ktorej chcesz wprowadzac znaki:\n"; cin >> n; cout<<"Podaj teraz co chcesz wpisac do tablicy o rozmiarze:"<<n<<endl; tab1 = new char[n]; tab(tab1,n); cout<<endl<<endl<<endl<<endl; cout<<"Tablica po wypelnieniu znakami:\n"; wyp(tab1,n); tab2 = new char[2*n]; cout<<endl; cout<<endl<<endl<<endl<<endl; cout<<"Druga tablica ze zmienionymi znakami:\n"; copy(tab2,tab1); wyp(tab2,2*n); delete [] tab1; delete [] tab2; cout<<endl<<endl<<endl<<endl; system("PAUSE"); return 0; }
Uytkownik Chudyyy edytowa ten post 05 kwiecie 2006, 15:27
mozesz napisa pytanie jescze raz, jako tak bardziej gramatycznie??
jak masz tablice znakw, to sprawdzasz jej dugo i dzielisz przez 3.
Tworzysz now tablice o rozmiarze wikszym od satej o wynik tamtego dzielenia pomonoony przez 3
Potem wystarczy tylko ptla, przebiegajca przez wszystkie znaki starej tablicy. Jak liczba modulo 3 = 0 to wstawiasz do nowej tablicy te 3 znaki. Musisz tylko sobie w jakie zmiennej liczy na ktor pozycj aktualnie trzeba zapisa i tyle
jak masz tablice znakw, to sprawdzasz jej dugo i dzielisz przez 3.
Tworzysz now tablice o rozmiarze wikszym od satej o wynik tamtego dzielenia pomonoony przez 3
Zamiast dzieli przez t trjk, a pniej przez ni mnoy mona po prostu od razu stworzy dwa razy wiksza tablic.
Uytkownik Chmurek edytowa ten post 05 kwiecie 2006, 16:42
;/;/ o to chodzi , ze mniej wiecej chyba wiem o co chodzi tylko nie potrafie tego w kodzie przedstawic :P wiec tak nie wiem czemu mi nie przekopiowuje wszystkich znakow do drugiej tablicy ;/;/ wiec o to chodzi nie ze jak to zrobic tylko co mam zle :( bo prawde mowiac pisze pierwszy raz program z tablicami char :P dopiero sie ucze cpp jesli ktos moze to prosze powiedziec co jest z tym kodem nie tak ;/
A tak, nawet nie przeczytaem wtedy, e ju co takiego masz. ;)
W kadym razie, spjrz na to:
if((i%3)!=0) { tab2[i] = tab1[i]; tab2[i] = 0; }
Nie wydaje Ci si to troch bezsensowne? ;)
Uytkownik Chmurek edytowa ten post 05 kwiecie 2006, 17:33
char * copy(char * cel, char * zrodlo) { int i = 0; for (; zrodlo[i] != 0; ++i) cel[i] = zrodlo[i]; cel[i] = 0; return cel; }
to jest fragment kodu ze strony kolesia co mnie uczy infy
Uytkownik Chudyyy edytowa ten post 05 kwiecie 2006, 18:46
wogle bez sensu jest ten kod, najpier przypisujesz cos do tablicy cel a potem to zerujesz (jaki w tym cel??)
Uytkownik DarkCez edytowa ten post 05 kwiecie 2006, 19:05
wogle bez sensu jest ten kod, najpier przypisujesz cos do tablicy cel a potem to zerujesz (jaki w tym cel??)
if((i%3)!=0) { tab2[i] = tab1[i]; tab2[i] = 0; }
no to tak wiem ze pewnie masz racje :P bo ja to zaczynam pisac w c++ wiec powiem Ci jak ja to widze
if((i%3)!=0)
jezeli i%3 czyli reszta z dzielenie jest rozna od 0 czyli wszystkie liczby , omijamy te "co trzecia" i wpisujemy tam te znaki co stoja na tych samych indeksach co w tablicy pierwszej . :mellow:
usunolem to tab2[i]=0 i tez nie dziala ;/
Uytkownik Chudyyy edytowa ten post 05 kwiecie 2006, 19:52
void KOPIUJ( SOURCE, DEST, size)
{
i = 0
for( J = 0 ; j < size ; ++j )
{
DESTINATION[i++] = SOURCE[j]
if(j%3 == 0 ){
DESTINATION[i++] = %
DESTINATION[i++] = &
DESTINATION[i++] = *
}
}
to taki oglny zary tego co potrzebujesz
Po prostu zakocz obydwie tablice zerem. Za chwil zamieszcz kompletny kod.
Ok, ja bym to inaczej zrobi, ale eby za bardzo nie odbiega od Twojej wersji to proponuj taki program:
#include <iostream> using namespace std; void tab(char *tab,int n) { for(int i=0;i<n;++i) cin>>tab[i]; tab[n] = 0; } char wyp(char *tab,int n) { for(int i=0;i<n && tab[i] != 0;++i) cout<<" "<<tab[i]; } char * copy(char * tab2, char * tab1) { char x,z,y; int i = 1; int j = 1; tab2[0] = tab1[0]; for (; tab1[i] != 0; ++i) { if((i%3) != 0) { tab2[j] = tab1[i]; j++; } else { tab2[j] = '%'; tab2[j+1] = '&'; tab2[j+2] = '*'; tab2[j+3] = tab1[i]; j += 4; } } tab2[j] = 0; return tab2; } int main() { char *tab1,*tab2; int n; cout<<"Podaj rozmiar tablicy do ktorej chcesz wprowadzac znaki:\n"; cin >> n; cout<<"Podaj teraz co chcesz wpisac do tablicy o rozmiarze:"<<n<<endl; tab1 = new char[n+1]; tab(tab1,n); cout<<endl<<endl<<endl<<endl; cout<<"Tablica po wypelnieniu znakami:\n"; wyp(tab1,n); tab2 = new char[2*n+1]; cout<<endl; cout<<endl<<endl<<endl<<endl; cout<<"Druga tablica ze zmienionymi znakami:\n"; copy(tab2,tab1); wyp(tab2,2*n+1); delete [] tab1; delete [] tab2; cout<<endl<<endl<<endl<<endl; system("PAUSE"); return 0; }
Uytkownik Chmurek edytowa ten post 05 kwiecie 2006, 20:31
dzieki :lol:
Inna wersja:
#include <iostream> using namespace std; int main() { int dlugosc; char *tekst, *wynik; cout << "Podaj dlugosc tekstu:\n"; cin >> dlugosc; tekst = new char[dlugosc]; cout << "Podaj tekst:\n"; cin >> tekst; wynik = new char[dlugosc*2]; for (int i=0;i<dlugosc;i+=3) { strncpy(wynik+i*2, &tekst[i], 3); strcpy(wynik+i*2+3, "%&*"); } cout << wynik << endl; return 0; }
;)
Uytkownik Chmurek edytowa ten post 05 kwiecie 2006, 20:58
wow.... bardzo niezle :) tez sie przyda :D
Jeszcze mona t drug tablic tworzy zamiast dugoci dwa razy wikszej ni pierwsza to troch podobnie do tego jak napisa Artur Menc.
Przykad:
W wypadku tekstu "Basia" dugo tablicy wynikowej powinna by rwna 9, a nie 10, gdy wynik to "Bas%&*ia" i zero na kocu.
Dlatego proponuj oblicza j tak:
dlugosc_wyniku = (dlugosc_zrodla * 2)/3 * 3
przy czym powinny to by zmienne cakowite, tak by wartoci uamkowe zostay obcite.
Wtedy dla tego przykadu otrzyamy
dlugosc_wyniku = 10/3 (=3) * 3 = 9
troche zmcozny jestem wic moliwe e jak gupot tu napisze ale zobaczymy ;)
dlugosc_wyniku = dlugosc_zrodla + (dlugosc_zrodla & 3)
nie ma dzielen i mnoe wiec troche oszczednej, ale nie gwarantuje ze to jest poprawny wzorek, poprostu taki ki sie "uoy" w gowie i zgadza sie dla kilku ronych przypadkw :)
Nie dziaa chociaby dla tych danych, ktre podaem.
Zreszt raczej nie powinno dziaa. ;)
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
#include <iostream> using namespace std; //wypelania tablice void tab(char *tab,int n) { for(int i=0;i<n;++i) { cin>>tab[i]; } } //wypisuje tablice char wyp(char *tab,int n) { for(int i=0;i<n;++i) { cout<<" "<<tab[i]; } } //funkcja kopiuje z jednej do drugiej tablicy znaki char * copy(char * tab2, char * tab1) { char x,z,y; int i = 0; for (; tab1[i]!= 0; ++i) { if((i%3)!=0) { tab2[i] = tab1[i]; tab2[i] = 0; } else { tab2[i] = '%'; tab2[i+1] = '&'; tab2[i+2] = '*'; // tab2[i]=0; } } return tab2; } int main() { char *tab1,*tab2; int n; cout<<"Podaj rozmiar tablicy do ktorej chcesz wprowadzac znaki:\n"; cin >> n; cout<<"Podaj teraz co chcesz wpisac do tablicy o rozmiarze:"<<n<<endl; tab1 = new char[n]; tab(tab1,n); cout<<endl<<endl<<endl<<endl; cout<<"Tablica po wypelnieniu znakami:\n"; wyp(tab1,n); tab2 = new char[2*n]; cout<<endl; cout<<endl<<endl<<endl<<endl; cout<<"Druga tablica ze zmienionymi znakami:\n"; copy(tab2,tab1); wyp(tab2,2*n); delete [] tab1; delete [] tab2; cout<<endl<<endl<<endl<<endl; system("PAUSE"); return 0; }
Uytkownik Chudyyy edytowa ten post 05 kwiecie 2006, 15:27
mozesz napisa pytanie jescze raz, jako tak bardziej gramatycznie??
jak masz tablice znakw, to sprawdzasz jej dugo i dzielisz przez 3.
Tworzysz now tablice o rozmiarze wikszym od satej o wynik tamtego dzielenia pomonoony przez 3
Potem wystarczy tylko ptla, przebiegajca przez wszystkie znaki starej tablicy. Jak liczba modulo 3 = 0 to wstawiasz do nowej tablicy te 3 znaki. Musisz tylko sobie w jakie zmiennej liczy na ktor pozycj aktualnie trzeba zapisa i tyle
jak masz tablice znakw, to sprawdzasz jej dugo i dzielisz przez 3.
Tworzysz now tablice o rozmiarze wikszym od satej o wynik tamtego dzielenia pomonoony przez 3
Zamiast dzieli przez t trjk, a pniej przez ni mnoy mona po prostu od razu stworzy dwa razy wiksza tablic.
Uytkownik Chmurek edytowa ten post 05 kwiecie 2006, 16:42
;/;/ o to chodzi , ze mniej wiecej chyba wiem o co chodzi tylko nie potrafie tego w kodzie przedstawic :P wiec tak nie wiem czemu mi nie przekopiowuje wszystkich znakow do drugiej tablicy ;/;/ wiec o to chodzi nie ze jak to zrobic tylko co mam zle :( bo prawde mowiac pisze pierwszy raz program z tablicami char :P dopiero sie ucze cpp jesli ktos moze to prosze powiedziec co jest z tym kodem nie tak ;/
A tak, nawet nie przeczytaem wtedy, e ju co takiego masz. ;)
W kadym razie, spjrz na to:
if((i%3)!=0) { tab2[i] = tab1[i]; tab2[i] = 0; }
Nie wydaje Ci si to troch bezsensowne? ;)
Uytkownik Chmurek edytowa ten post 05 kwiecie 2006, 17:33
char * copy(char * cel, char * zrodlo) { int i = 0; for (; zrodlo[i] != 0; ++i) cel[i] = zrodlo[i]; cel[i] = 0; return cel; }
to jest fragment kodu ze strony kolesia co mnie uczy infy
Uytkownik Chudyyy edytowa ten post 05 kwiecie 2006, 18:46
wogle bez sensu jest ten kod, najpier przypisujesz cos do tablicy cel a potem to zerujesz (jaki w tym cel??)
Uytkownik DarkCez edytowa ten post 05 kwiecie 2006, 19:05
wogle bez sensu jest ten kod, najpier przypisujesz cos do tablicy cel a potem to zerujesz (jaki w tym cel??)

if((i%3)!=0) { tab2[i] = tab1[i]; tab2[i] = 0; }
no to tak wiem ze pewnie masz racje :P bo ja to zaczynam pisac w c++ wiec powiem Ci jak ja to widze
if((i%3)!=0)
jezeli i%3 czyli reszta z dzielenie jest rozna od 0 czyli wszystkie liczby , omijamy te "co trzecia" i wpisujemy tam te znaki co stoja na tych samych indeksach co w tablicy pierwszej . :mellow:
usunolem to tab2[i]=0 i tez nie dziala ;/
Uytkownik Chudyyy edytowa ten post 05 kwiecie 2006, 19:52
void KOPIUJ( SOURCE, DEST, size)
{
i = 0
for( J = 0 ; j < size ; ++j )
{
DESTINATION[i++] = SOURCE[j]
if(j%3 == 0 ){
DESTINATION[i++] = %
DESTINATION[i++] = &
DESTINATION[i++] = *
}
}
to taki oglny zary tego co potrzebujesz
Po prostu zakocz obydwie tablice zerem. Za chwil zamieszcz kompletny kod.
Ok, ja bym to inaczej zrobi, ale eby za bardzo nie odbiega od Twojej wersji to proponuj taki program:
#include <iostream> using namespace std; void tab(char *tab,int n) { for(int i=0;i<n;++i) cin>>tab[i]; tab[n] = 0; } char wyp(char *tab,int n) { for(int i=0;i<n && tab[i] != 0;++i) cout<<" "<<tab[i]; } char * copy(char * tab2, char * tab1) { char x,z,y; int i = 1; int j = 1; tab2[0] = tab1[0]; for (; tab1[i] != 0; ++i) { if((i%3) != 0) { tab2[j] = tab1[i]; j++; } else { tab2[j] = '%'; tab2[j+1] = '&'; tab2[j+2] = '*'; tab2[j+3] = tab1[i]; j += 4; } } tab2[j] = 0; return tab2; } int main() { char *tab1,*tab2; int n; cout<<"Podaj rozmiar tablicy do ktorej chcesz wprowadzac znaki:\n"; cin >> n; cout<<"Podaj teraz co chcesz wpisac do tablicy o rozmiarze:"<<n<<endl; tab1 = new char[n+1]; tab(tab1,n); cout<<endl<<endl<<endl<<endl; cout<<"Tablica po wypelnieniu znakami:\n"; wyp(tab1,n); tab2 = new char[2*n+1]; cout<<endl; cout<<endl<<endl<<endl<<endl; cout<<"Druga tablica ze zmienionymi znakami:\n"; copy(tab2,tab1); wyp(tab2,2*n+1); delete [] tab1; delete [] tab2; cout<<endl<<endl<<endl<<endl; system("PAUSE"); return 0; }
Uytkownik Chmurek edytowa ten post 05 kwiecie 2006, 20:31
dzieki :lol:
Inna wersja:
#include <iostream> using namespace std; int main() { int dlugosc; char *tekst, *wynik; cout << "Podaj dlugosc tekstu:\n"; cin >> dlugosc; tekst = new char[dlugosc]; cout << "Podaj tekst:\n"; cin >> tekst; wynik = new char[dlugosc*2]; for (int i=0;i<dlugosc;i+=3) { strncpy(wynik+i*2, &tekst[i], 3); strcpy(wynik+i*2+3, "%&*"); } cout << wynik << endl; return 0; }
;)
Uytkownik Chmurek edytowa ten post 05 kwiecie 2006, 20:58
wow.... bardzo niezle :) tez sie przyda :D
Jeszcze mona t drug tablic tworzy zamiast dugoci dwa razy wikszej ni pierwsza to troch podobnie do tego jak napisa Artur Menc.
Przykad:
W wypadku tekstu "Basia" dugo tablicy wynikowej powinna by rwna 9, a nie 10, gdy wynik to "Bas%&*ia" i zero na kocu.
Dlatego proponuj oblicza j tak:
dlugosc_wyniku = (dlugosc_zrodla * 2)/3 * 3
przy czym powinny to by zmienne cakowite, tak by wartoci uamkowe zostay obcite.
Wtedy dla tego przykadu otrzyamy
dlugosc_wyniku = 10/3 (=3) * 3 = 9
troche zmcozny jestem wic moliwe e jak gupot tu napisze ale zobaczymy ;)
dlugosc_wyniku = dlugosc_zrodla + (dlugosc_zrodla & 3)
nie ma dzielen i mnoe wiec troche oszczednej, ale nie gwarantuje ze to jest poprawny wzorek, poprostu taki ki sie "uoy" w gowie i zgadza sie dla kilku ronych przypadkw :)
Nie dziaa chociaby dla tych danych, ktre podaem.
Zreszt raczej nie powinno dziaa. ;)