Newsgroup: it.comp.lang.c++
Titolo: programma per numeri in lettere

è possibile realizzare un programma in grado di scrivere in lettere
dei numeri?

 dei numeri?
#include <algorithm>
#include <iostream>
#include <stdexcept>
#include <string>
#include <cstdlib>
std::string lettere(
  unsigned int n
) {
  static const unsigned int lim = 9999;
  static const std::string mille("mille");
  static const std::string mila("mila");
  static const std::string cento("cento");
  static const std::string zero("zero");
  static const std::string decine [] = {
    "", "dieci", "venti", "trenta", "quaranta", "cinquanta",
    "sessanta", "settanta", "ottanta", "novanta" };
  static const std::string unita [] = {
    "", "uno", "due", "tre", "quattro", "cinque",
    "sei", "sette", "otto", "nove" };
  static const std::string undec [] = {
    "dieci", "undici", "dodici", "tredici", "quattordici",
    "quindici", "sedici", "diciassette", "diciotto", "diciannove" };
  static const char vocali [] = { 'a', 'e', 'i', 'o', 'u' };
  static char const * const fine_vocali = vocali + sizeof(vocali);
  std::string risultato;
  if (n > lim) {
    throw std::out_of_range("Numero troppo grosso");
  } else if (!n) {
    return zero;
  } else {
    if (n) {
      unsigned int u = n % 10;
      unsigned int d = (n / 10) % 10;
      unsigned int c = (n / 100) % 10;
      unsigned int m = (n / 1000);
      bool tronca = false;
 
      if (u) {
        risultato = unita[u];
        tronca = std::find(vocali, fine_vocali, risultato[0]) != fine_vocali;
      }
      if (d) {
        if (d == 1) {
          risultato = undec[u];
        } else {
          if (tronca) {
            risultato.insert(0, decine[d], 0, decine[d].size() - 1);
          } else {
            risultato.insert(0, decine[d]);
          }
        }
      }
      if (c) {
        risultato.insert(0, cento);
        if (c > 1) risultato.insert(0, unita[c]);
      }
      if (m) {
        if (m == 1) {
          risultato.insert(0, mille);
        } else {
          risultato.insert(0, mila);
          risultato.insert(0, unita[m]);
        }
      }
    }
  }
  return risultato;
}
int main(
  int argc,
  char * argv []
) {
  while (--argc) {
    // No error checking
    unsigned long n = std::strtoul(*++argv, 0, 0);
    try {
      std::cout << lettere(n) << std::endl;
    } catch (std::exception & e) {
      std::cerr << "*** EXCEPTION *** " << e.what() << '\n';
    }
  }
}
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy              ROT13: 
ybe...@cq.vasa.vg

>    unsigned long n = std::strtoul(*++argv, 0, 0);
questa assegnazione e' sbagliata, poiche strtoul non e' un elemento di std 

 questa assegnazione e' sbagliata, poiche strtoul non e' un elemento
di std
Ti sbagli. Includendo <cstdlib> come ha fatto Maurizio strtoul e'
definita come apparenente al namespace std. Forse hai un compilatore
non conforme...
Ciao,
Nicola

uso il visual c++ enterprise edition, l'ultima versione
e mi da' errore su quell'assegnazione 

 e mi da' errore su quell'assegnazione 
Allora e` un baco suo. Oppure tu hai messo stdlib.h invece di cstdlib
Per scrupolo ho compilato con gcc-4.0 gcc-3.3 e comeau online. per tutti
e` perfetto.
-- 
Adesso quando i medici di turno rifiuteranno di esserti d'aiuto / perchè
venne un polacco ad insegnargli che è più cristiano imporsi col rifiuto
pretenderanno che tu torni indietro/e ti costringeranno a partorire per
poi chiamarlo figlio della colpa / e tu una Maddalena da pentire