1 Funkcje i ich wykorzystanie

Podobne dokumenty
Ćwiczenia podstawowe, zestaw 5, część 1

OPERACJE WEJŚCIA / WYJŚCIA. wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout)

#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

#include <stdio.h> int main( ) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Podstawy programowania w języku C++

Wprowadzenie do programowania w języku C

Podstawy Programowania Podstawowa składnia języka C++

Operacje na plikach. Informatyka. Standardowe strumienie wejścia i wyjścia

Kilka prostych programów

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Programowanie w C/C++ Instrukcje - konstrukcje powtórka. LABORKA Piotr Ciskowski

a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10]

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Pzetestuj działanie pętli while i do...while na poniższym przykładzie:

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Ćwiczenie nr 3. Temat: Definicje i wykorzystanie funkcji, parametry funkcji

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Funkcje zawarte w bibliotece < io.h >

Wprowadzenie do programowania w języku C

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Funkcje zawarte w bibliotece < io.h >

1 Podstawy c++ w pigułce.

INSTRUKCJE REPETYCYJNE PĘTLE

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

INSTRUKCJE REPETYCYJNE PĘTLE

Język C zajęcia nr 5

1 Definiowanie prostych klas

1 Podstawy c++ w pigułce.

Podstawy programowania. Wykład 3 Konstrukcje sterujące. Krzysztof Banaś Podstawy programowania 1

INFORMATYKA Studia Niestacjonarne Elektrotechnika

do instrukcja while (wyrażenie);

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

1.1 Wprowadzenie do języka C w pigułce

Pliki. Informacje ogólne. Obsługa plików w języku C

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Biblioteka standardowa - operacje wejścia/wyjścia

Podstawy programowania w języku C++

Podstawy programowania w języku C++

1 Powtórzenie wiadomości

Podstawy programowania w języku C++

KURS C/C++ WYKŁAD 1. Pierwszy program

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Język C i C++. Podstawy. Zagadnienia do opanowania. Przykład 1. (modyfikuj kod, aby zrealizować punkty 5., 7.)

Laboratorium 6: Ciągi znaków. mgr inż. Leszek Ciopiński dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Funkcje standardowej biblioteki wejść-wyjść do wyświetlania i pobierania danych

1 Wielokrotne powtarzanie tych samych operacji

Podstawy programowania w języku C i C++

Pliki. Informacje ogólne. Obsługa plików w języku C

Funkcja (podprogram) void

Programowanie strukturalne i obiektowe

1. Wprowadzanie danych z klawiatury funkcja scanf

4. Wyrzuć wyjątek jeśli zmienna ist nie istnieje bloki: try, catch i wyrzucanie wyjątku

1. Informatyka - dyscyplina naukowa i techniczna zajmująca się przetwarzaniem informacji.

Instrukcje sterujące

Języki programowania obiektowego Nieobiektowe elementy języka C++

Lekcja 6: Pascal. Procedura i funkcja

Część 4 życie programu

Podstawy Programowania C++

Język C, instrukcje sterujące (laboratorium)

Plik jest reprezentowany przez strumień znaków (bajtów) o zmiennej długości. Koniec strumienia identyfikowany jest znacznikiem końca pliku EOF.

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

IX. Wskaźniki.(3 godz.)

I. Podstawy języka C powtórka

Reprezentacja symboli w komputerze.

Co nie powinno być umieszczane w plikach nagłówkowych:

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

1 Przetwarzanie plików

Ćwiczenie 7. Strumień trójelementowy. A g a EOF... EOF... Wprowadzenie do programowania w języku C. Wskaźnik bieżącej pozycji. bieżącej pozycji.

Wskaźniki do funkcji. Wykład 11. Podstawy programowania ( język C ) Wskaźniki do funkcji (1) Wskaźniki do funkcji (2)

Laboratorium z Podstaw Programowania Zajęcia 1

DANE TEKSTOWE W JĘZYKU C/C++ - TABLICE ZNAKOWE

