Newsgroup: it.comp.lang.c++
Titolo: Sarà una cretinata, ma... (modularità)

Salve a tutti, sono un neofita del C++ (ci giocherello da 2 giorni),
ma vorrei imparare ad utilizzarlo in maniera decente.
Ecco il mio problema, ho scritto un programmino banale per fare
in modo che, quando estraggo la radice di un numero, se il numero
è divisibile per 4, esce il 2 fuori dalla radice.
Il programmino sembra funzionare, così ho provato a farlo in modo che
ci sia una funzione che mi dice quante volte il numero è divisibile per 4...
E qui i casini. Output incomprensibili. Vi posto i listati (sono circa 2,5 k in
totale). Per favore ditemi cosa c'è che non va e, mentre ci siete, anche un
consiglio per migliorare quello che ho scritto! ;)
Grazie in anticipo.
rad2.cpp
-*-
#include <iostream.h>
#include <math.h>
void main()
{
  int n;
  cout << "Inserire il numero di cui devo estrarre la radice: "; cin >> n;
  cout << "La radice e` uguale a: ";
  int radice;              //Controllo dei quadrati perfetti
  double radice2;
  radice = sqrt(n);
  radice2 = sqrt(n);
  if(radice==radice2) {
      cout << radice;
      return 0;
  }
  double div4_1 = n;    //Controllo divisibilità di n per 4
  int div4_2 = n;
  div4_1 /= 4;
  div4_2 /= 4;
  if(div4_1!=div4_2)  {
      cout << sqrt(n);
      return 0;
  }
  int n_divisioni_4 = 0;
  while(div4_1==div4_2) {
      n_divisioni_4++;
      div4_1 /= 4;
      div4_2 /= 4;
  }
  double res = div4_1 * 4;
  if(res==1)  {
      cout << n_divisioni_4 * 2;
      return 0;
  }
  int res1;
  double res2;
  res1 = sqrt(res);
  res2 = sqrt(res);
  if(res1==res2) {
      cout << n_divisioni_4 * 2 << " * " << res1;
      return 0;
  }
  cout << n_divisioni_4 * 2 << " * radice di " << res;
  return 0;
}
-*-
rad2_modulare.cpp
-*-
#include <iostream.h>
#include <math.h>
int esci_2(int);
void main()
{
  int n;
  cout << "Inserire il numero di cui devo estrarre la radice: "; cin >> n;
  cout << "La radice e` uguale a: ";
  int radice;                      //Controllo dei quadrati perfetti
  double radice2;
  radice = sqrt(n);
  radice2 = sqrt(n);
  if(radice==radice2) {
      cout << radice;
      return 0;
  }
  int n_divisioni_4 = esci_2(n);   //Divisibilità per 4
  if(n_divisioni_4==0) {
      cout << radice;
      return 0;
  }
  else {
    double res = n / (4 * n_divisioni_4);
    if(res==1)  {
        cout << n_divisioni_4 * 2;
        return 0;
    }
    int res1;
    double res2;
    res1 = sqrt(res);
    res2 = sqrt(res);
    if(res1==res2) {
        cout << n_divisioni_4 * 2 << " * " << res1;
        return 0;
    }
    cout << n_divisioni_4 * 2 << " * radice di " << res;
    return 0;
  }
}
int esci_2(int m) {             //Controllo divisibilità m per 4
  int divisioni_4;
  double div4_1 = m;
  int div4_2 = m;
  div4_1 /= 4;
  div4_2 /= 4;
  if(div4_1!=div4_2)  {          //Se non divisibile, ritorna 0
      return 0;
  }
  while(div4_1==div4_2) {        //Quante volte è divisibile per 4?
      divisioni_4++;
      div4_1 /= 4;
      div4_2 /= 4;
  }
  return divisioni_4;            //Ritorno numero delle divisioni
}
--
Lupin85©
"...surrender your ego, be free, be free..."


per vedere se un intero è divisibile per 4 basta fare
n%4  (calcola il resto della divisione tra n e 4)
se il risultato è zero allora il numero è divisible altrimenti no
Pela

 4... 
anche qui e` molto piu` semplice di quello che hai fatto tu; nota che la 
seguente funzione e` molto generale (funziona con qualunque fattore), ma 
nel caso particolare del fattore 4 avremmo potuto sfruttare la 
rappresentazione binaria per fare una versione ottimizzata.
// restituisce il numero di fattori 'fatt' all'interno del numero 'n'
int num_fact(int n, int fatt)
{       
  int res = 0;
  while( n % fatt == 0 )
    {
      n/=fatt;
      res++;
    }
  return res;
}
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 del necessario; ecco una versione minimale del tuo programma:
Certo che non me la prendo, sono un newbie totale! ^_^
Grazie mille, studio i tuoi esempi e ci lavoro sopra.. ciao! ^^
