Műveletek nagy decimális számokkal
Hello! Nekem is a nagy decimális számokkal való műveletvégzés a problémám c-ben!
A program le is fordul Linux alatt GCC-vel, de nem tudom rendesen lefuttatni!
Itt a teljes forráskód is, meg 1-1 példa input, output!
Ha tudtok valami megoldást akkor légyszi segítsetek! nagyon fontos lenne! Még csak most kezdtem programozással foglalkozni és nem nagyon vágom a témát! Előre is köszi!
Péda input:
123456789123456789123456789
-
+123456789123456789123456780
-
-99999999999999999999
+
2
=
példa output:
100000000000000000010
Kód:
#include <string.h>
#include <stdio.h>
#include <math.h>
int main ()
{
char s1[255],s2[255],muv[1],elo[1];
FILE *inp,*out;
int i,c,a,b;
inp=fopen("be.txt","r"); /*A be.txt file megnyitása olvasásra */
out=fopen("ki.txt","w"); /*A ki.txt file megnyitása írásra */
if (inp==NULL)
{
fprintf(stderr,"be.txt nem létezik!\n"); getchar(); /*Amennyiben be.txt nem létezik, hibaüzenetet küld a stderr-re (képernyő) */
}
else
{
fscanf(inp,"%s\n",&s1); /*Első decimális szám beolvasása */
fscanf(inp,"%s\n",&muv); /*Első műveleti jel beolvasása */
a=strlen(s1); /*Első decimális szám hosszának meghatározása */
/*Előjelek vizsgálata*/
if ((s1[0] >='0' && s1[0]<='9') || (s1[0]=='+')) /*Amennyiben a szám elő karaktere 0 és 9 közé esik, vagy a + jel, a szám pozitív,
egyéb esetekben negatív */
{
elo[0]='+';
}
else
{
if (s1[0]=='-')
{
elo[0]='-';
s1[0]='0'; /*Amennyiben az első karakter a - jel volt, azt 0-ra változtatjuk */
}
}
}
while (muv[0]!='=') /*Addig ismétlődik a ciklus, amíg nem az = jelet kapjuk az inputról */
{
fscanf(inp,"%s\n",&s2); /*A következő decimális számjegy beolvasása */
b=strlen(s2); /*A decimális számjegy hosszának meghatározása */
/*Előjelek vizsgálata*/
if ((s2[0]>='0' && s2[0]<='9') || (s2[0]=='+'))
{
elo[0]='+';
}
else
{;
if (s2[0]=='-')
{
elo[0]='-';
s2[0]='0'; /*Amennyiben az első karakter a - jel volt, azt 0-ra változtatjuk */
}
}
/*Összeadási művelet leírása*/
if ((muv[0]=='+' && elo[0]=='+') || (muv[0]=='-' && elo[0]=='-')) /*Minden olyan esetben összeadást végzünk, amikor az előjel és a
műveleti jel megegyezik */
{
for (i=0; (i=a)||(i=b); i++)
{
s1[a-i]=s1[a-i]+s2[b-i]+c; /*A számok helyiértékes összeadása, kezdve az egyes helyiértéktől egészen a rövidebb szám legfelső
helyiértékéig. Amenniyben két szám összege nagyobb mint 9, úgy a c változót 1-re állítjuk és hozzadjuk a következő számpárhoz */
if ((s1[a-i]+s2[b-i])+c>9)
{
c=1;
}
else
c=0;
}
}
/*kivonási művelet leírása*/
if ((muv[0]=='+' && elo[0]=='-') || (muv[0]=='-' && elo[0]=='+')) /*Minden olyan esetben kivonást végzünk, amikor az előjel és műveleti
jel letérnek egymástól */
{
for (i=0;(i=a)||(i=b);i++)
{
if (s1[i]<s2[i])
{
s1[a-i]=s1[a-i]+10-s2[b-i];
s2[b-i-1]++;
}
else
s1[a-i]=s1[a-i]-s2[b-i];
}
}
fscanf(inp,"%s\n",&muv); /*A következő műveleti jel beolvasása */
}
for (i=0; i=255; i++) /*Kiírja a karakterekat az outputra egyenként egymás után*/
{
fprintf(out,"%c",s1[i]);
}
fflush(inp); /*Memória felszabadítása és fájlok lezárása */
fflush(out);
fclose(inp);
fclose(out);
}