1 Wprowadzenie

advertisement
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
Download