Zadania
Dla każdego z punktów przygotuj program w języku C, realizujący daną funkcjonalność:
-
getchar.c
: Poniższy program prezentujący wykorzystanie funkcjigetchar
można zapisać krócej - wykorzystaj pętle while oraz zredukuj liczbę miejsc w których funkcjagetchar
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.