Pomoc s programom v C (pokračovanie)

Programovacie jazyky, rady, poradňa...
Sagittarius
Guru
Guru
Používateľov profilový obrázok
Príspevky: 2883
Registrovaný: 13 feb 2007, 21:58
Bydlisko: Do nekonečna a ešte ďalej

Pomoc s programom v C (pokračovanie)

Príspevok od používateľa Sagittarius »

Konkrétne by som potreboval pomôcť z rekurziou, nejako si neviem nájsť v čom robím chybu. Program by mal (zatiaľ) generovať 7 lubovoľných čísel (6 čísel + 1 číslo ako v športke) a tie čísla majú byť každé rôzne. Ďakujem za pomoc. :)

Tu je kód:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int kontrola(int tah[],int i,int j)
{
int cislo;
cislo=random(7)+1;
for(j=0;j<i;j++)
{
if(tah[j]==cislo)kontrola(tah,i,j);else return cislo;
}
}

int generuj (int tah[],int i,int j)
{
for(i=0;i<7;i++)
{
tah=kontrola(tah,i,j);
}
return tah;
}


int main(int argv,char *argc[])
{
int i,j,tah[7];
clrscr();
randomize();
generuj(tah,i,j);
for (i=0;i<7;i++) printf("%d ",tah);
getch();
return 0;
}
pozn. random(7) a nie random(49), tam mám preto aby sa to dalo ľahšie kontrolovať, lebo pri 7 číslach musí 100-percentne vybrať každé raz aby to fungovalo, tak ako má...
gwixt
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3912
Registrovaný: 24 sep 2005, 16:50
Bydlisko: Trash-Can

Príspevok od používateľa gwixt »

musi to byt rekurziou? lebo toto riesenie je dost strasidelne :)
Sagittarius
Guru
Guru
Používateľov profilový obrázok
Príspevky: 2883
Registrovaný: 13 feb 2007, 21:58
Bydlisko: Do nekonečna a ešte ďalej

Príspevok od používateľa Sagittarius »

gwixt napísal:musi to byt rekurziou? lebo toto riesenie je dost strasidelne :)
Nemusí, len nič lepšie ma nenapadlo... :) resp. najskôr som to skúšal bez rekurzie ale nešlo mi to...
konyk87
King
King
Používateľov profilový obrázok
Príspevky: 1709
Registrovaný: 24 okt 2007, 15:56

Príspevok od používateľa konyk87 »

tak v tom pripade..

Kód: Vybrať všetko

for (i=0; i<=6; i++) {
  do {
    cislo = random(7)+1;
    mozem = true;
    for (j=0; j<i; j++) if (tah[j] == cislo) mozem=false;
  } while (mozem == false);
           
    tah[i]=cislo;
}
mozem je typu boolean..malo by to fungovat..

\\myslim, ze ti bude stacit len jedna funkcia..toto ked das do "generuj", tak by to malo vygenerovat cisla, ktore sa nebudu opakovat..
gwixt
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3912
Registrovaný: 24 sep 2005, 16:50
Bydlisko: Trash-Can

Príspevok od používateľa gwixt »

a co tak to spravit v jednom cykle

c-ko som uz dlho nevidel a pisem z hlavy takze to mozno nebude 100% korektne ale princip zostava

Kód: Vybrať všetko

#define DLZKA_POLA 7

int cisla [DLZKA_POLA] = { 1, 2, 3, 4, 5, 6, 7}; 
for(i=0; i<DLZKA_POLA-1; i++)
{
  rnd = rand(DLZKA_POLA-i);
  if(rnd!=i)
  {
    pom= cisla[rnd];
    cisla[rnd]=cisla[DLZKA_POLA-i-1];
    cisla[DLZKA_POLA-i-1]=pom;
  }
}
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

konyk87 napísal:..malo by to fungovat..
Fungovať to bude, ale vyberať z poľa náhodné prvky takýmto spôsobom nemusí byť najlepší nápad. :)
Sagittarius
Guru
Guru
Používateľov profilový obrázok
Príspevky: 2883
Registrovaný: 13 feb 2007, 21:58
Bydlisko: Do nekonečna a ešte ďalej

Príspevok od používateľa Sagittarius »

qwixt, konyk87: Ďakujem obom za rady. K+ Problém sa mi podarilo vyriešiť len mám k tomu malé pripomienky:

qwixt: Tvoja verzia je asi lepšia, len funguje(aspoň podľa mňa) len rovnaký počet prvkov poľa a čísel z ktorých má vyberať, ale ja som potreboval 49 čísel a tých 7 tam bolo len kvôli kontrole, lebo zo 7 musí vybrať všetkých 7, čiže je veľká šanca ak to robí chybu, že ju vidno hneď. Takže som použil konykovu verziu.
konyk87: C je nemá typ boolean. Ale inak pôvodne som to mal podobne, len som pred cyklom nepriraďoval tej premennej true alebo 1 a v tom som mal tú chybu.

Ďakujem ešte raz...

