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

Άσκηση στη c


orfeas1601

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

Δημοσ.

λοιπόν το πρόβλημα εχει ως εξής

το ν!=παραγοντικό ισούται με π.χ

3!=3*2*1=6

4!=4*3*2*1=24

 

δείχνει το σύνολο των μεταθέσεων δηλ..

3!=6 σημαίνει ότι έχουμε σύνολο 6 μεταθέσεις

παράδειγμα

 

123

132

213

231

312

321

Πρέπει να γραφεί κώδικας που να διαβάζει το ν και να υπολογίζει τις μεταθέσεις με κάποιο τρόπο.Το αποτέλεσμα είναι αυτό που βλέπετε...

Εάν μπορεί κάποιος να βοηθήσει....

ευχαριστώ ,σας παραθέτω τον κώδικα

>#include <stdio.h>

int print(int apo, int pros);
int main ()
{
   system("chcp 1253>nul");
   int i,n;
   printf ("****************υπολογισμός παραγοντικού******************\n");
   do
   {
          printf ("\nΠαρακαλώ δώστε το παραγοντικό του: ");
          scanf ("%d", &n);
          if (n<0) printf ("Μη αποδεκτός αριθμός,παρακαλώ δώστε θετικό αριθμό\n");
          }
          while (n<0);
          printf ("\n%d! = %d\n\n", n , anad(n)); //εκτύπωση του παραγοντικού
          for(i=0;i<anad(n);i++)//
          {
                                printf("\n");
                                print(1,n);//κλήση της συνάρτησης για εκτύπωση
                                printf("\n");
                                }
                                printf("\n\n");
                                system("pause");
                                return 0;
                                }
                                int print(int apo, int pros)//συνάρτηση για την εκτύπωση των
                                {                                      //μεταθέσεων
                                    if (apo<=pros)
                                    { 
                                                  printf("%d ",apo);
                                                  print(apo+1,pros);
                                                  }
                                                  }
                                                  int anad (int n) //υλοποίηση του παραγοντικού n!
                                                  { 
                                                      if (n==0) 
                                                      return 1;//επιστρέφει 1
                                                      else 
                                                      return (n*anad(n-1));//επιστρέφει το αποτέλεσμα για n!
                                                      }

Δημοσ.

π.χ. με recursion κάνεις κάτι σαν το παρακάτω

 

>
typedef char item;
item x[n];
const item Smallest='0',Largest='9';

print(item *x,int pos){
        if(pos<n){
             for(x[pos]=Smallest;x[pos]<Lasrgest;x[pos]++){
                    print(x,pos+1);
             }
        } else 
             τυπωσε τρέχουσα κατασταση πινακα x
}

 

και φυσικά γίνεται πολύ απλά και με loop

Δημοσ.

Κατ'αρχην δεν είσαι ξεκάθαρος στο τι δεν κατάφερες να "κάνεις".

 

Θελεις να εμφανίζεις τις διαφορετικές "μεταθέσεις";

αν ναι, στο σημείο του προγράμματος που θέλεις να εμφανίζονται θα το κάνεις.

Είδα ότι απλά τυπώνεις το ιδιο πράγμα συνέχεια (χωρις "μεταθέσεις").

 

Με ποιά μέθοδο έχεις υλοποιήσει την μέθοδο υπολογισμού του παραγοντικού;

Μπορείς να περιγράψεις τι κάνει ο κώδικας που έγραψες;

Μπορείς να τον στοιχίσεις σωστά; (είναι σαν δέντρο που γέρνει προς τα αριστερα).

Δημοσ.

Έχεις δίκιο,στοίχησα τον κώδικα,έγραψα και σχόλια.

Θέλω ο κώδικας να κάνει τις μεταθέσεις των αριθμών όπως είναι στο αρχικό μήνυμά μου.Απλά τον έφτασα σε αυτό το σημείο,έχοντας κολλήσει .....Σίγουρα δεν είναι έχει τελειώσει.

Δημοσ.
...στοίχησα τον κώδικα...
πού;

 

μπορείς να περιγράψεις με ποιόν τρόπο λειτουργεί ο υπολογισμός του παραγοντικού που έχεις κάνει;

(αν δεν έχεις καταλάβει τη μέθοδο αυτή, δεν σου χρησιμεύει και ο ψευδοκώδικας που έγραψα)

Δημοσ.
πού;

 

μπορείς να περιγράψεις με ποιόν τρόπο λειτουργεί ο υπολογισμός του παραγοντικού που έχεις κάνει;

(αν δεν έχεις καταλάβει τη μέθοδο αυτή, δεν σου χρησιμεύει και ο ψευδοκώδικας που έγραψα)

 

