Rozwiązania zadań z kolokwium z komentarzami do najczęściej popełnianych błędów.
Napisz program, który po wprowadzeniu współrzędnych punktu, wyprowadzi odpowiedź, w której ćwiartce układu współrzędnych znajduje się punkt.
Zadanie, w którym po wczytaniu współrzędnych punktu powinniśmy 4. instrukcjami IF sprawdzić spełnienie nierówności. Użyte instrukcje warunkowe mogą być w najprostszej postaci (bez ELSE).
Pamiętać jednak należy, że używając iloczynów lub sum logicznych warunków musimy je umieszczać w nawiasach !!!
Program zadanie1_zestawA;
USES CRT;
VAR
x,y: REAL;
BEGIN
CLRSCR;
WRITELN(`napisz wartość współrzędnej x');
READLN(x);
WRITELN(`napisz wartość współrzędnej y');
READLN(y);
IF (x>0) AND (y>0) THEN WRITELN(`Punkt jest w I-szej ćwiartce');
IF (x>0) AND (y<0) THEN WRITELN(`Punkt jest w II-giej ćwiartce');
IF (x<0) AND (y<0) THEN WRITELN(`Punkt jest w III-ciej ćwiartce');
IF (x<0) AND (y>0) THEN WRITELN(`Punkt jest w IV-tej ćwiartce');
READLN;
END.
Te ćwiartki mogą się różnić przyjęto ruch zgodnie z ruchem wskazówek zegara, może być inny to tylko kwestia zmian napisów - nie było to oceniane.
Mając dane: zbiór liczb całkowitych A { -5 ≤ x ≤ 10 } oraz zbiór
B {-1 ≤ x ≤ 25 } napisz program, który po wprowadzeniu liczby określi czy należy ona do iloczynu zbiorów A i B.
Obniży wartość zadania napisanie jednej relacji dotyczącej iloczynu zbiorów. Tą czynność ma wykonać program, a nie student. Należy również użyć nierówności nieostrych.
Program zadanie2_zestawA;
USES CRT;
VAR
x: REAL;
BEGIN
CLRSCR;
WRITELN(`napisz wartość x');
READLN(x);
IF (x>=-5) AND (x<=10) AND (x>=-1) AND (x<=25) THEN
WRITELN(`Liczba należy do iloczynu zbiorów' ) ELSE
WRITELN(`Liczba nie należy do iloczynu zbiorów');
READLN;
END.
Mając dany promień koła r, oblicz jego pole powierzchni oraz pole powierzchni kwadratu wpisanego w to koło. Oblicz stosunek powierzchni obu figur.
Na początek nieco podstawowej arytmetyki - jeśli przekątna kwadratu wynosi A to jego bok A/SQRT(2). Pole powierzchni koła o promieniu r to πr2 . Jeśli w koło wpiszemy kwadrat to promień koła wynosi połowę przekątnej kwadratu, więc bok kwadratu wynosi 2r/sqrt(2), zaś pole powierzchni tego kwadratu = sqr(2*r/sqrt(2)). Stosunek powierzchni to pole koła/pole kwadratu.
Program zadanie3_zestawA;
USES CRT;
VAR
r, pko,pkw: REAL;
BEGIN
CLRSCR;
WRITELN(`napisz wartość promienia koła');
READLN(r);
pko:=3.1415*sqr(r);
pkw:=sqr(2*r/sqrt(2));
WRITELN(`Pole koła wynosi `,pko:4:4,' Pole kwadratu wynosi `,pkw:4:4,' stosunek ich powierzchni `, pko/pkw:4:4);
READLN;
END.
Mając daną przekątną kwadratu oblicz pole jego powierzchni oraz pole powierzchni koła wpisanego w kwadrat. Oblicz stosunek powierzchni obu figur.
Zadanie bardzo podobne. Bok kwadratu liczymy identycznie czyli A/sqrt(2). Tym razem połowa boku to promień koła. Spróbuj samodzielnie dokonać obliczeń korzystając z poprzedniego zadania.
Wprowadź z klawiatury ciąg liczb zakończonych zerem. Policz ile z nich jest parzystych. Wynik wyprowadź na ekran.
Zadanie wymaga pętli warunkowej, czyli WHILE lub REPEAT. Załamanie pętli musi zakończyć wprowadzanie danych. Tu uwaga wartością domyślną zmiennej jest ZERO, czyli jeśli wcześniej nie przypiszemy zmiennej wartości 1, to w zależności od pętli wykona się ona raz lub wcale - natychmiast nastąpi załamanie, przecież sprawdzamy dla x<>0.
Należy również pamiętać o typach danych - liczby całkowite oraz to, że 0 mod 2 =0, czyli powiększy wynik. Tu należy pamiętać o zapisaniu programu przed jego uruchomieniem, warunek można zapętlić!!!
Program zadanie_4_zestawA;
USES CRT;
VAR
X,Y: INTEGER;
BEGIN
CLRSCR;
X:=1; {żeby nie było zera lub parzystej}
WHILE X<>0 DO
BEGIN
WRITELN(`NAPISZ LICZBĘ CAŁKOWITĄ'); {odczyt danych w pętli}
READLN(X);
IF (X MOD 2=0) THEN Y:=Y+1; {sprawdzenie parzystości liczby i jeśli spełnione to zwiększenie licznika}
END;
WRITELN(` LICZB PARZYSTYCH BYŁO `,Y-1); {zero też będzie policzone do wyniku!!!, trzeba odjąć 1}
READLN;
END.
Spróbuj wykonać to zadanie dla liczb nieparzystych.
Wyświetlić na ekranie sumę liczb z przedziału 0 ÷ 1000 podzielnych przez 15.
Przystępując do realizacji zadania musimy znać warunek podzielności liczby przez 15, należy użyć funkcji MOD w postaci x mod 15=0. Jeśli reszta z dzielenia przez 15 jest zerem to znaczy, że x jest podzielne bez reszty przez 15. Wykorzystamy pętlę FOR, znamy ilość powtórzeń od 1 do 1000.
Program zadanie_5_zestawA;
USES CRT;
VAR
SUMA,K: LONGINT;
BEGIN
CLRSCR;
FOR K:=1 TO 1000 DO
IF (K MOD 15=0) THEN SUMA:=SUMA+K;
WRITELN(`SUMA LICZB PODZIELNYCH PRZEZ 15 WYNOSI `,SUMA);
READLN;
END.
Wprowadź z klawiatury ciąg liczb zakończonych zerem. Policz ile z nich dzieli się przez 3. Wynik wyprowadź na ekran.
Zadanie podobne do tego z liczbami parzystymi - wykonaj je samodzielnie.
Znaleźć największą wartość całkowitą x, dla której spełniona jest nierówność
2*x2 + x + 10 < 500. Wynik wyprowadź na ekran.
Znów musimy użyć pętli warunkowej, tak obliczoną wartość wyrażenia porównać z warunkiem k<500.
Program zadanie_6_zestawA;
USES CRT;
VAR
X,Y: INTEGER;
BEGIN
CLRSCR;
WHILE Y<500 DO
BEGIN
X:=X+1;
Y:=2*SQR(X)+X+10;
END;
WRITELN(` NAJWIĘKSZA LICZBA SPEŁNIAJĄCA NIERÓWNOŚĆ TO `,X-1); {Trzeba odjąć 1 bo liczba, która załamie pętlę będzie wynikiem, ale jest o jeden za duża o największej spełniającej}
READLN;
END.
Ciało spada swobodnie. Oblicz jaką drogę przebędzie po 1 , 2 , 3 ... 10 sekundach. Wyniki wyświetl na ekranie.
Pętla o znanej liczbie powtórzeń, w której musi być umieszczone wypisywanie wyników.
Wartość przyspieszenia ziemskiego g=9.81 m/s2.
Program zadanie_7_zestawA;
USES CRT;
VAR
K:BYTE;
S:REAL;
CONST
G=9.81;
BEGIN
CLRSCR;
FOR K:=1 TO 10 DO
BEGIN
S:=G*K;
WRITELN(`DROGA PRZEBYTA PRZEZ CIAŁO PO `,K,' SEKUNDACH, WYNOSI `,S:4:4);
END;
READLN;
END.
DO ZESTAWU DLA KOLEJNEJ GRUPY
Napisz program, który wartość zapłaconego podatku, dla progów : do 10.000 - 20%, pomiędzy 10.000 a 20.000 - 30% i powyżej 30.000 - 50%.
Należy wykorzystać instrukcję warunkową IF opisując wspomniane progi podatkowe. W zadaniu jest błąd, co z danymi z przedziału 20.000 - 30.000 ? Należało to skorygować!, np. jak w poniższym programie.
Program zadanie1_zestaw1;
USES CRT;
P,Z:REAL;
BEGIN
WRITELN(`NAPISZ KWOTĘ DO OPODATKOWANIA');
READLN(Z);
IF Z<=10000 THEN P:=Z*0.2;
IF (Z>10000) AND (Z<20000) THEN P:=Z*0.3;
IF Z>=20000 THEN P:=Z*0.5;
WRITELN(`WARTOŚĆ PODATKU OD KWOTY `,Z:6:2,' WYNOSI `,P:6:2);
READLN;
END.
Napisz program, który napisze wyniki pośrednie oraz wynik końcowy dla drogi przebytej w ruchu jednostajnym po upływie 1, 2 , 3 … 10 minut, jeśli obiekt porusza się z szybkością 20 m/minutę.
Zadanie jest bardzo podobne do tego z zakresu pierwszej grupy.
Program zadanie2_zestaw1;
USES CRT;
VAR
K:BYTE;
S:REAL;
BEGIN
CLRSCR;
FOR K:=1 TO 10 DO
BEGIN
S:=20*K;
WRITELN(`DROGA PRZEBYTA PRZEZ CIAŁO PO `,K,' SEKUNDACH, WYNOSI `,S:4:4);
END;
READLN;
END.
Napisz program, który policzy pole powierzchni okręgu i kwadratu opisanego na nim. Daną wczytywaną z klawiatury jest promień okręgu.
Średnica okręgu to bok kwadratu.
Program zadanie3_zestaw1;
USES CRT;
VAR
r, pko,pkw: REAL;
BEGIN
CLRSCR;
WRITELN(`napisz wartość promienia koła');
READLN(r);
pko:=3.1415*sqr(r);
pkw:=SQR(2*r);
WRITELN(`Pole koła wynosi `,pko:4:4,' Pole kwadratu wynosi `,pkw:4:4,' stosunek ich powierzchni `, pko/pkw:4:4);
READLN;
END.
Napisz program, który zależnie od wyboru policzy: pole powierzchni kwadratu lub pole powierzchni koła. Program musi pytać się o dokonanie wyboru, a następnie musi odczytać z klawiatury długość boku lub promień koła.
Tu należy wykorzystać instrukcję wyboru CASE, jest ona wyraźnie zaznaczona w zadaniu.
Program zadanie4_zestaw1;
USES CRT;
VAR
r, p: REAL;
w:CHAR;
BEGIN
CLRSCR;
WRITELN(`napisz co chcesz policzyć: k - koło, s - kwadrat');
READLN(w);
CASE w OF
`k':
BEGIN
WRITELN(`PODAJ PROMIEŃ KOŁA');
READLN(r);
p:=3.1415*sqr(r);
WRITELN(`Pole powierzchni koła wynosi `,p:5:5);
END;
`s':
BEGIN
WRITELN(`PODAJ DŁUGOŚĆ BOKU KWADRATU');
READLN(r);
p:=SQR(r);
WRITELN(`Pole powierzchni kwadratu wynosi `,p:5:5);
END;
ELSE WRITELN(`DOKONAŁEŚ ZŁEGO WYBORU');
END;
READLN;
END.
Napisz program, który będzie wczytywać liczby aż do napisania zera. Policz sumę liczb dodatnich oraz liczb ujemnych.
Tu musimy użyć pętli warunkowej. W poprzednich zadaniach wykorzystywaliśmy pętlę WHILE, teraz wykonamy zadanie pętlą REPEAT.
PROGRAM zadanie5_zestaw1;
USES CRT
VAR k,sd,su : REAL;
BEGIN
CLRSCR;
REPEAT
writeln('Podaj liczbę całkowitą dodatnią lub ujemną');
readln(k);
if k<0 then su:=su+k;
if k>0 then sd:=sd+k;
UNTIL k=0;
writeln(`Suma liczb dodatnich wynosi ', sd:4:4);
writeln('Suma liczb ujemnych wynosi ', su:4:4);
READLN;
END.
Ta pętla również jest lepsza w pierwszych zadaniach, spróbuj je wykonać w pętli REPEAT.
Napisz program, który policzy kolejne potęgi liczby trzy. Wyniki napisz od wykładników 1 do 10.
Realizacja zadania pętlą o znanej ilości powtórzeń - wypisywane wyniki pośrednie. Można użyć innych pętli, ale wówczas należałoby samemu zmieniać wartość licznika.
Program zadanie6_zestaw1;
USES CRT;
VAR
K:BYTE;
S:LONGINT;
BEGIN
CLRSCR;
S:=1;
FOR K:=1 TO 10 DO
BEGIN
S:=S*3;
WRITELN(`TRZY DO POTĘGI `,K,' WYNOSI `,S);
END;
READLN;
END.
Napisz program, który policzy największą liczbę x spełniającą nierówność 22x2 - 2x -5 < 1350.
Takie zadanie było na początku, ale teraz użyjemy pętli REPEAT.
Program zadanie7_zestaw1;
USES CRT;
VAR
K:BYTE;
S:REAL;
BEGIN
CLRSCR;
REPEAT
K:=K+1;
S:=22*SQR(K)-2*K-5;
UNTIL S>1350;
WRITELN(` NAJWIĘKSZA LICZBA SPEŁNIAJĄCA NIERÓWNOŚĆ WYNOSI `,K-1);
READLN;
END.
Napisz program, który po dokonaniu wyboru policzy objętość kuli lub sześcianu. Program musi zaproponować możliwość wyboru i kolejno wczytać długość boku lub promień kuli.
Zadanie ma wyraźnie zaznaczone użycie instrukcji wyboru CASE. Podobne już było z kołem i kwadratem, więc spróbuj je wykonać sam.
Napisz program, który wypisze drogę przebytą przez pocisk karabinowy poruszający się ruchem jednostajnie przyspieszonym po upływie 1,2,3,…,20 sekundach. Przyspieszenie 10m/s2.
Bardzo podobne jest zadanie związane z ruchem spadającego ciała, droga przebyta w ruchu jednostajnie przyspieszonym s=at2. Wzorując się na wcześniejszych zadaniach wykonaj je samodzielnie.
POWODZENIA
Mamy nadzieję, że łatwiej zrozumiesz to co napisałeś na kolokwium.
6