GRY-Online.pl --> Archiwum Forum

C++ problem z programem - pomocy

08.11.2010
22:50
[1]

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.

08.11.2010
22:51
[2]

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

08.11.2010
22:53
[3]

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ć...

08.11.2010
22:53
[4]

BlackBolt [ Senator ]

Kategoria -> szkoła

08.11.2010
22:55
[5]

Piotrus1pan [ ZbiQ2 ]

BlackBolt--> u nas na lekcjach jeszcze nie korzystamy z cout ;/

08.11.2010
22:59
[6]

legrooch [ MPO Squad Member ]

Najpierw używasz wyplucia na ekran, a trzy posty niżej się o to pytasz :]

08.11.2010
23:02
[7]

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

08.11.2010
23:13
[8]

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]).

08.11.2010
23:16
[9]

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.

08.11.2010
23:17
[10]

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 ?


C++ problem z programem - pomocy - Piotrus1pan
08.11.2010
23:21
[11]

tomazzi [ Flash YD ]

czy teraz jest dobrze ?
A dobrze Ci wypisuje?

08.11.2010
23:26
[12]

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.

08.11.2010
23:34
[13]

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

08.11.2010
23:44
[14]

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

08.11.2010
23:51
[15]

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 " ...

09.11.2010
00:09
[16]

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.

© 2000-2025 GRY-OnLine S.A.