GRY-Online.pl --> Archiwum Forum

Pomoc w Turbo Pascal

26.11.2008
21:39
smile
[1]

struss [ Legionista ]

Pomoc w Turbo Pascal

Witam. Mam ogromną prośbę o pomoc w zadaniu które brzmi:
Napisz program z procedurą która we wczytanym ciągu znaków zamieni wszystkie wystąpienia A na B i na odwrót. Ciąg znaków wczytywany za pomocą programu głównego i wszystkie zmienne globalne.

Tu w spoilerze dam treść programu który napisałem i po 1,5 godzinnym szukaniu wydaje się najbardziej prawdopodobny i działający w teorii ale nie w praktyce. Może ktoś się zna i pomoże, robił kiedyś coś takiego, widzi jakiś błąd w moim programie lub potrafi znaleźć odpowiedź na to zadanie w internecie. Przyda się każda pomoc :D
Z góry dzięki.


spoiler start

Program zad4;
Uses
crt;
Var
wejscie,wyjscie:String;
i:Byte;
l:Char;
Procedure obroc;
Begin
for i:=length (wejscie) downto 1 do
Begin
l:=wejscie;
if l='a' then
Begin
wejscie:='b';
wyjscie:=wyjscie+wejscie;
End
else if l='b' then
Begin
wejscie:='a';
wyjscie:=wyjscie+wejscie;
End
else wyjscie:=wyjscie+wejscie;
End;
End;
Begin
clrscr;
wyjscie:='';
writeln ('Wprowadz znaki');
readln (wejscie);
obroc;
writeln (wyjscie);
readln;
End.

spoiler stop


PS
Jeżeli w celu zdiagnozowania błędu mam wypróbować jakieś kombinacje to napiszcie jakie.

PS2
Wydaje mi się że błąd nastepuje w tym momencie ponieważ zmiennej typu Char przypisuję zmienną typu Byte. Niestety nie wiem jak to zastąpić i zrobić tak żeby działało :P

l:=wejscie;

26.11.2008
21:55
[2]

GBreal.II [ floydian ]

Program zad4;
Uses crt;
Var
wejscie,wyjscie:String;
i:Byte;
l:Char;
dlugosc:integer;

Procedure obroc;
Begin
dlugosc:=length(wejscie);
for i:=1 to dlugosc do
Begin
l:=wejscie[ i ];
if l='a' then
Begin
l:='b';
wyjscie:=wyjscie+l;
End
else if l='b' then
Begin
l:='a';
wyjscie:=wyjscie+l;
End
else wyjscie:=wyjscie+l;
End;
End;
-------------------------------------
zmieniłem tylko to, co widać. Reszta zostaje z Twojego programu.
1. Dlaczego pętla jest od końca do początku? W takim przypadku program wypisze Ci to, co zamienił od końca...
2. Błąd podczas kompilacji pojawiał się w momencie, kiedy chciałeś "dostać się" do pojedynczych liter w słowie - jeśli chcesz to zrobić, musisz odwołać się do konkretnej litery - typ 'string' to właściwie tablica zmiennych typu 'char', więc do kolejnych liter odwołujemy się tak jak do elementów tablicy.
3. Te przypisywania, które robiłeś nie działałyby. Mając "wyjscie:=wyjscie+wejscie; " przy każdym wystąpieniu literki 'a' dopisywałbyś do wyjścia całe wczytane słowo, a chyba nie to chodziło.

Mam nadzieję, że pomogłem :) Jakby co - pytaj :)

26.11.2008
22:10
[3]

DEXiu [ Generaďż˝ ]

Dlaczego w spoilerze?! :| Ma to jakieś głębsze uzasadnienie oprócz chęci bycia fajnym i jednoczesnego zniechęcenia kogokolwiek do rzucenia choćby okiem na ten kod?

