Avatar
Peta
Člen
Avatar
Peta:

Ahoj, nemohl by mi prosím někdo pomoct? Potřebovala bych vypsat prvních dvacet a posledních dest prvků z třídění 5000 prvků, ale nevím jak přesně na to. Vím, že by tam mělo být něco jako

for (i = 0; i < 19; i++) {
        printf(......);

a

for (i= 4989; i < 4999; i++) { printf(...);

kód:

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

int insertionsort(int n)
{

    int pole[n], i, j, temp, srovnani = 0, presuny = 0;

    for (i = 0; i < n; i++)
        pole[i] = rand() % 100;

    for (i = 1; i<n; i++) {
        temp = pole[i];
        j = i - 1;

        if (i >= 0) {
            srovnani++;
            if (pole[i] > temp) {
                srovnani++;
            }
        }
        while (j >= 0 && pole[j] > temp) {
            srovnani++;
            pole[j + 1] = pole[j];
            presuny++;
            j--;
        }
        pole[j + 1] = temp;
    }

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

    float pocet_srovnani, pocet_presunu;

    pocet_srovnani = (float)srovnani / (n*n);
    pocet_presunu = (float)presuny / (n*n);

    printf("%i\t\t %i %.2f\t %i %.2f\n", n, srovnani, pocet_srovnani, presuny, pocet_presunu);

    return 0;
}

int main()

{
    srand(time(0));

    printf("Pocet\t Srovnani\t Vymeny\n---------------------------\n");

    insertionsort(10);
    insertionsort(20);
    insertionsort(50);
    insertionsort(100);
    insertionsort(200);
    insertionsort(500);
    insertionsort(1000);
    insertionsort(2000);
    insertionsort(5000);

    return 0;
}
 
Odpovědět 7. ledna 20:46
Avatar
Taskkill
Redaktor
Avatar
Odpovídá na Peta
Taskkill:

no asi se to samo nabizi ... printf("%d", pole[i]) ... pokud chces, co cislo to vlastni radku udelas printf("%d\n", pole[i]) .. (\n to je newline)
pokud nevis jak se printf pouziva (coz nerikam, jen tu vnimam jistou moznost) tak je to funkce berouci jeden nebo vice parametru, prvnim z nich musi byt za vsech okolnosti string ... tzv. ridici string (jestli chces) ... v nem muze byt text a specialni formulky, ktere se budou nahrazovat temi dalsimi parametry, je to asi takhle %d integer %f float %lf long float %c character %s string a mnoho dalsich ... celkove - umi to vsechny datovy typy cecka, umi to dokonce jeste mnohem vic, zarovnavani cisel na pocet cifer atd. moc moc veci... doporucuju prolustrovat zdejsi archiv, urcite najdes neco co te postrci dal

doufam, ze moje rada pomuze

 
Nahoru Odpovědět 7. ledna 22:58
Avatar
David Novák
Tým ITnetwork
Avatar
Odpovídá na Peta
David Novák:

Ten výpis budeš muset udělat přímo ve funkci, protože tam to pole máš lokální. Pokud to má vypsat pouze u poslední možnosti, tak můžeš přidat parametr:

int insertionsort(int n, int vypis)

V programu by ses po seřazení ptala if (vypis) a měla bys tam ty dva cykly, co máš nahoře.. Akorát bych tam nepsal čísla napevno, ale využil proměnnou n:

if (vypis && n >= 20)
{
  for (i = 0; i < 20; i++) {
   printf("%i ", pole[i]);
  }
  for (i = n - 11; i < n; i++) {
   printf("%i ", pole[i]);
  }
}

Jak vidíš, je třeba dávat pozor, abys nečetla mimo pole, kdyby náhodou bylo n menší než dvacet.. Dalo by se to vyřešit také tak, že bys použila další proměnnou, která by byla 20 pro n >= 20 a n pro n < 20.. Nebo můžeš přidat další argumenty a pak při volání toho sortu přímo specifikovat, kolik chceš vypsat ze začátku a kolik z konce.

Pak bys tu fci volala jako:

insertionsort(2000, 0);  // nic se nevypise
insertionsort(5000, 1);  // probehne vypis
Editováno 7. ledna 23:54
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 7. ledna 23:52
Chyba je mezi klávesnicí a židlí.
Avatar
David Novák
Tým ITnetwork
Avatar
Nahoru Odpovědět 8. ledna 10:13
Chyba je mezi klávesnicí a židlí.
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 5 zpráv z 5.