GRY-Online.pl --> Archiwum Forum

Pascal po raz (mam nadzieję) ostatni

23.01.2007
18:16
smile
[1]

Hitman14 [ Bad N Fluenz ]

Pascal po raz (mam nadzieję) ostatni

Czy ktoś byłby na tyle dobry i mógłby mi wytłumaczyć, jak powinien wyglądać program, który będzie szyfrował pisaną wiadomość za pomocą funkcji CASE? Chodzi o to, że gdy np. naciśnie się P, komputer napisze O, czyli literę sąsiednią z prawej strony na klawiaturze. Przykładowe słowo - KIOSK-->LOPDL.

To NIE jest moje zadanie domowe. Nie jest to też żadna praca semestralna (już oddałem :)). Orientuję się co nieco w Pascalu (na tyle na ile można się orientować po kilku zajęciach), ale właśnie napisanie takiego programu to dla mnie czarna magia - chciałbym zapełnić lukę w wiedzy.

Pomoże ktoś? :)

23.01.2007
20:33
smile
[2]

Arxel [ Legend ]

W ogóle nie znam się na pascalu, trochę bawiłem się w C++

A da się przypisać każdej literze inną? tak jak przypisuje się stałe wartości (na za pi=3,14)
i twtedy po wpisaniu w programie liter komputer kodował je wg podanych zmiennych...
Nie wiem czy w ogóle coś takiego da się zrobić ale o ile pamiętam to sam kiedys chciałem taki program kodujący stworzyć ale zabrakło mi chęci:P

23.01.2007
20:36
[3]

Hitman14 [ Bad N Fluenz ]

To się da zrobić - niby właśnie dzięki użyciu tego CASE. Dla kogoś zorientowanego w Pascalu (bardziej ode mnie :)) to powinno być zadanie na 5-10 minut.

23.01.2007
22:29
smile
[4]

Hitman14 [ Bad N Fluenz ]

Pomocyyyy.... :)

23.01.2007
22:38
smile
[5]

@$D@F [ Generaďż˝ ]

google nie gryzie


jesli chcesz zrobic szyfrowanie to proponuje zapisywac do pliku, jest bardziej praktyczne ;p

23.01.2007
22:50
[6]

Hitman14 [ Bad N Fluenz ]

@$D@F --> Dzięki za link, rzucę okiem, ale.. ja znam podstawy. Rozumiem znaczną część tego, co może być na początkowych zajęciach z Pascala. Nie wiem jednak, w jaki sposób stworzyć właśnie taki program używając CASE.

zapisywac do pliku

Yyy... czyli co? :>

Szyfrowanie ma wyglądać tak, jak w podanym zadaniu. :)

23.01.2007
22:55
smile
[7]

@$D@F [ Generaďż˝ ]

mi sie nie chce traz za bardzo nad tym siedziec, ide spac, a jtro nie mam czasu, ale zagladne tutaj w czwartek jak by co ;p

piszesz ze znasz podstawy a nie potrafisz programu zinterpretowac ;p

...
case operator of
'a': writeln ('s');
's': writeln ('d');
'd': writeln ('f');
'f': writeln ('g');
....

chyba tak ma byc, nie sprawdzałem a case uzywalem 3 lata temu ;p

a zapis do pliku, wpisujesz tekst i on automatycznie wpisuje wszystko w plik, potem mozesz go sobie dowolnie zmieniac recznie, np wyslac komus ;p

23.01.2007
22:59
[8]

Didier z Rivii [ life 4 sound ]

a koniecznie musisz uzywac instrukcji CASE?

da sie to duzo latwiej zrobic bez niej...
- wczytujesz do zmiennej literke
- odpowiednia funkcja (nie pamietam jej nazwy) przerabiasz literke na jej numer w kodzie ascii i zapisujesz go do innej zmiennej np. x
- robisz x=x+1;
- funkcja odwrotna do poprzedniej zmieniasz numerek ascii na literke i ukladasz w tablice w ktorej dostaniesz slowo

23.01.2007
23:01
smile
[9]

Hitman14 [ Bad N Fluenz ]

a koniecznie musisz uzywac instrukcji CASE?

Niestety.

Najlepszym rozwiązaniem dla mnie byłby post z dokładnym zapisem tego programu, linijka po linijce... Wierzę w ludzi i ich chęć czynienia dobra. :)

