
Int step; //степень числа
//запись операции в файл
writeOperInFile(oper, fout);
//заданеие степени числа
step = GetStep(out, str1);
//запись величины степени в файл
writeStepenInFile(str1, fout);
//возведение в степень
d1 = Stepen(d1, step);
//печать ответа
PrintOtvet(d1, out, str1, oper);
//запись ответа в файл
writeOtvetInFile(str1, fout);
return d1;
}
Модуль программы InOut.h
//Модуль определяет интерфейс с пользователем.
//Функции для ввода строк и вывода строк на экран.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
//--------------------------------------------------------------------
//Функция вывода меню в красном цвете.
void menu(HANDLE out)
{
//название консоли
SetConsoleTitle(L"Калькулятор для дробей");
COORD XY; XY.X = 0; XY.Y = 0;
SetConsoleCursorPosition(out,XY);
SetConsoleTextAttribute(out, 12);//цвет алый
printf_s("Выберите операцию \
\n\tарифметические операции: +, -, *, /, \
\n\tвозведение в степень: ^, \
\n\tквадратный корень: &, \
\n\tвыход: клавиша esc \n");
}
//---------------------------------------------------
//Функция вспомогательная проверки вводимой строки
//на цифры (допустимые значения)
int Proverka(char *str)
{
int err = 0;
for(int i=0; str[i] != 0; i++)
{
if(str[i]< 0x30 || str[i] > 0x39)//выделение кодов цифр
{
err = 1;
break;
}
}
return err? -1 : atoi(str);//применение тернарного оператора
}
//--------------------------------------------------------------
//Функция с параметрами по умолчанию для
//ввода строки символов с сообщениями и преобразованием строки
//в целое число.
int InputNum(HANDLE out, char *mes, char *error, int begPoz=0, WORD PozitionNumX=0, WORD PozitionNumY=10)
{
char CharNum [20]; //массив символов при вводе с клавиатуры
int NUM; //число, полученное из массива символов
COORD XY; //координаты для позиционирования
//позиционирование курсора с предварительной очисткой строки
SetConsoleTextAttribute(out, 0);// цвет черный
XY.X = PozitionNumX; XY.Y = PozitionNumY;
SetConsoleCursorPosition(out,XY);
for(int i=begPoz; i<75; i++) _putch(' ');//подготовка строки - очистка
SetConsoleCursorPosition(out,XY);
SetConsoleTextAttribute(out, 15);// цвет текста белый
//вывод сообщения для ввода и сам ввод строки
printf_s(mes); scanf_s("%19s",CharNum,20);
//проверка на допустимое значение с преобразованием
NUM = Proverka(CharNum);
//выдача сообщения об ошибке в фиксированной позиции
if(NUM < 0)
{
SetConsoleTextAttribute(out, 0);//цвет черный
XY.X = 0; XY.Y = 15;
SetConsoleCursorPosition(out,XY);
for(int i=0; i<75; i++) _putch(' ');//очистка строки
XY.X = 0; XY.Y = 15;
SetConsoleCursorPosition(out,XY);
SetConsoleTextAttribute(out, 12);//цвет красный
printf_s(error);
}
else //число правильное, стирание сообщения об ошибке
{
SetConsoleTextAttribute(out, 0);//цвет черный
XY.X = 0; XY.Y = 15;
SetConsoleCursorPosition(out,XY);
for(int i=0; i<75; i++) _putch(' ');//очистка строки
SetConsoleTextAttribute(out, 15);//цвет белый
}
return NUM;
}
//-----------------------------------------------------------------
//Функция формирование дроби из двух целых чисел
drob GetDrob(HANDLE out)
{
char *Messag1 = "Введите числитель дроби-> ";
char *Messag2 = "Введите знаменатель дроби-> ";
char *Messag3 = "Неверный ввод данных!!!";
drob d;
WORD PozChisX = 0, PozZnamX = 40; //позиции для высветки
int NUM = -1; //непреобразованное число
//ввод числителя
while(NUM < 0)
{
NUM = InputNum(out, Messag1, Messag3);
}
d.chis = NUM;
//ввод знаменателя
NUM = -1;
while(NUM < 0)
{
NUM = InputNum(out, Messag2, Messag3, 40, 40);
}
d.znam = NUM;
return d;
}
//-------------------------------------------------------------
//Функция формирования степени целого числа
//с записью в строку для протокола
int GetStep(HANDLE out, char *str1)
{
char *Messag1 = "\tВведите степень дробного числа -> ";
char *Messag2 = "Неверный ввод степени числа!!!";
int NUM = -1; //непреобразованное число - степень
//ввод строки - степени числа и ее преобразование
while(NUM < 0)
{
NUM = InputNum(out, Messag1, Messag2, 0, 0, 12);
}
sprintf_s(str1,80,"%d",NUM); //запись в строку
return NUM;
}
//------------------------------------------------------------------
//Функция вывода ответа.
//Вывод дроби с преобразованием в целую и дробную часть на экран.
//Запись дроби в строку str1 для протокола.
void PrintOtvet(drob d, HANDLE out, char * str1, char oper)
{
SetConsoleTextAttribute(out, 10);//цвет зеленый
COORD XY;
XY.X = 0; XY.Y = 15;
SetConsoleCursorPosition(out,XY);
for(int i=0; i<75; i++) _putch(' ');//очистка строки
XY.X = 0; XY.Y = 15;
SetConsoleCursorPosition(out,XY);
SetConsoleTextAttribute(out, 10);//цвет зеленый
int count=0;//счетчик целого числа
if(d.chis >= d.znam) //если числитель больше знаменателя
{
do{
d.chis = d.chis - d.znam;
count++; //выделение целой части, если числитель больше знаменателя
}while(d.chis >= d.znam);
if(d.chis == 0)sprintf_s(str1,80,"Ответ: (%d )",count); //только целая часть
else sprintf_s(str1,80,"Ответ: (%d %d / %d)",count, d.chis, d.znam); //целая часть и дробная часть
}
else{ //если числитель меньше знаменателя
if(d.chis == 0 && count == 0) sprintf_s(str1,80,"Ответ: (%d )",count);//в ответе 0
else sprintf_s(str1,80,"Ответ: ( %d / %d)",d.chis, d.znam); //правильная дробь
}
printf_s("Операция %c, %s", oper, str1);
SetConsoleTextAttribute(out, 15);//цвет белый
}
//---------------------------------------------------------------
//Функция ввода операции
char GetOper(HANDLE out)
{
COORD XY;
XY.X = 0; XY.Y = 12;
SetConsoleCursorPosition(out,XY);
for(int i=0; i<75; i++) _putch(' ');
XY.X = 0; XY.Y = 12;
SetConsoleCursorPosition(out,XY);
char op;
printf_s("\tВведите операцию-> ");
op = _getch();
_putch( op );
return op;
}
//-------------------------------------------------------------
//Функция вывода сообщения на экран о неправильно введенной операции
void PrintNoOper(char oper, HANDLE out)
{
SetConsoleTextAttribute(out, 0);//цвет черный
COORD XY;
XY.X = 0; XY.Y = 15;
SetConsoleCursorPosition(out,XY);
for(int i=0; i<75; i++) _putch(' ');//очистка строки
XY.X = 0; XY.Y = 15;
SetConsoleCursorPosition(out,XY);
SetConsoleTextAttribute(out, 12);//цвет красный
printf_s("Операции %c не существует !!!", oper);
SetConsoleTextAttribute(out, 15);//восстановление белого цвета текста
}
Модуль программы File.h
//Модуль выполняет файловые операции записи данных (дробей, операций,
//ответов) на диск в текстовый файл "Protokol.txt", расположенний в месте
//нахождения рабочей программы (загрузочного модуля).
#include <stdio.h>
#include <windows.h>
//Функция открытия файла протокола
FILE * OpenFil(HANDLE out)
{
FILE *fout;
fopen_s(&fout,"Protokol.txt","w");
if(fout == NULL)
{
COORD XY; XY.X = 0; XY.Y = 20;
SetConsoleCursorPosition(out,XY);
SetConsoleTextAttribute(out, 12);//цвет алый
printf_s("Файл не создан. Записи протокола на диск не будет!");
}
COORD XY; XY.X = 0; XY.Y = 20;
SetConsoleCursorPosition(out,XY);
SetConsoleTextAttribute(out, 11);//цвет зеленый
printf_s("Файл создан. Осуществляется ЗАПИСЬ протокола на диск. ");
SetConsoleTextAttribute(out, 15);//цвет белый
return fout;
}
//--------------------------------------------------------------
//Функция записи дроби
void writeDrobInFile(int i, int j, FILE *fout)
{
if(fout) fprintf_s(fout,"( %d/%d )", i, j);
}
//---------------------------------------------------------
//Функция записи ответа
void writeOtvetInFile(char *str1, FILE *fout)
{
if(fout) fprintf_s(fout," %s \n",str1);
}
//---------------------------------------------------------
//Функция записи операции
void writeOperInFile(char oper, FILE *fout)
{
if(fout) fprintf_s(fout," %c ",oper);
}
//---------------------------------------------------------
//Функция записи значения степени
void writeStepenInFile(char *str1, FILE *fout)
{
if(fout) fprintf_s(fout," %s ",str1);
}
Модуль программы Drob.h
//Модуль определяет структуру дроби и функции, работающие с дробями.
//Функции расчета не зависят от технологии программирования и не будут меняться.
//Все операции с дробями - операции с целыми числами
//Представление структуры дробь:
// числитель и знаменатель - целые числа.
#pragma once
struct drob
{
int chis; //числитель
int znam; //знаменатель
};
//------------------------------------------------------------
//Функция сокращение дробей - сокращение числителя и знаменателя
//через нахождение НОД. Используется алгоритм Евклида
drob Sokrasenie(drob dr)
{
int a, b;
a = abs(dr.chis); b = abs(dr.znam);
//нахождение НОД
while(a != b)
{
if(a > b) a = a - b;
else b = b - a;
}
//сокращение дробей
dr.chis = dr.chis/a;
dr.znam = dr.znam/a;
return dr;
}
//------------------------------------------------------------
//Функция сложения дробей.
//Используется стандартный математический алгоритм.
drob Slogenie(drob f1, drob f2)
{
f1.chis = f1.chis*f2.znam + f2.chis*f1.znam;
f1.znam = f1.znam*f2.znam;
return Sokrasenie(f1);
}
//------------------------------------------------------------
//Функция вычитания дробей.
//Используется стандартный математический алгоритм.
drob Vy4itenie(drob f1, drob f2)
{
f1.chis = f1.chis*f2.znam - f2.chis*f1.znam;
f1.znam = f1.znam*f2.znam;
return Sokrasenie(f1);
}
//------------------------------------------------------------
//Функция умножения дробей.
//Используется стандартный математический алгоритм.
drob Umnogenie(drob f1, drob f2)
{
f1.chis = f1.chis*f2.chis;
f1.znam = f1.znam*f2.znam;
return Sokrasenie(f1);
}
//------------------------------------------------------------
//Функция деления дробей.
//Используется стандартный математический алгоритм.
drob Delenie(drob f1, drob f2)
{
f1.chis = f1.chis*f2.znam;
f1.znam = f2.chis*f1.znam;
return Sokrasenie(f1);
}
//------------------------------------------------------------
//Функция квадратный корень.
//Используется метод вычитания последовательности нечетных чисел.
drob Koren(drob f1)
{
int kchis=0, kznam=0;
int i=1, j=1;
//работа с числителем
while(f1.chis >= i)
{
f1.chis = f1.chis - i;
kchis++;
i = i+2;
}
//работа со знаменателем
while(f1.znam >= j)
{
f1.znam = f1.znam - j;
kznam++;
j = j+2;
}
//результат
f1.chis = kchis++;
f1.znam = kznam++;
return Sokrasenie(f1);
}
//------------------------------------------------------------
//Функция возведения в целую степень
//используется алгоритм умножения дроби на себя stepen раз
drob Stepen(drob f1, int stepen)
{
int pchis=1, pznam=1;
for(int i =0; i< stepen; i++)
{
pchis = pchis*f1.chis;
pznam = pznam*f1.znam;
}
f1.chis = pchis;
f1.znam = pznam;
return Sokrasenie(f1);
}