Kilka rad na przyszłość:
GBreal.II już ci napisał, że string to tak jakby tablica charów, więc odwołując się do pojedynczej litery musisz indeksować tak jak tablicę.
Poza tym chyba "poprawniej" (tzn. ściślej według treści zadania) byłoby nie tworzyć stringu wyjściowego tylko modyfikować wejściowy i jego zwracać (głowy sobie za to uciąć nie dam, ale w Pascalu chyba można modyfikować pojedyncze litery w stringu).
Dobrze jest przy procedurze/funkcji bez parametrów pisać puste nawiasy (tzn. np tak: procedure obroc(); ) i przy wywołaniu także - dla poprawy czytelności i ułatwieniu domyślenia się intencji autora. Oprócz tego dobrze jest wywołując funkcję (np. length) nawiasy z argumentami umieszczać bezpośrednio za nazwą (czyli np. length(wejscie) a NIE length (wejscie) ) - chodzi o wyrobienie sobie nawyków bo w niektórych językach spacje mają znaczenie i będzie się rzucać o to.
I na koniec najważniejsze: mam nadzieję, że pisząc program stosujesz wcięcia (spacje albo tabulatory) i ogólnie jakiś sposób formatowania tekstu? Nie czepiam się tego tutaj, bo GOL automatycznie usuwa whitespace'y na początku linii, ale przy programach dłuższych niż kilka(naście) linijek wcięcia jednak się przydają.

26.11.2008
22:55
[4]

HondoX [ Konsul ]

to na tym sie jeszcze pracuje o_O? myslałem ze wurzytku jest juz tylko C++

26.11.2008
23:04
smile
[5]

struss [ Legionista ]

Wielkie dzięki za profesjonalną pomoc. To przywraca nadzieje że choć niezbyt często piszą to są na tym forum wartościowi ludzie a nie sami spamerzy, złośliwcy lub dzieci.

Co chciałem dodać od siebie: Jestem totalnym amatorem w programowaniu - uczę się sam, stawiam sobie właśnie takie trudne zadania żeby się doskonalić. Zacząłem 2 tygodnie temu a że nie zawsze mam czas to uczyłem się może z 15 godzin. Dlatego wezmę sobie do serca Wasze rady.


Parę słów do DEXiu :)
Poza tym chyba "poprawniej" (tzn. ściślej według treści zadania) byłoby nie tworzyć stringu wyjściowego tylko modyfikować wejściowy i jego zwracać (głowy sobie za to uciąć nie dam, ale w Pascalu chyba można modyfikować pojedyncze litery w stringu).

Na razie jeszcze do tego nie doszedłem także nie chciałbym sobie namieszać.

Dobrze jest przy procedurze/funkcji bez parametrów pisać puste nawiasy (tzn. np tak: procedure obroc(); ) i przy wywołaniu także

Nie wiedziałem o tym, spróbowałem i nie działa :P . Po zastosowaniu pustych nawiasów przy próbie kompilacji wyskakuje Error 2: Identifier expected.

Oprócz tego dobrze jest wywołując funkcję (np. length) nawiasy z argumentami umieszczać bezpośrednio za nazwą (czyli np. length(wejscie) a NIE length (wejscie) )

Zapamiętane :)

I na koniec najważniejsze: mam nadzieję, że pisząc program stosujesz wcięcia (spacje albo tabulatory) i ogólnie jakiś sposób formatowania tekstu?

Pisząc program stosuję wcięcia tzn. rzeczy odpowiadające sobie takie jak Begin-End czy if-else stawiam w tej samej kolumnie ale jak sam stwierdziłeś GOL zmazał spacje.

Dlaczego w spoilerze?! :| Ma to jakieś głębsze uzasadnienie oprócz chęci bycia fajnym i jednoczesnego zniechęcenia kogokolwiek do rzucenia choćby okiem na ten kod?

Zrobiłem to w odwrotnym celu ale jak widać nie bardzo mi wyszło. Powodów było parę:
- Chciałem żeby osoba najpierw przeczytała wstęp a nie rzuciła się na kod.
- Aby post był bardziej czytelny. Ze swoich doświadczeń wiem że jeżeli post jest obszerny to połowie w ogóle nie chcę się go czytać.
- Podejrzewałem że w pisząc kod nie całkiem poszedłem w dobrym kierunku a co za tym idzie, wyszedłem z założenia, że gdy znajdzie się osoba która zechce mi pomóc a niezbyt ma pojęcie w tej dziedzinie, nie zasugerowała się moim złym kierunkiem myślenia tylko zrobiła własny kod.





No to w sumie tyle i jeszcze raz dzięki.

© 2000-2024 GRY-OnLine S.A.