Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Καλησπέρα το συγκεκριμένο κομμάτι είναι για μία εργασία στη c και για κάποιο λόγο ενώ χρησιμοποιώ τη rand() πάντα πέρνω τα ίδια αποτελέσματα.Καμιά φορά σκαλώνει και δεν τρέχει. Το πρόβλημα βρίσκεται στη συνάρτηση DimiourgiaPinaka. Βάζω στον πίνακα σε τυχαίες θέσεις O,G,S,Μ(1 από το καθένα εκτός απο το Ο που μπορεί να είναι παραπάνω) δεν πρέπει να μπουν το ένα πάνω στο άλλο εκτός από το S που μπένει παντού εκτός πάνω στο Μ. Και επίσης το Μ μπένει μόνο σε γωνίες. Αν δείτε το λάθος θα με βοηθήσετε πολύ. Ευχαριστώ.

 

 

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

int phgadia(int, int);
char **DimiourgiaPinaka(int, int, int);
void EmfanishPinaka(char **, int, int);

int main(int argc, char *argv[])
{
 int n,k,p,i,j;
 srand( time(NULL) );
 char **T;
 //kathorismos diastaseis paixnidiou
 printf("O Megalexandros kai o kataramenos Ofis\n");
 printf("Kathoriste tis diastaseis tou paixndiou(NxK)\n");
 printf("To elaxisto megethos paixnidiou einai 5x5 kai to megisto 30x30\n");
 do
 {
     printf("Dwste to N\n");
     scanf("%d", &n);
     printf("Dwste to K\n");
     scanf("%d", &k);
      if(n<5 || n>30 || k<5 || k>30)
     {
            printf("dwsate lathos diastaseis, ksanaprospathiste...\n");
     }
 }while(n<5 || n>30 || k<5 || k>30);
 //kathorismos posostou phgadiwn
 p = phgadia(n, k);
 //dhmiourgia dunamikou 2d pinaka
 T=DimiourgiaPinaka(n, k, p);
 //emfanish pinaka
 EmfanishPinaka(T, n, k);
 
 

 system("PAUSE");	
 return 0;
}







char **DimiourgiaPinaka(int n, int k, int p)
{
    int i,j,x,y;
    char **P;   
    //dimiourgia pinaka
    P=(char **)malloc(n*sizeof(char *));
    for(i=0; i<n; i++)
    {       
        P[i]=(char *)malloc(k*sizeof(char));
    }
    //gemisma me #
    for(i=0;i<n; i++)
    {
        for(j=0;j<k; j++)
        {
            P[i][j]='#';
        }
    }
    //topothethsh phgadiwn
    for(i=0; i<p; i++)
    {
        do
        {
             x=rand()%n;
             y=rand()%k; 
        }while(P[x][y]!='#');
        P[x][y]='O';    
    }
    //topothethsh xrusou
    do
    {
        x=rand()%n;
        y=rand()%k;
    }while(P[x][y]!='#');
    P[x][y]='G';
    //topothethsh ofh
    x=rand()%n;
    y=rand()%k;
    P[x][y]='S';
    //topothethsh Megalexandrou
    do
    {
        if((rand()%2)==0)
        {
             x=0;
        }
        else
        {
            x=n;
        }
        if((rand()%2)==0)
        {
            y=0;
        }
        else
        {
            y=k;
        }           
    }while(P[x][y]!='#');
    P[x][y]='M';
    return P;
}

void EmfanishPinaka(char **P, int n, int k)
{
         int i,j;
         printf("  ");
         for(i=0; i<k; i++)
         {
                  printf("%s%d", " ", i+1);
         }
         printf("\n");
         printf("--");
         for(i=0; i<k; i++)
         {
                  printf("--");
         }
         printf("\n");
         for(i=0; i<n; i++)
         {
                  printf("%d%s", i+1, "|");
                  for(j=0; j<k; j++)
                  {
                           printf("%s%c", " ", P[i][j]);
                  }
                  printf("\n");
         }
         
}


