• Nie Znaleziono Wyników

2.3 Przetwarzanie tablic znakowych

N/A
N/A
Protected

Academic year: 2021

Share "2.3 Przetwarzanie tablic znakowych"

Copied!
11
0
0

Pełen tekst

(1)

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

(2)

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:

*

* *

(3)

* * *

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.

(4)

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.

(5)

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

(6)

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

(7)

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

(8)

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:

(9)

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:

(10)

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

(11)

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 :)).

Cytaty

Powiązane dokumenty

Wyznacza wartość liczby  metodą Monte Carlo z zadaną dokładnością.. Rysuje „spiralę prostokątną” zwijającą się do punktu

Na tej podstawie oszacuj czas działania pojedynczej pary tych instrukcji (po prostu zmierz czas wykonywania się powyższej pętli) i porównaj z czasem potrzebnym Twojemu procesorowi

(1 pkt) Na wejściu otrzymujemy pewną ilość liczb całkowitych: pierwsza liczba oznacza ilość zestawów danych, które mamy uwzględnić, druga – ilość liczb w pierwszym

Program generuje 15 węzłów listy jednokierunkowej z polami item generowanymi losowo z zakresu od 0 do 20, a następnie wypisuje po kolei wszystkie pola item oraz sumę liczb

Wypisano dziesięć kolejnych liczb całkowitych, z których najmniejszą jest −8.. Oceń praw-

Napisz program obsługujący zakład naprawy sprzętu gospodarstwa

Według niedowiedzionej do dzisiaj hipotezy, istnieje nieskończenie wiele liczb pierwszych Mersena..

Liczby wymierne – to takie, liczby które można zapisać w postaci ilorazu dwóch liczb całkowitych, w którym dzielnik jest różny od zera.. Są to więc liczby,