Skip to content

Commit

Permalink
add exercises for cvicenie 8
Browse files Browse the repository at this point in the history
  • Loading branch information
tuplle committed Nov 19, 2024
1 parent 34786d1 commit 4f3eb22
Show file tree
Hide file tree
Showing 9 changed files with 748 additions and 2 deletions.
2 changes: 1 addition & 1 deletion codelabs/cvicenie-7.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ Pre vypracovanie týchto úloh odporúčam mať funkčné lokálne vývojové pr
> aside negative
> Ak v rámci predpísaných výstupov sú uvedené slová medzi znakmi `<` a `>` ide o placeholder pre skutočnú hodnotu, ktorú musí dosadiť program.
Riešenia na jednotlivé úlohy budú uverejnené najskôr.
Riešenia na jednotlivé úlohy budú uverejnené neskôr.
<!-- ------------------------ -->
## Úloha 7.1
Expand Down
173 changes: 173 additions & 0 deletions codelabs/cvicenie-8.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
summary: Cvičenie 8 Dynamic Allocation
id: cvicenie-8
categories: cvicenie
tags: beginner
status: Published
authors: Milan Mladoniczky
feedback link: https://github.com/interes-group/pevs-BIAX10029-codelabs/issues

# Cvičenie 8 - Dynamická alokácia pamäte

<!-- ------------------------ -->
## Úvod

Náplňou tohto cvičenie je oboznámiť sa s dynamickou alokáciou pamäte a práce s pointrami.

Pri vypracovaní cvičení si je potrebné uvedomiť s akými typmi a akú veľkosť pamäte si program alokuje.

### Obsah
- alokácia dynamického pola
- realokácia existujúceho bloku pamäte


> aside negative
> Ak používate ako vývojové prostredie lokálny a editor a následnú kompiláciu cez terminál. Použite príkaz:
> ```shell
> gcc -std=c11 -o program -Wall -Wextra main.c
> ```
Pre vypracovanie týchto úloh odporúčam mať funkčné lokálne vývojové prostredie (VS Code, CLion a pod.) a kompilátor jazyka C.
> aside negative
> Nezabudnite každú alokovanú pamäť uvoľniť volaním funkcie `free` ! Je dôležité si po sebe vždy upratať.
Riešenia na jednotlivé úlohy budú uverejnené neskôr.
<!-- ------------------------ -->
## Úloha 8.1
Napíšte program, zdrojový kód, v jazyku C použitím štandardu C11, ktorý vypýta na vstupe od používateľa číslo `int n`
a následne alokuje pamäť _n_ blokov každý o veľkosti typu _int_.
Po alokácií program vypíše jednotlivé hodnoty čísle v alokovanej pamäti.
<!-- ------------------------ -->
## Úloha 8.2
Napíšte program, zdrojový kód, v jazyku C použitím štandardu C11, ktorý nadväzuje na úlohu 8.1. Do alokovanej pamäte zapíšte
čísla od 1 do _n_.
Následne program vypíše na štandardný výstup adresu alokovanej pamäte a zároveň jednotlivé zapísané hodnoty aj s ich adresou.
### Príklady vstupov / výstupov programu
Pre vstup 3 bude výpis vyzerať nasledovne:
```text
Adresa alokovanej pamäte: 0x0000475d21a
0. položka: adresa = 0x0000475d21a ; hodnota = 1
1. položka: adresa = 0x0000475d21b ; hodnota = 2
2. položka: adresa = 0x0000475d21c ; hodnota = 3
```
<!-- ------------------------ -->
## Úloha 8.3

Napíšte program, zdrojový kód, v jazyku C použitím štandardu C11, ktorý nadväzuje na úlohu 8.1. Do alokovanej program
postupne vyžiada od používateľa jednotlivé čísla ako prvky dynamického poľa.

Následne program vypíše na štandardný výstup adresu alokovanej pamäte a zároveň jednotlivé zapísané hodnoty aj s ich adresou.

### Príklady vstupov / výstupov programu

Priebeh programu môže byť nasledovný:

```text
Zadajte počet prvkov: 3
Zadanie 1. prvok: 85
Zadanie 2. prvok: 41
Zadanie 3. prvok: -2
Adresa alokovanej pamäte: 0x000784b111
0. položka: adresa = 0x000784b111 ; hodnota = 85
1. položka: adresa = 0x000784b112 ; hodnota = 41
2. položka: adresa = 0x000784b113 ; hodnota = -2
```


