Πρόβλημα στη εντολή rand() γλώσσα C

Πρόβλημα στη εντολή rand() γλώσσα C

Δημοσίευσηαπό Monkey20 » 28 Απρ 2011, 15:03

Καλησπέρα, θα μπορούσε κάποιος να μου εξηγήσει γιατί η rand() δε λειτουργεί άμα χρησιμοποιήσω τα q και w (q=n+1, w=m+1) ενώ άμα βάλω στη θέση τους n και m λειτουργεί το πρόγραμμα?
Μη δώσετε σημασία στις συναρτήσεις(δεν τισ έβαλα λόγο χώρου) το πρόγραμμα είναι ακομα υπο κατασκευή :geek:

Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>

void tamplo(int n, int m, int **pa);
void narkes(int n, int m, int **pa);

int main(int argc, char *argv[])
{
   int i,j,n,m,o,p,a,b,r1,r2,q,w;
   int **pa=NULL;
   printf("Dwste tis diastaseis tou paixnidiou n x m\n");
   printf("Prosoxh, to tamplo mporei na exei megethos to poly 24x30\n");
   scanf("%d%d", &n,&m);
   printf("Epilxte to epipedo duskolias tou paixnidiou\n");
   printf("Pathste 1 gia eukolo, 2 gia metro, 3 gia duskolo kai 4 gia akatorthoto\n");
   scanf("%d", &o);
   if(o==1)
   {
      p=m*n/8;
   }
   if(o==2)
   {
      p=m*n/7;
   }
   if(o==3)
   {
      p=m*n/6;
   }
   if(o==4)
   {
      p=m*n/5;
   }   
   pa=(int**)calloc(n, sizeof(int*)); //desmeush mnhmhs gia dimiourgia 2d pinaka
   for(i=0;i<n;i++)
   {
         pa[i]=(int*)calloc(m, sizeof(int));
   }
   tamplo(n,m,pa);
   printf("dwste tis syntetagmenes tou tetragwnou pou thelete na anoixete\n");
   scanf("%d%d", &a,&b);
   pa[a][b]=9;
   q=n+1;
   w=m+1;
   for(i=0;i<p;i++)
   {
       do
       {                     
           r1=rand()%q;
           r2=rand()%w;
       }while(r1==a && r2==b);
       pa[r1][r2]=1;//to 10 antiprosopevei tis narkes
   }
   tamplo(n,m,pa);   
   for(i=0;i<n;i++)
   {
       free(pa[i]);
   }
   free(pa);
   system("PAUSE");   
   return 0;
}
Monkey20
babeTUX
babeTUX
 
Δημοσιεύσεις: 6
Εγγραφή: 28 Απρ 2011, 14:34
Εκτύπωση

Re: Πρόβλημα στη εντολή rand() γλώσσα C

Δημοσίευσηαπό simosx » 28 Απρ 2011, 15:05

Είναι καλό να γράφεις το πρόγραμμα «σε στήλες» για να διαβάζεται καλύτερα.

Μπορείς να το κάνεις και τώρα, με το πρόγραμμα indent,
Κώδικας: Επιλογή όλων
sudo apt-get install indent

και μετά
Κώδικας: Επιλογή όλων
indent -tc /tmp/myprog.c


Έτσι, ο κώδικάς σου είναι

Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>

void tamplo (int n, int m, int **pa);
void narkes (int n, int m, int **pa);

int
main (int argc, char *argv[])
{
  int i, j, n, m, o, p, a, b, r1, r2, q, w;
  int **pa = NULL;
  printf ("Dwste tis diastaseis tou paixnidiou n x m\n");
  printf ("Prosoxh, to tamplo mporei na exei megethos to poly 24x30\n");
  scanf ("%d%d", &n, &m);
  printf ("Epilxte to epipedo duskolias tou paixnidiou\n");
  printf
    ("Pathste 1 gia eukolo, 2 gia metro, 3 gia duskolo kai 4 gia akatorthoto\n");
  scanf ("%d", &o);
  if (o == 1)
    {
      p = m * n / 8;
    }
  if (o == 2)
    {
      p = m * n / 7;
    }
  if (o == 3)
    {
      p = m * n / 6;
    }
  if (o == 4)
    {
      p = m * n / 5;
    }
  pa = (int **) calloc (n, sizeof (int *)); //desmeush mnhmhs gia dimiourgia 2d pinaka
  for (i = 0; i < n; i++)
    {
      pa[i] = (int *) calloc (m, sizeof (int));
    }
  tamplo (n, m, pa);
  printf ("dwste tis syntetagmenes tou tetragwnou pou thelete na anoixete\n");
  scanf ("%d%d", &a, &b);
  pa[a][b] = 9;
  q = n + 1;
  w = m + 1;
  for (i = 0; i < p; i++)
    {
      do
    {
      r1 = rand () % q;
      r2 = rand () % w;
    }
      while (r1 == a && r2 == b);
      pa[r1][r2] = 1;       //to 10 antiprosopevei tis narkes
    }
  tamplo (n, m, pa);
  for (i = 0; i < n; i++)
    {
      free (pa[i]);
    }
  free (pa);
  system ("PAUSE");
  return 0;
}


Η εντολή
Κώδικας: Επιλογή όλων
  system ("PAUSE");

που χρησιμοποιείς δε λειτουργεί σε Linux (είναι για Windows), οπότε μπορείς να την αφαιρέσεις.
Ή, να χρησιμοποιήσεις κάτι σαν
Κώδικας: Επιλογή όλων
#include <stdlib.h>

int main(void)
{
  system("read a");

  return 0;
}


που κάνει το ίδιο πράγμα.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Πρόβλημα στη εντολή rand() γλώσσα C

Δημοσίευσηαπό Monkey20 » 28 Απρ 2011, 15:08

Βασικά σε windows το τρέχω...βλέπεις κάποιο πρόβλημα στον τρόπο που χρησιμοποιώτη rand()?
Monkey20
babeTUX
babeTUX
 
Δημοσιεύσεις: 6
Εγγραφή: 28 Απρ 2011, 14:34
Εκτύπωση

Re: Πρόβλημα στη εντολή rand() γλώσσα C

Δημοσίευσηαπό simosx » 28 Απρ 2011, 15:11

Monkey20 έγραψε:Βασικά σε windows το τρέχω...βλέπεις κάποιο πρόβλημα στον τρόπο που χρησιμοποιώτη rand()?


Δε διάβασα τον κώδικα. Εδώ είμαστε φόρουμ για Ubuntu. Μπορείς να δοκιμάσεις τον προγραμματισμό σε Linux;
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Πρόβλημα στη εντολή rand() γλώσσα C

Δημοσίευσηαπό Monkey20 » 28 Απρ 2011, 15:13

Οκ με συγχωρείς.
Monkey20
babeTUX
babeTUX
 
Δημοσιεύσεις: 6
Εγγραφή: 28 Απρ 2011, 14:34
Εκτύπωση


  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Κάδος Απορριμμάτων (πλην SPAM)