Proste programy — operacje IO, instr. warunkowe i iteracyjne, funkcje
- „Za mało za dużo” — proszę napisać program pozwalający użytkownikowi na odgadnięcie liczby wylosowanej przez komputer. Program losuje nieznaną użytkownikowi liczbę (zakładamy np. przedział 1..100), użytkownik typuje liczbę, program odpowiada użytkownikowi czy to dobra liczba, czy też za mała, lub za duża. Gra trwa tak długo, aż użytkownik odgadnie wylosowaną liczbę.
- Odwrotne „Za mało za dużo” — proszę napisać program w wersji, w której komputer odgaduje liczbę wymyśloną przez użytkownika. Komputer typuje liczbę (zakładamy np. przedział 1..100) oraz pyta użytkownika czy to dobra liczba, czy też za mała, lub za duża. Gra trwa tak długo, aż użytkownik potwierdzi odgadnięcie liczby, lub komputer zorientuje się, że użytkownik oszukuje i podaje niewłaściwe odpowiedzi.
- Program Figury — proszę napisać program pozwalający na kalkulacje pól figur płaskich: kwadrat, prostokąt, koło, trójkąt, trapez. Wymagania użytkowe: program ma wyświetlać proste konsolowe menu pozwalające na wielokrotne powtarzanie obliczeń. Z poziomu menu użytkownik wybiera figurę, po wprowadzeniu liczb niezbędnych do wyznaczenia pól (długości boków, podstawy, wysokości, promienia) obliczona wartość jest wyświetlana. Program ma nie dopuścić do wprowadzenia ujemnych wartości liczbowych. Wymagania implementacyjne: program ma być podzielony na funkcje. Operacje potrzebne do obliczenia pola (wczytanie danych, uruchomienie obliczeń, wyświetlenie wyników) dla każdego rodzaju figury powinny być zawarte w osobnych funkcjach. Samo obliczenie pola figury ma być również zawarte w odpowiedniej funkcji. Do wprowadzania danych liczbowych z kontrolą ich nieujemności należy zdefiniować odpowiednią funkcję. Wskazowki: prezentacja koncepcji funkcji oraz wskazówki implementacyjne, szablon programu — menu konsolowe z podziałem na funkcje.
Wykorzystanie tablic jednowymiarowych
-
W trakcie badań kardiologicznych dokonuje się pomiarów tętna pacjenta. Załóżmy, że tętno spoczynkowe to 60 uderzeń serca na minutę. Należy napisać funkcje otrzymującą tablicę pomiarów tętna. Rezultatem funkcji ma być liczba określająca ile razy tętno pacjenta podniosło lub obniżyło się znacznie. Taka sytuacja występuje, gdy pomiar tętna jest większy od 70 lub mniejszy od 50. Proszę napisać funkcję
int skokiTetna( double pomiary[], int ilePomiarow )
, gdzie tablicapomiary
zawiera liczby odpowiadające pomiarom tętna ailePomiarow
to liczba określająca ile wartości zapisano w tablicypomiary
. -
Przy drodze szybkiego ruchu zainstalowano urządzenie zliczające liczbę przejeżdżających pojazdów. Zliczanie odbywa się na tej zasadzie, że czujnik optyczny dokonuje pomiaru co pewien, krótki czas. Generuje on daną o wartości 0 jeżeli nie zarejestrowano ruchu, wartość większą od zera, jeżeli czujnik wykrył ruch. Dane generowane przez czujnik są zapisywane w tablicy liczb rzeczywistych, przykładowy ciąg wartości
0 0 0 2 3 0 0 2 4 3 0 1 1 1 1
. Pojazd uznajemy jako zliczony, jeżeli zarejestrowano ciąg przynajmniej trzech niezerowych pomiarów o wartości średniej większej od 1. Dla podanego wyżej ciągu jako zliczony zostanie uznany jeden pojazd. Proszę napisać funkcjęint zliczPojazdy( double pomiary[], int ilePomiarow )
, gdzie tablicapomiary
zawiera wartości generowane prze czujnik ailePomiarow
to liczba określająca ile wartości zapisano w tablicypomiary
. Rezultatem funkcji ma być liczba pojazdów uznanych, wg powyższej reguły, jako zliczone. -
Program Roczny bilans: proszę napisać program pozwalający na przeprowadzenie rocznego bilansu dochodów związanych z prowadzeniem działalności gospodarczej. Przedsiębiorca w każdym miesiącu osiąga przychód, aby go osiągnąć ponosi też koszty. Różnica pomiędzy przychodem a kosztem jego uzyskania może być ujemna, wtedy przedsiębiorca ponosi stratę. Jeżeli różnica ta jest nieujemna to osiąga on dochód, być może zerowy. Zadaniem programu będzie umożliwienie przedsiębiorcy analizy rocznych przychodów, kosztów i dochodów. Wymagania użytkowe: program powiem wyświetlać proste konsolowe menu, pozwalające użytkownikowi na:
- wprowadzenie przychodów z kolejnych dwunastu miesięcy,
- wprowadzenie kosztów z kolejnych dwunastu miesięcy,
- wyliczenie sumarycznego przychodu, sumarycznych kosztów oraz sumarycznego dochodu,
- wyznaczenie wśród wprowadzonych danych minimalnego, maksymalnego i średniego przychodu, kosztu i dochodu, wraz z informacją, w których miesiącach te wartości wystąpiły.
- bilans dla kolejnych miesięcy: program wyświetla cztery kolumny, w pierwszej wartość przychodu, w drugiej wartość kosztu, w trzeciej wartość dochodu, w czwartej odpowiednio napisy „strata”, „zysk” lub „zero” w zależności od relacji pomiędzy przychodem a kosztem. Każdy wiersz zawiera dane z jednego miesiąca.
Wymagania implementacyjne: przychody i koszty to nieujemne liczby rzeczywiste. Należy kontrolować poprawność wprowadzanych danych. Przychody oraz koszty powinny zostać zapisane w tablicach liczb rzeczywistych o sparametryzowanym rozmiarze. Operacje wyznaczania dla przychodów i kosztów takich wartości jak suma, średnia, minimum, maksimum powinny być realizowane przez odpowiednie funkcje, obsługujące zarówno tablicę kosztów jak i przychodów. Można zastosować globalne tablice przychodów i kosztów, jednak powyższe funkcje mają pracować na tablicach przekazanych jako parametr. Kolumny przy zestawieniu bilansu z kolejnych miesięcy powinny być estetycznie ułożone, liczby wyrównane do lewej krawędzi kolumny, wartości w postaci dziesiętnej (nie wykładniczej) z dwoma miejscami po przecinku. Program (przy uwzględnieniu naturalnych ograniczeń trybu konsolowego) powinien być czytelny i komunikować się z użytkownikiem w zrozumiały sposób. Wskazowki: prezentacja koncepcji funkcji oraz wskazówki implementacyjne, Wskazowki: tablice i zasady ich przetwarzania, szablon programu — menu konsolowe z podziałem na funkcje.
Wykorzystanie tablic dwuwymiarowych
- Proszę napisać funkcję
void show( char tab[] [], int numOfRows, int numOfCols ) { ... }
, której zadaniem jest wypisanie do strumienia wyjściowego programu zawartości dwuwymiarowej tablicy przekazanej parametremtab
. Tablica liczynumOfRows
wierszy oraznumOfCols
kolumn. Format wyprowadzanych danych powinien odpowiadać zawartości tablicy – w kolejnych wyprowadzanych wierszach powinny pojawiać się znaki zapisane w kolejnych wierszach tablicy. Uwaga, tę funkcję proszę wykorzystać do testowania działania omówionych niżej funkcji. - Zakładamy, że rozpatrujemy dwuwymiarową, kwadratową tablicę znaków (liczba wierszy jest równa liczbie kolumn). Proszę napisać funkcje (otrzymujące taką kwadratową tablicę jako parametr):
-
void backSlash( char tab[][], int size ) { … }
— funkcja wpisuje znaki ‘*’ na głównej przekątnej (diagonalnej) tablicytab
o rozmiarzesize
, pozostałe elementy tablicy są wypełnione znakami spacji.5×5
* * * * *
-
void slash( char tab[][], int size ) { … }
— funkcja wpisuje znaki ‘*’ na przekątnej niediagonalnej tablicytab
o rozmiarzesize
, pozostałe elementy tablicy są wypełnione znakami spacji.5×5
* * * * *
-
void x( char tab[][], int size ) { … }
— funkcja wpisuje znaki ‘*’ na obu przekątnych tablicytab
o rozmiarzesize
, pozostałe elementy tablicy są wypełnione znakami spacji.5×5
* * * * * * * * *
-
void square( char tab[][], int size ) { … }
— funkcja wpisuje znaki ‘*’ do wszystkich elementów pierwszego i ostatniego wiersza oraz pierwszej i ostatniej kolumny tablicytab
o rozmiarzesize
, pozostałe elementy tablicy są wypełnione znakami spacji.5×5
***** * * * * * * *****
-
- Proszę napisać funkcję
void characterA( char tab[][], int numOfRows, int numOfCols ) { ... }
, której zadaniem jest zapisanie w tablicy znaków o nazwietab
wizerunku litery A zbudowanej ze znaków ‘*’. Tablica liczynumOfRows
wierszy oraznumOfCols
kolumn. Funkcja powinna przeanalizować wymiary tablicytab
rozmieścić w niej znaki ‘*’ maksymalnie wykorzystując obszar tablicy. Do testowania funkcji proszę wykorzystać napisaną wcześniej funkcjęshow
. Można założyć, że dla tablic o rozmiarze mniejszym niż 3×3 funkcja nie będzie działać. Przykładowe rozmieszczeni znaków w tablicach o różnych wymiarach:
4×4
** * * **** * *
4×7
***** * * ******* * *
4×3
* * * *** * * * *
3×3
* *** * *
Proszę napisać analogiczne funkcje dla liter E, F, H, L, O, U. Można się pokusić o napisanie funkcji dla wszystkich dużych liter alfabetu angielskiego.
Uwaga: ze względu na pewne zawiłości języka C/C++ parametr funkcji reprezentujący tablicę dwuwymiarową musi być zapisany w specjalny sposób. Zamiast spodziewanego zapisu:
void fun( char tab[][] ) { ... }
trzeba użyć zapisu
void fun( char (*tab)[] ) { ... }
Szczegóły zostaną wyjaśnione później.
Przetwarzanie łańcuchów znaków
- Opierając się na wykładzie poświęconym przetwarzaniu napisów proszę o zaimplementowanie funkcji wg programu wzorcowego 1 oraz funkcji dodatkowych. Implementacja z wykorzystaniem klasycznych operacji indeksowania tablicy i operatora
[]
. - Opierając się na wykładzie poświęconym przetwarzaniu napisów z wykorzystaniem wskaźników proszę o zaimplementowanie funkcji wg programu wzorcowego 2. Implementacja z wykorzystaniem wskaźników
char *
.
Elementy programowania obiektowego
- Definiowanie prostych klas, pola prywatne, konstruktory, metody set/get, realizatory.. Proszę zdefiniować klasy reprezentujące podstawowe figury geometryczne: kwadrat, prostokąt, koło, trójkąt. Każda z klas powinna przechowywać w prywatnych polach informacje potrzebne do obliczenia pola powierzchni danej figury. Dla każdego pola prywatnego należy zdefiniować metodę ustawiającą i pobierającą wartość. Należy zadbać o to, aby nie było możliwe ustawienie ujemnej wartości parametrów figur (np. boku kwadratu czy promienia koła). Każda klasa powinna posiadać zdefiniowane metody obliczające pole powierzchni figury. Należy również zdefiniować dla każdej klasy konstruktor bezparametrowy oraz konstruktor ogólny. Proszę napisać program pozwalający na obliczanie pól figur płaskich, realizowanych z wykorzystaniem zdefiniowanych klas. Uwaga, proszę przećwiczyć elementy charakterystyczne dla języka C++, takie jak:
- definiowanie funkcji składowych poza klasą,
- wykorzystanie operatora zakresu „::”,
- wykorzystanie parametrów domyślnych w celu ograniczenia liczby konstruktorów,
- wykorzystanie w konstruktorach list inicjalizacyjnych.
Przykład prostej klasy Kwadrat:
class Kwadrat { public: Kwadrat( double bok = 0 ); void ustawBok( double bok ); double podajBok(); double obliczPole(); private: double bok; }; Kwadrat::Kwadrat( double bok ) : bok( 0 ) { ustawBok( bok ); } void Kwadrat::ustawBok( double bok ) { if( bok >= 0 ) Kwadrat::bok = bok; } double Kwadrat::podajBok() { return bok; } double Kwadrat::obliczPole() { return bok * bok; }
- szablon programu — menu konsolowe z podziałem na funkcje, (źródło cpp).
- szczegółowe rozważania na temat definiowania klasy opisu kwadratu, począwszy od strony 10, (pdf).
- definiowanie klas i obiektów, prezentacja z wykładu, (pdf).
- Dziedziczenie..Bazując na klasach (zadanie powyższe) reprezentujących podstawowe figury geometryczne: kwadrat, prostokąt, koło, trójkąt, proszę zdefiniować klasy reprezentujące bryły: sześcian, prostopadłościan, kula, graniastosłup. Proszę wykorzystać dziedziczenie. Klasy reprezentujące bryły powinny posiadać funkcję składową obliczania pola, wyznaczającą wartość odpowiednią dla każdej z figur. Proszę rozszerzyć program z poprzedniego zadania, tak aby oferował możliwość obliczania pól nie tylko figur, ale również brył (sześcian, prostopadłościan, koło, graniastosłup). Wskazowki:
Wymagania implementacyjne: program ma być podzielony na funkcje. Operacje potrzebne do obliczenia pola (wczytanie danych, utworzenie obiektów, przekazanie danych, realizacja obliczeń) dla każdego rodzaju figury powinny być zawarte w osobnych funkcjach. Wskazowki:
.