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

Βοηθώντας μια φίλη...


dypbill

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

Δημοσ.

Καταρχάς καλησπέρα!

 

Το παρών θέμα το ανοίγω για να βοηθήσω μια γνωστή μου που έχει να παραδώσει μια εργασία στο Τ.Ε.Ι. όπου σπουδάζει. Όπως μου είπε η ίδια, η εργασία είναι σκέτη σπαζοκεφαλιά και ενώ έχει δοκιμάσει ότι της έχει έρθει στο μυαλό και αφού ρώτησε αρκετά άτομα μήπως και ξέρουν τη λύση, δεν έχει καταφέρει να τη λύσει ακόμα.

 

Επειδή λοιπόν, θέλω να τη βοηθήσω σας παρακαλώ να με βοηθήσετε σ'αυτό.;)

 

Η εργασία λέει:

 

 

ΑΣΚΗΣΗ 4

 

Να γραφεί πρόγραμμα που θα επιλύει, μέσα από ένα μενού επιλογών, τα παρακάτω προβλήματα αναδρομής:

 

1.Fibonacci

2.Το πρόβλημα του 3n+1

3.Διωνυμικός συντελεστής C(x,y)

4.Exit

 

Στην πρώτη επιλογή (1) η ακολουθία Fibonacci ορίζεται ως εξής :

 

0, n=0

 

F(n)= 1, n=1

 

F(n-1)+F(n-2), n>1

 

Ορίστε την αναδρομική συνάρτηση int fib(int n) που να υλοποιεί τον υπολογισμό του n-οστού όρου της ακολουθίας Fibonacci.

 

Χρησιμοποιήστε την παραπάνω συνάρτηση, υπολογίστε τους όρους της ακολουθίας

Fibonacci από n=x μέχρι το n=y, καλώντας τη συνάρτηση που υλοποιήσατε. Αμέσως μετά

τον υπολογισμό, να εμφανίζεται η τιμή του αντίστοιχου όρου της ακολουθίας Fibonacci στην οθόνη. Οι τιμές x και y θα ορίζονται από τον χρήστη κατά την εκτέλεση του προγράμματος μέσω της συνάρτησης void getvalues ( int *x , int *y) .

 

Στην επιλογή (2) το πρόβλημα του 3n+1 ορίζεται ως εξής: Εικάζεται, αλλά δεν έχει αποδειχθεί μαθηματικά, ότι αν ξεκινήσουμε από ένα θετικό ακέραιο αριθμό n και πάρουμε σαν επόμενό του τον n/2, αν ο n είναι άρτιος, ή τον 3n+1, αν ο n είναι περιττός, συνεχίζοντας με αυτόν τον τρόπο, κάποια στιγμή θα καταλήξουμε στο 1. Για παράδειγμα, αν ξεκινήσουμε από το n=22, η ακολουθία αριθμών που θα πάρουμε με αυτή τη διαδικασία θα είναι η 22,11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1.

 

Θα χρησιμοποιηθεί μια συνάρτηση int isodd(int n) που δέχεται σαν όρισμα έναν ακέραιο και

επιστρέφει 1, αν ο αριθμός είναι περιττός, ή 0, αν ο αριθμός είναι άρτιος.

 

Θα χρησιμοποιηθεί η συνάρτηση void printnum(int n) ώστε να εκτυπωθούν οι αριθμοί από το n έως το 1. Προς διευκόλυνση δίνεται ο ψευδοκώδικας της συνάρτησης :

 

Τύπωσε n

Αν το n<>1 τότε

Αν n περιττός τότε printnum(3n+1)

Αν n άρτιος τότε printnum(n/2)

 

 

 

Για την επιλογή (3) ο διωνυμικός συντελεστής υπολογίζεται αναδρομικά ως εξής:

 

1, για y=0, y=x

 

 

C(x,y)=

 

C(x-1,y-1) + C(x-1,y) για 0<y<x

 

Να χρησιμοποιηθεί η συνάρτηση void getvalues ( int *x , int *y) για τον ορισμό των τιμών x και y. Να γίνεται ο έλεγχος των τιμών ώστε 0<=y<=x.

 

Να χρησιμοποιηθεί η συνάρτηση long c_xy (int x, int y) για τον υπολογισμό του διωνυμικού συντελεστή.

 

 

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

Δημοσ.

Το δεύτερο υπό ερώτημα μπορεί να λυθεί με την ρουτίνα collatz, η οποία κάνει recursive collatz μέχρι ο αριθμός να είναι 1 (ή λιγότερο, πχ. 0 -περίπτωση ατέρμον loop!), εκτυπώνοντας κάθε νέο αριθμό που προκύπτει στο stdout. Φυσικά η χρήση της θέλει προσοχή διότι μεγάλοι αριθμοί απαιτούν και μεγάλο χώρο στο stack (ώστε να μην καταλήξουμε σε stack overflow κατά την επίλυση του προβλήματος).

 

