Zadania

Dla każdego z punktów przygotuj program w języku C, realizujący daną funkcjonalność:

  1. getchar.c: Poniższy program prezentujący wykorzystanie funkcji getchar można zapisać krócej - wykorzystaj pętle while oraz zredukuj liczbę miejsc w których funkcja getchar jest wywoływana do jednego.

#include <stdio.h>

int main()
{
        int c = getchar();
        while (c != EOF) {
                printf("%c", c);
                c = getchar();
        }
        return 0;
}

Kod źródłowy należy pokazać na zajęciach.

Funkcja getchar

int getchar(void);

Funkcja getchar zwraca znaki podane przed użytkownika na standardowe wejście (okno terminala) lub EOF w momencie osiągnięcia końca pliku (lub błędu). Przykład wykorzystania:

#include <stdio.h>

int main()
{
        int c = getchar();
        while (c != EOF) {
                printf("%c", c);
                c = getchar();
        }
        return 0;
}

Zmienne

Język C wymaga uprzedniej deklaracji każdej wykorzystywanej nazwy przed jej wykorzystaniem (w tym przed przypisaniem wartości). Deklaracja zmiennej wygląda następująco:

typ-zmiennej nazwa1, nazwa2, ...;

Przykładowo chcąc mieć trzy zmienne całkowite:

int result, x, n;

lub równoważnie:

int result;
int x;
int n;

Do zmiennych można przypisywać wartość. Pierwsze przypisanie nazywane jest _inicjalizacją_.

#include <stdio.h>

int main()
{
        int n = 33;
        printf("Initialized n: %d\n", n);

        n = 44;

        printf("Assigned to n: %d\n", n);

        return 0;
}

Zmienne zdefiniowane wewnątrz ciała funkcji to zmienne lokalne. Zmienne zdefiniowane poza funkcjami to zmienne globalne - każda z funkcji ma do nich dostęp.

int global_variable;

void function1()
{
        int local_variable_a = 4;
}

void function2()
{
        global_variable = 3;
        local_variable_a = 100;
}

int main()
{
        return 0;
}

Kompilując powyższy program otrzymujemy następujący błąd (komunikat może różnić się od systemu):

$ cc -o 01_globals_locals 01_globals_locals.c
01_globals_locals.c: In function ‘function2’:
01_globals_locals.c:11:9: error: ‘local_variable_a’ undeclared (first use in this function); did you mean ‘global_variable’?
   11 |         local_variable_a = 100;
      |         ^~~~~~~~~~~~~~~~
      |         global_variable
01_globals_locals.c:11:9: note: each undeclared identifier is reported only once for each function it appears in

Deklaracje funkcji

Funkcje w języku C składają się z deklaracji i definicji. Deklaracja funkcji jest wprowadzeniem nazwy funkcji do programu, określeniem zwracanego przez nią typu oraz jej prototypu:, liczby argumentów oraz typów argumentów.

Deklaracja funkcji wygląda następująco:

typ-zwracany nazwa-funkcji(argument1, argument2, …);

W przypadku braku argumentów:

  • przed C23: funkcja nie ma prototypu - nie jest sprawdzana poprawność przekazywanych argumentów (można podać dowolną liczbę argumentów w tym zero)

  • od C23: funkcja nie przyjmuje argumentów.

Funkcja nie przyjmująca argumentów może być również określona przez użycie słowa kluczowego void w miejscu listy argumentów.

Przykłady deklaracji funkcji:

void returns_nothing_accepts_anything_before_c23();
void returns_nothing_accepts_nothing();

/* Deklaracje funkcji mogą się powtarzać, o ile posiadają ten sam typ zwracany i prototyp */
void returns_nothing_accepts_nothing();

int returns_a_number_and_accepts_two_numbers(int a, int b);

Definicje funkcji

Definicja funkcji przypisuje zachowanie (ciało funkcji) do deklaracji funkcji. Przykład:

#include <stdio.h>

int add(int a, int b)
{
        return a + b;
}

int main()
{
        printf("%d\n", add(42, 43));
}

Funkcje w języku C muszą być zadeklarowane przed ich użyciem w innych funkcjach. Jeśli w funkcji main chcielibyśmy wykorzystać funkcję add, ale zdefiniować ją później musimy poprzedzić funkcję main deklaracją funkcji add.

#include <stdio.h>

int add(int a, int b);

int main()
{
        printf("%d\n", add(42, 43));
}

int add(int a, int b)
{
        return a + b;
}

Niektóre style programowania w języku C zalecają deklarację wszystkich funkcji na początku programu.