Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> умножение дробных чисел, в длинной арифметике 
V
    Опции темы
Samuele
Дата 30.5.2011, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 11.11.2010

Репутация: нет
Всего: нет



умножение длинных чисел столбиком.
иногда считает правильно, иногда запарывается даже на легком, например 19,2*4,1 выдает верный ответ, а 19,2*2,1 не верный. помогите найти ошибку.

функция main
Код

#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
#include <conio.h>


char a[60]={0};
char A[60]={0};
char B[60]={0};
char C[60]={0};
#define N 60
//---------------------------------------------------------------------------
//функция сложения двух операндов
void vizov_summa(void);
int summa(void);
//функция вычитания одного операнда из другого
void vizov_raznost (void);
int raznost (void);
//функция умножения двух операндов
void vizov_umnzh();
int umnzh();

//функция проверки выбора меню
int vibor_menu(void);
//функция проверки ввода данных
void vvod_perem (void);
//---------------------------------------------------------------------------

void main(void)
{
int menu=1;

cout<<"Vibirite deistvie :"<<endl;
cout<<"1: Slozhenie"<<endl;
cout<<"2: Vichitanie"<<endl;
cout<<"3: Umnozhenie"<<endl;
cout<<"4: Delenie"<<endl;
cout<<"5: Vichislenie cosinusa"<<endl;
cout<<"6: Vichislenie sinusa"<<endl;
cout<<"7: Vichislenie tangensa"<<endl;
cout<<"8: Vichislenie kvadratnogo kornya"<<endl;
cout<<"0: Vihod"<<endl;

while (menu!=0)
    {
    cout<<endl<<"Vibirite deistvie :";
    menu=vibor_menu();
    switch ( menu )
        {
        case 1: vizov_summa(); break;
        case 2: vizov_raznost(); break;
        case 3: vizov_umnzh(); break; /*
        case 4: vizov_deln(); break;
        case 5: vizov_cosn(); break;
        case 6: vizov_sins(); break;
        case 7: vizov_tang(); break;
        case 8: vizov_korn(); break;*/
        }

    }


cout<<"dlya zakritiya programmi nazhmite lyubuyu klavishu..."<<endl;
getch();
}


функция вызова умножения из main
Код

void vizov_umnzh()
{
    int razm=0, i;

    cout<<"Vvidite A=";
    vvod_perem();
    for (i = 0; i < N; i++) {
        A[i]=a[i];
    }
    cout<<"Vvidite B=";
    vvod_perem();
    for (i = 0; i < N; i++) {
        B[i]=a[i];
    }

    razm=umnzh();

    cout<<"A*B=";
    for (i = 0; i < razm; i++) {
        cout<<C[i];
    }
    cout<<endl;
}


сама функция умножения
Код

