IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Procházení polí a srovnávání

Aktivity
Avatar
Lukáš Stejskal:9.1.2021 17:37

Ahoj, za úkol jsme dostali viz zadaní:
Napište program, z klávesnice zadejte do dvou polí 2x10 hodnot, pak procházejte obě pole současně!, jedno zleva!, druhé zprava!, obě hodnoty porovnejte a do třetího pole zapište větší hodnotu. Obsah třetího pole vypište na obrazovku.

Zkusil jsem: Když jsem to zkoušel tak stále nevim jak vytvořit, že ty čísla budu navzájem porovnávat.

#include <stdio.h>
#include <stdlib.h>

#define POCET 10

int main(int argc, char **argv[]){
        int pole[POCET];
        int i,j = POCET - 1,pom;

        for(i = 0;i <POCET;i++){
                printf("Zadej %d.prvek: ",i+1);
                scanf("%d", &pole[i]);
        }

        for(i = 0;i < POCET/2;i++) {
                pom = pole[i];
                pole[i] = pole[j];
                pole[j] = pom;
                j--;
        }

        for(i = 0;i < POCET;i++){
                printf("%d ",pole[i]);
        }

        return 0;
}

Chci docílit: Porovnávání hodnot v jednotlivých polích pomocí cyklu

Děkuji všem za odpověď

LukášS

 
Odpovědět
9.1.2021 17:37
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Lukáš Stejskal
DarkCoder:9.1.2021 18:55

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š.

Nahoru Odpovědět
9.1.2021 18:55
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Lukáš Stejskal
DarkCoder:9.1.2021 20:01

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));
        }
}
Nahoru Odpovědět
9.1.2021 20:01
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Lukáš Stejskal:9.1.2021 22:26

Když jsem to zkoušel pustit, píše mi to
4202832 0 8 1 0 2036576 0 37 8 4202832

 
Nahoru Odpovědět
9.1.2021 22:26
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Lukáš Stejskal
DarkCoder:9.1.2021 22:58

Pak děláš něco špatně. Výstup programu je:

2 5 9 8 4 3 4 8 9 5
Nahoru Odpovědět
9.1.2021 22:58
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Lukáš Stejskal:10.1.2021 10:33

A když bych to chtěl ten tvůj kod upravit, abych zadával libovolná čísla, tak by se to udělalo jak?

 
Nahoru Odpovědět
10.1.2021 10:33
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Lukáš Stejskal
DarkCoder:10.1.2021 15:00

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.

Nahoru Odpovědět
10.1.2021 15:00
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Lukáš Stejskal:12.1.2021 20:26

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ěď

 
Nahoru Odpovědět
12.1.2021 20:26
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Lukáš Stejskal
DarkCoder:12.1.2021 21:07

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?

Nahoru Odpovědět
12.1.2021 21:07
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Lukáš Stejskal:12.1.2021 21:21

mohl bys mi to ukázat, já na tu chybu nemohu přijít

 
Nahoru Odpovědět
12.1.2021 21:21
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Lukáš Stejskal
DarkCoder:12.1.2021 21:28

Traversuješ pole2 pomocí indexu i, ale načítáš hodnoty na konstantní index j (POCET - 1).

Nahoru Odpovědět
12.1.2021 21:28
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Lukáš Stejskal:12.1.2021 21:43

Asi mi to už nemyslí, mohl by si to vypsat nebo napsat správně??
díky

 
Nahoru Odpovědět
12.1.2021 21:43
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Lukáš Stejskal
DarkCoder:12.1.2021 22:19
&pole2[i]

Když si provedeš kontrolní výpis ihned po načtení, bude se Ti programovat lépe.

Nahoru Odpovědět
12.1.2021 22:19
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Lukáš Stejskal:13.1.2021 10:22

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

 
Nahoru Odpovědět
13.1.2021 10:22
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Lukáš Stejskal
DarkCoder:13.1.2021 11:37

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í.

Nahoru Odpovědět
13.1.2021 11:37
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.