<!-- ------------------------ -->
## Úloha 8.4

Napíšte program, zdrojový kód, v jazyku C použitím štandardu C11, ktorý načíta od používateľa počet slov `int n` (_n_ je zadané od používateľa)
a ich maximálnu dĺžku `int maxLen`. Následne program dynamicky alokuje pole reťazcov. Pre každé slovo alokuje novú dynamickú pamäť pre samotný reťazec
ako prvok poľa. Slovo má maximálne dĺžku definovanú používateľom.

Program postupne od používateľa načíta _n_ slov. Po načítaní všetkách slov vypíše načítané slová a ich dĺžky.

> aside positive
> Pre získanie dĺžky reťazcov je možné použiť funkciu `strlen` z knižnice `&lt;string.h>`
### Príklady vstupov / výstupov programu

Priebeh programu môže byť nasledovný:

```text
Zadajte počet slov: 3
Zadajte maximálnu dĺžku slova: 10
Zadajte slová:
ahoj
programovanie
C
---
Slová a ich dĺžky:
ahoj (4 znaky)
programovanie (13 znakov)
C (1 znak)
```


<!-- ------------------------ -->
## Úloha 8.5

Napíšte program, zdrojový kód, v jazyku C použitím štandardu C11, ktorý na začiatku alokuje pamäť o veľkosti 5 čísel
(t.j. pole veľkosti `5*sizeof(int)`). Následne umožní používateľovi pridávať hodnoty to poľa zo štandardného vstupu.
Ak sa pole naplní, zmeňte jeho alokovanú veľkosť na dvojnásobnú aktuálnej veľkosti a umožnite používateľa ďalej zadávať čísla.
Pokračujte načítanie hodnôt pokým používateľ nezadá hodnotu **-1**, ktorý ukonči zadávanie čísel.

Na záver, program vypíše všetky načítané čísla, veľkosť a adresu alokovanej pamäte.

Nezabudnite patrične uvoľniť alokovanú pamäť a ošetriť prípady keď alokácia pamäte zlyhá.

### Príklady vstupov / výstupov programu

Priebeh programu môže byť nasledovný:

```text
Zadajte hodnoty (zadaním -1 ukončíte):
10
20
30
40
50
60
70
-1
---
Zadané hodnoty: 10 20 30 40 50 60 70
Konečná veľkosť poľa: 10 prvkov
Adresa poľa: 0x000044781dcc
```


<!-- ------------------------ -->
## Úloha 8.6

Majme nasledujúci program:

```C
void runMe(){
int* leakingPtr = (int*) malloc(sizeof(int)*1024);
for(int i=0;i<1024;i++){
leakingPtr[i] = i+1000;
}
}

int main(){
runMe();
return 0;
}
```

1. Ako vyzerá alokovaná pamäť program pred a po volaní funkcie `runMe`?
2. Čo je zlé s funkciou `runMe`? (minimálne 2 veci)
3. Prepíšte program tak aby bol korektný.
25 changes: 25 additions & 0 deletions codelabs/cvicenie-8/codelab.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"environment": "web",
"format": "html",
"prefix": "https://storage.googleapis.com",
"mainga": "",
"updated": "2024-11-20T00:29:55+01:00",
"id": "cvicenie-8",
"duration": 0,
"title": "Cvičenie 8 - Dynamická alokácia pamäte",
"authors": "Milan Mladoniczky",
"summary": "Cvičenie 8 Dynamic Allocation",
"source": "cvicenie-8.md",
"theme": "",
"status": [
"published"
],
"category": [
"cvicenie"
],
"tags": [
"beginner"
],
"feedback": "https://github.com/interes-group/pevs-BIAX10029-codelabs/issues",
"url": "cvicenie-8"
}
168 changes: 168 additions & 0 deletions codelabs/cvicenie-8/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@

<!doctype html>

<html>
<head>
<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
<meta name="theme-color" content="#4F7DC9">
<meta charset="UTF-8">
<title>Cvičenie 8 - Dynamická alokácia pamäte</title>
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Source+Code+Pro:400|Roboto:400,300,400italic,500,700|Roboto+Mono">
<link rel="stylesheet" href="//fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="https://storage.googleapis.com/claat-public/codelab-elements.css">
<style>
.success {
color: #1e8e3e;
}
.error {
color: red;
}
</style>
</head>
<body>
<google-codelab codelab-gaid=""
codelab-ga4id=""
id="cvicenie-8"
title="Cvičenie 8 - Dynamická alokácia pamäte"
environment="web"
feedback-link="https://github.com/interes-group/pevs-BIAX10029-codelabs/issues">

