Środowisko programisty/C - zmienne i funkcje: Różnice pomiędzy wersjami
Nie podano opisu zmian |
|||
Linia 29: | Linia 29: | ||
=== Podstawy === | === Podstawy === | ||
W języku C | W języku C, w przeciwieństwie do Pascala, nie występuje ś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) | typ nazwa_funkcji(lista parametrów) | ||
Linia 46: | Linia 46: | ||
=== Funkcja main === | === 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: | 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() | int main() | ||
Linia 54: | Linia 54: | ||
} | } | ||
Wynik działania funkcji main jest przekazywany do powłoki i w sytuacji kiedy wykonanie programu zakończy się sukcesem, powinien wynosić 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 === | === Słowo kluczowe return === | ||
Linia 129: | Linia 129: | ||
printf("format", lista zmiennych) | 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. | 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ć: | Znaki formatujące zawsze mają następującą postać: | ||
Linia 135: | Linia 135: | ||
%[flagi][szerokość][.precyzja][modyfikatory]typ | %[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. | 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. | ||
{| border="1" | {| border="1" | ||
Linia 166: | Linia 166: | ||
|} | |} | ||
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). | 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). | ||
{| border="1" | {| border="1" | ||
Linia 218: | Linia 218: | ||
* białe znaki, które oznaczają, że scanf odczyta dowolną liczbę białych znaków (być może zero białych znaków) | * białe znaki, które oznaczają, że scanf odczyta dowolną liczbę białych znaków (być może zero białych znaków) | ||
* opisy formatu danych wejściowych | * opisy formatu danych wejściowych oznaczające, że scanf przeczyta z wejścia fragment napisu i zapisze go w kolejnej zmiennej z listy zmiennych | ||
* inne znaki, które powinny być wprowadzone dokładnie tak, jak zostały wpisane w formacie, inaczej scanf zgłosi błąd | * inne znaki, które powinny być wprowadzone dokładnie tak, jak zostały wpisane w formacie, inaczej scanf zgłosi błąd | ||
Aktualna wersja na dzień 11:22, 27 wrz 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, w przeciwieństwie do Pascala, nie występuje ś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
getchar
Funkcja getchar() wczytuje kolejny znak ze standardowego wejścia. Jej wynikiem jest zmienna typu int. Jeśli standardowe wejście się skończyło, to wczytane zostanie EOF. Poniżej przykładowy zliczacz liczby wprowadzonych znaków
#include<stdio.h> void main() { int ch, i=0; while( (ch = getchar() ) != EOF) i++; printf("Wprowadziłeś %d znaków\n", i); }
putchar
Wypisuje jeden znak na standardowe wyjście. Poniżej wypisywacz alfabetu:
#include <stdio.h> int main () { char c; for (c = 'a' ; c <= 'z' ; c++) putchar (c); putchar('\n'); return 0; }
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, 123456l); 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; }
scanf
Do wczytywania zmiennych ze standardowego wejścia służy funkcja scanf. Ma ona następującą postać:
scanf("format", lista zmiennych)
format może zawierać następujące elementy:
- białe znaki, które oznaczają, że scanf odczyta dowolną liczbę białych znaków (być może zero białych znaków)
- opisy formatu danych wejściowych oznaczające, że scanf przeczyta z wejścia fragment napisu i zapisze go w kolejnej zmiennej z listy zmiennych
- inne znaki, które powinny być wprowadzone dokładnie tak, jak zostały wpisane w formacie, inaczej scanf zgłosi błąd
Opisy formatu danych wejściowych zawsze mają następującą postać:
%[*][szerokość][modyfikatory]typ
Pole typ decyduje o tym, jaki powinien być typ kolejnego argumentu.
Typ | Znaczenie | Oczekiwany typ argumentu |
---|---|---|
c | pojedynczy znak | char * |
d | liczba całkowita | int * |
e,E,f,g,G | liczba rzeczywista | float * |
o | liczba ósemkowa | int * |
s | napis aż do białego znaku | char * |
u | nieujemna liczba całkowita | int * |
x | liczba szesnastkowa | int * |
Jeśli jest zaznaczona gwiazdka (*), to wprowadzany ciąg znaków będzie ignorowany (popatrz na przykład). Modyfikatory pełnią taką samą rolę jak przy funkcji printf.
#include <stdio.h> int main () { char str [80]; int i, j; scanf ("%s",str); // wczytuje napis scanf ("%d",&i); // wczytuje liczbe i scanf ("%d %d",&i, &j); // wczytuje liczby i j scanf ("%*d %d",&i); // wczytuje dwie liczby, ale i jest ustawiane na wartosc drugiej z nich return 0; }