//chrono: Aha. Ďakujem, vyskúšam...
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Pri tom gwixtovom príklade si urobíš pole dlhé 49 prvkov. Naplníš ho číslami 1-49. Pomocou toho algoritmu, čo tam má gwixt to pole premiešaš a potom použiješ prvých 7 číslic.
gwixt
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3912
Registrovaný: 24 sep 2005, 16:50
Bydlisko: Trash-Can

Príspevok od používateľa gwixt »

nemusis ho ani premiesat cele ... staci ked ten for pojde tolko krat kolko potrebujes (N) a ako vysledok zoberes poslednych N prvkov z pola
Sagittarius
Guru
Guru
Používateľov profilový obrázok
Príspevky: 2883
Registrovaný: 13 feb 2007, 21:58
Bydlisko: Do nekonečna a ešte ďalej

Príspevok od používateľa Sagittarius »

Nejdem otvárať druhú tému, veď vlastne ešte stále je to ten istý program, aj cyklus len tento raz zadávam čísla z klávesnice a musí byť každé z tých šiestich iné...len problém je v tom, že v cykle mi načíta 7 čísel miesto šiestich, prvý krát načítava číslo dvakrát a ja neviem prečo... Ďakujem za pomoc

Kód: Vybrať všetko

void zadaj()
{
 int i,j,tiket[6],mozem,cislo;
 for(i=0;i<6;i++)
 {
 do
  {
   scanf("%d ",&cislo);
   mozem=1;
   for(j=0;j<i;j++)
   {
    if(tiket[j]==cislo) mozem=0;
   }
   tiket[i]=cislo;
  } while(mozem==0);
 }
 for(i=0;i<6;i++) printf("%d ",tiket[i]);
}
konyk87
King
King
Používateľov profilový obrázok
Príspevky: 1709
Registrovaný: 24 okt 2007, 15:56

Príspevok od používateľa konyk87 »

takto to nepojde? :)

Kód: Vybrať všetko

void zadaj()
{
 int i,j,tiket[6],mozem,cislo;
 for(i=0;i<6;i++)
 {
 do
  {
   scanf("%d ",&cislo);
   mozem=1;
   for(j=0;j<i;j++)
   {
    if(tiket[j]==cislo) mozem=0;
   }
  } while(mozem==0);
  tiket[i]=cislo;
 }
 for(i=0;i<6;i++) printf("%d ",tiket[i]);
}
Sagittarius
Guru
Guru
Používateľov profilový obrázok
Príspevky: 2883
Registrovaný: 13 feb 2007, 21:58
Bydlisko: Do nekonečna a ešte ďalej

Príspevok od používateľa Sagittarius »

konyk87 napísal:takto to nepojde? :)
Ďakujem za ochotu, ale robí to presne to isté, keď si dám pred scanf napr. príkaz printf("Zadaj cislo"); tak výpis vyzerá asi takto:

Kód: Vybrať všetko

Zadaj cislo
1
2
Zadaj cislo
3
Zadaj cislo
4
...atď
konyk87
King
King
Používateľov profilový obrázok
Príspevky: 1709
Registrovaný: 24 okt 2007, 15:56

Príspevok od používateľa konyk87 »

cez vikend sme s kamaratom podobny priklad robili a fungoval nam..pri zadavani vstupov sme mali nasledujuci kod..

Kód: Vybrať všetko

for(i=0; i<p; i++) {
  printf("Zadaj %d. cislo: ", (i+1));
  scanf("%d", &cislo);
  tipy[i] = cislo;
  do {
    mozem=1;
    for(j=0; j<i; j++) {
      if(tipy[j]==tipy[i]) {
        mozem=0;
        i--;
      }
    }
  } while(mozem==0);
}
ak ti bude aj tak pytat pri prvom cisle 2 vstupy, tak uz vazne netusim, kde by mohla byt chyba..
Sagittarius
Guru
Guru
Používateľov profilový obrázok
Príspevky: 2883
Registrovaný: 13 feb 2007, 21:58
Bydlisko: Do nekonečna a ešte ďalej

Príspevok od používateľa Sagittarius »

konyk87: Ďakujem funguje to. Ale keďže sa tam menila riadiaca premenná cyklu v cykle, tak to nebolo celkom najvhodnejšie riešenie a po porade s cvičiacim som napísal niečo takéto :) :

Kód: Vybrať všetko

void zadaj()
{
 int i=0,j,cislo,tiket[SIZE-1],mozem;
 while (i<SIZE-1)
 {
  clrscr();
  gotoxy(1,3);
  printf("Zadaj %d. cislo: ", (i+1));
  scanf("%d", &cislo);
  tiket[i] = cislo;
  mozem=1;
  for(j=0; j<i; j++)
  {
    if((tiket[i]==tiket[j]) || (tiket[i]<1) || (tiket[i]>49)) mozem=0;
   }
  i=i+mozem;
  }
 gotoxy(1,3);
 printf("Vas tiket: ");
 for(i=0;i<6;i++) printf("%d ",tiket[i]);
}
Tie niektoré príkazy tam mám pre potrebu zobrazovanie, aby to zobrazovalo ako ja chcem...
Napísať odpoveď