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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Соединить четыре программы 
:(
    Опции темы
vnaumenko
Дата 25.11.2012, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пишу калькулятор больших чисел. (+, -, /, *).
Все эти действия уже написаны и работают, вот только надо создать единую программу.
Создать типа менюшки, для выбора действия. Можно через CASE, как вам удобно.

Сложение:
Код
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void vvod(char *ar, int  &n);
void nol(char *ar, int &m, int n);
void slogenie(char a[], int &n, char b[], int m);

int main() 
{
    char a[1000],b[1000];
    int i,na,nb;
    
    printf("‘«®¦Ґ*ЁҐ\n\n");
    // Инициализация
    vvod(a, na);
    vvod(b, nb);
    // Сложение
    slogenie(a,na,b,nb);
    // Вывод ответа
    printf("ЋвўҐв: ");
    for(i=0; i<na; i++)
      printf("%d",a[i]);
    // Пауза
    printf("\n\n");
    system("PAUSE");
    
    return 0;
}
// Ввод данных
void vvod(char *ar, int  &n)
{
    int i=0;
    
    printf("‚ўҐ¤ЁвҐ зЁб«®: ");
    ar[i]=getchar();
    while(ar[i]!='\n') {
      ar[i]-=48;
    i++;
      ar[i]=getchar();    
      }
    n=i;
    printf("\n");
}
// Дополняем нулями
void nol(char *ar, int &m, int n)
{
      int i,j;
    
    for(i=0; i<n-m; i++)
        for(j=n-1; j>0; j--)
        ar[j]=ar[j-1];
    for(i=0; i<n-m; i++)
      ar[i]=0;    
    m=n;    
}
// Слоежение
void slogenie(char a[], int &n, char b[], int m)
{
    char c[1000];
    int i,j,l,o;
    
    // Дополняем нулями
    if(n>m) nol(b,m,n);
    else if(n<m) nol(a,n,m);
    // Обнуляем резултат
    for(i=0; i<n+1; i++)
      c[i]=0;
    // Сложение
    o=0; l=0;
    for(j=n; j>0; j--) {
       c[j]+=(a[j-1] + b[j-1] + o)%10;
     if(c[j]>9) {
       l=1;
       c[j]=c[j]%10;
       }
       o=(a[j-1] + b[j-1] + o)/10+l;        
     if(j==1) c[0]+=o;
     l=0;
     }
    // Избавляемся от ведущих нулей
    while(c[0]==0) {
      for(j=0; j<n; j++)
        c[j]=c[j+1];
      if(n!=0) n--; else break;
      }
    while(b[0]==0) {
      for(j=0; j<m-1; j++)
        b[j]=b[j+1];
      if(m!=1) m--; else break;
      }
    n++;
    // Вывод результата
    for(i=0; i<n; i++)
      a[i] = c[i];
}


Вычитание:
Код
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void vvod(char *ar, int  &n);
void nol(char *ar, int &m, int n);
void vichitanie(char a[], int &n, char b[], int &m);

int main() 
{
    char a[1000],b[1000];
    int i,na,nb;
    
    printf("‚лзЁв**ЁҐ\n\n");
    // Инициализация
    vvod(a, na);
    vvod(b, nb);
    // Вычитание
    vichitanie(a,na,b,nb);
    // Вывод ответа
    printf("ЋвўҐв: ");
    for(i=0; i<na; i++)
      printf("%d",a[i]);
    // Пауза
    printf("\n\n");
    system("PAUSE");
        
    return 0;
}
// Ввод данных
void vvod(char *ar, int  &n)
{
    int i=0;
    
    printf("‚ўҐ¤ЁвҐ зЁб«®: ");
    ar[i]=getchar();
    while(ar[i]!='\n') {
    ar[i]-=48;
    i++;
    ar[i]=getchar();    
    }
    n=i;
    printf("\n");
}
// Дополняем нулями
void nol(char *ar, int &m, int n)
{
    int i,j;
    
    for(i=0; i<n-m; i++)
    for(j=n-1; j>0; j--) ar[j]=ar[j-1];
    
    for(i=0; i<n-m; i++) ar[i]=0;
    
    m=n;    
}
// Вычитание
void vichitanie(char a[], int &n, char b[], int &m)
{
    char c[1000];
    int i,j,o;
    
    //Дополняем нулями
    if(n>m) nol(b,m,n);
    else if(n<m) nol(a,n,m);
    //Обнуляем резултат
    for(i=0; i<n; i++)
      c[i]=0;
    //Вычитание
    o=0;
    for(j=n-1; j>=0; j--) {
      c[j] += a[j] - b[j] + o;
        o=0;
      if(c[j]<0) {
        o=-1;
        c[j]=10 + c[j];
        }
      }
    //Избавляемся от ведущих нулей
    while(c[0]==0) {
      for(j=0; j<n-1; j++)
        c[j]=c[j+1];
      if(n!=1) n--; else break;
      }
    while(b[0]==0) {
      for(j=0; j<m-1; j++)
        b[j]=b[j+1];
      if(m!=1) m--; else break;
      }
    //Вывод результата
    for(i=0; i<n; i++)
      a[i] = c[i];
}


Умножение:
Код
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void vvod(char *ar, int &n);
void umnogenie(char a[], int &n, char b[], int m);

int main() 
{
    char a[1000],b[1000];
    int i,na,nb;
    
    printf("“¬*®¦Ґ*ЁҐ\n\n");
    // Инициализация
    vvod(a, na);
    vvod(b, nb);
    // Сложение
    umnogenie(a,na,b,nb);
    // Вывод ответа
    printf("ЋвўҐв: ");
    for(i=0; i<na; i++)
      printf("%d",a[i]);
    // Пауза
    printf("\n\n");
    system("PAUSE");
    
    return 0;
}
//Ввод данных
void vvod(char *ar, int  &n)
{
    int i=0;
    
    printf("‚ўҐ¤ЁвҐ зЁб«®: ");
    ar[i]=getchar();
    while(ar[i]!='\n') {
    ar[i]-=48;
    i++;
    ar[i]=getchar();    
    }
    n=i;
    printf("\n");
}
// Умножение
void umnogenie(char a[], int &n, char b[], int m)
{
    char c[1000];
    int i,j,l,o;
    
    //Обнуляем резултат
    for(i=0; i<n+m; i++)
      c[i]=0;
    //Умножение
    for(i=0; i<m; i++) {
    o=0; l=0;
    for(j=n-1; j>=0; j--) {
        c[j+m-i]+=(a[j]*b[m-1-i] + o)%10;
      if(c[j+m-i]>9) {
        l=c[j+m-i]/10;
        c[j+m-i]=c[j+m-i]%10;
        }
      o=(a[j]*b[m-i-1] + o)/10+l;        
      if(j==0) c[j+m-1-i]+=o;
      l=0;
      }
    }
    //Избавляемся от ведущих нулей
    n=n+m;
    while(c[0]==0) {
      for(j=0; j<n-1; j++)
        c[j]=c[j+1];
      if(n!=1) n--; else break;
      }
    //Вывод результата
    for(i=0; i<n; i++)
      a[i] = c[i];
}


Деление:
Код
#include <stdio.h>
#include <stdlib.h>

void vvod(char *ar, int &n);
bool bolshe(char a[], int na, char b[], int nb);
bool ravno(char a[], int na, char b[], int nb);
void pervl(char a[], int na, char b[], int nb, char l[], int &nl);
void nol(char *ar, int &m, int n);
void vichitanie(char a[], int &n, char b[], int &m);

int main()
{
    char
    a[1000], // Делимое
    b[1000], // Делитель
    c[1000], // Частное
    m[1000], // Вычитаемое
    l[1000]; // Остаток
    int
    na,nb,nc,nm,nl; // Число цифр
    int i,j,start;
    
    printf("„Ґ«Ґ*ЁҐ\n\n");
    // Инициализация
    vvod(a,na);
    printf("/\n\n");
    vvod(b,nb);
    nc = 0;
    c[0] = 0;  // В случае деления на большее число
    // Первая цифра
    pervl(a,na,b,nb,l,nl);
    for (i=0; i<nb; i++)
      m[i] = b[i];
    nm = nb;
    start = nl;
    if (!(ravno(l,nl,a,na) && bolshe(b,nb,a,na))) {
      for (i=0; bolshe(l,nl,m,nm) || ravno(l,nl,m,nm); i++)
        vichitanie(l,nl,m,nm);
      c[nc] = i;
      }
    nc++;
    // Следуущие цифры
    for (i=start; i<na; i++) {
      l[nl] = a[i]; nl++;
      while(l[0]==0) {
        for(j=0; j<nl-1; j++)
        l[j]=l[j+1];
        if(nl!=1) nl--; else break;
        }
      for (j=0; bolshe(l,nl,m,nm) || ravno(l,nl,m,nm); j++)
      vichitanie(l,nl,m,nm);
      c[nc] = j; nc++;
      }
    // Ответ
    printf("ЋвўҐв: ");
    for (i=0; i<nc; i++)
      printf("%d",c[i]);
    printf("\n");
    printf("Ћбв*в®Є: ");
    for (i=0; i<nl; i++)
      printf("%d",l[i]);
    // Пауза
    printf("\n\n");
    system("PAUSE");
    
    return 0;
}
// ----------------------------------------------------------------------------
//Ввод данных
void vvod(char *ar, int  &n)
{
    int i=0;
    
    printf("‚ўҐ¤ЁвҐ зЁб«®: ");
    ar[i]=getchar();
    while(ar[i]!='\n') {
      ar[i]-=48;
      i++;
      ar[i]=getchar();
      }
    n=i;
    printf("\n");
}
// Больше
bool bolshe(char a[], int na, char b[], int nb)
{
    int i;
    
    if (na>nb) return true;
    else if (nb>na) return false;
    else
      for (i=0; i<na; i++)
      if (a[i]>b[i]) return true;
      else if (b[i]>a[i]) return false;
    
    return false;
}
// Равно
bool ravno(char a[], int na, char b[], int nb)
{
    int i;
    
    if (na!=nb) return false;
    else
      for (i=0; i<na; i++)
      if (a[i]!=b[i]) return false;
    
    return true;
}
// Первое вычитаемое
void pervl(char a[], int na, char b[], int nb, char l[], int &nl)
{
    int i;
    
    if (bolshe(b,nb,a,na)) {
       for (i=0; i<na; i++)
         l[i] = a[i];
       nl = na;
      } else {
    for (i=0; i<nb; i++) 
      l[i] = a[i];
    nl = nb;
    if (bolshe(b,nb,l,nl)) {
      l[nl] = a[nl];
      nl++;
      }
    }
}
// Дополняем нулями
void nol(char *ar, int &m, int n)
{
    int i,j;
    
    for(i=0; i<n-m; i++)
      for(j=n-1; j>0; j--)
        ar[j]=ar[j-1];
    
    for(i=0; i<n-m; i++)
      ar[i]=0;
    
    m=n;    
}
// Вычитание
void vichitanie(char a[], int &n, char b[], int &m)
{
    char c[1000];
    int i,j,o;
    
    //Дополняем нулями
    if(n>m) nol(b,m,n);
    else if(n<m) nol(a,n,m);
    //Обнуляем резултат
    for(i=0; i<n; i++)
      c[i]=0;
   //Вычитание
    o=0;
    for(j=n-1; j>=0; j--) {
      c[j] += a[j] - b[j] + o;
        o=0;
      if(c[j]<0) {
        o=-1;
        c[j]=10 + c[j];
        }
      }
    //Избавляемся от ведущих нулей
    while(c[0]==0) {
      for(j=0; j<n-1; j++)
        c[j]=c[j+1];
      if(n!=1) n--; else break;
      }
    while(b[0]==0) {
      for(j=0; j<m-1; j++)
        b[j]=b[j+1];
      if(m!=1) m--; else break;
      }
    //Вывод результата
    for(i=0; i<n; i++)
      a[i] = c[i];
}

PM MAIL   Вверх
Dem_max
Дата 25.11.2012, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



а что размер int64 уже маловат стал ??


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Arantir
Дата 25.11.2012, 18:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


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

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



Dem_max,
1000! = ?

Добавлено @ 18:37
Цитата(vnaumenko @  25.11.2012,  16:53 Найти цитируемый пост)
как вам удобно.

Оригинально =) Готовый код вам тут вряд ли кто-то напишет. 
А в чем проблема объединения? У вас все 4 проги как по шаблону писаны. Функция ввода вообще одинаковая. Переименуйте main() в каждой проге в что-то типа start_umnogenie(), start_plus() и т.д. и засуньте все методы и переменные из четырех эту в одну новую прогу и в этой проге в main() запсукайте свои start_<действие>() в соответствии с выбранной математической операцией.

Это сообщение отредактировал(а) Arantir - 25.11.2012, 18:38


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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