<google-codelab-step label="Úvod" duration="0">
<p>Náplňou tohto cvičenie je oboznámiť sa s dynamickou alokáciou pamäte a práce s pointrami.</p>
<p>Pri vypracovaní cvičení si je potrebné uvedomiť s akými typmi a akú veľkosť pamäte si program alokuje.</p>
<h2 is-upgraded>Obsah</h2>
<ul>
<li>alokácia dynamického pola</li>
<li>realokácia existujúceho bloku pamäte</li>
</ul>
<aside class="warning"><p> Ak používate ako vývojové prostredie lokálny a editor a následnú kompiláciu cez terminál. Použite príkaz:</p>
<pre><code language="language-shell" class="language-shell">gcc -std=c11 -o program -Wall -Wextra main.c
</code></pre>
</aside>
<p>Pre vypracovanie týchto úloh odporúčam mať funkčné lokálne vývojové prostredie (VS Code, CLion a pod.) a kompilátor jazyka C.</p>
<aside class="warning"><p> Nezabudnite každú alokovanú pamäť uvoľniť volaním funkcie <code>free</code> ! Je dôležité si po sebe vždy upratať.</p>
</aside>
<p>Riešenia na jednotlivé úlohy budú uverejnené neskôr.</p>


</google-codelab-step>

<google-codelab-step label="Úloha 8.1" duration="0">
<p>Napíšte program, zdrojový kód, v jazyku C použitím štandardu C11, ktorý vypýta na vstupe od používateľa číslo <code>int n</code> a následne alokuje pamäť <em>n</em> blokov každý o veľkosti typu <em>int</em>.</p>
<p>Po alokácií program vypíše jednotlivé hodnoty čísle v alokovanej pamäti.</p>


</google-codelab-step>

<google-codelab-step label="Úloha 8.2" duration="0">
<p>Napíšte program, zdrojový kód, v jazyku C použitím štandardu C11, ktorý nadväzuje na úlohu 8.1. Do alokovanej pamäte zapíšte čísla od 1 do <em>n</em>.</p>
<p>Následne program vypíše na štandardný výstup adresu alokovanej pamäte a zároveň jednotlivé zapísané hodnoty aj s ich adresou.</p>
<h2 is-upgraded>Príklady vstupov / výstupov programu</h2>
<p>Pre vstup 3 bude výpis vyzerať nasledovne:</p>
<pre><code language="language-text" class="language-text">Adresa alokovanej pamäte: 0x0000475d21a
0. položka: adresa = 0x0000475d21a ; hodnota = 1
1. položka: adresa = 0x0000475d21b ; hodnota = 2
2. položka: adresa = 0x0000475d21c ; hodnota = 3
</code></pre>


</google-codelab-step>

<google-codelab-step label="Úloha 8.3" duration="0">
<p>Napíšte program, zdrojový kód, v jazyku C použitím štandardu C11, ktorý nadväzuje na úlohu 8.1. Do alokovanej program postupne vyžiada od používateľa jednotlivé čísla ako prvky dynamického poľa.</p>
<p>Následne program vypíše na štandardný výstup adresu alokovanej pamäte a zároveň jednotlivé zapísané hodnoty aj s ich adresou.</p>
<h2 is-upgraded>Príklady vstupov / výstupov programu</h2>
<p>Priebeh programu môže byť nasledovný:</p>
<pre><code language="language-text" class="language-text">Zadajte počet prvkov: 3
Zadanie 1. prvok: 85
Zadanie 2. prvok: 41
Zadanie 3. prvok: -2
Adresa alokovanej pamäte: 0x000784b111
0. položka: adresa = 0x000784b111 ; hodnota = 85
1. položka: adresa = 0x000784b112 ; hodnota = 41
2. položka: adresa = 0x000784b113 ; hodnota = -2
</code></pre>


</google-codelab-step>