Programowanie strukturalne i obiektowe. Funkcje

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Programowanie strukturalne język C - wprowadzenie

Operacje wejścia/wyjścia odsłona pierwsza

Wstęp. #define include include include include include include

Zad. 5: Układ równań liniowych liczb zespolonych

Programowanie - instrukcje sterujące

1 Przetwarzanie tablic znakowych

Algorytm. a programowanie -

2 Przygotował: mgr inż. Maciej Lasota

Kup książkę Poleć książkę Oceń książkę. Księgarnia internetowa Lubię to!» Nasza społeczność

Reprezentacja symboli w komputerze. Znaki alfabetu i łańcuchy znakowe. Programowanie Proceduralne 1

for (inicjacja_warunkow_poczatkowych; wyrazenie_warunkowe; wyrazenie_zwiekszajace) { blok instrukcji; }

Informatyka 1. Plan dzisiejszych zajęć. zajęcia nr 11. Elektrotechnika, semestr II rok akademicki 2008/2009

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

Programowanie w językach wysokiego poziomu

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Warto też w tym miejscu powiedzieć, że w C zero jest rozpoznawane jako fałsz, a wszystkie pozostałe wartości jako prawda.

Podstawy programowania

Podstawy programowania

Języki programowania. Tablice struktur, pliki struktur. Część ósma. Autorzy Tomasz Xięski Roman Simiński

for (inicjacja_warunkow_poczatkowych(końcowych); wyrazenie_warunkowe; wyrazenie_zwiekszajace(zmniejszające)) { blok instrukcji; }

WHILE (wyrażenie) instrukcja;

Wykład VI. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Wstęp do programowania. Wykład 1

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 9 - sem.iii. Dr inż. M. Czyżak

Ćwiczenie 4 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Podstawy programowania w języku C++

Transkrypt:

1 Funkcje i ich wykorzystanie Ćwiczenie to poświęcone jest tworzeniu programu wykorzystującego podprogramy funkcje jako narzędzia do strukturalizacji i hierarchizacji kodu programu. Program ten pozwala na trening w stosowaniu funkcji. Mimo iż wykonywane w ramach tych ćwiczeń podprogramy są proste, pozwalają one na wyrobienie umiejętności systematycznego budowania programów zawierających większą liczbę linii kodu. Materiał teoretyczny zawarty jest w materiałach wykładowych. 1.1 Figury płaskie Należy program pozwalający na obliczanie pól i obwodów wybranych figur płaskich: kwadratu, prostokąta, koła, trójkąta, trapezu. Scenariusz działania programu: 1. Program wyświetla informację o jego przeznaczeniu. 2. Program wyświetla menu główne pozwalające na wybór figury, dla której mają być wykonane obliczenia. 3. Po wybraniu figury, program wczytuje wymagane dane oraz wyświetla obliczone pole i obwód. 4. Program wraca do menu głównego, pozwalając na powtórzenie obliczeń dla dowolnej figury. 5. Program kończy swoje działanie po naciśnięciu przez użytkownika wybranego klawisza zakończenia. Przykładowa organizacja komunikacji z użytkownikiem Przykładowy przebieg wykonania programu prezentuje, umieszczony dalej Rysunek 1 oraz Rysunek 2. Prototypowa wersja kodu programu przedstawiona jest dalej. Program zawiera przykładową implementację funkcji wczytującej liczbę rzeczywistą (funkcja wczytaj_liczbe_f). Wymagania Program ma być podzielony na procedury i funkcje realizujące spójne funkcjonalnie czynności. Ilustruje to przedstawiony dalej program przykładowy. Po realizacji pierwszej wersji programu, opartej na poniższym szablonie, należy koniecznie rozbudować program o elementy opisane w sekcji Rozszerzenia. 1

