Ś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

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.

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

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.

Typy argumentów funkcji scanf
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;
}