Aiuto isolamento cifre

di il
2 risposte

Aiuto isolamento cifre

Salve a tutti
sto facendo una funzione che calcola la potenza di un numero introducendo sia la base che l'esponente
e poi me la stampa in questo formato :
1.234.567
la procedura funzionerà anche con numeri negativi o con esponenti negativi.
per quanto riguarda la funzione della potenza funziona tranquillamente.
il problema stà nella funzione di cifratura ed è il seguente :
18^20 = 12748236216396078174437376
arrivo ad isolare le seguenti cifre : 12748236216396
quando la routine mi deve isolare lo 0 e gli altri successivi si blocca.
le parti incriminate sono la parte rossa e quella blu
la parte blu fa bloccare il programma
la correzione che mi serve e che non sò come fare ad isolare le cifre dallo 0 in poi.
// potenza2.cpp : definisce il punto di ingresso dell'applicazione console.
//
#include "stdafx.h"
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
long double potenza(int,int);
int cifra(long double,char);
int _tmain(int argc, _TCHAR* argv[])
   {
     int base,esp,rc;
     long double numero;
     char tasto;
     cout.precision(27);
     cout << "inserisci base : ";
     cin >> base;
     cout << "inserisci esponente : ";
     cin >> esp;
     numero=potenza(base,esp);
     cout << numero << endl;
     if (esp<0) { rc=cifra(numero,' '); }
      else rc=cifra(numero,'z');
     if (rc == 1)
       {
         cout << "errore parametro tipo formato non inserito " << endl;
         cin >> tasto; return 1;
       }
     if (rc == 2)
       {
         cout << "errore parametro numero non inserito " << endl;
         cin >> tasto; return 1;
       }
     if (rc == 3)
       {
         cout << "procedura inutile numero piccolo " << endl;
         cin >> tasto; return 2;
       }
     if (rc == 4)
       {
         cout << "numero troppo grande per la procedura " << endl;
         cin >> tasto; return 2;
       }
     if (rc == 5)
       {
         cout << "errore parametro zeros suppressed " << endl;
         cin >> tasto; return 1;
       }
     return 0;
   }
long double potenza(int base,int esp)
    {
      long double numero;
      int altro;
      if ( base == 1) { return base; }
      if ( base == 0) { return base; }
      if ( esp == 0) { return 1; } 
      if ( esp == 1) { return base; }
      numero = base; altro = esp-1;
      if (esp < 0) { altro=esp * (-1);}
      for (int indy=1; indy <= altro;indy++)
         { numero = numero * base; }
      if (esp < 0) { numero = ( 1 / numero); } 
      return numero;
    }
int cifra(long double numero,char tipo)
   {
     long double cifra2;
     double n;
     double sottrai[27];
     int ccifra[27];
     char stringa2[38];
     char como;
     int indy, kindy, pindy, windy, senno, ncifre, tonno, vl, trofeo;
     cifra2 = numero; ncifre = 0; vl = 3; senno = 0; n=1;
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³  inizializzazione vettore e calcolo delle cifre. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ 
     sottrai[0]=0;
     cout << "*------------------------------------------------*" << endl;
     cout << "!             TABELLA VALORI DA SOTTRARRE        !" << endl;
     cout << "*------------------------------------------------*" << endl;
     cout << "* ELE *                  VALORE                  *" << endl;
     cout << "*------------------------------------------------*" << endl;
     cout << "* 0   * 0                                        *" << endl;
     cout << "*------------------------------------------------*" << endl;
     for (indy=1;indy<27;indy++)
        {
          n = n * 10;
          cout << "* " << indy << "   * " << n << " *" << endl,
          cout << "*------------------------------------------------*" << endl;
          sottrai[indy]=n;
        }
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ vede quante cifre ha il numero. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
     indy=26; 
     while (ncifre == 0)
          {
            if (cifra2 >= sottrai[indy]) { ncifre = indy; }
            indy--;
          }
     cout << "n cifre = " << ncifre;
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ controllo parametri ingresso. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
     if (tipo == ' ') { vl=0; }
     if (tipo == '$') { vl=1; }
     if (tipo == 'Z') { vl=2; }
     if (tipo == 'z') { vl=2; }
     if (vl == 3) { return 1; }
     if (cifra2 < 0 ) { senno = 1; }
     if (ncifre < 3 && vl==1)
       {
         cout << "vl = " << vl << " ncifre = " << ncifre << endl;
         return 3;
       }
     if (ncifre < 4 && vl==0)
       {
         cout << "vl = " << vl << " ncifre = " << ncifre << endl;
         return 3;
       }
     if (ncifre < 4 && vl==2)
       {
         cout << "vl = " << vl << " ncifre = " << ncifre << endl;
         return 3;
       }
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³  inizializzazione dei vettori del programma. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
     trofeo=48;
     stringa2[37]='\0';
     for (windy=0;windy < 37;windy++)
        { stringa2[windy]=trofeo; }
     for (windy=0;windy < 27;windy++)
        { ccifra[windy]=0; }
     cout << " numero da scorporare = " << numero << endl;
     cout << " primo numero da sottrarre = " << sottrai[ncifre] << endl;
     cin >> como;
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³  PRELEVA LE CIFRE. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
     pindy = 0; kindy= ncifre; windy = 0; trofeo = 0;tonno = 1;
     while ( pindy < ncifre)
          {
            cifra2 = cifra2 - sottrai[kindy];
            trofeo++;
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³  correzione delle cifre arrotondate per difetto. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
            switch (kindy)
                  {
                    case 26:
                            { 
                              cifra2 = cifra2 - 12000000000; 
                              break;
                            }
                    case 25:
                            { 
                              cifra2 = cifra2 - 1200000000; 
                              break;
                            }
                    case 24:
                            {
                              cifra2 = cifra2 - 20000000;
                              break;
                            }
                    case 23:
                            {
                              cifra2 = cifra2 - 8000000;
                              break;
                            }
                    default:
                            { break; }
                  }
if (cifra2 < 0)
              {
                ccifra[windy]=0;
                kindy--; pindy++;
                cout << "numero = " << cifra2 << "-" << endl;
                cout << "n      = " << sottrai[kindy] << endl;
                cout << "======== " << cifra2 << endl;
                cin >> como;
                windy++;
              }
 if (cifra2 < sottrai[kindy])
              {
                ccifra[windy]=trofeo;
                cout << "numero = " << cifra2 << '\t' << " cifra esportata = ";
                cout << ccifra[windy] << endl;
                pindy++; kindy--;windy++;
                trofeo=0;
              }
          }
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³  preleva l'ultima cifra.  ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
     trofeo=0;
     for (windy =1;windy <= cifra2;windy++)
        { trofeo++; }
     ccifra[ncifre]=trofeo;
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-¿
//³  completiamo la visualizzazione.  ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-Ù
     tonno = 0;pindy = ncifre;windy = 36; trofeo = 1;
     while ( pindy >= 0)
          {
            if (tonno == 2 && vl == 1 && trofeo == 1)
              { 
                stringa2[windy] = ','; windy--;
                tonno = 0; trofeo = 0; 
              }
            if (tonno == 3)
              {
                stringa2[windy] = '.'; windy--; tonno = 0;
              }
            stringa2[windy] = stringa2[windy] + ccifra[pindy];
            pindy--; windy--; tonno++;
          }
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³  eventuale azione di "zeros suppressed" e segno del numero. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
     if (vl == 2)
       {
         windy=0;
         while (stringa2[windy] == '0')
              {
                stringa2[windy]= ' ';
                windy++;
              }
       }
     windy--; stringa2[windy]='+';
     if (senno == 1)
       { stringa2[windy]='-'; }
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³  visualizza la cifra nel modo giusto.  ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
     cout << stringa2 << endl;
     return 0;
   }