στο αρχικό μήνυμά μου έχω τοποθετήσει και τον κώδικα και σχόλια γι'αυτόν.

η συνάρτηση anand υπολογίζει το παραγοντικό πχ του 3,του 4 , κλπ...

Δημοσ.
στο αρχικό μήνυμά μου έχω τοποθετήσει και τον κώδικα και σχόλια γι'αυτόν. Δεν είναι στοιχισμένος ο κωδικας, τα σχόλια που έχεις βάλει είναι τα προφανή και δεν είναι απαραίτητα

η συνάρτηση anand υπολογίζει το παραγοντικό πχ του 3,του 4 , κλπ...

τη μεθοδολογία για τη συνάρτηση ζηταω

Δημοσ.
τη μεθοδολογία για τη συνάρτηση ζηταω

 

>int anad (int n) //υλοποίηση του παραγοντικού n!
                                                  { 
                                                      if (n==0) 
                                                      return 1;//επιστρέφει 1
                                                      else 
                                                      return (n*anad(n-1));//επιστρέφει το αποτέλεσμα για n!
                                                      }

 

για να βρούμε την τιμή του παραγοντικού π.χ του !3=3*2*1=6,

για !4=4*3*2*1=24...κλπ.Εδώ επιστρέφει n*anad(n-1) η οποία υπολογίζει το παραγοντικό.Ίσως κάπου μπερδευόμαστε και δεν μπορώ να σε καταλάβω τι ακριβώς μου ζητάς.Τρέξε τον κώδικα ,αλλά δεν έχει ολοκληρωθεί,θα πρέπει να εμφανίσει με τις κατάλληλες εντολές τις μεταθέσεις των στοιχείων ,δλη

 

123

132

213

231

312

321

 

οι μεταθέσεις των στοιχείων όσες και το αποτέλεσμα για !3=6.Εάν ήταν !4=24 θα είχαμε 24 μεταθέσεις

 

---------- Προσθήκη στις 10:44 ---------- Προηγούμενο μήνυμα στις 09:53 ----------

 

σου παραθέτω κώδικα για !n=3

>#include <stdio.h>

void print(const int *v, const int size)
{
    int i;
 if (v != 0) {
   for ( i = 0; i < size; i++) {
     printf("%4d", v[i] );
   }
   printf("\n");
 }
} // print


void permute(int *v, const int start, const int n)
{ 
    int i; 
 if (start == n-1) {
   print(v, n);
 }
 else {
   for ( i = start; i < n; i++) {
     int tmp = v[i];
     
     v[i] = v[start];
     v[start] = tmp;
     permute(v, start+1, n);
     v[start] = v[i];
     v[i] = tmp;
   }
 }
}


main()
{
 int v[] = {1, 2, 3};
 permute(v, 0, sizeof(v)/sizeof(int));
 system("pause");
}


 

---------- Προσθήκη στις 10:59 ---------- Προηγούμενο μήνυμα στις 10:44 ----------

 

κοίτα εδώhttp://http://www.bearcave.com/random_hacks/permute.html

Δημοσ.

Κοιτα τη μεθοδολογία τη ξέρω, ηθελα να δω αν όμως έχεις καταλλάβει τον όρο αναδρομή ή recursion.

 

Αυτή η μέθοδος έχει χρησιμοποιηθεί στον υπολογισμό του παραγοντικού (που δεν έχει την παραμικρή υποψία στοιχισης).

 

Αυτη τη μέθοδο χρησιμοποίησα και εγώ στο (μη ολοκληρωμένο) παράδειγμα που σου έδωσα για την print. Πρέπει πρωτα να διαβάσεις τι κάνει η αναδρομή (και το απλούστερο ίσως παράδειγμα της, ο υπολογισμός παραγοντικού) και μετά να πας σε λίγο πιό δύσκολη περίπτωση, όπως της print που ακολουθεί:

 

>
void print(x[],int pos,int n){
//n = αριθμός του οποίου το παραγοντικο θέλουμε
//pos είναι μετρητης για την αναδρομή
//χ[] πίνακας που γεμίζει η αναδρομη
       if(pos<n){
      		for(x[pos]='0';x[pos]<=n+'0';x[pos]++){//για όλους τους συνδιασμούς στη θέση pos
                               αν το x[pos] δεν έχει χρησιμοποιηθει στις θέσεις x[0] εως x[pos-1], τότε
			print(χ[],pos+1,n);//βρες τους συνδιασμούς για την επόμενη θέση pos+1
	}
} else {
                       //ολες οι n θέσεις υπολογιστηκαν 
	τυπωσε απο x[0] εως x[n-1]
           }
}

Αρχειοθετημένο

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

  • Δημιουργία νέου...