Dalsze przykłady prostych programów Uwaga: funkcja random(i

Transkrypt

Dalsze przykłady prostych programów Uwaga: funkcja random(i
Dalsze przykłady prostych programów
Uwaga: funkcja random(i) oraz procedura randomize dowiedzieć się samemu.
1. Schemat Hornera
(Dotyczy obliczania wartości wielomianu)
Weźmy pod uwagę wielomian stopnia n:
wn(x) = a0xn + a1xn-1 + ... +an-1x + an
Powyższy wielomian możemy przekształcić:
wn(x) = (a0xn-1 + a1xn-2 + ... + an-1)x + an
Kontynując przekształcanie otrzymujemy:
wn(x) = (...((a0x + a1)x + a2)x +...+ an-1)x + an
Opierając się na powyższych rozważaniach wartość wielomianu wn(x), dla danego x, możemy
obliczyć w kilku krokach:
w := a0
w := w *x + a1
w := w *x + a2
...
w := w *x + an
Zauważmy, że indeksy współczynników są „w odwróconej kolejności” w stosunku do potęg x
prosty przykład;
uses crt;
program Horner;
{Obliczamy wartosc wielomianu w(x)=3x3 - 4x2 + 4x - 5
var a0, a1, a2, a3: real;
x, w: real;
{prosty przyklad ilustrujacy schemat}
begin
a0:=3; a1:=-4; a2:=4; a3:=-5;
x:=2.0;
w:=a0;
w:=w*x+a1;
w:=w*x+a2;
w:=w*x+a3;
writeln('Wartosc wielomianu wynosi: ', w:0:2);
writeln('nacisnij ENTER');
readln;
end.
dla x=2.0}
Pełny program
Program wczytuje stopień wielomianu oraz jego współczynniki
oraz wartość x. Zwraca wartość wielomianu
program Horner1;
uses crt;
type
tablica=array[0..1000] of real;
var
a:tablica;
x:real;
i,n:integer;
function wielomian(nn:integer; xx:real; aa:tablica):real;
var j:integer;
suma:real;
begin
suma:=a[1];
for j:=1 to nn do
suma:=suma*xx+aa[j];
wielomian:=suma;
end;
{glowny program}
begin
write(' podaj stopien wielomianu ');
readln(n);
for i:=0 to n do begin
write(' podaj wspolczynnik ',i,' ');
readln(a[i]);
end;
write(' podaj wartosc x ');readln(x);
clrscr;
writeln(' wartosc wielomianu dla x= ',x,' wynosi ',wielomian(n,x,a));
end.
Zabawka: generuje na ekranie w przypadkowych pozycjach (standardowy rkran
80x24)gwiazdki w różnych kolorach. Program przyrywa nasićnięcie dowolnego
2.
klawisza (fynkcja keypressed sprawdza, czy naciśnieto klawisz)
program gwiazdki;
uses crt;
var x, y: integer;
begin
clrscr;
randomize;
repeat
x:=random(79)+1;
y:=random(24)+1;
gotoxy(x,y);
textcolor(random(15));
write('*');
delay(500)
until keypressed;
textcolor(white);
end.
Kolejna zabawka. Zgadywanie liczb. Użytkownik ma zgadnąć liczbę naturalną z
określonego przedziału, którą „pomyślał” komputer. Przeanalizuj program.
Mozesz zmienić występujace w nim stałe (3 i 10). Dlaczego -32768??
3.
Program Zgadywanka;
const a=3; b=10;
var x, odp: integer;
begin
randomize;
x:=a+random(b-a);
odp:=-32768; {zakladamy, ze zaden przedzial takiej liczby nie uwzglednia}
writeln('Twoim zadaniem jest odgadnac liczbe z zakresu od ',a ,' do ',b);
while odp<>x do
begin
write('Jaka liczbe pomyslalem? ');
readln(odp);
if odp>x then writeln('Za duza!');
if odp<x then writeln('Za mala')
end;
writeln('Odgadles!!! Szukana liczba to: ', x);
end.
4. Sprawdzanie, czy wprowadzony ciąg znaków jest palindromem
Palindromem (z greckiego) nazywamy wyraz, który tak samo brzmi, gdy jest czytany wspak.
Palindromami sa na przykład takie wyrazy, jak kajak, zaraz, oko, zakaz, mam itp.
Dane: ciag znaków s
Wynik: komunikat „tak” lub „nie” w zaleznosci od tego, czy s jest palindromem
Kroki:
1. Wczytaj ciag znaków s.
2. Zmiennej i przypisz wartosc 1, zas zmiennej j przypisz wartosc długosc(s).
3. Jesli i jest wieksze lub równe j, wtedy wypisz komunikat „tak” i zakoncz działanie algorytmu.
4. Jesli s[i] jest rozne od s[j], wtedy wypisz komunikat „nie” i zakoncz działanie algorytmu.
5. Powieksz o 1 zmienna i oraz pomniejsz o 1 zmienna j.
6.Przejdz do kroku 3.
program Palindrom;
var s: string;
i, j: integer;
begin
write('Podaj ciag znaków: ');
readln(s);
i := 1; { numer pierwszego znaku }
j := length(s); { numer ostatniego znaku , length jest funkcja standardowa}
while i<j do
begin
if s[i]<>s[j] then
begin
{znaki roznia sie}
writeln('Nie');
halt; {ZOBACZ CO TO!!!!}
end;
{sprawdzamy dalej}
i := i+1;
j := j-1;
end;
{sprawdzenie dobiegło pomyslnie do konca}
writeln('Tak');
end.
5. Największy wspólny dzielnik 2 liczb
program nwd;
uses crt;
var liczba1,liczba2:integer;
function NWD(a,b:integer):integer;
begin
while a<>b do
if a>b then a:=a-b
else b:=b-a;
NWD:=a;
end;
begin
clrscr;
write ('PODAJ LICZBE 1 : ');readln(liczba1);
write ('PODAJ LICZBE 2 : ');readln(liczba2);
writeln('NWD = ',NWD(liczba1,liczba2));
writeln;
writeln('KONIEC - ENTER');
readln;
end.
6. Trójkąt Pascala (co to jest? - dowiedzieć się!!)
{uwaga: typ comp sluzy do zapisywania bardzo duzych licz calkowitych,
64-bity, ALE NIE JEST TYPEM PORZADKOWYM, np. nie mozna stosowac jako licznik
petli}
http://pl.wikibooks.org/wiki/Object_Pascal/Typy_zmiennych#Typy_podstawowe
program trojkat_pascala;
uses crt;
//const l=17; {ilosc skladnikow trojkata (poteg) max 19 bo kompy sie zwieszaja }
var k,n:integer;
l: integer;
Function silnia(n: integer): comp;
{uwaga: typ comp sluzy do zapisywania bardzo duzych licz calkowitych,
64-bity, ALE NIE JEST TYPEM PORZADKOWYM, np. nie mozna stosowac jako licznik
petli}
Begin
If n = 0 Then silnia := 1
Else
silnia := n * silnia(n - 1);
End;
begin
write( 'do jakiego n (n<19!!, bo zawiesi) prowadzic obliczenia? '); readln(l);
clrscr;
for n:=0 to l do
begin
for k:=0 to n do write(silnia(n)/(silnia(k)*silnia(n-k)):0:0,' ');
writeln;
end;
end.
7. Sortowanie „bąbelkowe”. Do tablicy wpisujemy n przypadkowych
liczb całkowitych z zadanego zakresu. Program sortuje ROSNĄCO liczby.
Sortowanie bąbelkowe – patrz:
http://pl.wikipedia.org/wiki/Sortowanie_b%C4%85belkowe
Jak sortować MALEJĄCO?
program sort_babel;
uses crt;
{tutaj mozesz zmienic, 40 to ilosc liczb do sortowania}
const wielkosc=40;{ilosc elementow w tablicy}
var tablica:array[1..wielkosc]of integer;{deklaracja tablicy}
i,l,pom,zakres:integer;{zmienne pomocnicze}
begin
write(' posortuje ',wielkosc,' liczb z zakresu [0..zakres], jaki jest zakres?'); readln(zakres);
clrscr;
randomize;{zainicjonowanie generatora losowan}
for i:=1 to wielkosc do tablica[i]:=random(zakres);{wstawienie losowych wartosci do tablicy}
{ Sortowanie poczatek}
for i:=2 to wielkosc do
begin
l:=i;
repeat
if tablica[l]<tablica[l-1] then begin
pom
:=tablica[l];
tablica[l] :=tablica[l-1];
tablica[l-1]:=pom;
end;
Dec(l);
until(l=1);
end;
{ Sortowanie koniec }
for i:=1 to wielkosc do {wyswietl na ekranie}
begin write(' ',tablica[i]);if i mod 10 = 0 then writeln;end;
end.
Inny program sortowania: sortujemy alfabetycznie wyrazy. Zwróć uwagę,
że operatory relacji (<, >,...) można stosować dla porównywania łańcuchów.
Jak to wówczas działa? DOWIEDZIEĆ SIĘ!!!
program sortowanie_alfabetyczne;
uses crt;
const wielkosc=10;{ilosc elementow w tablicy}
{to mozesz zmienic, mozesz wielkosc czytac z klawiatury}
var tablica:array[1..wielkosc]of string;
i,l:integer;
pom:string;
begin
clrscr;
Writeln('Podaj ',wielkosc,' wyrazow do posortowania.');
writeln;
for i:=1 to wielkosc do
begin
Write('Podaj wyraz nr',i,' : ');
readln(tablica[i]);
end;
writeln;
writeln('POSORTOWANE WYRAZY :');
writeln;
for i:=2 to wielkosc do
begin
for l:=i downto 2 do
if tablica[l]<tablica[l-1] then
begin
pom:=tablica[l];
tablica[l]:=tablica[l-1];
tablica[l-1]:=pom;
end;
end;
for i:=1 to wielkosc do writeln(tablica[i]);
end.
8. Program „totolotek”, losuje okresloną ilość liczb z podanego zakresu
i drukuje je jako ciąg rosnący
program totolotek;
uses crt;
const size=400;
{to jest max zakres liczb, mozna zmienic, ale po co?}
var zakres,ile:integer;
pom,i,j:integer;
tab:array[1..size]of integer;
begin
randomize;
writeln('Program TOTOLOTEK');
writeln;
write( 'Podaj z ilu liczb losowac (max = ',size,')
: ');
readln(zakres);
writeln;
write( 'Podaj ile liczb wylosowac z zakresu 1..',zakres,' : ');
readln(ile);
for i:=1 to ile do
begin
repeat
pom:=1;
tab[i]:=random(zakres)+1;
for j:=1 to i do
begin
if i<>j then if tab[i]=tab[j]then pom:=0;
end;
until (pom=1);
end;
for i:=ile downto 1 do
begin
for j:=2 to i do
begin
if tab[j]<tab[j-1] then
begin
pom:=tab[j];
tab[j]:=tab[j-1];
tab[j-1]:=pom;
end;
end;
end;
clrscr;
writeln;
writeln;
writeln('Oto wylosowane ',ile,' liczb sposrod ',zakres,' :');
writeln;
for i:=1 to ile do write(' ',tab[i]);
{drukujemy pusta linie}
writeln;
end.
9. Program oblicza sumę cyfr liczby typu longint. Jak napisac program,
który obliczałby sumę cyfr np. liczby 100 znaków?
Objaśnienia:
procedura str(liczba,lancuch) zamienia liczbę na łańcuch
funkcja length(lancuch) podaje ilość znaków łańcucha
procedura val(znak,cyfra,blad) zmienia znak na cyfrę, lub zwraca błąd,
gdy znak nie jest cyfrą
program suma_cyfr_liczby;
uses crt;
var liczba:longint;
cyfr:byte;
cyfra:byte;
s:string;
error:integer;
begin
write('Podaj liczbe : ');
readln(liczba);
str(liczba,s);
writeln(s);
readln;
liczba:=0;
for cyfr:=1 to length(s)do
begin
val(s[cyfr],cyfra,error);
liczba:=liczba+cyfra;
end;
writeln('Suma cyfr to ',liczba);
end.