Środowisko programisty/C - zmienne i funkcje: Różnice pomiędzy wersjami
Linia 170: | Linia 170: | ||
#include <stdio.h> | #include <stdio.h> | ||
int main() | int main() | ||
{ | { |
Wersja z 11:31, 21 sie 2006
Typy zmiennych
Typy proste
Język C definiuje następujące typy proste
Nazwa | Znaczenie | Typowy zakres |
---|---|---|
char | znak | |
unsigned char | mała liczba całkowita | 0-255 |
short int | liczba całkowita | |
unsigned short int | liczba dodatnia | |
int | duża liczba całkowita | |
float | liczba rzeczywista | |
double | duża liczba rzeczywista |
Funkcje
Podstawy
W języku C nie występuje, w przeciwieństwie do Pascala, ścisły podział na funkcje i procedury. Występują jedynie funkcje, które niekoniecznie muszą dawać jakikolwiek wynik. Składnia funkcji jest następująca:
typ nazwa_funkcji(lista parametrów) { treść funkcji return wynik_funkcji }
Napiszmy funkcję obliczającą sumę dwóch parametrów
int dodaj(int a, int b) { return a + b; }
Funkcja main
Funkcja main, której wynikiem jest liczba typu int, jest główną funkcją w C i jest wykonywana automatycznie w momencie uruchomienia programu. Korzystając z funkcji dodaj można napisać następujący program:
int main() { printf("%d\n", dodaj(1,1)); return 0; }
Wynik działania funkcji main jest przekazywany do powłoki i w sytuacji kiedy wykonanie programu zakończy się sukcesem, powinien wynosić 0.
Słowo kluczowe return
Funkcja kończy swoje działanie po napotkaniu instrukcji return. Czyli następujący kod jest poprawny (funkcja liczy sumę):
int dodaj(int a, int b) { return a + b; return a * b; // Ta instrukcja nigdy się nie wykona }
Procedury
Niekiedy występuje potrzeba utworzenia funkcji, która niczego nie oblicza, czyli znanej z Pascala procedury. W takim przypadku możemy zastosować konstrukcję:
void funkcja() { ... return }
Popatrzmy na następujący przykład:
#include <stdio.h> int dodaj(int a, int b) { return a + b; }; void wypisz(int i) { printf("%d\n", i); return; }; int main() { wypisz(dodaj(1,1)); return 0; }
Wybrane funkcje biblioteczne
printf
Do wypisywania informacji służy funkcja printf. Ma ona następującą postać:
printf("format", lista zmiennych)
format to napis, który zostanie wypisany na standardowe wyjście. Napis ten może zawierać znaki formatujące, mówiące o tym jakich zmiennych będzie oczekiwać funkcja w liście zmiennych i w jaki sposób zostaną one wypisane.
Znaki formatujące zawsze mają następującą postać:
%[flagi][szerokość][.precyzja][modyfikatory]typ
Najistotniejszym parametrem jest typ, który decyduje o tym jak zostanie potraktowana zmienna wypisywana przez funkcję printf. Zwróćmy uwagę na to, że jest takie rozwiązanie jest zupełnie inne niż w Pascalu, w którym kompilator po napotkaniu funkcji Write lub Writeln sam domyśla się z jakimi parametrami ma do czynienia.
Typ | Znaczenie | Przykład |
---|---|---|
c | pojedynczy znak | q |
d lub i | liczba całkowita ze znakiem | -11 |
e (lub E) | liczba z mantysą i wykładnikiem oddzielona znakiem e (lub E) | 1.2345e3 (lub 1.2345E3) |
f | liczba rzeczywista | 1.23 |
g (lub G) | krótsze z pary %f i %e (lub %E) | 1.23 |
o | liczba ósemkowa ze znakiem | 71 |
s | napis | przykład ze spacja |
u | liczba całkowita nieujemna | 11 |
x | liczba szesnastkowa nieujemna | af1 |
X | liczba szesnastkowa nieujemna (wielkie litery) | AF1 |
p | adres w pamięci | A000:00FF |
n | nic (służy do uzyskania liczby wypisanych dotychczas znaków) | (wskaźnik na int) |
Szerokość, to minimalna liczba znaków które będą wypisane. Jeśli napis do wypisania będzie krótszy niż oczekiwana szerokość, to zostaną dodane do niego spacje. Szerokość może zaczynać się od 0, wtedy zamiast spacji dopisywane są zera. Pole szerokość może mieć również wartość "*" co oznacza, że szerokość zostanie podana nie w napisie formatującym, ale jako jeden z parametrów do funkcji printf (poprzedzający argument do formatowania).
Flaga | Znaczenie |
---|---|
- | wyrównanie do lewej |
+ | argumenty dodatnie będą poprzedzone znakiem plus |
spacja | jeśli argument jest dodatni, to będzie poprzedzony spacją |
Pole precyzja mówi o tym, ile liczb ma być wypisane po przecinku.
Modyfikator | Znaczenie |
---|---|
h | argument jest interpretowany jako short int |
l | argument jest interpretowany jako long int (całkowity) lub double (rzeczywisty) |
L | argument jest interpretowany jako long double |
Popatrzmy na przykład (uruchom go, aby zobaczyć jak to wygląda)
#include <stdio.h> int main() { printf ("Znaki: %c %c\n", 'a', 65); printf ("Liczby: %d %ld\n", 1234, 123456); printf ("Ze spacjami: %10d \n", 1234); printf ("Z zerami: %010d \n", 1234); printf ("Całkowite: %d %x %o \n", 100, 100, 100); printf ("Rzeczywiste: %4.2f %.0e \n", 1.2345, 1.2345); printf ("Gwiazdka: %*d \n", 4, 0); printf ("%s \n", "Napis"); return 0; }