Środowisko programisty/C - zmienne i funkcje

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania

Typy zmiennych

Typy proste

Język C definiuje następujące typy proste

Typy proste w C
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.

Typy obsługiwane przez funkcję printf
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).

Flagi
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.

Modyfikatory
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

scanf