poniedziałek, 4 lutego 2008

Tablice

Tym razem krócej, dziś na infie było zadanie następującej treści....

Napisz program, który zapełni tablicę 20liczbami losowymi z zakresu 1 do 10, a następnie sprawdzi czy występuje wśród nich liczba wczytana z klawiatury.

Na podstawie tego polecenia stworzyłem 5 sic! programów:

v1- zapełniamy tablicę i wypisujemy wartości;
v2- zapełniamy tablicę, pytamy o liczbę, wyświetlamy ilość wystąpień;
v3- zapełniamy tablicę, pytamy o liczbę, wyświetlamy ilość wystąpień, i wszystkie wartości tablicy - tak dla sprawdzenia;p;
v4- zapełniamy tablicę, i wypisujemy ilość wystąpień każdej wartości 1..10;
v5- zapełniamy tablicę, i wypisujemy ilość wystąpień każdej wartości 1..10, dodatkowo wyświetla zawartość całej tablicy;

Wszystko do pobrania stąd: http://bzyx90.googlepages.com/tablica.zip

Licencja: http://creativecommons.org/licenses/by/2.5/pl/

Pozwolę zamieścić program początkowy, i program spełniający wszystkie wymagania, polecenia:

Na coś takiego, można zużyć 45 min lekcji ;]

program tablica_v1;
var
tablica:array[1..20] of byte; {Definujemy tablicę o 20 komórakch,czyli 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}
i,a:byte; {Zmienne pomocnicze}
begin
Randomize; {Inicjalizacja generatora liczb losowych}
for i:=1 to 20 do {Dzięki tej pętli nasze działania opierają się na całej tablicy}
tablica[i]:=random(10)+1; {pierwsza cześć w trakcie działania wygląda następująco }
{tablica[1], tablica[2]...tablica[20] są to kolejne komórki tablicy}
{część 2 przypisuje loswową liczbę z zakresu 1 do 11}
for i:=1 to 20 do {j.w}
writeln(tablica[i]); {wypisywanie wartości kolejnych komórek}
readln; {to tylko 'blokuje' ekran po wypisaniu}
end.

Jednak, ażeby program spełniał wymagania musi wyglądać mniej więcej tak:

program tablica_v2;
var
tablica:array[1..20] of byte; {Definujemy tablicę o 20 komórakch,czyli 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}
i,a,k:byte; {Zmienne pomocnicze}
begin
k:=0; {tak będzie bezpieczniej}
Randomize; {Inicjalizacja generatora liczb losowych}
for i:=1 to 20 do {Dzięki tej pętli nasze działania opierają się na całej tablicy}
tablica[i]:=random(10)+1; {pierwsza cześć w trakcie działania wygląda następująco }
{tablica[1], tablica[2]...tablica[20] są to kolejne komórki tablicy}
{część 2 przypisuje loswową liczbę z zakresu 1 do 11}
write('Podaj wartość elementu jaki chcesz znaleść(min.1 max.10) '); {Chyba rozumimy}
readln(a); {odczytujemy wartość jaką chcemy zmaleść}
for i:=1 to 20 do {j.w}
if tablica[i]=a then {sprawdzamy czy komórka tablicy jest 'równa' naszej magicznej licznie}
k:=k+1; {Prosty trik, jeżeli liczba występuje zwiększamy licznik o 1}
writeln('Liczba ',a, ' występuje ',k, ' razy.'); {to chyba wiadome}
readln; {to tylko 'blokuje' ekran po wypisaniu}
end.
No cóż, polecam pobrać wszystko zaznajomić się z wszystkimi programami i ich źródłami, jak zwykle zachęcam do komentarzy.

niedziela, 3 lutego 2008

Zakończ program z zabezpieczeniem

Zaintrygowany, prostym pytaniem, postanowiłem napisać procedurę pozwalającą zakończyć program, wcześniej prosząc o podanie znaku z klawiatury T, aby zakończyć, N, aby kontynuować. Zastanówmy się co się stanie jeśli nie podamy, ani T, ani N, tylko np. H, wtedy wbrew naszym oczekiwaniom, program będzie się zachowywał tak jakbyśmy podali T. W wielu przypadkach taka sytuacja może doprowadzić do rozstroju nerwowego użytkownika, dlatego napisałem prostą procedurę, która zabezpiecza nas przed niechcianą kontynuacją.

Całość można pobrać z tąd, wersję z i bez komentarzy, objaśniających działanie. http://bzyx90.googlepages.com/zakoncz-v2.zip Całość na licencji:

Creative Commons License





Treść programu, na żywca proszę bardzo:

var
c:char;

procedure zakoncz;
begin
write('Zakonczyć T/N ?');
readln(c);
c:=upcase(c);
if c <> 'T' then
begin
if c <> 'N' then
begin
writeln('Podano zły znak');
zakoncz;
end;
end;
end;

begin
repeat
zakoncz;
until c='T'
end.

Sposób użycia, po prostu piszemy program, między0 "repeat", a "zakoncz;" reszta, zrobi się sama. Jeśli podamy nieprawidłowy znak otrzymamy komunikat "Zły znak" i zostaniemy poproszeni o podanie innego. W tej chwili program zakańcza się po podaniu T lub t, ale nic nie szkodzi na przeszkodzie aby zakańczał się po podaniu N lub n, wystarczy zmienić c='T' na c='N'. W razie pytań proszę o komentarze, wszelkie oceny, problemy, i wszystko inne proszę w komentarzach.

Całość sprawdzona w Free Pascal Compiler . Poprawione, pliki wersja bez komentarzy nie działała.