<google-codelab-step label="Úloha 8.4" duration="0">
<p>Napíšte program, zdrojový kód, v jazyku C použitím štandardu C11, ktorý načíta od používateľa počet slov <code>int n</code> (<em>n</em> je zadané od používateľa) a ich maximálnu dĺžku <code>int maxLen</code>. Následne program dynamicky alokuje pole reťazcov. Pre každé slovo alokuje novú dynamickú pamäť pre samotný reťazec ako prvok poľa. Slovo má maximálne dĺžku definovanú používateľom.</p>
<p>Program postupne od používateľa načíta <em>n</em> slov. Po načítaní všetkách slov vypíše načítané slová a ich dĺžky.</p>
<aside class="special"><p> Pre získanie dĺžky reťazcov je možné použiť funkciu <code>strlen</code> z knižnice <code>&lt;string.h></code></p>
</aside>
<h2 is-upgraded>Príklady vstupov / výstupov programu</h2>
<p>Priebeh programu môže byť nasledovný:</p>
<pre><code language="language-text" class="language-text">Zadajte počet slov: 3
Zadajte maximálnu dĺžku slova: 10
Zadajte slová:
ahoj
programovanie
C
---
Slová a ich dĺžky:
ahoj (4 znaky)
programovanie (13 znakov)
C (1 znak)
</code></pre>


</google-codelab-step>

<google-codelab-step label="Úloha 8.5" duration="0">
<p>Napíšte program, zdrojový kód, v jazyku C použitím štandardu C11, ktorý na začiatku alokuje pamäť o veľkosti 5 čísel (t.j. pole veľkosti <code>5*sizeof(int)</code>). Následne umožní používateľovi pridávať hodnoty to poľa zo štandardného vstupu. Ak sa pole naplní, zmeňte jeho alokovanú veľkosť na dvojnásobnú aktuálnej veľkosti a umožnite používateľa ďalej zadávať čísla. Pokračujte načítanie hodnôt pokým používateľ nezadá hodnotu <strong>-1</strong>, ktorý ukonči zadávanie čísel.</p>
<p>Na záver, program vypíše všetky načítané čísla, veľkosť a adresu alokovanej pamäte.</p>
<p>Nezabudnite patrične uvoľniť alokovanú pamäť a ošetriť prípady keď alokácia pamäte zlyhá.</p>
<h2 is-upgraded>Príklady vstupov / výstupov programu</h2>
<p>Priebeh programu môže byť nasledovný:</p>
<pre><code language="language-text" class="language-text">Zadajte hodnoty (zadaním -1 ukončíte):
10
20
30
40
50
60
70
-1
---
Zadané hodnoty: 10 20 30 40 50 60 70
Konečná veľkosť poľa: 10 prvkov
Adresa poľa: 0x000044781dcc
</code></pre>


</google-codelab-step>

<google-codelab-step label="Úloha 8.6" duration="0">
<p>Majme nasledujúci program:</p>
<pre><code language="language-C" class="language-C">void runMe(){
int* leakingPtr = (int*) malloc(sizeof(int)*1024);
for(int i=0;i&lt;1024;i++){
leakingPtr[i] = i+1000;
}
}

int main(){
runMe();
return 0;
}
</code></pre>
<ol type="1">
<li>Ako vyzerá alokovaná pamäť program pred a po volaní funkcie <code>runMe</code>?</li>
<li>Čo je zlé s funkciou <code>runMe</code>? (minimálne 2 veci)</li>
<li>Prepíšte program tak aby bol korektný.</li>
</ol>


</google-codelab-step>

</google-codelab>

<script src="https://storage.googleapis.com/claat-public/native-shim.js"></script>
<script src="https://storage.googleapis.com/claat-public/custom-elements.min.js"></script>
<script src="https://storage.googleapis.com/claat-public/prettify.js"></script>
<script src="https://storage.googleapis.com/claat-public/codelab-elements.js"></script>
<script src="//support.google.com/inapp/api.js"></script>

</body>
</html>
2 changes: 1 addition & 1 deletion docs/codelabs/cvicenie-7.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ Pre vypracovanie týchto úloh odporúčam mať funkčné lokálne vývojové pr
> aside negative
> Ak v rámci predpísaných výstupov sú uvedené slová medzi znakmi `<` a `>` ide o placeholder pre skutočnú hodnotu, ktorú musí dosadiť program.
Riešenia na jednotlivé úlohy budú uverejnené najskôr.
Riešenia na jednotlivé úlohy budú uverejnené neskôr.
<!-- ------------------------ -->
## Úloha 7.1
Expand Down
Loading

0 comments on commit 4f3eb22

Please sign in to comment.