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: 3. a 5. nejmenší prvek pole

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Hadrovej
Neregistrovaný
Avatar
Hadrovej:11.5.2013 12:20

Zdravím, prosil bych pomoct, mám zadaný pole a musím z něj dostat 3. a 5. nejmenší prvek a vypsat na jaký je pozici. Zkoušel jsem to dělat pomocí řazení bubble sortem a pak to z toho nák dostat ale nedokážu to ani seřadit :(
takhle mám vytvořený pole
do{
printf("Zadejte velikost pole (min 10,max 500): ");
scanf("%u",&pp);
}
while(pp<10||pp­>500);
for(i=0;i<pp;i++){
pole[i]=rand()%1000;
}

 
Odpovědět
11.5.2013 12:20
Avatar
Michal Žůrek - misaz:11.5.2013 12:30

asi bych na to použil dictionry to znamená, že si to tam dáš:
key: index prku
value: hoota z původního pole
no a pak to seřadíš podle value.

Nakonec vypíšeš key od 3. a 5. prvku.

 
Nahoru Odpovědět
11.5.2013 12:30
Avatar
Michal Žůrek - misaz:11.5.2013 12:31

jo a si si doufám jistý že ten kód cos tu napsal je opravdu c#. :`

 
Nahoru Odpovědět
11.5.2013 12:31
Avatar
Hadrovej
Neregistrovaný
Avatar
Hadrovej:11.5.2013 13:04

jo je to c :) a Mohl bys mi to prosim tě ukázat v nákým příkladu v kodu já takhle vůbec nevím co to je :) Jestli máš teda čas, nechci otravovat :)

 
Nahoru Odpovědět
11.5.2013 13:04
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na
David Hartinger:11.5.2013 13:26

Bubblesort tu máme samozřejmě vysvětlený i s kódem: http://www.itnetwork.cz/…programovani

Nahoru Odpovědět
11.5.2013 13:26
New kid back on the block with a R.I.P
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na
Petr Nymsa:11.5.2013 13:28

No první věc, jsi si opravdu jistý že toto je C# ? :) ... každopádně seřaď to například pomocí Select sort algoritmu http://www.itnetwork.cz/…le-velikosti a vypiš 3 a 5 prvek.

Diksuzi přesouvám do správné sekce

Nahoru Odpovědět
11.5.2013 13:28
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Petr Nymsa
Lukáš Hruda:11.5.2013 13:34

Select sort mi pro pole o maximální velikosti 500 prvků přijde zbytečně složitý, bubble sort, popř. insert sort bohatě postačí. Ale když to pole seřadí, tak už z něj nedostane původní pozice těch dvou prvků.

 
Nahoru Odpovědět
11.5.2013 13:34
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Lukáš Hruda
David Hartinger:11.5.2013 13:39

Musí si udělat druhé pole, kde bude mít pozice a upravit si třídící algoritmus tak, aby třídil obě naráz. Což nebude složité.

Nahoru Odpovědět
11.5.2013 13:39
New kid back on the block with a R.I.P
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Lukáš Hruda
Petr Nymsa:11.5.2013 13:40

Až teď čtu zbytek dotazu, no to máš pravdu. Hmm nevím jestli tu existuje něco jako Dictionary, porad ty :D já se odtutd klidím ,akorát budu přihlížet

//EDIT
A nebo to napsal Sdraco, lehčí způsob

Editováno 11.5.2013 13:41
Nahoru Odpovědět
11.5.2013 13:40
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na David Hartinger
Lukáš Hruda:11.5.2013 13:47

To je příliš složité, stačí do druhého pole ukládat pointery na prvky místo prvků jako takových. Pak stačí seřadit pointery podle velikostí hodnot na které ukazují a zpětně se z pointeru dá spočítat pozice.

 
Nahoru Odpovědět
11.5.2013 13:47
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na David Hartinger
Lukáš Hruda:11.5.2013 14:52

Respektive, udělal bych to nějak takhle, připadá mi to nejjednodušší.

#include <stdio.h>

void CopyPointersToArray(int*,int**,int);
void SortPtrArray(int**,int);
int GetPosition(int*,int**,int);

int main()
{
  int size;
  int* arr = NULL;
  int** ptrArr = NULL;
  int i;

  srand(time(0));
  printf("Zadejte velikost pole: ");
  scanf("%d",&size);

  arr = malloc(sizeof(int) * size);
  ptrArr = malloc(sizeof(int*) * size);

  for(i = 0; i < size; i++)
    arr[i] = rand() % 1000;

  CopyPointersToArray(arr,ptrArr,size);
  SortPtrArray(ptrArr,size);

  printf("Vypis pole:\n");
  for(i = 0; i < size; i++)
    printf("%d ",arr[i]);

  printf("\n3. nejmensi prvek je %d a jeho pozice je %d",*ptrArr[2],GetPosition(arr,ptrArr,2));
  printf("\n5. nejmensi prvek je %d a jeho pozice je %d",*ptrArr[4],GetPosition(arr,ptrArr,4));

  getchar();
  getchar();
  free(ptrArr);
  free(arr);
}


void CopyPointersToArray(int* arr, int** ptrArr, int size)
{
  int i;
  for(i = 0; i < size; i++)
    ptrArr[i] = &arr[i];
}

void SortPtrArray(int** ptrArr, int size)
{
  int i, j;
  for(i = 0; i < size; i++)
    for(j = 0; j < size - 1; j++)
      if(*ptrArr[j] > *ptrArr[j + 1])
      {
        int* temp = ptrArr[j];
        ptrArr[j] = ptrArr[j + 1];
        ptrArr[j + 1] = temp;
      }
}

int GetPosition(int* arr, int** ptrArr, int pos)
{
  return ptrArr[pos] - arr;
}

Vstup není ošetřen a pozice se počítá od 0.

 
Nahoru Odpovědět
11.5.2013 14:52
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 11 zpráv z 11.