Dobra, dlaczego muszę? Egzamin na koniec semestru. 10 osób na sali, 10 zadań do losowania. 9 na 10 jestem w stanie zrobić bez większego problemu. Niestety losuję to jedno - właśnie takie, które opisałem. W piątek mam drugie podejście. Wolałbym być przygotowany, gdybym znowu trafił na to samo...

23.01.2007
23:02
[10]

@$D@F [ Generaďż˝ ]

to jest do szkoly ? dlaczego musisz ?

Didier - if ?

23.01.2007
23:18
[11]

Didier z Rivii [ life 4 sound ]

@$D@F --> nie, specyficzna funkcja ktora wywoluje od razu daje kod. uzywalem jej kiedys w jakims programiku :)


Hitman14 --> oto cala filozofia uzycia case w tym programie:
pobierasz literke od uzytkownika i wpisujesz w zmienna "znak":


case znak of
'a': znak_2 := 'b';
'b': znak_2 := 'c';
'c': znak_2 := 'd';
'd': znak_2 := 'e';
.... itd
'z': znak_2 := 'a';
end;



23.01.2007
23:27
[12]

Hitman14 [ Bad N Fluenz ]

Czyli tak? Tylko nie bijcie, jeśli się zbłaźnię tym postem... :)

program szyfr;
uses crt;
var
znak, znak_2: char;
begin
ClrScr;
Writeln('Podaj wyraz ');
Readln(znak);
case znak of
'k': znak_2 := 'l';
'i': znak_2 := 'o';
'o': znak_2 := 'p';
's': znak_2 := 'd';
Readln;
end
end.

23.01.2007
23:30
[13]

@$D@F [ Generaďż˝ ]

jesli juz to
case
warunki
koniec case
wypisz znak

wszystko w petli

23.01.2007
23:33
smile
[14]

Hitman14 [ Bad N Fluenz ]

Czy ja musiałem dostać akurat TO zadanie?

@$D@F --> Jakby ci to powiedzieć... Mógłbyś poprawić ten mój zapis wg twoich wskazówek? Będę ci wdzięczny do końca życia.

23.01.2007
23:36
[15]

@$D@F [ Generaďż˝ ]

na kiedy potrzebujesz?

23.01.2007
23:38
[16]

Hitman14 [ Bad N Fluenz ]

<z cichą nadzieją w głosie> Skoro w piątek znowu egzamin, to najpóźniej w czwartek powinienem ogarniać jak stworzyć taki program...

No egzamin, egzamin. Zedytowałem posta [9], jeśli nie zauważyłeś. ;)

23.01.2007
23:40
smile
[17]

@$D@F [ Generaďż˝ ]

egzamin powiadasz ? musze pascala sciagnac bo nie mam na kompie, to zajmie chwile ;)

23.01.2007
23:44
smile
[18]

Hitman14 [ Bad N Fluenz ]

BTW, pokombinowałbym co nieco w Pascalu, ale -->


OOO... Nevermind, już działa.. :) Pascal, nie program ;)

24.01.2007
00:01
smile
[19]

Hitman14 [ Bad N Fluenz ]

Tak przy okazji (zupełnie inny program) - dlaczego wywala mi tutaj ERROR 200 - division by zero?

program liczba;
uses crt;
Const k=125;
var a: real;
begin
ClrScr;
REPEAT
Writeln('Podaj swoja liczbe ');
Readln(a);
IF a>k THEN Writeln ('Twoja liczba jest za duza!');
IF a<k THEN Writeln ('Twoja liczba jest za mala!');
UNTIL a=k;
Readln;
end.

24.01.2007
00:04
[20]

@$D@F [ Generaďż˝ ]

program szyfrowanie;
uses crt;
var
znak: char;
i: integer;
begin
write ('wpisz tekst - ');
for i:=1 to 20 do
begin
read (znak);
case znak of
'a': write ('litera a ');
'b': write ('litera b ');
'c': write ('litera c ');
end;
end;
writeln('jakis tekst');
readln ();

end.

komentarz
wartosc "i" mozesz dowolnie zmieniac, jak ja osiagnie przestanie szyfrowac
literki oraz tekst mozesz dowolnie zmieniac ;p

zaraz zobacze
edit
u mnie dziala

24.01.2007
00:05
[21]

Didier z Rivii [ life 4 sound ]

a dla ulatwienia podaj jeszcze w ktorej linii? :)

24.01.2007
00:10
[22]

Hitman14 [ Bad N Fluenz ]

U mnie nie działa. :O

Kompilować kompiluje, ale przy włączaniu wywala błąd o division by zero. Tak samo jak w moim programie z posta [12] i [19].

24.01.2007
00:11
[23]

@$D@F [ Generaďż˝ ]

aha, probowalem ustawic zamiast for - repeat until ale cos nie pasowalo to zostawilem tak, z petla sam musisz kombinowac ;p
jak cos to zajze rano przed wyjscie

tutaj masz kurss - nawet nie wiem co jest w srodku


sciagnij sobie free pascala jeszcze raz bo masz zrypany kompilator

24.01.2007
00:14
[24]

kastore [ Troll Slayer ]

Hitman14 --> masz po prostu za starego Turbo pascala. Błąd division by zero wynikał z błędnej obsługi programów wynikowych na prockach powyżej Pentium II. Był do tego specjalny patch. Poza tym poszukaj sobie gdzieś DOS Boxa, to takie środowisko odpalane w XP udające dosa i można w nim pisać programu. Poza tym polecam Delphi.

24.01.2007
00:17
smile
[25]

@$D@F [ Generaďż˝ ]

u mnie pascal dziala i nie ma problemow
fpc-2.0.2.i386-win32.exe

edit
download
ftp://ftp.uni-erlangen.de/pub/mirrors/freepascal/dist/i386-win32-2.0.4/fpc-2.0.4.i386-win32.exe
tutaj masz link

24.01.2007
00:23
[26]

Qbaa [ Senator ]

uses crt;
var
wyr:string;
j:integer;
begin
clrscr;
writeln('Podaj wyraz');
readln(wyr);
j:=1;
while (ord(wyr[0]) > i) do
begin
case wyr[j] of
'a': wyr[j]:='s';
'A': wyr[j]:='S';
'b': wyr[j]:='n';
'B': wyr[j]:='N';

end;
j:=j+1;
end;
write(wyr);
readln;
end.

program z posta [19] działa u mnie dobrze

24.01.2007
00:28
[27]

Hitman14 [ Bad N Fluenz ]

O, widzę nawet, że stary wyjadacz CS'a wziął się do pomocy. :)

OK, już wiem czemu programy mi nie działały - muszę ściągnąć tego patcha albo od nowa całą 30-megową wersję. Tylko że link z posta [25] nie działa..

program z posta [19] działa u mnie dobrze

Ja to mam szczęście. Kumpel siedzący obok dostał właśnie do napisania coś takiego. Gdyby nie moje podpowiedzi, to by nie zaliczył. Odtworzyłem to z pamięci w kilka minut. Ale ja oczywiście musiałem wylosować takie coś...

EDIT:

Dobra, już wszystko jasne - zaczęło się ściągać. :) Dzięki! @$D@F, jesteś moim mistrzem. :)
Qbaa też, a oprócz tego nieźle kara w Countera. ;)

Jak się ściągnie, to pokombinuję z tym, co mi podaliście. :)

24.01.2007
00:30
[28]

@$D@F [ Generaďż˝ ]

ktory link nie dziala ? jeden jest do pliku na ftp a drugi do strony z tym linkiem

ew

pobierz
intel/i386
* Win32 (Windows 95, 98, ME, NT, 2000, XP)

wybierasz serwer z jakiego sciagsz

dobranoc

24.01.2007
00:31
smile
[29]

Qbaa [ Senator ]

nie mogę już edytować na wersję ostateczną, zabrakło kilka sekund :)

uses crt;
var
wyr:string;
j:integer;
begin
clrscr;
writeln('Podaj wyraz');
readln(wyr);
j:=1;
while (ord(wyr[0]) >= j) do
begin
case wyr[j] of
'a': wyr[j]:='s';
'A': wyr[j]:='S';
'b': wyr[j]:='n';
'B': wyr[j]:='N';

end;
j:=j+1;
end;
write(wyr);
readln;
end.

