Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
профорг поясняет.doc
Скачиваний:
4
Добавлен:
14.08.2019
Размер:
752.13 Кб
Скачать
    1. Программа решения задачи

#include <vcl.h>

#pragma hdrstop

#include <conio.h>

#include <iostream.h>

#include <iomanip.h>

#include <math.h>

#include <windows.h>

#pragma argsused

char* Rus(const char* text);

struct Drob //структура дробь

{ int a,b; //поля структуры - числ. и зн.

};

double sum(double, double);//прототип функции, считающей разницу десят. дробей

Drob sum(Drob, Drob); //прототип ф-и, считающей разницу обычных дробей

int lendr(Drob); //ф-я, считающая размер дроби

void output (Drob, Drob, Drob); //ф-я, осуществляющая вывод об. дробей с учетом их размерности

int main(int argc, char* argv[])

{

int ch;

double d,c;

Drob dr1;

Drob dr2;

cout << Rus ("Для вычитания десятичных дробей введите 1, обычных дробей введите 2: ");

cin >> ch;

if (ch==1)

{

cout << Rus("Введите две десятичные дроби: ");

cin >> d >> c; //вводим исх. числа

cout << endl << d << " - " << c << " = " << sum(d,c); //выводим сумму, вызываем ф-ю

}

if (ch==2)

{

cout << endl << Rus("Введите числитель первой дроби: ");

cin >> dr1.a;

cout << endl << Rus("Введите знаменатель первой дроби: ");

cin >> dr1.b;

cout << endl << Rus("Введите числитель второй дроби: ");

cin >> dr2.a;

cout << endl << Rus("Введите знаменатель второй дроби: ");

cin >> dr2.b;

Drob dr; //создаем дробь, явл-ся разницей

dr=sum(dr1,dr2); //считаем разницу дробей

output (dr1,dr2,dr); //осуществляем вывод дробей

}

getch();

return 0;

}

//функция, вычитающая десятичные дроби

double sum(double d1, double c1)

{

return d1-c1;

}

//функция, вычитающая обычные дроби

Drob sum(Drob dr1, Drob dr2)

{

Drob dr3; //создаем дробь, в которую запишем разницу

if (dr1.b==dr2.b) //если знаменатели равны

{

dr3.a=dr1.a-dr2.a; //вычитаем числители

dr3.b=dr1.b;

}

if (dr1.b!=dr2.b) //если знаменатели не равны

{

dr3.b=dr1.b*dr2.b; //перемножаем знаменатели

dr3.a=dr1.a*dr2.b-dr2.a*dr1.b; //вычитаем числители, приведенные к общ.зн

}

//циклы для сокращения дроби

for (int i=1;i<=dr3.b;i++)

{

if ((dr3.a%i==0)&&(dr3.b%i==0)) //если делится без остатка - делим

{

dr3.a/=i;

dr3.b/=i;

i=1; //возвращаем счетчик, чтобы не пропустить делители

}

}

return dr3;

}

//функция, считающая размер дроби (используется в выводе)

int lendr(Drob dr)

{

int a1=dr.a; //копируем переменные, чтобы не потерять зн-я

int b1=dr.b;

int k=1; //счетчик размерности

if(dr.a>dr.b)

{

for (int i=1;a1/10>0;i++) //если есть остаток от деления на 10

{

k++;

a1/=10; //убираем один разряд

}

}

else

{

for (int i=1;b1/10>0;i++)

{

k++;

b1/=10;

}

}

if (dr.a<0 || dr.b<0) k++; //учитываем знакоместо под минус

return k;

}

//Функция, осуществляюшая вывод обычных дробей с учетом их размерности

void output (Drob d1, Drob d2, Drob d3)

{

cout<<setw(lendr(d1))<<d1.a<<" "<<setw(lendr(d2))<<d2.a<<" "<<setw(lendr(d3))<<d3.a<<endl; //первая строка - числители

for (int i=1;i<=lendr(d1);i++)//рисуем дробную черту размером с количеством знаков в дроби

cout<<"-";

cout<<" + "; //в этой же строке - знак +

for (int i=1;i<=lendr(d2);i++)

cout<<"-";

cout<<" = "; //в этой же строке - знак -

for(int i=1;i<=lendr(d3);i++)

cout<<"-";

cout<<endl;

cout<<setw(lendr(d1))<<d1.b<<" "<<setw(lendr(d2))<<d2.b<<" "<<setw(lendr(d3))<<d3.b<<endl; //последняя строка - знаменатели

}

//---------------------------------------------------------------------------

char bufRus[256];

char* Rus(const char* text)

{

CharToOem(text, bufRus);

return bufRus;

}