Newsgroup: it.comp.lang.c++
Titolo: Potreste correggere queste sorgenti?

Salve a tutti,fra qualche giorno ho da fare l'esame di Elementi
d'informatica,e avrei bisogno di uno sguardo su quattro algoritmi che ho
realizzato:si tratta della RICERCA BINARIA e della ricerca di zeri di una
funzione con bisezione e con Newton-Raphson.
Ringrazio tutti anticipatamente e mi scuso per la quantità di dati postata
____________________________________________________________
#include <iostream.h>
#include <stdlib.h>
void main(void)
{
  cout<<"RICERCA BINARIA DI UN ELEMENTO DA UN VETTORE ORDINATO
V.Canale,matr.531/137\n";    file://titolo
  cout<<"\n";
  void cercaBin( int [], int, int, int &); file://dichiarazione
  const int MAX=100;                 file://cardinalità
  int v[MAX], FattRiemp, elemento;
  cout<<"Quanti valori da analizzare? ";
  cin>>FattRiemp;
   for (int i=0; i<FattRiemp; i++)                 file://riempimento
dell'array
      {
      cout<<"inserisci il "<<(i+1)<<"° valore: ";
      cin>>v[i];
      }
      cout<<"Valore da cercare: ";
      cin>>elemento;
  int ris =-1;            file://INIZIALIZZATA A "NON TROVATO"
  cercaBin( v, FattRiemp, elemento, ris);  file://cercaBin è del tipo void
  if (ris == -1)
        cout<<"L'elemento e' assente\n";
    else
        cout<<"L'elemento e' al "<<(ris+1)<<"° posto del vettore.\n";
  cout<<"\n";
 system("PAUSE");
}
void cercaBin(int vett[], int FattRiemp, int val, int &risp)
{
 int da=0;
 int a = (FattRiemp-1);  file://se il 1° elemento è all'indice 0, il 5°
sarà
all'indice 4
 int m;
 risp = -1;
 while ( (risp= -1) && (a-da >= 0) )
      {
       m= (da+a)/2;
       if (vett[m] == val)
          risp = m;
       else
          {
          if (vett[m] > val)
             a = m-1;
           else
             da = m+1;
          }
      }
}
__________________________________________________________
/* dal 1° if al secondo ci sono 
problemi.il
 prog va in loop infinito
*/
#include <iostream.h>
#include <stdlib.h>
int m;
void main(void)
{
  cout<<"\t"<<"\t"<<"Ricerca Binaria Ricorsiva  V.Canale,matr.531/137 \n";
  cout<<"\n";
  int CercaBinRicors( int[], int, int, int, int ); file://dichiarazione
  const int MAX=100;                 file://cardinalità
  int v[MAX], FattRiemp, elemento;
  cout<<"Quanti valori da analizzare? ";
  cin>>FattRiemp;
   for (int i=0; i<FattRiemp; i++)
      {
      cout<<"inserisci il "<<(i+1)<<"° valore: ";
      cin>>v[i];
      }
      cout<<"Valore da cercare: ";
      cin>>elemento;
   int ris =-1;            file://INIZIALIZZATA A "NON TROVATO"
   ris =  CercaBinRicors( v, 0, (FattRiemp-1) , elemento, ris);
file://da=elemento di posto 0
   if (ris == -1)
        cout<<"L'elemento e' assente\n";
    else
        cout<<"L'elemento e' al "<<(ris+1)<<"° posto del vettore.\n";
  cout<<"\n";
 system("PAUSE");
}
int CercaBinRicors( int vett[], int da, int a, int val, int risp)
{
 if (da == a)         file://se il vettore è formato da 1 solo elemento
    {
    if (vett[da] == val)  file://ed è proprio quello che cerchiamo
        risp = da;
     else
        risp =  -1;   file://se non cerchiamo l'unico elemento del
vettore --->
alla fine del programma
        return risp;  file://in assenza di questa istruzione si genera un
root
infinito
    }
 else
    m = (da + a)/2;     file://se il vettore ha + di 1 elemento,genera il
punto
medio
 if (vett[m] == val)    file://se il punto medio dell'array è l'elemento
che
cerchiamo
    risp = m;         // --->alla fine del programma
    return risp;
 else
    {
    if(vett[m] < val)      file://se il punto medio dell'array è minore del
valore che cerchiamo
         CercaBinRicors( vett, m+1, a, val, risp);    file://cambia
l'estremo
da=m+1
    else
         CercaBinRicors( vett, da, m-1, val, risp);   file://cambia
l'estremo
a=m-1
    }
     return risp;
}
_________________________________________________________
#include <iostream.h>
#include <stdlib.h>
  double f(double);
  double deriv (double f(double), double, double);
  double zeriNewRaph(double f(double), double, double, double eps=1.0e-8);
