Estou precisando ajuda com um código que usamos com clipper para resolver o problema de arredondamento de valores, gostaria de converter o código em c para harbour vejam o código:
Exemplo:
Código: Selecionar todos
FUNCTION MAIN
aa := 0.00
bb := 0.00
continua = .T.
while continua
cls
@ 0,0 say "a" get aa picture "9999999999999999.99"
@ 1,0 say "b" get bb picture "9999999999999999.99"
read
if lastkey()<>27
cls
? "valores:"
? aa, bb
?
? "opera‡oes em clipper:"
? aa+bb
? aa-bb
? aa*bb
? aa/bb
? round(aa/bb,4)
?
? "opera‡oes em c:"
? c_sum(aa, bb)
? c_sub(aa, bb)
? c_mult(aa, bb)
? c_div(aa, bb)
?
? "tecle qualquer tecla para continuar..."
inkey(0)
else
continua = .F.
endif
end
return
Código: Selecionar todos
#include "c:\clipper5\include\extend.api"
#include "c:\c700\include\stdlib.h"
#include "c:\c700\include\string.h"
#include "c:\c700\include\math.h"
#define SOMA 0
#define SUBTRACAO 1
#define MULTIPLICACAO 2
#define DIVISAO 3
#define PRECISAO 20
double par1, par2;
int decimal;
char result[21];
void do_oper(int oper)
{double r1, err;
int dec, sig, aux;
char err_c[PRECISAO+1];
strcpy(err_c, "0.");
aux = decimal;
while(aux != 0)
{strcat(err_c, "0");
aux--;
}
strcat(err_c, "1");
err = atof(err_c);
switch(oper)
{case SOMA:
r1 = par1 + par2;
break;
case SUBTRACAO:
r1 = par1 - par2;
break;
case MULTIPLICACAO:
r1 = (par1 * par2);
break;
case DIVISAO:
r1 = (par1 / par2);
break;
}
if(r1 > 0)
r1 += err;
else
r1 -= err;
strcpy(result, ecvt(r1, PRECISAO, &dec, &sig));
if(dec<1)
{char ret[PRECISAO+1];
if( ((sig!=0)&&(dec<2-PRECISAO)) || ((sig==0)&&(dec<1-PRECISAO)) || (dec<=-(decimal)) )
{strcpy(ret, "0.");
if(decimal>0)
{aux = decimal;
while(aux>0)
{strcat(ret, "0");
aux--;}
}
strcpy(result, ret);
}
else
{strcpy(ret, "0.");
aux = dec;
while(aux<0)
{strcat(ret, "0");
aux++;
}
strncat(ret, result, decimal+dec);
strcpy(result, ret);
if(sig!=0)
{strcpy(ret, "-");
strncat(ret, result, PRECISAO-1);
strcpy(result, ret);
}
}
}
else
{if( ((sig==0)&&(dec>PRECISAO)) || ((sig!=0)&&(dec>PRECISAO-1)) )
{strcpy(result, "*");
aux = PRECISAO-1;
while(aux>0)
{strcat(result, "*");
aux--;
}
}
else
{char ret1[PRECISAO+1], ret2[PRECISAO+1];
strcpy(ret1, "");
strncat(ret1, result, dec);
if((sig==0)&&(dec>(PRECISAO-2)) || ((sig!=0)&&(dec>(PRECISAO-3))))
strcpy(result, ret1);
else
{strcat(ret1, ".");
strcpy(ret2, " ");
strncat(ret2, result, PRECISAO-1);
memmove(ret2, ret1, dec+1);
strcpy(result, "");
strncat(result, ret2, dec+1+decimal);
}
if(sig!=0)
{strcpy(ret1, "-");
strncat(ret1, result, PRECISAO-1);
strcpy(result, ret1);
}
}
}
return;
}
CLIPPER c_sum()
{if(ISCHAR(1))
par1 = atof(_parc(1));
else
par1 = _parnd(1);
if(ISCHAR(2))
par2 = atof(_parc(2));
else
par2 = _parnd(2);
if(PCOUNT == 3)
{decimal = _parni(3);
if(decimal > 10)
decimal = 10;
else if(decimal < 0)
decimal = 0;
}
else
decimal = 2;
do_oper(SOMA);
_retc(result);}
CLIPPER c_sub()
{if(ISCHAR(1))
par1 = atof(_parc(1));
else
par1 = _parnd(1);
if(ISCHAR(2))
par2 = atof(_parc(2));
else
par2 = _parnd(2);
if(PCOUNT == 3)
{decimal = _parni(3);
if(decimal > 10)
decimal = 10;
else if(decimal < 0)
decimal = 0;
}
else
decimal = 2;
do_oper(SUBTRACAO);
_retc(result);}
CLIPPER c_mult()
{if(ISCHAR(1))
par1 = atof(_parc(1));
else
par1 = _parnd(1);
if(ISCHAR(2))
par2 = atof(_parc(2));
else
par2 = _parnd(2);
if(PCOUNT == 3)
{decimal = _parni(3);
if(decimal > 10)
decimal = 10;
else if(decimal < 0)
decimal = 0;
}
else
decimal = 2;
do_oper(MULTIPLICACAO);
_retc(result);}
CLIPPER c_div()
{if(ISCHAR(1))
par1 = atof(_parc(1));
else
par1 = _parnd(1);
if(ISCHAR(2))
par2 = atof(_parc(2));
else
par2 = _parnd(2);
if(par2==0)
{printf("Erro de divisao por zero!");
exit(0);
}
else
{if(PCOUNT == 3)
{decimal = _parni(3);
if(decimal > 10)
decimal = 10;
else if(decimal < 0)
decimal = 0;
}
else
decimal = 2;
do_oper(DIVISAO);
_retc(result);
}
}