Rysunek 1. Przebieg dialogu z użytkownikiem menu główne Rozszerzenia Rysunek 2. Obliczenia dla kwadratu i powrót do menu Proszę rozbudować program tak, by dla każdej figury wyświetlał podmenu, pozwalające użytkownikowi wybrać, czy obliczone ma być pole czy też obwód. Należy zastosować schemat analogiczny do zastosowanego w programie głównym. Ponieważ takie podmenu będzie się powtarzać dla każdej z figur, należy obsługę tego podmenu zrealizować np. w postaci funkcji, tak, aby w programie nie powtarzać podobnych sekwencji kodu. Proszę rozszerzyć program o kontrolę poprawności prowadzanych parametrów na etapie ich wpisywania, tak, aby program nie pozwolił na wprowadzenie zerowej lub ujemnej liczby określającej np. bok, czy promień. Kontrolowane prowadzanie danych należy zawrzeć w odpowiednim podprogramie. Program przykładowy #include <stdio.h> #include <stdlib.h> #include <ctype.h> /* Prototypy wykorzystywanych w programie funkcji */ void wyswietl_menu( void ); void obliczenia_dla_kwadratu( void ); void obliczenia_dla_prostokata( void ); void obliczenia_dla_kola( void ); void obliczenia_dla_trojkata( void ); void obliczenia_dla_trapezu( void ); float wczytaj_liczbe_f( char komunikat[] ); void czyszczenie_bufora( void ); float pole_kwadratu( float bok ); float obwod_kwadratu( float bok ); int main() 2

int klawisz; puts( "\nobliczam parametry figur plaskich" ); do wyswietl_menu(); klawisz = tolower( getchar() ); fflush( stdin ); switch( klawisz ) case '1' : obliczenia_dla_kwadratu(); case '2' : obliczenia_dla_prostokata(); case '3' : obliczenia_dla_kola(); case '4' : obliczenia_dla_trojkata(); case '5' : obliczenia_dla_trapezu(); default : if( klawisz!= 'z' ) putchar( '\a' ); while( klawisz!= 'z' ); return EXIT_SUCCESS; void wyswietl_menu( void ) puts( "\n1.kwadrat\n2.prostokat\n3.kolo\n4.trojkat\n5.trapez" ); printf( "\nwybierz numer figury lub Z by zakonczyc: " ); void obliczenia_dla_kwadratu( void ) float bok; printf( "\nobliczenia dla kwadratu" ); bok = wczytaj_liczbe_f( "\npodaj dlugosc boku: " ); printf( "Pole : %g\nobwod: %g", pole_kwadratu( bok ), obwod_kwadratu( bok ) ); printf( "\nnacisnij Enter by powrocic do menu..." ); ( void )getchar(); void obliczenia_dla_prostokata( void ) void obliczenia_dla_kola( void ) void obliczenia_dla_trojkata( void ) 3

void obliczenia_dla_trapezu( void ) float pole_kwadratu( float bok ) return bok * bok; float obwod_kwadratu( float bok ) return 4 * bok; float wczytaj_liczbe_f( char komunikat[] ) char bufor_tekstowy[ 80 ]; printf( komunikat ); fgets( bufor_tekstowy, 80, stdin ) ; return atof( bufor_tekstowy ); Proszę przeanalizować kod i sposób analogiczny zaprogramować brakujące funkcje. Wiem, że niektóre podprogramy wyglądają na naciągane. Są krótkie, gdyby je wyeliminować, program stałby się krótszy. Nie to jest jednak naszym celem. Celem jest systematyczne i konsekwentne stosowanie podprogramów do podziału programu na funkcjonalnie spójne fragmenty oraz do wyeliminowania powtarzających się fragmentów kodu. 1.2 Funkcje identyfikujące rodzaj znaku Należy napisać funkcje, pozwalające na identyfikowanie typu znaku przekazanego parametrem. Rozważmy funkcję: int is_lower( char c ); Rezultatem funkcji ma być wartość 0, jeżeli znak c nie jest małą literą, lub wartość różną od zera (np. 1), gdy znak c jest małą literą. Wykorzystanie funkcji może być następujące: int main() char znak; printf( "Wprowadz mala litere; " ); znak = getchar(); if( is_lower( znak ) ) printf( "Wprowadziales mala litere %c", znak ); else printf( "Nie wprowadziles malej litery!");... Pozostałe funkcje mogą być wykorzystane w analogiczny sposób. int is_upper( char c ); 4

