Podstawy programowania dr inż. Robert Arsoba Ćwiczenie 9 Funkcje Cel ćwiczenia Celem ćwiczenia jest praktyczne zapoznanie się z deklarowaniem, definiowaniem i wywoływaniem przez programistę własnych funkcji w programach tworzonych w języku C oraz wykształcenie umiejętności budowy programów z podziałem na funkcje (podprogramy). Zakres ćwiczenia obejmuje funkcje, w których parametry przekazywane są przez wartość lub przez wskaźnik (przez adres). Przygotowanie się do ćwiczenia • • • Zapoznać się z wykładem dotyczącym funkcji. • Zwrócić uwagę na budowę funkcji w języku C (nagłówek i ciało funkcji). • Przeanalizować przykłady funkcji zamieszczone w materiałach do wykładu. • Utrwalić metody przekazywania argumentów do funkcji przez wartość i przez wskaźnik. Zapoznać się z przykładowym programem zamieszczonym w opisie ćwiczenia, zawierającym definicje różnych wariantów funkcji silnia. • Przeanalizować kod źródłowy zdefiniowanych funkcji i programu. • Skompilować i uruchomić program, przetestować jego działanie. Zrealizować samodzielnie zadania ćwiczeniowe. • Opracować dla poszczególnych funkcji algorytmy w postaci schematów blokowych. • Na podstawie algorytmów utworzyć kod źródłowy funkcji i przetestować ich działanie w prostych programach zawierających wywołanie tych funkcji. Zadania do wykonania 1. Zdefiniować funkcję double potega(double a, int n), zwracającą wartość funkcji an. Uwzględnić, że potęgowana liczba a jest zmiennoprzecinkowa, natomiast wykładnik potęgi n jest liczbą całkowitą (dodatnią, ujemną lub równą 0). Potęgowanie zrealizować jako operację mnożenia powtarzaną w pętli. Przetestować działanie funkcji w prostym programie. 2. Zdefiniować funkcje: int str2int(char *s); (odpowiednik funkcji atoi) float str2float(char *s); (odpowiednik funkcji atof) zamieniające łańcuch znakowy s odpowiednio na liczbę typu int i liczbę typu float. Działanie funkcji zrealizować w oparciu o analizę łańcucha znakowego s metodą „znak po znaku”. Funkcje powinny w odpowiedni sposób reagować na niewłaściwe znaki mogące pojawić się w łańcuchu s. Przetestować działanie funkcji w prostym programie. Materiały przygotowano w ramach projektu „Inżynier pilnie poszukiwany” Strona 1 Podstawy programowania dr inż. Robert Arsoba 3. Korzystając z funkcji zdefiniowanych w zadaniu 2, zdefiniować funkcje: int czytaj_int(); float czytaj_float(); wczytujące poprawnie z klawiatury i zwracające odpowiednio: liczbę całkowitą typu int i liczbę rzeczywistą typu float. Funkcje powinny w odpowiedni sposób reagować na niewłaściwe znaki mogące pojawić się w łańcuchach znakowych wczytywanych z klawiatury. Przetestować działanie funkcji w prostym programie. 4. Zdefiniować własną wersję bibliotecznej funkcji strrev do odwracania kolejności znaków w łańcuchu znakowym (zapis łańcucha wspak). Następnie wykorzystać zdefiniowaną funkcję w programie określającym, czy podane z klawiatury słowo jest palindromem. Wskazówka: palindrom to słowo lub ciąg znaków, który czytany wspak ma tę samą postać, np. kajak, kobyłamamałybok. 5. Zdefiniować funkcje: int czy_pierwsza(int n); int czy_doskonala(int n); sprawdzające, czy wartość n jest odpowiednio liczbą pierwszą i liczbą doskonałą. Wykorzystując te funkcje, zdefiniować funkcje: void pierwsze(int a, int b); void doskonale(int a, int b); wyświetlające na ekranie odpowiednio liczby pierwsze i liczby doskonałe z zadanego przedziału od a do b. Następnie napisać program wyszukujący w zadanym przez użytkownika przedziale wszystkie liczby pierwsze i doskonałe. Przykład działania programu: Wyszukiwanie liczb w zadanym przedziale: 1 – liczby pierwsze 2 – liczby doskonałe 3 – koniec programu Wybierz rodzaj liczb: 2 Podaj lewy brzeg przedziału : 1 Podaj prawy brzeg przedziału: 500 Znalezione liczby doskonałe : 6, 28, 496 Naciśnij klawisz ENTER aby powrócić do menu. (w tym momencie program powinien ponownie wyświetlić na ekranie menu). Wymagana zawartość sprawozdania z ćwiczenia 1. Notatki ze schematami blokowymi algorytmów do zadań. 2. Pliki z kodem źródłowym programów. Zalecane źródła wiedzy 1. B. Kernighan, D. Ritchie: „Język ANSI C”, WNT, Warszawa 2001. Materiały przygotowano w ramach projektu „Inżynier pilnie poszukiwany” Strona 2 Podstawy programowania dr inż. Robert Arsoba Przykładowy program /* * Definicja funkcji silnia (cztery warianty) * Robert Arsoba * 1.12.2009 * Wersja 1.0 */ #include <stdio.h> #include <stdlib.h> /* funkcje printf */ /* funkcja system */ /* silnia przy uzyciu petli for */ double silnia1(unsigned int n) { double wynik = 1; /* najmniejszy mozliwy wynik silni int i; /* licznik petli for (i = 1; i <= n; i++) /* i zmienia wartosc od 1 do n wynik *= i; /* domnazanie kolejnych wartosci i return wynik; /* wyjscie z funkcji } */ */ */ */ */ /* silnia przy uzyciu petli while */ double silnia2(unsigned int n) { double wynik = 1; int i = 1; while (i <= n) { wynik *= i; i++; } return wynik; } /* silnia przy uzyciu petli do-while */ double silnia3(unsigned int n) { double wynik = 1; int i = 1; do { wynik *= i; i++; } while (i <= n); return wynik; } /* silnia - wersja rekurencyjna */ double silniaR(unsigned int n) { if (n > 1) return n*silniaR(n-1); /* wywolanie rekurencyjne */ else /* warunek zakonczenia rekurencji */ return 1; } Materiały przygotowano w ramach projektu „Inżynier pilnie poszukiwany” Strona 3 Podstawy programowania dr inż. Robert Arsoba int main() { system("cls"); printf("0! 1! 5!\n"); printf("%.0lf %.0lf printf("%.0lf %.0lf printf("%.0lf %.0lf printf("%.0lf %.0lf system("pause"); return 0; } %.0lf\n", %.0lf\n", %.0lf\n", %.0lf\n\n", silnia1(0), silnia2(0), silnia3(0), silniaR(0), silnia1(1), silnia2(1), silnia3(1), silniaR(1), Materiały przygotowano w ramach projektu „Inżynier pilnie poszukiwany” Strona 4 silnia1(5)); silnia2(5)); silnia3(5)); silniaR(5));