int phgadia(int n, int k)
{
   int p,r;
   printf("Kathoriste to pososto twn tetragwnwn se sxesh me ta sunolika pou tha einai phgadia\n");
   printf("pathste 1 gia liga(5 tis ekato) h 2 gia kamposa(10 tis ekato) h 3 gia polla(15 tis ekato)\n");
   do
   {
      scanf("%d", &p);
      if(p<1 || p>3)
      {
             printf("dwsate lathos dedomena, pathste 1 h 2 h 3 gia na kathorisete thn epilogh sas\n");
      }
   }while(p<1 || p>3);
   if(p==1)
   {
         r=n*k*5/100;
   }
   else if(p==2)
   {
         r=n*k*10/100;
   }
   else
   {
         r=n*k*15/100;
   }
   return r;
}

Επεξ/σία από monkey90
Δημοσ.

Στην main() ξεκίνα με:

 

>
srand( time(NULL) );

που ενεργοποιεί την γεννήτρια ψευδοτυχαίων. Χωρίς αυτό η rand() δίνει πάντα τα ίδια αποτελέσματα.

Δημοσ.

Άμα βάλω την srand( time(NULL) ); τότε είναι που σχεδόν πάντα "κολλάει"..δηλαδή δίνει ο χρήστης αυτα που του ζητούνται και μετά βγάζει το στοιχείο main.exe σταμάτησε να λειτουργεί.

Δημοσ.

Έχεις κάνει: #include <time.h> ?

 

Αν ναι, δεν φταίει η srand() ... κάτι άλλο φταίει στο πρόγραμμά σου (ή στο σύστημά σου).

Δημοσ.

Ναι την έχω βάλει...υπάρχει κάποιο λογικό λάθος δεν ξέρω. Σε ευχαριστώ πάντως.

Εαν κάποιος εντωπίση που είναι το λάθος ,λογικά στην συνάρτηση DimiourgiaPinaka, θα του ήμουν ευγνώμων.

Δημοσ.

Ακόμα δεν το έχω βρει..υπάρχει περίπτωση να φταίειο υπολογιστής μου;

Δε μπορώ να το εντωπίσω και επειδή κολλάει εκεί δε μπορώ να ελένξω και τα επόμενα που έχω κάνει.

Δημοσ.

Ακόμα δεν το έχω βρει..υπάρχει περίπτωση να φταίειο υπολογιστής μου;

Δε μπορώ να το εντωπίσω και επειδή κολλάει εκεί δε μπορώ να ελένξω και τα επόμενα που έχω κάνει.

 

Σπάνια φταίει ο υπολογιστης ή η διατύπωση της άσκησης. Καποιο λογικο λάθος έχει ο κωδικας σου.

Βασικα δοκιμασε να παιξεις με την εξοδο. Δηλαδη βάζε εσυ εισοδους και αναλογα με την εξοδο που παιρνεις προσπαθησε να καταλαβεις που υπάρχει το θέμα. Σε ποια ρουτίνα. Πολυ γενικο αυτο που σου λεω

αλλα ελπιζω καπως να σε βοηθησει.

Δημοσ.

Ακόμα δεν το έχω βρει..υπάρχει περίπτωση να φταίειο υπολογιστής μου;

Δε μπορώ να το εντωπίσω και επειδή κολλάει εκεί δε μπορώ να ελένξω και τα επόμενα που έχω κάνει.

Το πρόγραμμα σου κτυπάει access violation στο while(P[x][y]!='#') (στην DimiourgiaPinaka) διότι τα x, y δείχνουν μια θέση παραπάνω από το μέγεθος του πίνακα που δέσμευσες με:

P=(char **)malloc(n*sizeof(char *));

for(i=0; i<n; i++)

{

P=(char *)malloc(k*sizeof(char));

}

 

Θα πρέπει να αναθεωρήσεις τον κώδικα σου (διότι ορίζεις σε διάφορα σημεία τα x, y σου) ώστε να μην είναι εκτός ορίων (ή αρνητικές τιμές), πχ:

 

>
	 if((rand()%2)==0)
	 {
		  x=0;
	 }
	 else
	 {
		 x=n - 1;
	 }
	 if((rand()%2)==0)
	 {
		 y=0;
	 }
	 else
	 {
		 y=k - 1;
	 }

 

* Τώρα αν τα x, y πάνε < 0 ή αν υπάρξουν άλλα bugs θα το δεις εσύ κλπ.

 

Καλή συνέχεια.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...