Ćwiczenie 9 - Robert Arsoba

Transkrypt

Ćwiczenie 9 - Robert Arsoba
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));