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.