Programma che risolve disequazione

di il
9 risposte

Programma che risolve disequazione

Salve ho provato a svolgere questo esercizio ma il programma invece di darmi il massimo numero intero positivo minore di Y mi da il minimo intero positivo che superara la y. Qualche consiglio su come fare ? Allego il codice che ho scritto dopo la traccia del problema. Grazie per l'aiuto.

Dato un numero reale positivo Y immesso da tastiera si scriva un programma in linguaggio C che determini qual è il massimo numero intero positivo X tale per cui sia valida la relazione x^x =< y

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

int main ()
{
	int x, y, elevato;
	printf("Dammi un numero ");
	scanf("%d", &y);
		
	while (elevato < y){
		
	elevato = pow (x, x); 
		
	x++;
		
	}
	
	printf ("Il risultato e' %d", x);
	
	getchar();
	
}

9 Risposte

  • Re: Programma che risolve disequazione

    Ho provato e prima di tutto non è vero che ti dà il primo intero maggiore della y, e poi non inizializzi alcuna variabile, e anche se lo facessi sarebbe comunque sbagliato. Inizia a cambiarlo inizializzando le variabili e dicci cosa esce fuori, poi cerca di capire perché
  • Re: Programma che risolve disequazione

    ANDPRI ha scritto:


    Ho provato e prima di tutto non è vero che ti dà il primo intero maggiore della y, e poi non inizializzi alcuna variabile, e anche se lo facessi sarebbe comunque sbagliato. Inizia a cambiarlo inizializzando le variabili e dicci cosa esce fuori, poi cerca di capire perché
    Le variebili le ho inizializzate ma non mi sembra che ci sia alcun cambiamento.
  • Re: Programma che risolve disequazione

    Ovvero? Quale codice utilizzi adesso? Cosa inserisci in input? Cosa hai in output? Cosa dovresti avere?
  • Re: Programma che risolve disequazione

    Quasar3.14 ha scritto:


    ANDPRI ha scritto:


    Ho provato e prima di tutto non è vero che ti dà il primo intero maggiore della y, e poi non inizializzi alcuna variabile, e anche se lo facessi sarebbe comunque sbagliato. Inizia a cambiarlo inizializzando le variabili e dicci cosa esce fuori, poi cerca di capire perché
    Le variebili le ho inizializzate ma non mi sembra che ci sia alcun cambiamento.
    Si lo so, ma almeno ora lo sai anche tu. Comunque prova a fare mentalmente le operazioni che succedono nel while e ti renderai conto di cosa è sbagliato. Magari usa numeri piccoli tipo 10 o 20, e simulati in testa quello che fa il while e fino a quando lo fa. La soluzione è davvero vicina tranquillo, niente di troppo complicato
  • Re: Programma che risolve disequazione

    Se ho capito bene dal codice che hai scritto sei ai primi passi. L'idea è praticabile e ti hanno già dato suggerimenti. Ma esistono altri sistemi, uno dei quali è quello delle bisezioni il cui codice accludo sotto. In questa circostanza utilizzare l'algoritmo delle bisezioni è chiaramente un "overkilling" ma penso che sia utile perché puoi utilizzare l'idea per casi più intricati e dove i numeri non sono interi. Come esercizio per i primi passi, una scansione dei valori è chiaramente accettabile ma in pratica è qualcosa che non si fa quasi mai.

    Potresti se ti va e se credi, studiare come funziona il metodo di bisezione e migliorare il codice (non ho controllato il caso di <= rispetto a < e con gli interi si deve sempre fare attenzione) e ti resta nel tuo cassetto un metodo nuovo da usare in altri casi.

    L'esercizio che devi svolgere è molto didattico perché consente anche una soluzione diretta, ed è quello che si cerca sempre di fare quando la matematica si fa dura. Una soluzione in forma chiusa è sempre meglio di una numerica. Quindi in ordine di efficacia hai: 1) scansione di intervallo di valori, eventualmente migliorabile con una stima del punto iniziale 2) Metodo numerico come quello delle bisezioni che vedi sotto 3) Forma chiusa. Puoi anche portargli tutte e tre le soluzioni
    
    #include   <stdio.h>
    #include   <stdlib.h>
    
    /*
     *   funzione obiettivo:
     *
     *   x * x < y si scrive (e si codifica) come
     *
     *   FUN = x * x - y
     */
    
    long       function (long  xval, long  yval)
    {
        return ( xval * xval - yval ) ;
    }
    
    
    
    void     make_iter (int    *a_iter  ,
                        long   *a_res   ,
                        long   a_x1     ,
                        long   a_x2     )
    {
        ++(*a_iter) ;
        (*a_res) = ( a_x1 + a_x2 ) / 2 ;
        printf("iterazione %4d  xnext = %4ld\n",(*a_iter),(*a_res)) ;
    }
    
    
    
    int        main ()
    {
        int         iter_no =  0 ;
        int         maxmitr = 20 ;
        long        xval         ;
        long        yval         ;
        long        a_inf        ;
        long        b_sup        ;
        long        allowed_err  ;
        long        xnext        ;
    
    
        yval  =  144  ;  // valore dato
    
        xval  =    0  ;  // valore di partenza
        a_inf =    0  ;  // intervallo in cui cercare
        b_sup = 2000  ;
    
        allowed_err = 1 ;
    
        // mostra situazione iniziale
    
        make_iter (&iter_no,&xval,a_inf,b_sup) ;
    
        // esegui
    
        do
        {
            if(   function(a_inf,yval) * function(xval,yval) < 0   )
            {
                b_sup = xval ;
            }
            else
            {
                a_inf = xval ;
            }
    
            make_iter (&iter_no,&xnext,a_inf,b_sup) ;
    
            if(  abs((int)xnext-(int)xval) < allowed_err  )
            {
                printf("\niterazioni %4d  valore cercato = %d\n",iter_no,xnext) ;
                return (0) ;
            }
    
            xval = xnext ;
        }
        while( iter_no < maxmitr ) ;
    
        printf("procedura non converge o troppe iterazioni");
    
        return (1) ;
    }
    
  • Re: Programma che risolve disequazione

    Non ho compreso se però il risultato è quanto cercava Quasar3.14...
  • Re: Programma che risolve disequazione

    Hai ragione, a pensarci bene il mio sorgente risolve l'equazione associata... però non è difficile usarlo come punto di partenza.
  • Re: Programma che risolve disequazione

    Capisco.

    Io, restando genericamente alla impostazione di Quasar3.14, avevo immaginato una cosa del genere:
    #include <stdio.h>
    #include <math.h>
    
    
    int main() {
    
        int x=0, y;
        printf("Dammi un numero ");
        scanf("%d", &y);
         
        while (pow(x+1, x+1) <= y)
            ++x;
    
        printf ("Il risultato e' %d\n", x);
    
        return (0);
    
    }
    Ciao.
  • Re: Programma che risolve disequazione

    vuott ha scritto:


    Capisco.

    Io, restando genericamente alla impostazione di Quasar3.14, avevo immaginato una cosa del genere:
    #include <stdio.h>
    #include <math.h>
    
    
    int main() {
    
        int x=0, y;
        printf("Dammi un numero ");
        scanf("%d", &y);
         
        while (pow(x+1, x+1) <= y)
            ++x;
    
        printf ("Il risultato e' %d\n", x);
    
        return (0);
    
    }
    Ciao.
    Proprio come avevo pensato io, solo che usavo pow(x,x) e alla fine sottraevo 1 a x e si ottiene lo stesso risultato
Devi accedere o registrarti per scrivere nel forum
9 risposte