int umnzh (void)
{
    bool znak_A=0, znak_B=0, znak_C=0;
    char buff[N]={0};
    char fa=0, sb=0;
    int kol_A=0, kol_B=0, kol_C=0;
    int tochka_A=0, tochka_B=0, tochka_C=0;
    int i=0, j=0, m=0;
    int razr=0, t=0;
    int razm;

    //считаем цифры в каждом числе
    for ( i = 0; i < N; i++)
    {
        if (A[i]==45) {        //убираем знак минуса в начале
            znak_A=1;
            for ( j = 0; j<N-1; j++)
                A[j]=A[j+1];
                A[N-1]=0;
        }
        if (A[i]==46) {
            tochka_A=i;
            for (j=tochka_A; j<N-1; j++) //убираем точку
                A[j]=A[j+1];
                A[N-1]=0;
        }
        if (A[i]>47 && A[i]<58)
            kol_A++;


        if (B[i]==45) {        //убираем знак минуса в начале
            znak_B=1;
            for ( j = 0; j<N-1; j++)
                B[j]=B[j+1];
                B[N-1]=0;
        }
        if (B[i]==46) {
            tochka_B=i;
            for (j=tochka_B; j<N-1; j++) //убираем точку
                B[j]=B[j+1];
                B[N-1]=0;
        }
        if (B[i]>47 && B[i]<58)
            kol_B++;

    }

    //определяем кол-во знаков ПОСЛЕ запятой
    if (tochka_A!=0)
        tochka_A=kol_A-tochka_A;
    if (tochka_B!=0)
        tochka_B=kol_B-tochka_B;

    //определяем знак конечного числа
    if ( (znak_A==0&&znak_B==1) || (znak_A==1&&znak_B==0) )
        znak_C=1;
    if ( (znak_A==1&&znak_B==1) || (znak_A==0&&znak_B==0) )
        znak_C=0;

    //сдвигаем цифры числа А к правому краю массива
    //через дополнительный массив
    for (i = 0; i <= kol_A; i++) {
        buff[N-1-i]=A[kol_A-i-1];
    }
    for (i = 0; i < N; i++) {
        A[i]=0;
    }
    for (i = N-1; i >= N-kol_A; i--){
        A[i]=buff[i];
    }

//обнулим массив buff перед очередным использованием
    for (i = 0; i < N; i++)
        buff[i]=0;

//сдвигаем цифры числа В к правому краю массива
    for (i = 0; i <= kol_B; i++) {
        buff[N-1-i]=B[kol_B-i-1];
    }
    for (i = 0; i < N; i++) {
        B[i]=0;
    }
    for (i = N-1; i >= N-kol_B; i--){
        B[i]=buff[i];
    }


    for(i=0; i<N; i++) {
        buff[i]=0;
        C[i]=0;
    }

    //начинаем умножать
    for (i=N-1; i>=N-kol_B; i--){
        sb=B[i]-48;                    //выбираем множитель из второго числа
        razr=0;
        for (j=N-1; j>=N-kol_A; j--){
            fa=A[j]-48;
            buff[j]=fa*sb+razr; //умножаем каждую цифру первого числа
            razr=0;             //на множитель и переносим разряд
            while (buff[j]>=10){
                buff[j]-=10;    //смотрим переполнение
                razr++;
            }
            //добавляем разряд впереди
            if (j==N-kol_A && razr!=0) {
                t=1;
                buff[N-kol_A-t]=razr;
                razr=0;
            }
        }
        razr=0;
        //накапливаем сумму в итоговый массив
        for (j=N-1; j>=N-kol_A-t; j--) {
            C[j-m]+=buff[j]+razr;
            razr=0;
            if (C[j-m]>=10) {
                C[j-m]-=10;
                razr=1;
            }
            //добавляем разряд если надо
            if (j==N-kol_A && razr!=0) {
                C[j-m-1]=razr;
                razr=0;
            }
        }
        t=0;
        m++;
    }

    //считаем кол-во цифр в конечном числе
    for (i=0; i<N; i++) {
        if (C[i]!=0) kol_C++;
    }

    //возвращаем код чисел по таблице ASCII
    for (j=N-1; j>=N-kol_C; j--)
           C[j]+=48;

    for (i=0; i<N; i++)
        buff[i]=0;
    j=0;
    //сдвигаем массив влево
    for ( i=N-kol_C; i<N; i++) {
        buff[j]=C[i];
        C[i]=0;
        j++;
    }
    for (i=0; i<N; i++)
        C[i]=buff[i];

    //добавляем точку
    tochka_C=kol_C-(tochka_A+tochka_B);
    if (tochka_C!=0) {
        for (i = N-1; i >= tochka_C; i--) {
            C[i]=C[i-1];
        }
        C[tochka_C]=46;
        kol_C++;
    }
    //добавляем минус если надо
    if (znak_C==1) {
        for ( i=N-1; i>0; i--)
            C[i]=C[i-1];
        C[0]=45;
        kol_C++;
    }

    /*
    for (i=0; i<kol_C; i++)
        cout<<"C["<<i<<"]="<<C[i]<<endl;
    */
    razm=kol_C;

    return razm;
}

PM MAIL   Вверх
Vetos
Дата 30.5.2011, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: нет
Всего: 4



Samuele, а функция vvod_perem, а лучше скинь исходный файл, чтоб можно было все проверить smile 



--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
Samuele
Дата 31.5.2011, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 11.11.2010

Репутация: нет
Всего: нет



вот файл. это из проекта из CodeGear RAD 2007.

З.Ы. функции проверки данных я написал уже давно и спокойно их прикреплял к любой программе и все замечательно работало, так вряд ли там есть ошибка.

З.Ы.Ы. ошибка была в неверном подсчете цифр в итоговом числе, т.е во время подсчета пропускались все нули...

Это сообщение отредактировал(а) Samuele - 31.5.2011, 15:00
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0430 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.