#c #string #calculator #unsigned-integer
#c #строка #калькулятор #целое число без знака
Вопрос:
Итак, недавно я задал вопрос о произвольной конкретной программе целочисленного калькулятора. Он сканирует две строки и должен вычислять их сумму и разность, умножение, деление и модуль. Пока я думаю, что я действительно близок к завершению функций разности сумм и умножения. Вот как выглядит мой код для функции сложения:
void sum(char* a, char* b)
{
//initializing values
int len1,len2,i;
int carry=0;
char *r;
// counting the digits
len1=strlen(a);
len2=strlen(b);
// checking which array is longer
if (len1>=len2)
{
// if first array is longer we allocate enough memory for the result
r=(char*)malloc((len1 1)*sizeof(char));
// starting from the LSB
for (i=0; i<=len2; i)
{ // mod 10 to extract only the last digit of the sum
// that becomes our new digit
*(r len1-i)=(*(a len1-i) *(b len2-i) carry)%10;
carry=(*(a len1-i) *(b len2-i))/10;
}
// copying the rest of the digits
for (i=len2 1; i<=len1; i)
*(r len1-i)=*(a len1-i);
}
//case when the other number has more digits
else
{
r=(char*)malloc((len2 1)*sizeof(char));
for (i=0; i<=len1; i)
{
*(r len2-i)=(*(a len1-i) *(b len2-i) carry)%10;
carry=(*(a len1-i) *(b len2-i))/10;
}
for (i=len1 1; i<=len2; i)
*(r len2-i)=*(b len2-i);
}
// printing the result
printf("The result is: n %s n", r);
}
Проблема в том, что когда я пытаюсь вызвать функцию в main, конечный результат просто выдает ошибки, хотя при компиляции кода ошибок нет. Это может быть проблемой в main, так что вот как выглядит мой main.
int main()
{
FILE *fp;
char *fi=NULL, *se=NULL;
char o;
int i=0;
fp= fopen("/CalculatorHistory.txt", "r ");
opening();
fi=(char*)malloc(60*sizeof(char));
se=(char*)malloc(60*sizeof(char));
while(i<2)
{
first();
scanf("%s", fi);
// I am not sure when im saving pointer arrays, if it works like this
// or i should save it in a for loop
fprintf(fp, fi);
oper();
scanf(" %c", amp;o);
fprintf(fp, o);
second();
scanf("%s", se);
fprintf(fp, se);
switch (o)
{
case ' ':
sum(fi, se);
case '-':
sub(fi, se);
case '*':
mul(fi, se);
case '/':
div(fi, se);
case '%':
mod(fi, se);
}
}
return 0;
}
Я надеюсь, что кто-нибудь сможет мне помочь. Я довольно растерян и все еще новичок в программировании на языке си.
Комментарии:
1. Не связано, но я вполне убежден, что нотация индексации массива является более чистой и более читаемой, чем арифметика указателей / разыменование.
2. Записывать тело кода добавления дважды — не очень хорошая идея. Вы можете определить более длинные и более короткие строки и настроить указатели в соответствии с одним циклом, который сканирует информацию. Вы могли бы использовать
char *lhs, *rhs
и установитьlhs
, чтобы указывать на более длинную строку иrhs
указывать на более короткую (или наоборот), а затем выполнять вычисления в терминах этих переменных. Неясно, завершаете ли вы свою результирующую строку нулем.3. Возможно, вас заинтересуют другие способы решения вашей проблемы, например nongnu.org/bnf
4. или немного более сложное использование flex bison: oreilly.com/library/view/flex-bison/9780596805418/ch01.html … это говорит о том, что оба они используют настольный калькулятор в качестве примера «привет, мир».