Diskuze: Procházení polí a srovnávání
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 15 zpráv z 15.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.


Zadání je zcela jasné. Máš porovnat hodnoty ve dvou polích a uložit výsledky do třetího, tak by nebylo od věci vytvořit ta pole tři. Jedno budeš číst zleva, druhé zprava, porovnáš hodnoty na daných indexech a uložíš do třetího pole, které nakonec vypíšeš.
Pro inspiraci:
#include <stdio.h>
#define POCET 10
void comp_and_print(int* p1, int* p2, int* p3, int size);
int main(void) {
int pole1[POCET] = { 2, 5, 9, 8, 1, 3, 4, 7, 6, 0 };
int pole2[POCET] = { 5, 9, 8, 1, 3, 4, 7, 6, 0, 2 };
int pole3[POCET];
comp_and_print(pole1, pole2, pole3, POCET);
return 0;
}
void comp_and_print(int* p1, int* p2, int* p3, int size) {
for (int i = 0; i < size; i++) {
(*(p1 + i) > *(p2 + size - 1 - i)) ? (*(p3 + i) = *(p1 + i)) : (*(p3 + i) = *(p2 + size - 1 - i));
printf("%d ", *(p3 + i));
}
}
Když jsem to zkoušel pustit, píše mi to
4202832 0 8 1 0 2036576 0 37 8 4202832
Pak děláš něco špatně. Výstup programu je:
2 5 9 8 4 3 4 8 9 5
A když bych to chtěl ten tvůj kod upravit, abych zadával libovolná čísla, tak by se to udělalo jak?
To jak načítat hodnoty z klávesnice do pole máš už ve svém kódu. Inicializaci polí pozměníš na samotné definice a jelikož provádíš úkon více než jednou pouze s drobnými odlišnosti, sestavíš si na to funkci.
Celý kód pak vypadá následovně:
#include <stdio.h>
#define POCET 10
void read_array(int* p, int size, int index);
void comp_and_print(int* p1, int* p2, int* p3, int size);
int main(void) {
int pole1[POCET], pole2[POCET], pole3[POCET];
read_array(pole1, POCET, 1);
read_array(pole2, POCET, 2);
comp_and_print(pole1, pole2, pole3, POCET);
return 0;
}
void read_array(int* p, int size, int index) {
for (int i = 0; i < size; i++) {
printf("Zadej %d.prvek %d.pole: ", i + 1, index);
scanf("%d", p + i);
}
}
void comp_and_print(int* p1, int* p2, int* p3, int size) {
for (int i = 0; i < size; i++) {
(*(p1 + i) > * (p2 + size - 1 - i)) ? (*(p3 + i) = *(p1 + i)) : (*(p3 + i) = *(p2 + size - 1 - i));
printf("%d ", *(p3 + i));
}
}
Pokud v kódu nechceš pracovat s ukazateli a ukazatelovou aritmetikou, pak můžeš použít indexovou alternativu:
p[i] // alternativa za *(p + i)
&p[i] // alternativa p + i
Pozn:
Výše uvedený kód neopisuj, ber ho pouze jako inspiraci.
Ještě jedna věc týkající se k tvému úryvku kódu:
Tvar funkce main() schopné přebírat argumenty zadanými na příkazovém řádku má tvar:
int main(int argc, char *argv[])
// nikoli
int main(int argc, char **argv[])
Druhý parametr je pole znakových ukazatelů, nikoli pole ukazatelů na znakový ukazatel.
Už jsem to zvládl ale vždy po spuštění a zadání mně to ukazuje toto
1
0
4203865
0
0
0
44
0
0
0
Už nevím, co s tím
#include <stdio.h>
#include <stdlib.h>
#define POCET 10
int main(int argc, char *argv[]) {
int pole1[POCET];
int pole2[POCET];
int pole3[POCET];
int i, j = POCET-1;
for(i = 0;i < POCET;i++){
printf("Zadej %d.prvek 1.pole: ",i+1);
scanf("%d", &pole1[i]);
}
for(i = 0;i < POCET;i++){
printf("Zadej %d.prvek 2.pole: ",i+1);
scanf("%d", &pole2[j]);
}
for(i = 0;i < POCET;i++);{
if(pole1[i]>pole2[j]){
pole3[i] = pole1[i];
}
else{
pole3[i] = pole2[j];
}
j--;
}
for(i = 0;i < POCET;i++){
printf("%d\n", pole3[i]);
}
return 0;
}
Díky za odpověď
Mnohem lepší. Zkontroluj si druhý for cyklus, který není zcela v pořádku. Je pak druhý čítač nutný když používáš jeden čítač a zároveň znáš počet prvků pole?
mohl bys mi to ukázat, já na tu chybu nemohu přijít
Traversuješ pole2 pomocí indexu i, ale načítáš hodnoty na konstantní index j (POCET - 1).
Asi mi to už nemyslí, mohl by si to vypsat nebo napsat správně??
díky
&pole2[i]
Když si provedeš kontrolní výpis ihned po načtení, bude se Ti programovat lépe.
i když jsem to změnil tak stále. Pokud jsem to udělal dobře. Mohl by si to opravit přímo? díky
#include <stdio.h>
#include <stdlib.h>
#define POCET 10
int main(int argc, char *argv[]) {
int pole1[POCET];
int pole2[POCET];
int pole3[POCET];
int i, j = POCET-1;
for(i = 0;i < POCET;i++){
printf("Zadej %d.prvek 1.pole: ",i+1);
scanf("%d", &pole1[i]);
}
for(i = 0;i < POCET;i++){
printf("Zadej %d.prvek 2.pole: ",i+1);
scanf("%d",&pole2[i]);
}
for(i = 0;i < POCET;i++);{
if(pole1[i]>pole2[j]){
pole3[i] = pole1[i];
}
else{
pole3[i] = pole2[j];
}
j--;
}
for(i = 0;i < POCET;i++){
printf("%d\n", pole3[i]);
}
return 0;
}
nic
Mohl by si to opravit přímo? díky
Nemohl. Tím, že bych to udělal za tebe, ztratila by domácí úloha svůj
smysl.
Je třeba se nevzdávat hned po prvním neúspěchu, takto bys toho moc
neudělal.
Vynaložené úsilí, které do toho vložíš, se Ti v budoucnu bohatě
vrátí.
Ale navedu Tě správným směrem a něčeho Tě přiučím.
Když Ti program nefunguje, je třeba najít chybu.
Zpočátku není na škodu si provádět kontrolní výpisy, jak už jsem v
předchozím příspěvku psal.
Tím si zkontroluješ, zda operace, kterou jsi provedl proběhla správně.
Dvě operace, které si prováděl, měly způsobovat naplnění polí pole1
a pole2 celými čísly z klávesnice.
Správně si použil for cyklus, stanovil rozsah, použil symbolickou konstantu
POCET.
Funkce scanf() a print() jsou funkcemi ze standardní knihovny jazyka C,
vyžadují vložení hlavičkového
souboru stdio.h. Pomocí direktivy preprocesoru #include si tento hlavičkový
soubor vložil.
Nyní je třeba zjistit, zda se čísla zadaná z klávesnice načetla do
pole správně.
Budeš testovat pouze tyto dvě operace, ostatní si můžeš zakomentovat.
Tím že si obsah polí budeš postupně vypisovat, ač to v ostré verzi
programu být nemá, zjistíš,
zda vše proběhlo v pořádku. Můžeš si tam výpis pole dočasně vložit,
vše ověřit a smazat. Nebo
můžeš použít podmíněný překlad. Jehož část pak můžeš jednoduše
pro překladač odstranit tím,
že zrušíš definici makra (např. dáš do komentáře nebo vymažeš).
Může to vypadat např. následovně:
#include <stdio.h>
#define DEBUG // ladeni programu
#define POCET 10
int main(int argc, char* argv[]) {
int pole1[POCET];
int pole2[POCET];
// int pole3[POCET];
int i;
for (i = 0; i < POCET; i++) {
printf("Zadej %d.prvek 1.pole: ", i + 1);
scanf("%d", &pole1[i]);
}
#ifdef DEBUG
for (i = 0; i < POCET; i++) printf("%d ", pole1[i]);
putchar('\n');
#endif
for (i = 0; i < POCET; i++) {
printf("Zadej %d.prvek 2.pole: ", i + 1);
scanf("%d", &pole2[i]);
}
#ifdef DEBUG
for (i = 0; i < POCET; i++) printf("%d ", pole2[i]);
putchar('\n');
#endif
/*
for (i = 0; i < POCET; i++); {
if (pole1[i] > pole2[j]) {
pole3[i] = pole1[i];
}
else {
pole3[i] = pole2[j];
}
j--;
}
*/
/*
for (i = 0; i < POCET; i++) {
printf("%d \n", pole3[i]);
}
*/
return 0;
}
Všimni si, jaké úpravy jsem v programu provedl.
Když si tento program spustíš, zjistíš, že to co si zadal z
klávesnice, je obsahem polí pole1 a pole2.
A to je to co chceš. Můžeš zakomentovat řádek s #define DEBUG a
pokračovat dále v tvorbě programu.
Tento cyklus opakovat, dokud program nebude fungovat tak jak má.
Pokud by si toto prováděl, zjistil bys včera, že pole2 se Ti nenačetlo správně a nehledal bys složitě chybu v celém programu.
Jak se budou tvé znalosti zlepšovat, budeš už vědět na co si dávat pozor a čas strávený laděním se Ti zkrátí.
Zobrazeno 15 zpráv z 15.