1 Wprowadzenie 1. Ćwiczenie 1 — łagodny start. Obejmuje praktyczną realizację programów omówionych na pierwszym wykładzie. Należy zastosować wersje wykorzystujące elementy języka C++. Ćwiczenia do wykonania: Przeliczanie odległości z kilometrów na mile (zobacz wykład): http://uranos.cto.us.edu.pl/~siminski/jpo/jpo_w_01.pdf. Wyznaczanie ś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 metrach 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ą poprawnoś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, odejmowania, 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ładamy, ż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ównania 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 pierwiastkó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 1 wyliczeniu odpowiednich wyznaczników W, Wx, Wy a następnie ich ilorazó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 stwierdzenie czy ta osoba: posiada bierne prawo wyborcze (ukończone 18 lat), posiada 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 wyprowadzić 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ć wielokrotne wykonywanie opisanych czynności. 9. Wypłata. Napisać program wczytujący liczbę całkowitą należącą do przedział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 przepracowanych 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 wykonywanie opisanych czynności. 10. Napisz program obliczający i drukujący na ekranie objętości i pola powierzchni 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: * ** 2 *** 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ściowych program powinien wyświetlić ilość wpisanych liczb parzystych (z wyłączeniem zera) i ich średnią wartość oraz ilość wpisanych liczb nieparzystych 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. 3 użyj stałych # DEFINE. 19. Zmodyfikuj poprzednie zadanie tak, aby program wyświetlał menu pozwalają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 podanie 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 stan wolny Głowa rodziny Małżeństwo, rozliczenie wspólne Małżeństwo, rozliczenie osobne 15 15 15 15 % % % % dochodu dochodu dochodu dochodu podatek do 17850 $ do 23900 $ do 29750 $ do 14875 $ + + + + 28 28 28 28 % % % % reszty reszty reszty 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. 4 2 TABLICE 2.1 Proste programy na tablicach 1. Napisz program, który wczyta 15 liczb róznych liczb całkowitych do jednowymiarowej 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 wartosciami (inicjacja w momencie deklaracji), dwie tablice liczb (10-15 pozycji), a nastepnie do trzeciej tablicy wpisz odpowiednio: element pierwszy w tablicy 3 – sume pierwszego elementu z tablicy 1 i ostatniego z tablicy 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 przekatnych 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 rosnąco od najmniejszego do największego, • Nad i pod średnią — wyświetlenie informacji ile dochodów jest większych od średniego i jaka jest ich suma, oraz ile dochodów jest mniejszych od średniego i jaka jest ich suma. • Koniec — powoduje zakończenie programu. Po wybraniu odpowiedniej opcji następuje wyznaczenie odpowiednich wielkości, zgodnie z powyższym opisem. 5. Notowania. Makler nadzoruje dzienne notowania pewnej spółki giełdowej. 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 maklerowi ? na podstawie zanotowanych wartości ? na wyznaczenie średniego, minimalnego i maksymalnego kursu obserwowanej spółki. Program 5 powinien posiadać trzy niezależne opcje: wczytywanie wartości akcji, przeglą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 sortowania 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 sortowaniu 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 przenosi 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 elementu w ciągu; zamianie go z pierwszym elementem w ciągu, wyznaczeniu najmniejszego 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 zamianie 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 6 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. Oczywiś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 kontynuujmy 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−1 są 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 7 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 cyfrowej. 2.3 Przetwarzanie tablic znakowych Program studenta ma realizować przetwarzanie tablic znakowych. Należy wykonać ć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 funkcji 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: 8 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: 9 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 10 3 Pliki Ćwiczenia mają na celu zapoznanie studenta z obsługą plików (tekstowych). Zakł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 tekstowego: 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 zaszyć w kodzie programu, jednak ostatecznie obydwie nazwy powinny zostać 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 :)). 11