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

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);

}

29