>
/*-Collatz conjecture 3n+1 demo (c) directx----------------------------------*/

#include <stdio.h>
#ifdef __BORLANDC__
#pragma hdrstop
#endif

/*---------------------------------------------------------------------------*/
int	collatz(int);

#ifdef __BORLANDC__
#pragma argsused
#endif
int main(void)
{
int	nNumber = 22;

collatz(nNumber);

printf("\nPress enter to exit..");
getchar();

return 0;
}
/*---------------------------------------------------------------------------*/
int	collatz(int nNumber)
{
/* Print current number */
printf("%d ", nNumber);

/* Is this the end? */
if(nNumber <= 1)
 {
	putchar('\n');
	return	nNumber;
 }

/* Even or odd? - Call self */
return	collatz((nNumber % 2) ? (3 * nNumber) + 1: nNumber / 2);
}

 

Έξοδος για αριθμό 22:

 

>
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

 

Και για αριθμό 27:

 

>
27 82 41 124 62 31 94 47 142 71 214 107 322 161 484 242 121 364 182 91 274 137 4
12 206 103 310 155 466 233 700 350 175 526 263 790 395 1186 593 1780 890 445 133
6 668 334 167 502 251 754 377 1132 566 283 850 425 1276 638 319 958 479 1438 719
2158 1079 3238 1619 4858 2429 7288 3644 1822 911 2734 1367 4102 2051 6154 3077
9232 4616 2308 1154 577 1732 866 433 1300 650 325 976 488 244 122 61 184 92 46 2
3 70 35 106 53 160 80 40 20 10 5 16 8 4 2 1

 

Το πρόγραμμα έχει δοκιμασθεί σε ET/CodeGear C++ Builder και φυσικά μπορεί να περιέχει bugs ή άλλες αβλεψίες.

 

Υ.Γ.

Για περισσότερα σχετικά με το Collatz conjecture να δει εδώ, το ίδιο να πράξει και για τα υπόλοιπα ερωτήματα της ;)

Δημοσ.
>
#include <stdio.h> 

void getvalues ( int * , int *);
int fib(int);
int isodd(int);
void printnum(int);
long c_xy (int,int);
int main()
{
int n,x,y,choice,tryagain,e;
choice=0;tryagain=1;
while (tryagain==1){
	while (choice<1 || choice>4){
		printf("\n\n");
		printf("\n         epiloges");
		printf("\n=========================");
		printf("\n1.Fibonacci");
		printf("\n2.to problima tou 3n+1");
		printf("\n3. dionymikos sintelestis C(x,y)");
		printf("\n4.Exit");
		printf("\n choice(1-4):");scanf("\n%d",&choice);
		if(choice<1 || choice>4) printf("\nerror choice must be 1,2,3,or 4 try again!\n");
	}
	if(choice==1){
		e=1;
		while (e==1){
			printf("\nDose arxi-telos  fibonacci (x y):y>=x(p.x:9 12):");
			getvalues(&x,&y);
			if (y>=x) e=0;
			if (e==1) printf("\nwrong numbers enter again x,y (y>=x)\n");
		}
		for (int i=x;i<=y;i++){
			printf("\nFIBONACI %d=%d",i,fib(i));
		}
	}
	if(choice==2){
		printf("\ndose to n gia ypologismo:");
		scanf("\n%d",&n);
		printnum(n);
	}
	if(choice==3){
		e=1;
		while (e==1){
			printf("\ndose x,y gia to C(x,y) (0<=y<=x) (p.x.:8 2):");
			getvalues(&x,&y);
			if (x>=y && y>=0) e=0;
			if (e==1) printf("\nwrong numbers enter again x,y (0<=y<=x)\n");
		}
		printf("\ndionimikos syntelestis gia x=%d,y=%d  c(x,y)=%ld",x,y,c_xy (x,y));
	}
	if (choice==4) tryagain=0;
	choice=-1;
}
return 0;
}

void getvalues ( int *x , int *y){
scanf("\n %d %d",x,y);

}

int fib(int n){
if(n==0) return 0;
if(n==1) return 1;
return fib(n-1)+fib(n-2);
}

int isodd(int n){
if (n%2==0) return 0;
return 1;
}
void printnum(int n){
printf(" %d ",n);
if ( n!=1){
	if (isodd(n)==1) 
		printnum(3*n+1);
	else
            printnum(n/2);
}
}

long c_xy (int x, int y){
if (y==0 || y==x) return 1;
return c_xy(x-1,y-1) + c_xy(x-1,y);

}

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

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

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