Tahák
Tato stránka obsahuje zkomprimované informace o všech důležitých syntaktických konstrukcích jazyka C, které budeme v UPR používat. Zejména ze začátku může být užitečná pro to, abyste si mohli rychle připomenout, jak v C zapsat nějaký konkrétní příkaz. Podobné taháky můžete naleznout také třeba zde nebo zde.
Základní program (učivo)
#include <stdio.h>
int main() {
// Radkovy komentar
/*
* Blokovy komentar
*/
printf("Hello world\n");
return 0;
}
Překlad a spuštění programu (učivo)
$ gcc main.c -g -fsanitize=address -o main
$ ./main
Základní výpis (učivo)
- Textu
printf("Ahoj UPR\n");
- Číselného výrazu
printf("Cislo: %d\n", <výraz>); printf("Cislo: %d\n", 1 + 2);
Proměnné (učivo)
- Vytvoření:
<datový typ> <název> = <výraz>;
int vek = 18;
- Užitečné datové typy:
int
: celé číslo se znaménkemfloat
: desetinné číslochar
: znak
- Čtení (získání hodnoty proměnné):
<název proměnné>
printf("%d\n", vek); int x = vek + 1;
- Zápis (změna hodnoty proměnné):
<název proměnné> = <výraz>;
vek = 42;
Výrazy (učivo)
- Sčítání:
a + b
- Odčítání:
a - b
- Násobení:
a * b
- Dělení:
a / b
- Zbytek po dělení:
a % b
- Rovná se:
a == b
- Menší než:
a < b
- Menší nebo rovno než:
a <= b
- Větší než:
a > b
- Větší nebo rovno než:
a >= b
- A zároveň:
a && b
- Nebo:
a || b
Podmínky (učivo)
Podmínka (příkaz) if:
if (<výraz 1>) {
// Provede se, pokud je <výraz 1> pravdivý
} else if (<výraz 2>) {
// Provede se, pokud <výraz 1> není pravdivý, a <výraz 2> je pravdivý
} else {
// Provede se, pokud <výraz 1> není pravdivý, a <výraz 2> také není pravdivé
}
#include <stdio.h>
int main() {
int a = 10;
if (a > 5) {
printf("a je vetsi nez 5\n");
} else {
printf("a je mensi nebo rovno 5\n");
}
return 0;
}
Cykly (učivo)
-
Cyklus while
// <výraz> -> <tělo> -v // ^ | // ----------------- // Dokud je <výraz> pravdivý while (<vyraz>) { <telo> }
#include <stdio.h> int main() { int a = 10; while (a > 0) { printf("a=%d\n", a); a = a - 1; } return 0; }
-
Cyklus for
// <příkaz> -> <výraz 1> -> <tělo> -> <výraz 2> -v // ^ | // -------------------------------< // Dokud je <výraz 1> pravdivý for (<prikaz>; <vyraz 1>; <vyraz 2>) { <telo> }
#include <stdio.h> int main() { for (int i = 0; i < 10; i++) { printf("i = %d, i * 2 = %d\n", i, i * 2); } return 0; }
Funkce (učivo)
- Deklarace
<datový typ> <název funkce>( <datový typ parametru 1> <název parametru 1>, <datový typ parametru 2> <název parametru 2>, … ) { // tělo }
- Funkce, která nic nevrací
void vypis_text() { printf("Ahoj\n"); }
- Funkce, která vrací hodnotu
int secti(int a, int b) { return a + b; }
- Volání funkce
int main() { int c = secti(1, 2); return 0; }
Ukazatele (učivo)
- Vytvoření ukazatele
int* p = NULL;
- Získání adresy proměnné
int a = 5; int* p = &a;
- Dereference ukazatele
int a = 5; int* p = &a; printf("%d\n", *p);
Pole (učivo)
- Vytvoření pole na zásobníku
int arr[10] = {};
- Inicializace prvků pole
int arr[5] = {1, 2, 3, 4, 5};
- Čtení z pole
int druhy_prvek = arr[1];
- Zápis do pole
arr[1] = 1;
Dynamická paměť (učivo)
- Alokace proměnné na haldě
int* mem = (int*) malloc(sizeof(int));
- Alokace pole na haldě
int* mem = (int*) malloc(sizeof(int) * 10);
- Uvolnění dynamické paměti
free(mem);
Řetězce (učivo)
- Vytvoření řetězce pro čtení (nelze modifikovat)
const char* text = "Hello UPR";
- Vytvoření řetězce na zásobníku (lze modifikovat)
char text[] = "Hello UPR";
- Vypsání řetězce
printf("%s\n", text);
- Přístup k znaku řetězce
char c = text[1];
- Zjištění délky řetězce
#include <string.h> … const char* text = "Hello UPR"; int delka = strlen(text);
- Porovnání dvou řetězců
#include <string.h> … const char* text1 = "Hello UPR"; const char* text2 = "Hello"; if (strcmp(text1, text2) == 0) { // Řetězce jsou stejné }
- Převod textu na číslo
#include <stdlib.h> … const char* text = "123"; int cislo = strtol(text, NULL, 10);
Vstup (učivo)
- Načtení řádku
char buf[80]; fgets(buf, sizeof(buf), stdin);
- Načtení formátovaného vstupu
int a; scanf("%d", &a);
Struktury (učivo)
-
Deklarace struktury
struct <název struktury> { <datový typ prvního členu> <název prvního členu>; <datový typ druhého členu> <název druhého členu>; <datový typ třetího členu> <název třetího členu>; … };
typedef struct { const char* login; int age; } Student;
-
Inicializace proměnné typu struktury
Student s = { .login = "BER0134", age = 29 };
-
Čtení členu
int age = s.age;
-
Zápis členu
s.age = s.age + 1;
-
Přístup k členu přes ukazatel
Student* p = &s; p->age = p->age + 1;
Soubory (učivo)
- Otevření souboru pro čtení
FILE* file = fopen("file.txt", "r"); // Textový mód FILE* file2 = fopen("file.txt", "rb"); // Binární mód
- Otevření souboru pro zápis
FILE* file = fopen("file.txt", "w"); // Textový mód FILE* file2 = fopen("file.txt", "wb"); // Binární mód
- Zavření souboru
fclose(file);
- Textový zápis do souboru (vyžaduje textový mód)
fprintf(file, "%d", 1);
- Textové čtení ze souboru (vyžaduje textový mód)
char row[80]; fgets(row, sizeof(radek), file);
- Zjištění, jestli předchozí pokus o čtení vyústil v konec souboru
if (feof(file)) { … }
- Binární zápis do souboru (vyžaduje binární mód)
int arr[5] = { 1, 2, 3, 4, 5 }; fwrite(arr, sizeof(int), 5, file);
- Binární čtení ze souboru (vyžaduje binární mód)
int arr[5] = { 1, 2, 3, 4, 5 }; fread(arr, sizeof(int), 5, file);
Modularizace (učivo)
- Hlavičkový soubor
functions.h
#pragma once int secti(int a, int b);
- Zdrojový soubor
functions.c
#include "functions.h" int secti(int a, int b) { return a + b; }
- Zdrojový soubor
main.c
#include <stdio.h> #include "functions.h" int main() { printf("%d\n", secti(1, 2)); return 0; }
- Překlad
$ gcc -c functions.c $ gcc -c main.c $ gcc functions.o main.o -o main