Kurs C++2, m 3, Instrukcja for


Ć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 zwraca wartość typu int. Jeśli chcemy, by funkcja nie zwracała żadnej wartości deklarujemy, że zwraca 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 pozycje i wyjdź 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*/

}

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ą parametry 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 wartość i poprzez adres. Jeśli argument jest przekazywany poprzez wartość, to funkcja otrzymuje prywatną, 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 obiektu można go zmodyfikować. Więcej o tym sposobie przekazywania parametrów później.

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 przekazywane 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

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 <stdio.h>

#include <conio.h>

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 znakowych (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 inicjalizujemy 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 <stdio.h>

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++]);}

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 <stdio.h>

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 wartość. Niech funkcja wypisze wartość przekazanego jej argumentu, potem dokona jego modyfikacji i wypisze ponownie jego wartość. Po powrocie z funkcji wypisz ponownie wartość zmiennej, 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 mają 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.

  1. Zdefiniować funkcję sprawdzającą podzielność liczby n przez m przy wykorzystaniu wyrażenia warunkowego, a nie instrukcji if-else.

  2. Zdefiniować funkcję, która ustawia trzy argumenty typu int w porządku malejącym.

  3. Zdefiniować funkcję silnia, która dla danej liczby naturalnej oblicza wartość n! Przeanalizować wpływ typu danych na otrzymany wynik.

  4. Rozwiązać problem z zadania 7 stosując funkcję rekurencyjną.

  5. Zdefiniować funkcję rekurencyjną NWD obliczającą największy wspólny dzielnik liczb m i n.

  6. Zdefiniować funkcję menu, która wyświetla na ekranie listę czterech ponumerowanych opcji.

  7. 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 napotkaniu tego znaku funkcja wypisuje wprowadzone znaki, ale w odwrotnej kolejności. Do wprowadzania danych z klawiatury zastosować funkcję getch. Kod klawisza ESC to 27.

  8. 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 litery wystąpienia podtekstu x w tekście s. W przeciwnym razie, powinien pojawić się stosowny komunikat.

Laboratorium Podstawy Programowania

3



Wyszukiwarka

Podobne podstrony:
Kurs C++2, m 4, Instrukcja for
Jazda pasem ruchu oraz po łuku do przodu i do tyłu, Kurs Instruktora Prawa Jazdy, Egzamin praktyczny
Wypadek drogowy, Kurs Instruktora Prawa Jazdy, Konspekty, Konspekty, 17 Wypadek bez ofiar i z ofiara
Instructions for?sicLog
instructions for zen meditation 2GVX7YJXPQNLC74CRS3FJNXUAOIXYARA5IRHJXY
petle, Instrukcja for
PARKOWANIE RÓWNOLEGŁE POMIĘDZY DWOMA POJAZDAMI, Kurs Instruktora Prawa Jazdy, Egzamin praktyczny
Omówienie zasad obowiązujących w związku z używaniem pasów b, Kurs Instruktora Prawa Jazdy, Konspekt
KRYTERIA EGZAMINACYJNE, Kurs Instruktora Prawa Jazdy, Egzamin praktyczny
Bezpieczeństwo czynne i bierne w pojeździe, Kurs Instruktora Prawa Jazdy, Konspekty, Konspekty, Bezp
OSK, Kurs Instruktora Prawa Jazdy, Konspekty, Konspekty
Znaki zakazu i nakazu, Kurs Instruktora Prawa Jazdy, Konspekty, 1
Test z metodyki i psychologii, kurs instruktor nauki jazdy
Pas ruchu, Kurs Instruktora Prawa Jazdy, Egzamin praktyczny
pierwszeństwa ruchu drogowego, Kurs Instruktora Prawa Jazdy, Konspekty, 2
Omówienie zasady należytej ostrożności, Kurs Instruktora Prawa Jazdy, Konspekty, Konspekty
Zmniejszona przejrzystość powietrza, Kurs Instruktora Prawa Jazdy, Konspekty, 1
JS 10 Instrukcja for, Programowanie, instrukcje - teoria

więcej podobnych podstron