void main(void)
{
  cout<<"RICERCA DEGLI ZERI DI UNA FUNZIONE (Newton-Raphson)
V.Canale,matr.531/137\n";    file://titolo
  cout<<"\n";
  double  da, a, x;
  cout<<"Scrivi il primo estremo dell'intervallo di ricerca: ";
  cin>>da;
  cout<<"Scrivi il secondo estremo dell'intervallo di ricerca: ";
  cin>>a;
 // cout<<"dx = ";
 // cin>>dx;
  x= zeriNewRaph(f, da, a);
  cout<<"Uno zero della funzione e' in x="<< x;
  cout<<"\n";
  cout<<"\n";
 system("PAUSE");
}
double f(double x)    file://calcolo della f(x)
{
 double y = -(x*x) + 4 ;
 return y;
}
double deriv(double f(double), double x, double dx)
{
 return ( f(x + dx)-f(x) )/dx;
}
double zeriNewRaph(double f(double), double a, double b, double eps=1.0e-8)
{
   double x0 = (b-a)/2.0;      file://partiamo da un valore approssimato
   double fx0= f(x0);
   double x1 = x0 /(deriv(f, x0, eps) );
//   double x1 = x0 -  fx0 / deriv(f, x0, eps);
   while ( fabs(x0 - x1) > eps)
   {
      x0 = x1;
      x1 = x0 -  fx0 / deriv(f, x0, eps);
   }
   return x1;
}
__________________________________________________________
#include <iostream.h>
#include <stdlib.h>
  double f(double);
  double zeroIterativa(double f(double), double, double, int &, double
eps=1.0e-6);
void main(void)
{
  cout<<"\t"<<"RICERCA DEGLI ZERI DI UNA FUNZIONE  V.Canale,matr.531/137
\n";    file://titolo
  cout<<"\n";
  double  da, a;
  cout<<"Scrivi il primo estremo dell'intervallo di ricerca: ";
  cin>>da;
  cout<<"Scrivi il secondo estremo dell'intervallo di ricerca: ";
  cin>>a;
  int soluzTrovata;
  double x = zeroIterativa(f, da, a, soluzTrovata);
  if ( soluzTrovata == 0)     // se qui scrivo soluzTrovata == 1 funziona!
     cout<<"Non ci sono zeri nell'intervallo descritto.\n";
  else
     cout<<"Uno zero della funzione e' in x= "<< x;
  cout<<"\n";
 system("PAUSE");
}
double f(double x)    file://calcolo della f(x)
{
 double y = -(x*x) + 4;
 return y;
}
double zeroIterativa(double f(double), double a, double b, int &soluz,
double eps=1.0e-6)
{
   double m;
   double fa = f(a);
   double fb = f(b);
   soluz= 0;                 file://inizializzata a NON TROVATA
   while ( fabs(b-a) > eps  && soluz ==0 )
      {
      m = (b+a)/2.0;
      double fm = f(m);
      if ( fm*fa > 0.0)    file://se i 2 valori della funzione sono
concordi
        {
        a= m;               file://M diventa il nuovo punto A: si dimezza
l'intervallo di analisi
        fa= fm;
        }
      else
         {
         if ( fm*fa < 0.0)  file://vuol dire che la soluzione è
nell'intervallo
di analisi
            {
            b= m;
            fb= fm;
            }
         else
           soluz=1;   // trovato lo zero nel punto m
         }
      }
   return m;         file://ritorna x=punto medio
}
_______________________________________________________
Rock'n'roller

   cout<<"\t"<<"RICERCA DEGLI ZERI DI UNA FUNZIONE  V.Canale,matr.531/137
Non ho tempo di leggere tutto ma posso dirti che non č consigliable e
soprattutto
NON E' STANDARD definire il main void.
E piů giusto scrivere "int main(void)".
Capě?