ps.
znalazłem patcha do turbo pascala 7 i 7.01

24.01.2007
01:47
smile
[30]

Hitman14 [ Bad N Fluenz ]

Ściągnąłem.

I... wg zapisu, który podał Qbaa działa. Ale... czy aby na pewno to miało tak wyglądać?

Chodzi mi o to, że gdy napisze to przykładowe KIOSK i nacisnę enter, to program linijkę niżej poda mi zaszyfrowane "LOPDL". Nie jestem pewien, czy to miało tak wyglądać - nie da się tego zrobić tak, żeby program OD RAZU wyświetlał zamienione litery, czyli - wduszam K, od razu na monitorze widzę L, wduszam I, widzę O, itd.?

Może po prostu przekombinowałem nieco, ale warto zapytać. :)

W każdym razie wielkie dzięki dla każdego, który coś tu napisał - w szczególności dla ciebie @$D@F, za wielką cierpliwość dla mojego ubogiego w wiedzę programistyczną umysłu, i dla ciebie, Qbaa, za dokładność i konkrety. :)

Teraz pozostaje mi rozszyfrować co znaczy linijka while (ord(wyr[0]) >= j) do oraz co do tego wszystkiego ma zmienna 'j' i jej podliczanie. Ale nie będę już wam truł (tego już wystarczy ;)) , z tym poradzę sobie jakoś sam. :)

24.01.2007
10:35
[31]

nagytow [ Firestarter ]

Postanowilem dorzucic swoje trzy grosze :)

Przede wszystkim, do programowania w pascalu polecam Dev-Pascal ( ). Oczywiscie program jest darmowy (zawiera free pascala).

Przede wszystkim uzycie case jest zbedne (i niewygodne). Latwiej uzyc inc. Aby nie czekac na wpisanie calego slowa i od razu widziec zaszyfrowany wynik uzyj funkcji readkey. Nizej masz przyklad, wystarczy dorzucic petle, ktora czeka na wcisniecie entera.

program crypt;
uses crt;
var c:char;
begin
c:=readkey;
inc(c);
write(c);
end.

24.01.2007
11:56
[32]

Scatterhead [ łapaj dzień ]

zgodze się z nagytow:

instrukcja case jest tutaj lekko powiedzieć zbędna... wystarczy do kodu danego znaku dodać jeden, a gdy dochodzi do pewnej granicy wrócić do początku

program crypt;
uses crt;
var c:char;
begin
c:=readkey;
inc(c);
if c > 'Z' then c := 'a'; // jezeli wyszlo poza duze Z wracaj do a (to jest do zmiany, moze wracac np do zera, nie pamietam dokladnie tablicy ascii jak tam bylo)
write(c);
end.

24.01.2007
11:58
[33]

diabelek1 [ szczęśliwy ]

Ale autor watku napisal, ze wynikiem nie ma byc kolejna litera alfabetu tylko litera na prawo od zrodlowej na klawiaturze. Tzn dla A -> S a nie dla A -> B

24.01.2007
12:11
[34]

nagytow [ Firestarter ]

Ah, zle przeczytalem. W takim razie case oczywiscie pasuje :)

24.01.2007
17:21
smile
[35]

Qbaa [ Senator ]

Chodzi mi o to, że gdy napisze to przykładowe KIOSK i nacisnę enter, to program linijkę niżej poda mi zaszyfrowane "LOPDL". Nie jestem pewien, czy to miało tak wyglądać - nie da się tego zrobić tak, żeby program OD RAZU wyświetlał zamienione litery, czyli - wduszam K, od razu na monitorze widzę L, wduszam I, widzę O, itd.?

uses crt;
var
znak:char;
begin
clrscr;
writeln('Podaj wyraz');
znak:=readkey;
while (znak <> #13) do
begin
case znak of
'a': znak:='s';
'A': znak:='S';
'b': znak:='n';
'B': znak:='N';
end;
write(znak);
znak:=readkey;
end;
end.

teraz będzie konwertować na bierząco wpisywany tekst. kończysz enterem.

post [30]
while (ord(wyr[0]) >= j) do, można zastąpić while (length(wyr) >= j) do
dzieki j wiemy jak dlugo chodzic po tej petli, zeby przerobic calego stringa.

© 2000-2024 GRY-OnLine S.A.