1 Wprowadzenie
1. Ćwiczenie 1 — łagodny start. Obejmuje praktyczną realizację programów omówionych na pierwszym wykładzie. Należy zastosować wersje wykorzy- stujące elementy języka C++. Ćwiczenia do wykonania: Przeliczanie od- ległości z kilometrów na mile (zobacz wykład):
http://uranos.cto.us.edu.pl/~siminski/jpo/jpo_w_01.pdf. Wyzna- czanie średniego spalania (zobacz wykład):
http://uranos.cto.us.edu.pl/~siminski/jpo/jpo_w_01.pdf.
2. Przelicznik miar: Napisać program przeliczający odległość podaną w me- trach na następujące miary: cal, stopę, jard, milę lądową, sążnie, mile morskie, angstremy, kable, łokcie, wiorsty, itp.
3. Ćwiczenie 2 — instrukcje. Wyznaczanie średniego spalania z kontrolą po- prawności danych — dystansu i ilości (zobacz wykład)
http://uranos.cto.us.edu.pl/~siminski/jpo/jpo_w_02.pdf.
4. Gra w [Za dużo, za mało] (zobacz wykład)
http://uranos.cto.us.edu.pl/~siminski/jpo/jpo_w_02.pdf.
5. Kalkulator pozwalający na wykonywanie operacji dodawania, odejmowa- nia, mnożenia i dzielenia na dwóch liczbach rzeczywistych. Program ma identyfikować sytuację wprowadzenia błędnego symbolu działania oraz próbę dzielenia przez zero. Podobnie jak w poprzednich przykładach zakła- damy, że użytkownik wprowadzi prawidłowe liczby. Scenariusz działania programu:
• Program wyświetla informację o swoim przeznaczeniu.
• Wczytuje pierwszą liczbę.
• Wczytuje symbol operacji arytmetycznej: +, -, *, /.
• Wczytuje drugą liczbę.
Wyświetla wynik lub — w razie konieczności — informację o niemożności wykonania działania. Program kończy swoje działanie po naciśnięciu przez użytkownika klawisza Enter.
6. Równanie kwadratowe. Program wczytuje współczynniki A, B i C równa- nia kwadratowego w postaci Ax2+Bx+C=0, wyznacza jego rozwiązania w zakresie liczb rzeczywistych. Program powinien wyznaczyć tzw. deltę, i w zależności od jej wartości poinformować użytkownika o braku pierwiast- ków rzeczywistych, wartości jednego pierwiastka podwójnego lub wartości dwóch pierwiastków.
7. Układ równań liniowych. Dany jest układ równań liniowych: A1x + B1y
= C1 A2x + B2y = C2 Program wczytuje współczynniki obu równań:
A1, B1, C1, A2, B2, C2. Rozwiązanie układu równań może polegać na
wyliczeniu odpowiednich wyznaczników W, Wx, Wy a następnie ich ilo- razów — zgodnie z informacjami poznanym na zajęciach z matematyki.
Należy identyfikować i prawidłowo zareagować na sytuację, gdy układ jest nieokreślony.
8. Prawa wyborcze.Napisać program wczytujący liczbę całkowitą należącą do przedziału (1..15] (lewostronnie otwarty, prawostronnie domknięty).
Liczba ta określa wiek pewnej osoby. Zadaniem programu jest stwierdze- nie czy ta osoba: posiada bierne prawo wyborcze (ukończone 18 lat), po- siada czynne prawo wyborcze (ukończone 21 lat), może kandydować do senatu (ukończone 30 lat), może kandydować na prezydenta (ukończone 35 lat). Dodatkowo, dla osób niepełnoletnich należy wyznaczyć i wypro- wadzić informację ile lat pozostało do osiągnięcia pełnoletności, a dla osób pełnoletnich, od ilu lat są pełnoletnie. Program powinien umożliwiać wie- lokrotne wykonywanie opisanych czynności.
9. Wypłata. Napisać program wczytujący liczbę całkowitą należącą do prze- działu [1..31] oraz liczbę rzeczywistą z przedziału [50..20] (oba przedziały obustronnie domknięte). Liczba całkowita określa liczbę dniówek przepra- cowanych przez pewnego pracownika, liczba rzeczywista stawkę za dniówką.
Kwota wypłaty jest iloczynem liczby przepracowanych dniówek i stawki za dniówkę. Dla pracowników, którzy przepracowali od 20 do 15 dniówek dolicza się premię wysokości 100zł, dla tych, którzy przepracowali więcej niż 25 dniówek, dolicza się premię w wysokości 200zł. Zadaniem programu jest wyliczenie kwoty wypłaty, uwzględniającej dodatek zależny od liczby przepracowanych godzin. Program powinien umożliwiać wielokrotne wy- konywanie opisanych czynności.
10. Napisz program obliczający i drukujący na ekranie objętości i pola po- wierzchni następujących brył:
• kuli
• prostopadłoscianu
• stożka
(Pamiętaj, ze niezbedne wymiary program uzyskuje od uzytkownika ...) 11. Napisz program, który pyta o oceny z min. 5 róznych przedmiotów danego
ucznia / studenta, a nastepnie liczy srednia tych ocen. Sprawdz ponadto, czy studentowi o takiej sredniej przysługuje stypendium naukowe (jesli srednia > 4.1)
12. Napisz program, który drukuj piramidke postaci:
*
* *
* * *
Piramidka moze byc tworzona z dowolnych znaków. Glebokosc piramidki podaje uzytkownik
13. Napisz program, który drukuje na ekranie po wpisaniu przez użytkownika wyrazu: hello piramidke postaci:
h ee lll llll ooooo
14. Używając dowolnie wybranej pętli napisz program, który oblicza wysokość odsetek na rachunku bankowym w ciągu roku, przy założeniu, że zarówno wysokość kwoty początkowej jak i oprocentowanie w skali roku, a także długość okresu kapitalizacji (w dniach) podawane są przez użytkownika.
15. Napisz program, który odczytuje dane wejściowe aż do napotkania znaku
#, a następnie wyświetla każdy wpisany znak wraz z jego dziesiętnym kodel ASCII. W jednym wierszu powinno znajdować się osiem par znak - kod. Propozycja: użyj licznika znaków i operatora modulo (%) do wy- świetlania znaku nowej linii w co ósmym cyklu pętli.
16. Napisz program, który pobiera liczby całkowite do momentu wpisania przez użytkownika cyfry 0.Po zakończeniu wczytywania danych wejścio- wych program powinien wyświetlić ilość wpisanych liczb parzystych (z wyłączeniem zera) i ich średnią wartość oraz ilość wpisanych liczb niepa- rzystych i ich średnią wartość.
17. Korzystając z instrukcji if..else, napisz program, który odczytuje dane wejściowe do znaku #, zastępuje każdą kropkę wykrzyknikiem, a każdy wykrzyknik - dwoma wykorzyknikami, oraz wyświetla liczbę zmian, jaką wykonał.
18. Napisz program, który pobiera liczbę przepracowanych godzin w tygodniu, a następnie wyświetla wynagrodzenie brutto, podatek oraz wynagrodzenie netto. Przyjmij następujące wartości:
• podstawowe wynagrodzenie = 40 zł/godz.
• nadgodziny (powyżej 40 godzin w tygodniu) = 150 % podstawowego wynagrodzenia
• podatek
15 % dla pierwszych 1200 zł 20 % dla kolejnych 600 zł 25 % dla reszty wynagrodzenia.
użyj stałych # DEFINE.
19. Zmodyfikuj poprzednie zadanie tak, aby program wyświetlał menu po- zwalające wybrać stawkę wynagrodzenia (zastosuj instrukcje switch). Po uruchomieniu program powinien wyświetlać coś w rodzaju:
***********************************************************
Podaj liczbe odpowiadajaca zadanej stawce wynagrodzenia lub opcji:
1. 35 zł/godz.
2. 37 zł/godz.
3. 40 zł/godz.
4. 45 zł/godz.
5. wyjście
***********************************************************
W przypadku wybrania opcji od 1 do 4, program powinien poprosić o po- danie liczby przepracowanych godzin. Po wyświetleniu wyników, program powinien wrócić do menu. W przypadku wpisania wartości innej niż cyfry z przedziału od 1 do 5, program powinien przypomnieć użytkownikowi o dostępnych opcjach, a następnie wrócić do menu. Stawki wynagrodzenia i podatku przedstaw za pomocą stałych #define.
20. Amerykańska skala podatkowa z roku 1988 była jedną najprostszych w ostatnich czasach. Składała się ona z czterech kategorii, z których każda zawierała dwie stawki. Oto jej podsumowanie: Na przykład, osoba stanu
kategoria podatek
stan wolny 15 % dochodu do 17850 $ + 28 % reszty Głowa rodziny 15 % dochodu do 23900 $ + 28 % reszty Małżeństwo, rozliczenie wspólne 15 % dochodu do 29750 $ + 28 % reszty Małżeństwo, rozliczenie osobne 15 % dochodu do 14875 $ + 28 % reszty
wolnego, która osiągnęła dochód w wysokości 20000 dolarów, jest winna państwu 0.15 × 17850 $ + 0.28 × (20000 $ - 17850$). Napisz program, który pobiera kategorię i dochód podlegający opodoatkowaniu, a nastepnie oblicza wysokość kwoty podatku. Użyj pętli tak, aby użytkownik mógł obliczyć podatek dla kilku różnych przypadków w czasie jednej sesji z programem.
2 TABLICE
2.1 Proste programy na tablicach
1. Napisz program, który wczyta 15 liczb róznych liczb całkowitych do jedno- wymiarowej tablicy, a nastepnie znajduje najwieksza i najmniejsza z nich, a takze ich pozycje w zbiorze.
2. Napisz program, w którym zadeklarujesz i zainicjujesz dowolnymi warto- sciami (inicjacja w momencie deklaracji), dwie tablice liczb (10-15 pozy- cji), a nastepnie do trzeciej tablicy wpisz odpowiednio: element pierwszy w tablicy 3 – sume pierwszego elementu z tablicy 1 i ostatniego z ta- blicy 2 element drugi w tablicy 3 – sume drugiego elementu z tablicy 1 i przedostatniego z tablicy 2, itd.
3. Napisz program obliczajacy sumy kolumn, sumy wierszy i sumy obu prze- katnych macierzy prostokatnej o ustalonym dowolnym wymiarze (np. 20 x 20). Zawartosc i analizowany zakres macierzy wczytywana ma byc od uzytkownika. Poza wyliczonymi sumami wyswietl równiez sama macierz.
4. Roczne przychody. Program ten będzie wczytywał przychody osiągnięte przez podatnika w kolejnych miesiącach roku podatkowego. Scenariusz działania programu: Program wyświetla informację o jego przeznaczeniu.
Program wyświetla menu główne (zobacz str. 22 wykładu o instrukcjach), pozwalające na wybór następujących opcji:
• Wczytaj — wczytanie dochodów,
• Wyświetl — wyświetlenie wczytanych dochodów,
• Średnia i suma — wyznaczenie dochodu średniego i sumarycznego,
• Minimalny i maksymalny — wyznaczenie dochodu minimalnego i maksymalnego,
• Od najmniejszego — wyświetlenie dochodów uporządkowanych ro- snąco od najmniejszego do największego,
• Nad i pod średnią — wyświetlenie informacji ile dochodów jest więk- szych od średniego i jaka jest ich suma, oraz ile dochodów jest mniej- szych od średniego i jaka jest ich suma.
• Koniec — powoduje zakończenie programu.
Po wybraniu odpowiedniej opcji następuje wyznaczenie odpowiednich wiel- kości, zgodnie z powyższym opisem.
5. Notowania. Makler nadzoruje dzienne notowania pewnej spółki giełdo- wej. W ciągu dnia pracy, trwającego 8 godzin, makler spisuje kurs spółki dwukrotnie w ciągu godziny. Należy napisać program, który pozwoli ma- klerowi ? na podstawie zanotowanych wartości ? na wyznaczenie śred- niego, minimalnego i maksymalnego kursu obserwowanej spółki. Program
powinien posiadać trzy niezależne opcje: wczytywanie wartości akcji, prze- glądanie wprowadzonych wartości akcji, wyznaczanie wartości średniej, minimalnej i maksymalnej, oraz opcje pozwalającą na zakończenie jego działania.
2.2 Doskonalenie umiejętności pracy z tablicami liczb
Ćwiczenie ma na celu zapoznanie studentów z wybranymi metodami sortowa- nia wewnętrznego. Badane w ćwiczeniu metody sortowania to: sortowanie przez proste wstawianie, sortowanie przez proste wybieranie, sortowanie bąbelkowe, sortowanie szybkie (quick sort). Zakładamy, że długość tablicy podlegającej sor- towaniu jest znana i wynosi n. Metody sortowania:
2.2.1 Sortowanie przez proste wstawianie
Sortowanie przez proste wstawianie odbywa się w następujący sposób: dla każ- dego i = 2, 3, ..., n trzeba powtarzać wstawianie a[i] w już uporządkowaną część tablicy a[1] . . . a[i − 1]. W metodzie tej obiekty podzielone są umownie na dwa ciągi: ciąg wynikowy a1. . . ai−1 oraz ciąg źródłowy ai. . . an. W każdym kroku począwszy od i = 2 i zwiększając i o jeden, i-ty element ciągu źródłowego prze- nosi się do ciągu wynikowego, wstawiając go w odpowiednim miejscu.
Algorytm:
1. Wykonaj co następuje począwszy od indeksu i = 2 do i = n
• Wskaż na i-ty element
• Wstaw i-ty element w odpowiednim miejscy w a1...ai
2.2.2 Sortowanie przez proste wybieranie
Sortowanie przez proste wybieranie polega na wyznaczeniu najmniejszego ele- mentu w ciągu; zamianie go z pierwszym elementem w ciągu, wyznaczeniu naj- mniejszego elementu w a[2, n] i zamianie go z drugim elementem: wyznaczeniu najmniejszego elementu w a[3, n] i zamianie go z trzecim elementem itd. aż do posortowania całkowitego ciągu.
Algorytm:
1. Wykonaj co następuje n − 1 razy (i = 1 do i = n − 1)
• Wskaż na najmniejszy element spośród a[i]...a[n];
• Wymień go z ai
2.2.3 Sortowanie bąbelkowe
Sortowanie bąbelkowe polega na przeglądaniu od końca sortowanej tablicy i za- mianie miejscami elementów jeśli są one w kolejności odwrotnej tj. pierwszy jest mniejszy od drugiego. Po zakończeniu pierwszego przejścia element najmniejszy powinien się znajdować na odpowiednim dla niego miejscu czyli na początku
tablicy.
Algorytm:
1. Wykonaj co następuje n − 1 razy (i = n − 1, ..., 1)
• Wskaż na ostatni element;
• Wykonaj co następuje i razy
(a) Porównaj wskazany element z elementem poprzednim
(b) Jeśli porównane elementy są w nie właściwej kolejności, zamień je miejscami
(c) Wskaż na następny element 2.2.4 Sortowanie szybkie (Quick Sort)
Jest to metoda, w której stosuje się zasadę zamiany. W metodzie sortowania szybkiego korzysta się z faktu, że w celu zapewnienia efektywności powinno się wymieniać obiekty położone daleko od siebie. Załóżmy że dane jest n obiektów ustawionych w odwrotnym porządku kluczy. Można posortować je wykonując tylko n/2 wymian, biorąc najpierw obiekty - skrajny z lewej strony i skrajny z prawej strony, a następnie posuwać się stopniowo do środka z obu stron. Oczy- wiście takie postępowanie możliwe jest tylko dlatego, że uporządkowanie było dokładnie odwrotne.
Wybierzmy losowo jakiś obiekt i nazwijmy go x; przeglądajmy tablicę od lewej strony aż znajdziemy obiekt ai> x, a następnie przeglądajmy tablicę od prawej strony aż znajdziemy aj < x. Wymieńmy teraz te dwa obiekty i kon- tynuujmy proces przeglądania i zamiany, aż nastąpi spotkanie gdzieś w środku tablicy. W rezultacie otrzymamy tablicę podzieloną na lewą część z kluczami mniejszymi od x oraz prawą część z kluczami większymi od x.
Jeżeli na przykład za x wybierzemy środkowy klucz 42, to w tablicy kluczy 44 55 12 42 94 6 18 67
trzeba dokonać dwóch wymian aby otrzymać tablicę podzieloną 18 6 12 42 94 55 44 67
Ostatnie wartości indeksów są i = 5 oraz j = 3. Klucze a1...ai−1są mniejsze bądź równe kluczowi x = 42, klucze aj+1...an są większe bądź równe temu kluczowi. Wynika stąd, że otrzymaliśmy podział na dwie części, a mianowicie ak.klucz x.klucz dla k = 1...i − 1
ak.klucz x.klucz dla k = j + 1...n oraz
ak.klucz = x.klucz dla k = j + 1...i − 1
Następnie powtarzamy tę operacje dla obu wcześniej utworzonych podciągów.
Algorytm
założenie: Istnieje ciąg liczb xl, xl+1, xp,
1. Przyjmij za element podziału element v znajdujący się w pobliżu środka ciągu, i podziel tym elementem dany ciąg. Oznacza to, że v znajdzie się na
pozycji elementu xk, dla pewnego k spełniającego l ¬ k ¬ p, i elementy na lewo będą od niego nie większe a elementy na prawo od niego będą nie mniejsze.
2. Zastosuj ten sam algorytm do (l, k − 1, x) 3. Zastosuj ten sam algorytm do (k + 1, p, x)
Algorytm ten jest bardzo prosty i efektywny, ponieważ zmienne i, j oraz x mogą być w czasie przeglądania tablicy trzymane w szybkich rejestrach maszyny cy- frowej.
2.3 Przetwarzanie tablic znakowych
Program studenta ma realizować przetwarzanie tablic znakowych. Należy wy- konać ćwiczenie bez użycia funkcji bibliotecznych (string.h, ctype.h) – operacje przetwarzania napisów i identyfikowania znaków wykonać na piechotę.
Po implementacji tego programu warto przejrzeć informacje dotyczące funk- cji i makr zawartych w bibliotekach identyfikowanych przez nagłówki sting.h i ctype.h.
1. int strlen( char s[] ) Funkcja:
Wlasna implementacja funkcji wyznaczajacej dlugosc napisu liczona w znakach
Parametry:
char s[] – tablica zawierajaca napis ktorego dlugosc jest wyznaczana Rezultat:
dlugosc napisu liczona w znakach
2. int lwrstrcnt( char s[] ) Funkcja:
Wyznacza liczbe malych liter w napisie s Parametry:
char s[] – tablica zawierajaca napis Rezultat:
Liczba malych liter w napisie s
3. int uprstrcnt( char s[] ) Funkcja:
Wyznacza liczbe duzych liter w napisie s Parametry:
char s[] – tablica zawierajaca napis Rezultat:
Liczba duzych liter w napisie s
4. int dgtstrcnt( char s[] ) Funkcja:
Wyznacza liczbe cyfr w napisie s Parametry:
char s[] – tablica zawierajaca napis Rezultat:
Liczba cyfr w napisie s
5. int nalphastrcnt( char s[] ) Funkcja:
Wyznacza liczbe liter i cyfr w napisie s Parametry:
char s[] – tablica zawierajaca napis Rezultat:
Liczba liter i cyfr w napisie s
6. int chrstrcnt( char c, char s[] ) Funkcja:
Wyznacza liczbe wystapien znaku c w s Parametry:
char c – znak poszukiwany w napisie char s[] – tablica zawierajaca napis Rezultat:
Liczba wystapien znaku c w napisie s
7. int chrstrpos( char c, char s[] ) Funkcja:
Wyznacza indeks (pozycje w napisie) pierwszego wystapienia znaku c w s Parametry:
char c – znak poszukiwany w napisie char s[] – tablica zawierajaca napis Rezultat:
Pozycja znaku w tablicy liczona od 0 lub -1 gdy znak nie znaleziony
8. int chrstrcnt( char c, char s[] ) Funkcja:
Wyznacza indeks (pozycje w napisie) ostatniego wystapienia znaku c w s Parametry:
char c – znak poszukiwany w napisie char s[] – tablica zawierajaca napis Rezultat:
Pozycja znaku w tablicy liczona od 0 lub -1 gdy znak nie znaleziony
9. void strrev( char s[] ) Funkcja:
Odwraca kolejnosc znakow w tablicy s Parametry:
char s[] – tablica zawierajaca napis Rezultat:
Brak
3 Pliki
Ćwiczenia mają na celu zapoznanie studenta z obsługą plików (tekstowych). Za- kłada się, że studenci będą korzystać z materiałów wykładowych dr Simińskiego dotyczących przetwarzania plików z danymi.
Poszczególne zadania powinny być realizowane w formie osobnych funkcji, a program główny powinien być wyposażony w menu pozwalające wykonać każdą z tych funkcji.
Poszczególne zadania do wykonania są następujące :
1. Napisać funkcję umożliwiającą odczyt pliku tekstowego i wyświetlenie jego zawartości na ekranie.
2. Napisać funkcję umożliwiającą odczyt informacji dotyczących pliku tek- stowego: liczby linii, liczby znaków oraz liczby słów (wyrazów).
3. Napisać funkcję umożliwiającą odczyt pliku tekstowego i skopiowanie jego zawartość do innego pliku. W pierwszej wersji można nazwy plików za- szyć w kodzie programu, jednak ostatecznie obydwie nazwy powinny zo- stać podawane jako parametry wywołania programu, które jak wiadomo odczytujemy z argumentów funkcji main(int argc, char * argv[]).
4. Napisać funkcję umożliwiającą zliczenie wystąpień podanej frazy w pliku o podanej nazwie. Obydwa parametry: szukana fraza oraz nazwa pliku powinny zostać podane jako argumenty wywołania programu. (j.w.) 5. Napisać funkcję umożliwiającą zamianę dowolnego znaku w pliku na inny
podany znak. (Coś na zasadzie szyfrowania :)).