il codice e stato scritto con visual c++
quando la provate provatela con 18^20 o con numeri simili.
ringrazio chiunque mi dia una mano o ci provi

Edit skynet : inserimento tag code

2 Risposte

  • Re: Aiuto isolamento cifre

    Ciao ^^,

    non sono dello staff, cmq per piacere potresti incollare il codice tra i tag code e /code? quindi potresti modificare il post così che sia più facile la lettura ? grazie ^^


    Regolamento: http://www.iprogrammatori.it/forum-programmazione/announces/regolamento-del-forum-leggere-prima-scrivere-t6454.html


    Distinti Saluti,
    Alessandro
  • Re: Aiuto isolamento cifre

    Vi scorporo la parte del codice che non funziona correttamente
    per dettagli sulla definizione variabili etc etc vederi il primo messaggio (codice completo)
    //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
    //³  PRELEVA LE CIFRE. ³
    //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
         pindy = 0; kindy= ncifre; windy = 0; trofeo = 0;tonno = 1;
         while ( pindy < ncifre)
              {
                cifra2 = cifra2 - sottrai[kindy];
                trofeo++;
    //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
    //³  correzione delle cifre arrotondate per difetto. ³
    //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
                switch (kindy)
                      {
                        case 26:
                                {
                                  cifra2 = cifra2 - 12000000000;
                                  break;
                                }
                        case 25:
                                {
                                  cifra2 = cifra2 - 1200000000;
                                  break;
                                }
                        case 24:
                                {
                                  cifra2 = cifra2 - 20000000;
                                  break;
                                }
                        case 23:
                                {
                                  cifra2 = cifra2 - 8000000;
                                  break;
                                }
                        default:
                                { break; }
                      }
                if (cifra2 < 0) // qui il programma si blocca
                  {
                    ccifra[windy]=0;
                    kindy--; pindy++;
                    cout << "numero = " << cifra2 << "-" << endl;
                    cout << "n      = " << sottrai[kindy] << endl;
                    cout << "======== " << cifra2 << endl;
                    cin >> como;
                    windy++;
                  }
                if (cifra2 < sottrai[kindy])
                  {
                    ccifra[windy]=trofeo;
                    cout << "numero = " << cifra2 << '\t' << " cifra esportata = ";
                    cout << ccifra[windy] << endl;
                    pindy++; kindy--;windy++;
                    trofeo=0;
                  }
              }
    //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
    //³  preleva l'ultima cifra.  ³
    //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
         trofeo=0;
         for (windy =1;windy <= cifra2;windy++)
            { trofeo++; }
         ccifra[ncifre]=trofeo;
Devi accedere o registrarti per scrivere nel forum
2 risposte