Rezultatem funkcji ma być wartość 0, jeżeli znak c nie jest dużą literą, lub wartość różną od zera (np. 1), gdy znak c jest dużą literą. int is_digit( char c ); Rezultatem funkcji ma być wartość 0, jeżeli znak c nie jest cyfrą dziesiętną, lub wartość różną od zera (np. 1), gdy znak c jest cyfrą dziesiętną. int is_oct_digit( char c ); Rezultatem funkcji ma być wartość 0, jeżeli znak c nie jest cyfrą ósemkową, lub wartość różną od zera (np. 1), gdy znak c jest cyfrą ósemkową. int is_hex_digit( char c ); Rezultatem funkcji ma być wartość 0, jeżeli znak c nie jest cyfrą szesnastkową, lub wartość różną od zera (np. 1), gdy znak c jest cyfrą szesnastkową. 1.3 Funkcje zamiany wielkości liter Należy napisać funkcje, pozwalające na zamianę wielkości znaku, będącego literą, odpowiednio z dużej na małą, oraz z małej na dużą (zakładamy wykorzystanie kodu ASCII): char to_lower( char c ); char to_upper( char c ); Jeżeli funkcja to_lower otrzyma w parametrze c znak będący dużą literą, rezultatem funkcji ma być odpowiednia mała litera. Jeżeli znak c nie jest dużą literą, rezultatem funkcji ma być znak c. Analogicznie, jeżeli funkcja to_upper otrzyma w parametrze c znak będący małą literą, rezultatem funkcji ma być odpowiednia duża litera. Jeżeli znak c nie jest małą literą, rezultatem funkcji ma być znak c. Należy wykorzystać fakt, że przesunięcie pomiędzy literami dużymi a małymi w kodzie ASCII wynosi 32 (zobacz materiały wykładowe). Wykorzystanie funkcji to_lower może być następujące: int main() char znak; printf( "Wprowadz mala litere; " ); znak = getchar(); if(! is_lower( znak ) ) printf( "Nie wprowadziles malej litery!"); else znak = to_upper( znak ); printf( "Duzy ddpowiednik wprowadzonej litery to %c", znak );... 5

1.4 Wczytywanie liczby z zakresu Należy napisać funkcję: float czytaj_liczbe_z_zakresu( float dol, float gora ); Funkcja odczytuje z klawiatury liczbę rzeczywistą, przy czym pozwala tylko na wprowadzenie liczby należącej do przedziału domkniętego określonego parametrami dol i gora. Odpytywanie użytkownika trwa tak długo, aż zostanie wprowadzona liczba z odpowiedniego zakresu. Należy kontrolować wartości parametrów dol i gora oraz zaproponować metodę sygnalizacji błędu. 1.5 Równanie kwadratowe Dane jest równanie kwadratowe: Ax 2 + Bx + Cx = 0 Należy napisać funkcje wyznaczające deltę, pojedynczy pierwiastek, pierwiastki podwójne. Funkcja obliczająca deltę: float delta( float a, float b, float c ); Funkcja obliczająca pierwiastek podwójny (delta równa zero): float x0( float a, float b, float c ); Funkcja obliczająca dwa pierwiastki (delta większa od zera): float x1( float a, float b, float c, float delta ); float x2( float a, float b, float c, float delta ); Proszę napisać program rozwiązujący równanie kwadratowe w oparciu o te funkcje. 1.6 Układ równań liniowych Dany jest układ równań liniowych A 1 x + B 1 y = C 1 A 2 x + B 2 y = C 2 Rozwiązanie układu równań może polegać na wyliczeniu odpowiednich wyznaczników W, W x, W y a następnie ich ilorazów zgodnie z informacjami poznanym na zajęciach z matematyki. Proszę napisać funkcje wyznaczające wartości wyznaczników: float w( float a1, float b1, float a2, float b2 ); float wx( float c1, float b1, float c2, float b2 ); float wy( float a1, float c1, float a2, float c2 ); Należy zaprojektować i zaimplementować program pozwalający na rozwiązywanie dowolnego układu takich równań. Program powinien umożliwiać wczytanie współczynników A 1, B 1, C 1, B 2, C 2, następnie powinien wyznaczyć rozwiązania równań metodą wyznacznikową. Należy 6

