Wykład 1
Szerokość pola i precyzję wyniku można w specyfikacji przekształcenia liczby pominąć. Np.: %6f przeznacza na liczbę co najmniej sześć znaków, %.2f wymusza dwa miejsca po kropce dziesiętnej, lecz nie określa sztywnego rozmiaru pola, a %f po prosty zleca wypisanie liczby w postaci zmiennopozycyjnej.
W wyniku następujących specyfikacji przekształcenia argument zostanie wypisany jako:
%d liczba dziesiętna;
%6d liczba dziesiętna zajmująca co najmniej 6 znaków;
%f liczba zmiennoprzecinkowa;
%6f liczba zmiennoprzecinkowa zajmująca co najmniej 6 znaków;
%.2f liczba zmiennoprzecinkowa z 2 miejscami po kropce dziesiętnej;
%6.2f liczba zmiennoprzecinkowa z 2 miejscami po kropce dziesiętnej zajmująca co najmniej 6 znaków.
Stałe symboliczne
Stosowane są do reprezentowania wartości niezmiennych w całym programie. Dzięki zastosowaniu stałej symbolicznej można łatwo modyfikować te wartości bez konieczności analizowania całej struktury programu. Wiersz #define wprowadza definicję nazwy symbolicznej, która ma reprezentować określony ciąg znaków.
#define nazwa tekst_zastępujący;
Przykład:
#include <studio.h>
#define LOWER 0
#define UPPER 300
#define STEP 20
void main()
{ int fahr;
for (fahr=LOWER; fahr <= UPPER; fahr=fahr+STEP)
printf (“%3d %6.1f\n”, fahr, (5.0/9.0)*(fahr-32));}
Obiekty LOWER, UPPER, STEP nie są zmiennymi, lecz stałymi symbolicznymi, toteż nie pojawią się wśród deklaracji. Nazwy symboliczne umownie zapisuje się wielkimi literami alfabetu w celu odróżnienia ich od nazw zmiennych. Po deklaracji #define nie stosuje się średnika.
Sekwencje specjalne w C
\a znak alarmu
\b znak cofania
\f znak nowej strony
\n znak nowego wiersza
\r znak powrotu karetki
\t znak tabulacji poziomej
\v znak tabulacji pionowej
\\ znak \
\? znak zapytania
\' znak apostrofu
\” znak cudzysłowie
\ooo liczba ósemkowa
\xhh liczba szesnastkowa.
Operatory zwiększania i zmniejszania
Język C oferuje da operatory zwiększania i zmniejszania wartości zmiennych. Operator zwiększania ++ dodaje 1 do swojego argumentu, podczas gdy operator zmniejszenia - - odejmuje1.
Operatory te mogą być używane zarówno jako przedrostkowe (++n) jak i przyrostkowe (n++). W obu przypadkach wynikiem jest zmiana wartości zmiennej n, ale wyrażenie ++n zwiększa n przed użyciem jej wartości, natomiast wyrażenie n++ zwiększa zmienną n po użyciu jej poprzedniej wartości. Oznacza to, ze w kontekście, w którym jest istotna także wartość, a nie tylko efekt zwiększenia, wyrażenia ++n i n++ są różne.
Przykład:
Jeśli n=5 to x=n++; nadaje x wartość 5, ale x=++n; nadaje x wartość 6. W obu przypadkach wartością zmiennej n stanie się 6.
Operatory zmniejszenia i zwiększenia można stosować tylko do zmiennych. Takie wyrażenia jak (i+j)++ są błędne.
Operatory logiczne
&& operator logicznej koniunkcji (AND)
operator logicznej alternatywy (OR)
Operatory i wyrażenia przypisania
Wyrażenia podobne do i=i+2, w których zmienna występująca po lewej stronie operatora przypisania = powtarz się natychmiast po prawej stronie, można zapisać w bardziej zwartej postaci: i+=2
Operator += jest nazywany operatorem przypisania. Dla większości operatorów dwuargumentowych występuje odpowiedni operator przypisania op= gdzie op jest jednym z operatorów: +, - , *, /.
Przykład: wyr1 op= wyr2 ==> wyr1 = (wyr1) op (wyr2)
Przykład: x*=y+1 ==> x=x*(y+1)
Funkcje
Funkcje pomagają podzielić duże przedsięwzięcia obliczeniowe na mniejsze zadania. Dzięki nim można korzystać z tego, co już zostało przez innych zrobione, zamiast rozpoczynać zawsze od zera. Odpowiednie funkcje ukrywają szczegóły pewnych operacji przed częściami programu, w których znajomości tych szczegółów jest zbędna. Całość jest wówczas bardziej przejrzysta, a ponadto łatwiej wprowadza się zmiany. Każdy program można umieścić w jednym lub kilku plikach źródłowych.
Deklaracja funkcji:
typ_funkcji nazwa_funkcji (lista typów argumentów);
Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty.
float fun( int a); float fun( int);
Nazwy argumentów w deklaracjach nie są istotne dla kompilatora i można je pominąć.
void fun(char *); char *fun (char tab[]);
int fun(void); void fun (float&);
Każda definicja funkcji ma następujący format:
typ_powrotu nazwa_funkcji (deklaracje parametrów)
{ deklaracje i instrukcje; }
Program jest właściwie zbiorem definicji zmiennych i funkcji. Komunikacja między funkcjami odbywa się za pośrednictwem argumentów wywołania funkcji i wartości zwracanych przez funkcję, a także za pośrednictwem zmiennych zewnętrznych. W pliku źródłowym funkcje mogą występować w dowolnej kolejności, a program można podzielić między kilka plików źródłowych pod warunkiem, że żadna z funkcji nie zostanie podzielona.
Definicja jest deklaracją, w której jest przedstawiona treść funkcji. Każda funkcja wywoływana w programie musi być zdefiniowana, tylko raz.
#include<iostream.h>
long dodaj(int , int ); // deklaracja funkcji, prototyp funkcji
main() { long wynik; int i=9; float f=3.45; wynik = dodaj (2, 5); //wywołanie funkcji }
long dodaj(int a, int b) //definicja funkcji
{ long w; w=2*a+2*b; return (w); }
Instrukcja RETURN jest narzędziem, dzięki któremu wywołana funkcja przekazuje do miejsca wywołania wartość pewnego wyrażenia. Po słowie return może wystąpić dowolne wyrażenie. Jeśli zajdzie potrzeba, wyrażenie zostanie przekształcone do typu wartości zwracanej przez funkcję. Wyrażenie jest otaczane nawiasami okrągłymi.
return (wyrażenie);
Funkcja wywołująca może zignorować zwracaną wartość. Poza tym instrukcja return nie musi zawierać wyrażenia; w takim przypadku do miejsca wywołania nie przekazuje się żadnej wartości. Sterowanie wraca bez wartości także wtedy, kiedy wykonywanie funkcji zakończy się po osiągnięciu nawiasu klamrowego zamykającego funkcję.
1. Funkcja może zwracać wartość, wtedy przed jej nazwą umieszczamy typ zmiennej zwracanej przez funkcję,
2. Jeśli funkcja nie zwraca wartości jej nazwę poprzedzamy słowem void,
3. Funkcja może być wywoływana z argumentami, wtedy lista argumentów umieszczana jest po nazwie funkcji w nawiasach,
4. Jeśli funkcja wywoływana jest bez argumentu to deklarujemy: int f(void) lub int f(),
Przekazywanie argumentów do funkcji
Podczas wywoływania funkcji przydziela się pamięć dla jej argumentów formalnych, a następnie każdemu argumentowi formalnemu przypisuje się odpowiadający mu parametr aktualny. Sprawdza się przy tym zgodności typów i w razie potrzeby dokonuje się konwersji.
void func(int par) { //par jest parametrem formalny funkcji
par += 5; }
zmienna par to tzw. parametr formalny funkcji. W funkcji main() wywołujemy ją w nastepujący sposób:
void main() { int a1=5;
func(a1); // a1 to jest parametr aktualny funkcji. }
Argumenty przekazujemy:
- przez wartość
- przez wskaźnik
- przez referencję.
Przekazywanie parametrów przez wartość
Funkcja pracuje na kopii zmiennej (parametru aktualnego), więc funkcja nie ma możliwości modyfikowania go. Parametr aktualny służy jedynie do modyfikacji parametru formalnego przechowywanego tymczasowo na stosie.
int func(int par) {
par = par + 5;
printf(“\n funkcja: par= %d”, par);
return (par); }
zmienna par to argument (parametr) formalny funkcji.
void main() { int w, a1=5;
printf(“Parametr aktualny przed wywołaniem: a1=%d”, a1);
w = func(a1);
prinft(„Parametr aktualny po wywołaniu: a1=%d”, a1);
printf(„\nWynik=%d”, w); }
// Ekran:
Parametr aktualny przed wywolaniem: a1 = 5
funkcja: par=10
Parametr aktualny po wywolaniu: a1=5
Wynik = 10
3
3