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: Seřazení polí podle velikosti

Aktivity
Avatar
Lukáš Stejskal:9.1.2021 17:31

Ahoj,
za úkol jsme dostali nasat program viz zadaní:
Napište program, zadejte z klávesnice do pěti polí pět různých řetězců a vypište na obrazovku délky jednotlivých řetězců od nejkratšího po nejdelší (využijte řídící struktury). Délky řetězců musí být možné zadat libovolně v délce 5 - 100 znaků.

Zkusil jsem: Zatím jsem pouze dokázal spočítat znaky v daných řetězcích, ale nevím jak je seřadit podle velikosti.

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


int main(int argc, char *argv[]) {
        char pole1[100];
        char pole2[100];
        char pole3[100];
        char pole4[100];
        char pole5[100];
        char pole6[500];


        int pocet1, pocet2, pocet3, pocet4, pocet5;

        printf("Zadej prvni retezec: ");
        gets(pole1);
        printf("Zadej druhy retezec: ");
        gets(pole2);
        printf("Zadej treti retezec: ");
        gets(pole3);
        printf("Zadej ctvrty retezec: ");
        gets(pole4);
        printf("Zadej paty retezec: ");
        gets(pole5);

        pocet1 = strlen(pole1);
    printf("Prvni retezec ma %d znaku\n",pocet1);
        pocet2 = strlen(pole2);
    printf("Druhy retezec ma %d znaku\n",pocet2);
    pocet3 = strlen(pole3);
    printf("Treti retezec ma %d znaku\n",pocet3);
    pocet4 = strlen(pole4);
    printf("Ctvrty retezec ma %d znaku\n",pocet4);
    pocet5 = strlen(pole5);
    printf("Paty retezec ma %d znaku\n",pocet5);



        return 0;

        }

Chci docílit: Pomocí řídící struktury seřadit řetezce podle velikosti

 
Odpovědět
9.1.2021 17:31
Avatar
Odpovídá na Lukáš Stejskal
Lukáš Stejskal:9.1.2021 17:38

Děkuji všem za odpověďi

LukášS

 
Nahoru Odpovědět
9.1.2021 17:38
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Lukáš Stejskal
DarkCoder:9.1.2021 19:07

Přece nebudeš vytvářet samostatná pole tímto způsobem. Vytvoř 2D pole [5][101], kde každý řádek bude představovat prostor pro uložený řetězec o délce 100 znaků + '\0'.Pro načtení řetězců použij funkci fgets() nikoli gets(), která je zastaralá. Zjisti délku každého řetězce, ulož si je třeba do pomocného pole. Pomocí nějakého třídícího algoritmu si délky seřaď a vypiš na obrazovku. Můžeš použít implementovanou funkci qsort() v stdlib.h.

Nahoru Odpovědět
9.1.2021 19: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:9.1.2021 19:14

Právě já nevím jak to uložit do toho pomocného pole a pak použít nějaký algoritmus

 
Nahoru Odpovědět
9.1.2021 19:14
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Lukáš Stejskal
DarkCoder:9.1.2021 19:57

Třeba takto:

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

#define POCET 5
#define DELKA 101

int cmpfunc(const void* a, const void* b);

int main(void) {
        char pole[POCET][DELKA] = { "****", "***", "*", "*****", "**" };
        int pom_pole[POCET];

        for (int i = 0; i < POCET; i++) {
                pom_pole[i] = strlen(pole[i]);
                printf("%d ", pom_pole[i]); /* kontrolni vypis delky retezcu */
        }

        putchar('\n');

        qsort(pom_pole, POCET, sizeof(int), cmpfunc);

        for (int i = 0; i < POCET; i++) printf("%d ", pom_pole[i]);

        return 0;
}

int cmpfunc(const void* a, const void* b) {
        return (*(int*)a - *(int*)b);
}
Nahoru Odpovědět
9.1.2021 19:57
"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 20:13

a nešlo by to pouze úpravou toho původního? Protože my se to ve škole učíme takto a tak daeko jsme ješte nedošli.

Díky

 
Nahoru Odpovědět
9.1.2021 20:13
Avatar
Odpovídá na Lukáš Stejskal
Lukáš Stejskal:9.1.2021 20:27

popřípadě stačí jenom vypsat nejdelší a nejkratší.

Díky moc

 
Nahoru Odpovědět
9.1.2021 20:27
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Lukáš Stejskal
DarkCoder:9.1.2021 20:50

Samozřejmě že by to šlo. Pokud si ovšem máte vystačit pouze se znalostí 1D pole, pak je celý proces dosti kostrbatý, neboť neexistuje žádná spojitost mezi poli a je třeba vše vypisovat jedno po druhém. Předpokládám, že znalosti preprocesoru, konkrétně jeho operátory # a ## jste také nebrali.

Než abych se pustil do zbytečností, tak se v tomto místě zeptám, co jste probrali z následujícího seznamu:

jednorozměrná pole, dvourozměrná pole, ukazatele, preprocesor.

Je obrovský rozdíl, zda se má vypisovat délky všech polí seřazené podle nějakého kritéria nebo jen délka nejkratšího a nejdelšího řetězce.

Dále se zeptám, Vás učí ve škole načítat řetězce pomocí funkce gets()?

Nahoru Odpovědět
9.1.2021 20:50
"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:9.1.2021 21:35

My používáme jednorozměrná pole, a také funkci gets. Preprocesor jsme nebraly a ukazatele začaly

 
Nahoru Odpovědět
9.1.2021 21:35
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Lukáš Stejskal
DarkCoder:9.1.2021 22:10

Pokud používáte pouze jednorozměrná pole, pak nezbývá, než přiřazovat výsledky velikostí řetězců do pomocného pole jedno za druhém ručně. Nelze využít indexaci v cyklu. Že pro načítání řetězců používáte funkci gets(), která byla ze standardu odstraněna v roce 2011, je dosti nešťastné. Svědčí to o kvalitě školství..

Ale abych se vrátil k tématu. Pokud je třeba řadit, můžeš použít opakovaný for cyklus pro traversování pole. Pokud stačí najít nejkratší a nejdelší délku řetězce, stačí jeden průchod polem pomocí for cyklu.

Nahoru Odpovědět
9.1.2021 22:10
"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:23

Mohl bys to prosím aspoň naznačit tu první možnost

Díky

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

Můžeš použít již implementovaný quicksort nebo jiný algoritmus. Zde máš například bubblesort.

void bubbleSort(int array[], int size) {
        for (int step = 0; step < size - 1; step++) {
                for (int i = 0; i < size - step - 1; i++) {
                        if (array[i] > array[i + 1]) {
                                int temp = array[i];
                                array[i] = array[i + 1];
                                array[i + 1] = temp;
                        }
                }
        }
}

a volání funkce:

bubbleSort(pom_pole, POCET);

tím nahradíš stávající řádek:

qsort(pom_pole, POCET, sizeof(int), cmpfunc);

Smyslem úlohy je ale právě ta algoritmizace, tudíž by si se měl pokusit o to najít nějaký způsob sám.
Že nemusí být nejefektivnější, nevadí. Hlavní je aby to fungovalo. Jak se budou tvé znalosti zvětšovat,
můžeš pak vytvořit stávající řešení nahradit lepším.

Nahoru Odpovědět
9.1.2021 22:53
"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 12 zpráv z 12.