identyfikować i prawidłowo zareagować na sytuację, gdy układ jest nieokreślony. 1.7 Suplement problem buforowanego wejścia Funkcja getchar() wczytuje kolejny znak ze strumienia wejściowego stdin. Na poziomie biblioteki funkcji identyfikowanej przez nagłówek stdio.h następuje buforowanie informacji. Można podejrzewać, że buforowanie to jest przyczyną braku natychmiastowej reakcji na naciśnięcie klawisza, konieczne jest potwierdzenie wprowadzanego znaku naciśnięciem klawisza Enter. Niestety nawet zakaz buforowania strumienia (zobacz funkcja setbuf) nie przynosi zwykle rezultatu. Przyczyną jest nałożenie się dwóch mechanizmów buforowania wewnętrznego, właściwego dla biblioteki standardowego wejścia/wyjścia oraz buforowania na poziomie systemu operacyjnego. I to właśnie ten ostatni rodzaj buforowania sprawia problem przy wczytywaniu danych. Istnieją dwa sposoby czyszczenia bufora wypełnionego niechcianymi znakami. Jeden wykorzystuje funkcję fflush, przeznaczoną właśnie do zapisywania buforów systemowych. Wydaje się, że skutecznym sposobem na wyeliminowanie nieodczytanych jeszcze znaków, oczekujących w buforze, będzie: c = getchar(); fflush( stdin ); Rozwiązanie to jest skuteczne i zwykle działa. Dlaczego zwykle? Otóż zastosowanie funkcji fflush powinno się ograniczać do strumieni otwartych dla zapisu i aktualizacji. Dosłownie: The function fflush forces a write of all buffered data for the given output or update stream via the stream's underlying write function.. Zatem funkcja ta nie powinna działać dla strumienia wejściowego stdin, otwartego dla odczytu. Dlaczego zatem działa? Implementacje funkcji bibliotecznych powinny być zgodne z ustalonymi standardami zdefiniowanymi odpowiednio w normach ANSI/ISO. Jednak zdarza się, że norma nie precyzuje pewnych szczególnych przypadków. Powoduje to, że niektóre implementacje różnie zachowują się w owych, niedoprecyzowanych sytuacjach. Zobaczmy inny opis funkcji fflush: If the given stream has been opened for writing operations the output buffer is phisically written to the file. If the stream was open for reading operations the content of the input buffer is cleared..... Według tego opisu wymiecienie bufora strumienia otwartego do odczytu powoduje skasowanie zawartości bufora. I o to nam właśnie chodzi. Niestety, pisząc oprogramowanie o maksymalizowanym stopniu przenośności nie możemy oczekiwać, że pewna funkcja zadziała tak jak chcemy w zakresie swych cech niezdefiniowanych. Zatem dobrze jest zamiast funkcją fflush posłużyć się własną funkcją o implementacji pokazanej niżej. 7

/*---------------------------------------------------------------- Funkcja: void clr_input_buffer() Przeznaczenie i opis dzialania Funkcja powoduje wyczyszczenie bufora strumienia stdin, poprzez Odczytanie wszystkich znakow zapisanych w buforze, lacznie ze znakiem \n. Funkcja jest bezparametrowa i nie udostepnia rezultatu ----------------------------------------------------------------*/ void clr_input_buffer( void ) while( getchar()!= '\n' ) ; 8