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