Piotrus1pan [ ZbiQ2 ]
C++ problem z programem - pomocy
mam pytanie do was napisałem taki program,który był zadany jako Praca domowa.
#include <stdio.h>
#include <conio.h>
#include <string.h>
main()
‹
char tab[50];
char tab2[50];
int i;
printf("wprowadz wyraz :");
scanf("%c",&tab);
for (i=0; i<strlen(tab); i++)
tab2[strlen(tab)-i]=tab;
scanf("%c",&tab2);
getch();
›
ma on pozwalać wpisać wyraz,a następnie go odwrócić... Wydaje mi się że wszystko jest w porządku ale nie wyświetla się tekst... Jaka jest tego przyczyna ? Od razu mówię słabo na razie ze mną i c ++ i dlatego proszę was o pomoc. Hah bym zapomniał program ma się opierać na printf i scanf oraz pętlach i tablicy... z góry dzięki za pomoc.
tomazzi [ Flash YD ]
To pierwsze to nie C++ tylko C. A po drugie nie masz funkcji która wypisze wyraz na ekran.
[3] printf("wprowadz wyraz :");
Piotrus1pan [ ZbiQ2 ]
ok w takim razie przepraszam za pomyłkę :) A możesz mi powiedzieć jaka jest komenda na wyświetlanie tekstu ? bo nie mogę se przypomnieć...
BlackBolt [ Senator ]
Kategoria -> szkoła
Piotrus1pan [ ZbiQ2 ]
BlackBolt--> u nas na lekcjach jeszcze nie korzystamy z cout ;/
legrooch [ MPO Squad Member ]
Najpierw używasz wyplucia na ekran, a trzy posty niżej się o to pytasz :]
Vaig [ Chor��y ]
Po kolei
main wypada deklarować jako int main i na końcu dać return 0;, tak aby kod wyglądał
int main()
‹
// kod
return 0;
›
Jeżeli nie wiesz czemu, to uznaj, że tak się robi i tyle.
%c w scanfie oznacza, że spodziewasz się pojedynczego znaku (c - character). Ty natomiast spodziewasz się łańcucha znaków (z ang. string), więc powinieneś użyć %s.
Przypisanie
tab2[strlen(tab)-i]=tab;
zawiera dwa błędy. Po pierwsze odejmujesz o jeden znak za mało (pamiętaj, że indeksowanie tablic zaczyna się od 0, a nie 1), drugi błąd to brak podania indeksu tab po znaku równości.
Ostatecznie zamiast wypisania masz kolejnego scanfa, który czyta, a nie wypisuje. Google: printf
Moshimo [ FullMetal ]
Vaig -->
drugi błąd to brak podania indeksu tab po znaku równości.
Moge sie mylic, ale wydaje mi sie, ze Ty sie tu mylisz ;). Jesli dobrze kojarze, w przypadku nie podania indeksu brany jest pod uwage adres tablicy, dokladniej mowiac adres pierwszego elementu tablicy (tab[0]).
Vaig [ Chor��y ]
w przypadku nie podania indeksu brany jest pod uwage adres tablicy, dokladniej mowiac adres pierwszego elementu tablicy (tab[0]).
Zgadza się, ale w Piotrus1pan potrzebuje przepisać wartość, więc użycie wskaźnika jest tutaj nieprawidłowe.
Piotrus1pan [ ZbiQ2 ]
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main()
‹
char tab[50];
char tab2[50];
int i;
printf("wprowadz wyraz :");
scanf("%s",&tab);
printf("%s",tab);
for(i=0; i<strlen(tab); i++)
tab2[strlen(tab)-i]=tab;
printf("%s",tab2);
getch();
return 0;
›
czy teraz jest dobrze ?
Vaig-->a czemu tab2 jest źle ?
Edit.Po skompilowaniu jest dobrze tylko że przed zmianą wyrazu robi się kwadracik O_o ? Skąd on się bierze ? Jak się pozbyć tych 2 znaczków ? Z przodu i z tyłu ?
tomazzi [ Flash YD ]
czy teraz jest dobrze ?
A dobrze Ci wypisuje?
Vaig [ Chor��y ]
Sprawdź, czy działa - jak nie działa to niedobrze.
A nie działa poprawnie.
Wyobraź sobie wyraz "Aacd"
[0][1][2][3] <--- indeksy
[A][a][c][d] <--- tab
Teraz twoja pętla przelatuje od zera do długości ciągu tab-1 (bo użyłeś znaku mniejszeości, nie mniejszości-równości, czyli 3) i powinna przepisywać znaki z jednej tablicy do drugiej w ten sposób:
tab2[x] = tab[y]
Zastanów się jakie zmienne / wartości wstawić jako x i y, żeby uzyskać poniższy wynik.
[0][1][2][3] <--- indeksy
[A][a][c][d] <--- tab
[d][c][a][A] <--- tab2
Musisz użyć m.in. długości strlen(tab) oraz 'i', które będzie ci wskazywało jak daleko jesteś w trakcie przepisywania.
Na screenie widzę, że już poprawiłeś indeks tab, teraz tylko zwróć uwagę, że indeksowanie tablicy zaczyna się od zera, nie od jedynki.
Piotrus1pan [ ZbiQ2 ]
Vaig-->
jak mam być szczery to się pogubiłem... mam użyć pętli drugiej for ? Bo zrozumiałem coś takiego że jeżeli mam tab A i on jest 0 w tablicy,to w tab2 to powinno A+3 miejsca do przodu i ma się zmniejszać?
Już chyba czaję ^^ Gdzieś powinienem przy tab2 zmienić literkę ;p
Vaig [ Chor��y ]
Ogólnie przepisuje dobrze tylko nie dostrzegasz tego, że tablica 4 znakowa ma indeksy 0,1,2,3, a nie 1,2,3,4. Stąd przepisanie na indeksy 1,2,3,4 zostawia ci śmiecia na indeksie zerowym.
ś - jakiś śmieć
Tak wygląda wykonanie twojego programu.
i = 0
strlen(tab)-i = 4
[0][1][2][3][4] <-- indeksy
[z][w][a][k][--] <-- tab
[ś][ś][ś][ś][z] <-- tab 2
i = 1
strlen(tab)-i = 3
[0][1][2][3][4] <-- indeksy
[z][w][a][k][--] <-- tab
[ś][ś][ś][w][z] <-- tab 2
i = 2
strlen(tab)-i = 2
[0][1][2][3][4] <-- indeksy
[z][w][a][k][--] <-- tab
[ś][ś][a][w][z] <-- tab 2
i = 3
strlen(tab)-i = 1
[0][1][2][3][4] <-- indeksy
[z][w][a][k][--] <-- tab
[ś][k][a][w][z] <-- tab 2
Pozostaje ci śmieć.
Wystarczy ci wstawić jeszcze tylko jeden element między poniższe brackety, żeby zlikwidować przesunięcie.
tab2[strlen(tab)-i]
Chciałem na przykładzie zbik, ale gol poformatował, to masz zwaka. :)
Piotrus1pan [ ZbiQ2 ]
hah czyli muszę cofnąć w tab2 moje napisy o 1 miejsce ? Teraz tylko pytanie jak to wykonać
Edit. Dodałem printf("%s",tab2+1); i teraz miejsce odpowiednie tylko że pojawia się nadal na końcu " ...
Vaig [ Chor��y ]
Trochę naokoło droga, bo mogłeś po prostu zmienić
tab2[strlen(tab)-i]=tab[ i ];
na
tab2[strlen(tab)-i-1]=tab[ i ];
, ale w programowaniu chodzi o tworzenie kreatywnych rozwiązań, wiec ważne, że zrozumiałeś w czym problem.
Ten ostatni śmieć to prawdopodobnie śmieć, który był w tym miejscu w pamięci, zanim ty ją dostałeś.
W momencie kiedy zadeklarujesz
char tab[50]
to kompilator zarezerwuje ci 50 slotów pod znaki w pamięci. Tylko cały myk jest w tym, że zanim ta pamięć została tobie przyznana, była używana przez jakiś inny program działający w twoim systemie i ty próbując odczytać tab2 natrafiasz na jakieś pozostałości z innych programów. Możesz to rozwiązać na kilka sposobów, ale najprościej będzie (co i tak będziesz często robił) wykonać zerowanie tablicy.
for(i=0; i<50;i++)
tab[ i ] = 0;
Dla drugiej tablicy tak samo. Wtedy będziesz wiedział, że tablice, których używasz są czyste i nie wypiszą ci niespodzianek.
Jeżeli dalej będziesz miał śmiecia to wrzuć zaktualizowany kod.
Heh dopiero teraz zauważyłem, że tab[ i ] też gol zjada formatowaniem i niepotrzebnie się czepiałem. Polecam do wklejania kodów używać np.