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ś? :)
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
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.
Hitman14 [ Bad N Fluenz ]
Pomocyyyy.... :)
@$D@F [ Generaďż˝ ]
google nie gryzie
jesli chcesz zrobic szyfrowanie to proponuje zapisywac do pliku, jest bardziej praktyczne ;p
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. :)
@$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
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
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...
@$D@F [ Generaďż˝ ]
to jest do szkoly ? dlaczego musisz ?
Didier - if ?
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;
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.
@$D@F [ Generaďż˝ ]
jesli juz to
case
warunki
koniec case
wypisz znak
wszystko w petli
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.
@$D@F [ Generaďż˝ ]
na kiedy potrzebujesz?
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ś. ;)
@$D@F [ Generaďż˝ ]
egzamin powiadasz ? musze pascala sciagnac bo nie mam na kompie, to zajmie chwile ;)
Hitman14 [ Bad N Fluenz ]
BTW, pokombinowałbym co nieco w Pascalu, ale -->
OOO... Nevermind, już działa.. :) Pascal, nie program ;)
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.
@$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
Didier z Rivii [ life 4 sound ]
a dla ulatwienia podaj jeszcze w ktorej linii? :)
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].
@$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
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.
@$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
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
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. :)
@$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
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
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. :)
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.
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.
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
nagytow [ Firestarter ]
Ah, zle przeczytalem. W takim razie case oczywiscie pasuje :)
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.