Advertisement
marcogiunta98

radq.c

Mar 22nd, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.69 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h> //mi serve per fabs, che e' il valore assoluto di un numero reale
  3.  
  4. void main(void)
  5.  {float x0,x,errore,incognita_al_quadrato;
  6.   unsigned int i=0,iterazioni_max;/*dichiaro quante iterazioni siano ammissibili per evitare che vada avanti in eterno*/
  7.   unsigned short int mostrare_numeri;//dichiaro se poi mostero' tutti i numeri; per questa variabile mi basta lo short int, per quella precedente non necessariamente
  8.   char risposta;//mi servira' poi per lo switch per chiedere all'utente se vuole vedere tutti i numeri
  9.  
  10.   printf("\nInserisci il numero del quale vuoi la radice quadrata\n");
  11.   scanf("%f",&incognita_al_quadrato);
  12.   printf("\nInserisci una stima della radice\n");
  13.   scanf("%f",&x0);
  14.   while (!x0)//devo assicurarmi che nessun valore della successione sia zero perche' altrimenti non posso calcolare il successivo senza dividere per zero
  15.    {printf("\nPer favore inserisci un valore iniziale non nullo... Altrimenti l'algoritmo non funziona!\n");/*Cosi' evito la divisione per zero*/
  16.     scanf("%f",&x0);
  17.    }
  18.   x=x0; //x0 e' il primo valore della mia successione; devo assegnare qualcosa a x prima di usarlo se no รจ casuale
  19.   printf("\nInserisci l'errore accettabile\n");
  20.   scanf("%f",&errore);
  21.   printf("\nInserisci il numero massimo di iterazioni accettabili\n");//devo evitare che il programma duri in eterno senza che l'utente ne sia consapevole
  22.   scanf("%d",&iterazioni_max);                                        //non serve a molto perche' la convergenza e' velocissima, ma non si sa mai
  23.   printf("\nVuoi visualizzare i numeri della successione calcolati passo passo? (s/n)\n");
  24.   scanf(" %c",&risposta);
  25.   switch(risposta)
  26.    {case 's':
  27.     case 'S': mostrare_numeri=1;
  28.               break;
  29.     case 'n':
  30.     case 'N': mostrare_numeri=0;
  31.               break;
  32.     default : while ((risposta!='s') && (risposta!='S') && (risposta!='n') && (risposta!='N'))
  33.                {printf("\nInput sbagliato, per favore riprova.\n");
  34.                 scanf(" %c",&risposta);
  35.                }
  36.               if ((risposta=='s')||(risposta=='S'))
  37.                {mostrare_numeri=1;
  38.                }
  39.               else
  40.                {mostrare_numeri=0;
  41.                }
  42.               break;
  43.   }
  44.   //printf("%d",mostrare_numeri);
  45.   if (mostrare_numeri==1)/*l'espressione fabs(...) al rigo sotto e' l'errore relativo fra x_n+1 e x_n*/
  46.    {while ((i<iterazioni_max) && (fabs((-x/2+incognita_al_quadrato/(2*x))/x)>=errore) && (x!=0))/*i deve essere minore di ite_max perche' poi gli aggiungo 1; cosi' non sforo*/
  47.      {x=0.5*x+(0.5*incognita_al_quadrato)/(x); /*prima controllo se non ho sforato iterazioni_max, poi se ho raggiunto la precisione voluta*/
  48.       i=i+1;                               /*l'ultimo controllo verifica che x non sia zero, se no spuntano divergenze non volute*/
  49.       printf("\n%.15f\n",x);                  
  50.      }
  51.    }
  52.   else
  53.    {while ((i<iterazioni_max) && (fabs((-x/2+incognita_al_quadrato/(2*x))/x)>=errore) && (x!=0))/*i deve essere minore di ite_max perche' poi gli aggiungo 1; cosi' non sforo*/
  54.      {x=0.5*x+(0.5*incognita_al_quadrato)/(x); /*prima controllo se non ho sforato iterazioni_max, poi se ho raggiunto la precisione voluta*/
  55.       i=i+1;                               /*l'ultimo controllo verifica che x non sia zero, se no spuntano divergenze non volute*/                
  56.      }
  57.    }
  58.  
  59.   if (i<iterazioni_max) /*se il while si e' fermato con i<ite_max vuol dire che e' stata raggiunta la precisione voluta con almeno una iterazione di margine*/
  60.    {printf("\nPartendo da %f ed eseguendo %d iterazioni ho trovato che %.15f approssima la radice quadrata di %f con errore inferiore a %.15f\n",x0,i,fabs(x),incognita_al_quadrato,errore);
  61.    }
  62.   else /*in questo caso ho raggiunto quella precisione esattamente con iterazioni_max oppure non l'ho raggiunta; aggiungo un if*/
  63.    {if (fabs((-x/2+incognita_al_quadrato/(2*x))/x)<=errore) /*l'ho raggiunta per un pelo*/
  64.      {printf("\nPartendo da %f ed eseguendo proprio %d iterazioni ho trovato che %.15f approssima la radice quadrata di %f con errore inferiore a %.15f\n",x0,i,fabs(x),incognita_al_quadrato,errore);  
  65.      }
  66.     else /*non l'ho raggiunta*/
  67.      {printf("\nIn %d iterazioni partendo da %f non sono riuscito ad approssimare la radice quadrata di %f con errore minore di %.15f; la mia miglior stima e' %.15f.\n",i,x0,incognita_al_quadrato,errore,fabs(x));
  68.     //printf("\nIn %d iterazioni partendo da %f non sono riuscito ad approssimare la radice quadrata di %f con errore minore di %f; la mia miglior stima e' %f, che approssima sqrt(%f) con errore inferiore a %f\n",i,x0,incognita_al_quadrato,errore,fabs(x),incognita_al_quadrato,fabs((-x/2+incognita_al_quadrato/(2*x))/x));
  69.      }
  70.    }
  71.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement