funkcje,operatory,wyrazenia


Ćwiczenie 3
Funkcje, operatory i wyrażenia
3.1. Funkcje
Każda funkcja ma format:
typ_zwracanej_wartości nazwa_funkcji( lista_deklaracji_argumentów )
{
deklaracje i instrukcje, jeśli występują
}
Typ zwracanej wartości jest opcjonalny, jeśli zostanie pominięty, to przyjmuje się, że funkcja zwra-
ca wartość typu int. Jeśli chcemy, by funkcja nie zwracała żadnej wartości deklarujemy, że zwra-
ca void. Typ void jest typem specjalnym i oznacza nic. Funkcja, która powinna zwrócić wartość
wyrażenia robi to przy użyciu instrukcji:
return wyrażenie;
Instrukcja return jest ostatnią instrukcją wykonywaną przez funkcję. Oznacza to, że program,
gdy wykona instrukcję return wychodzi z funkcji, nawet jeśli po tej instrukcji są jakieś inne.
Program 3.1
Napisać funkcję, która sprawdzi czy w podanej tablicy znakowej, zawierającej jakiś tekst,
występuje podany znak. Jeśli, tak to funkcja ma zwróci indeks do tablicy (czyli pozycję na której
wystąpił ten znak, licząc od 0), jeśli nie to ma zwrócić liczbę -1;
int CzyWystępuje(char tab[ ], char c) /*pierwszy parametr to tablica znaków o nazwie
tab, drugi o nazwie c to znak*/
{
int i;
for(i = 0; i < strlen(tab); i = i+1)
if(tab[i] == c) /*podwójny znak = to operator porównania*/
return i; /* jeśli znalazłeś szukany znak to zwróć jego pozy-
cje i wyjdz z funkcji */
return -1; // jeśli nie znalazłeś, to zwróć -1 jako informacje o niepowodzeniu
}
main( ) /*główna funkcja programu*/
{
char t[] =  przykladowy tekst ; /*deklaracja tablicy z równoczesną jej
inicjalizacją*/
int retVal;
retVal = CzyWystępuje(t,  z ); /*wywołanie funkcji*/
printf( wynik = %d\n , retVal); /*wypisanie wartości zwróconej*/
printf( wynik = %d\n , CzyWystępuje(t,  b ));
/*wywołanie funkcji, wartość zwrócona przez nią
będzie argumentem wywołania printf*/
}
Laboratorium Podstawy Programowania
W deklaracji funkcji CzyWystępuje parametry char tab[ ] i char c nazywane są parametrami
formalnymi. Przy wywołaniu funkcji takim jak np. CzyWystępuje(t,  z ); umieszczone są para-
metry aktualne, które są podstawiane za parametry formalne. Np tablica t występująca w funkcji
main widziana jest przez funkcje CzyWystępuje pod nazwą tab, a litera  z podstawiana jest za
znak c.
Zauważ, że w warunku na zakończenie pętli for użyta jest funkcja strlen. Funkcja ta jako argument
dostaje tab (stała tekstowa, lub tablica tekstowa), a zwraca jej długość (liczbę znaków). Zauważ też,
że tablice w jezyku C indeksowane są od ZERA.
3.2. Argumenty funkcji
W języku C argumenty do funkcji mogą być przekazywane na dwa sposoby: poprzez war-
tość i poprzez adres. Jeśli argument jest przekazywany poprzez wartość, to funkcja otrzymuje pry-
watną, tymczasową kopię danego argumentu. Ponadto funkcja ta nie ma dostępu do rzeczywistego
argumentu w funkcji wywołującej. Wewnątrz funkcji każdy taki argument jest zmienną lokalną
o wartości początkowej równej wartości, z którą funkcja została wywołana. Funkcja może zmieniać
wartość tej zmiennej, ale te zmiany nie są widoczne na zewnątrz, bo przeprowadzane są na kopii,
która po zakończeniu wykonywania funkcji przestaje istnieć.
Inaczej przedstawia się sytuacja dla zmiennych, które są przekazywane poprzez adres.
W takim wypadku funkcja nie dostaje kopii parametru tylko jego adres. Mając adres danego obiek-
tu można go zmodyfikować. Więcej o tym sposobie przekazywania parametrów pózniej.
W sposób specjalny traktowane są tablice będące argumentem funkcji. Wtedy to do funkcji
przekazuje się wartość będącą położeniem (adres) początku tablicy; jej elementy nie są kopiowane.
Zwiększa to efektywność wykorzystania czasu oraz pamięci operacyjnej. Gdyby tablice były prze-
kazywane przez wartość, wówczas za każdym wywołaniem funkcji, której argumentem jest tablica
byłyby tworzone kopie tej tablicy. Funkcja może zmienić elementy tablicy poprzez indeksowanie
od tego położenia. Tablice są więc przekazywane przez adres.
Operatory zwiększania i zmniejszania wartości zmiennych:
arg++, ++arg oraz arg--, --arg
Operatory te służą do zwiększania lub zmniejszania o 1 argumentu arg.
Operatory relacji i logiczne:
> >= < <= większe, większe lub równe,
mniejsze, mniejsze lub równe
== przyrównanie
!= nierówne
&& logiczne AND
|| logiczne OR
Bitowe operatory logiczne
& bitowa koniunkcja AND
| bitowa alternatywa OR
^ bitowa różnica symetryczna XOR
<< bitowe przesunięcie w lewo
>> bitowe przesunięcie w prawo
~ bitowe uzupełnienie jedynkowe
Politechnika Opolska
2
Laboratorium Podstawy Programowania
Operatory i wyrażenia przypisania
i = i + 2 jest równoważne i += 2
i = i / 3 jest równoważne i /= 3
Dla większości operatorów dwuargumentowych występuje odpowiedni operator przypisania op=,
gdzie op jest jednym z operatorów:
+ - * / % << >> & ^ |
Program 3.2
Wykonać przesunięcie w lewo o 3 bity zmiennej a typu int  odpowiada to operacji mnożenia
przez 28.
#include
#include
void main()
{
clrscr();
int t[16];
int a = 100, b=a;
printf("a=%i\n",a);
for (int i=0;i<16;i++) {t[i]=b%2; b/=2; }
for (int j=15;j>=0;j--) printf("%d",t[j]);
a<<=3;
b=a;
printf("\n po przesunieciu: %d\n",a);
for (i=0;i<16;i++) {t[i]=b%2; b/=2; }
for (j=15;j>=0;j--) printf("%d",t[j]);
getch();
}
3.3. Tablice znakowe
Pracę z tablicami rozpoczynamy od tablic znakowych. Przykładami deklaracji tablic znako-
wych (wprowadzone już w zestawie 1)są:
char tekst[32];
char txt[ ] = "to jest tekst";
W I przypadku deklarujemy tablicę tekst o rozmiarze 32 elementów typu char. Tablica ta
nie jest zainicjowana, więc zawiera wartości przypadkowe. W II przypadku deklarujemy i inicjali-
zujemy tablicę txt. Tym razem nie został podany rozmiar tablicy. Kompilator automatycznie określi
rozmiar tablicy na długość tekstu plus 1, tj. 13 + 1. Wynika to z faktu, że każdy tekst (tutaj stała
tekstowa) zakończony jest znakiem '\0' oznaczającym koniec łańcucha tekstowego. Dzięki temu np.
funkcja printf wie, gdzie tekst się kończy, a funkcja strlen poprawnie określa jego długość.
Tablice w języku C są indeksowane od 0.
Program 3.3
Wypisać zawartość tablicy txt. Możliwe są dwa sposoby.
#include
char txt[] = "to jest tekst";
main( )
{
int i;
printf("%s\n", txt); /* sposób pierwszy */
i = 0;
while(txt[i]) /* sposób drugi - znak po znaku*/
printf("%c", txt[i++]);}
Politechnika Opolska
3
Laboratorium Podstawy Programowania
W przedstawionej jako druga metodzie, warto zwrócić uwagę na warunek w pętli while.
Ponieważ tekst jest zakończony znakiem '\0', to pętla skończy się we właściwy sposób i znak '\0'
(odpowiada mu kod o wartości ZERO) nie będzie już wypisany (pętla while jest wykonywana tak
długo, jak długo warunek ma wartość prawdy, tzn. jest różny od ZERA).
Program 3.4
Zdefiniować funkcję małeNaDuze(char org[ ], char wyn[ ]), która zmieni wszystkie małe
litery występujące w tekście org na duże, a rezultat zapisze w tablicy wyn.
#include
małeNaDuze(char org[ ], char wyn[ ])
{ /* ciało funkcji ...*/ }
main()
{
char t[128]; /*alokacja tablicy mogącej pomieścić tekst o 127 znakach */
małeNaDuze( 0 1 ala X , t);
printf( %s , t); /*wypisz wynik*/
}
Programy do samodzielnego napisania:
1. Napisać program z dowolną własną funkcją ilustrujący przekazywanie argumentów przez war-
tość. Niech funkcja wypisze wartość przekazanego jej argumentu, potem dokona jego modyfi-
kacji i wypisze ponownie jego wartość. Po powrocie z funkcji wypisz ponownie wartość zmien-
nej, która była przekazana przykładowej funkcji. Przekonaj się, że taka funkcja działa na kopii
przekazanych jej parametrów aktualnych i po opuszczeniu funkcji przekazane jej parametry ma-
ją taką samą wartość, jak przed wejściem do funkcji.
2. Napisać program, który pokaże różnice pomiędzy operatorami przedrostkowymi (np. ++arg)
oraz przyrostkowymi (np. arg++).
3. Zdefiniować funkcję WordLength(), która przy użyciu operatorów bitowych obliczy długość
słowa dostępnej maszyny, to znaczy określi liczbę bitów wartości typu int.
4. Zdefiniować funkcję invert(int x, char p, char n), która zamieni n bitów argumentu x z 1 na 0
i odwrotnie, rozpoczynając od pozycji p. Pozostałe bity nie powinny się zmienić. Zastosować
operator XOR.
Przykład: wywołanie invert(15, 3, 2), w zapisie binarnym: 15 = 00001111b, zamieniając
na przeciwne bity 3 i 4, licząc od zera otrzymujemy: 00010111b.
maska = 00011000. Obliczając 00001111b XOR 00011000 otrzymujemy 00010111b.
5. Zdefiniować funkcję sprawdzającą podzielność liczby n przez m przy wykorzystaniu wyrażenia
warunkowego, a nie instrukcji if-else.
6. Zdefiniować funkcję, która ustawia trzy argumenty typu int w porządku malejącym.
7. Zdefiniować funkcję silnia, która dla danej liczby naturalnej oblicza wartość n! Przeanalizować
wpływ typu danych na otrzymany wynik.
8. Rozwiązać problem z zadania 7 stosując funkcję rekurencyjną.
9. Zdefiniować funkcję rekurencyjną NWD obliczającą największy wspólny dzielnik liczb m i n.
10. Zdefiniować funkcję menu, która wyświetla na ekranie listę czterech ponumerowanych opcji.
11. Zdefiniować funkcję reverse(char s[ ]), odwracającą znaki ze strumienia wejściowego. Funkcja
ma wczytywać znaki, aż do napotkania znaku odpowiadającego klawiszowi ESC. Po napotka-
niu tego znaku funkcja wypisuje wprowadzone znaki, ale w odwrotnej kolejności. Do wprowa-
dzania danych z klawiatury zastosować funkcję getch. Kod klawisza ESC to 27.
12. Zdefiniować funkcję znajdz(char s[ ], char x[ ]), której zadaniem będzie sprawdzenie, czy
w podanym tekście s występuje podtekst x. Jeśli tak, to funkcja ma zwrócić pozycję pierwszej
Politechnika Opolska
4
Laboratorium Podstawy Programowania
litery wystąpienia podtekstu x w tekście s. W przeciwnym razie, powinien pojawić się stosowny
komunikat.
Politechnika Opolska
5


Wyszukiwarka

Podobne podstrony:
historia logiki, język, jego funkcje, nazwy, wyrażenia, funktory, związki logiczne
tablica funkcji i operatorów typy danych
tablica funkcji i operatorów
wyrazenia i operatory
M MARCJANIK typologia polskich wyrazen jezykowych o funkcji grzecznosciowej
Geneza i funkcjonowanie mitu arkadyjskiego
trans operation
Fundacje i Stowarzyszenia zasady funkcjonowania i opodatkowania ebook
integracja funkcji
FUNKCJA CHŁODZENIE SILNIKA (FRIC) (ZESPOLONE Z KALKULATOREM
ciaglosc funkcji2
Znaczenie korytarzy ekologicznych dla funkcjonowania obszarów chronionych na przykładzie Gorców
m01 operatorchecker sowi
Funkcjonowanie zbiornikow wodnych i Makrofity
Zestaw 1 Funkcja kwadratowa Funkcja homograficzna Równanie liniowe

więcej podobnych podstron