Отчёт (Архив готовых лабораторных работ для ИУ)
Описание файла
Файл "Отчёт" внутри архива находится в следующих папках: Архив готовых лабораторных работ для ИУ, 1, отчёты, работа 2. Документ из архива "Архив готовых лабораторных работ для ИУ", который расположен в категории "". Всё это находится в предмете "информатика" из 2 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "информатика" в общих файлах.
Онлайн просмотр документа "Отчёт"
Текст из документа "Отчёт"
Московский государственный технический
университет им. Н.Э. Баумана.
Факультет «Информатика и управление»
Кафедра ИУ5. Курс «Основы информатики»
Отчет по лабораторной работе №2
«Дроби»
Выполнил: | Проверил: | |
студент группы ИУ5-24 | преподаватель каф. ИУ5 | |
Шевченко Роман | Папшев И.С. | |
Подпись и дата: | Подпись и дата: |
г. Москва, 2008 г.
Постановка задачи
Создать класс для работы с обыкновенными дробями. Дроби вводятся как строка. Ввод и вывод дроби имеет следующий вид:
- для дробей с целой частью: знак, целая часть, пробел, числитель, слэш (‘/’), знаменатель.
Например: -2 6/18, 5 9/3, 2 4/1.
- для дробей без целой части: знак, числитель, слеш (‘/’), знаменатель.
Например: 3/4, -9/3, -8/6 (знаменатель всегда положительный).
При выводе и после выполнения арифметических операций дроби сокращаются, то есть числитель и знаменатель не должны иметь общих множителей. Перегрузить операции '+', '+=' для сложения дроби и целого, дроби и double в любых сочетаниях. Для инициализации объектов разрабатываемого класса обыкновенных дробей предусмотреть соответствующие конструкторы.
Для инициализации объектов разрабатываемого класса обыкновенных дробей предусмотреть соответствующие конструкторы (с одним аргументом типа char*, с одним аргументом типа double и с двумя аргументами типа int, которые имеют значения по умолчанию). При перегрузке операций использовать функции - члены класса, а где это невозможно, то функции - друзья класса.
Разработка интерфейса класса.
Интерфейс класса содержит следующие методы:
protected:
int chisl, znam; //Числитель и знаменатель
public:
friend int perevod(int &chisl, int &znam); //Перевод в правильную дробь
friend void sokrashenie(int &chisl, int &znam); //Сокращение дроби
friend fraction preobraz(double a);
fraction(); //конструктор по умолчанию дробью с целой частью
fraction(int c, int ch, int zn); //конструктор инициализации
fraction(int ch, int zn); //конструктор инициализации дробью без целой части
fraction(int c); //конструктор инициализации целым числом
fraction(double a); //конструктор инициализации дробью
fraction(char *str); //конструктор инициализации строкой
fraction(const fraction &ob); //конструктор копирования
friend ostream &operator<<(ostream &stream, fraction op); //Перегруженный оператор << - вывод на экран
friend istream &operator>>(istream &stream, fraction &op); //Перегруженный оператор >> - ввод с клавиатуры
fraction operator = (fraction op2); //Перегруженный оператор = - присваивание дроби
fraction operator = (int op2); //Перегруженный оператор = - присваивание числа типа int
fraction operator = (double op2); //Перегруженный оператор >> - присваивание числа типа double
fraction operator + (int op2); //Перегруженный оператор + - сложение дробь с целым
friend fraction operator + (int op1, fraction op2); //Перегруженный оператор + - сложение целое с дробью
fraction operator + (fraction &op2); //Перегруженный оператор + - сложение дробь с дробью
friend fraction operator + (fraction op1, double op2); //Перегруженный оператор + - сложение длобь с вещественым
friend fraction operator + (double op1, fraction op2); //Перегруженный оператор + - сложение вещественное с дробью
fraction operator += (int op2); //Перегруженный оператор += - увеличение на целое
fraction operator += (fraction &op2); //Перегруженный оператор -= - увеличение на дробь
fraction operator += (double op2); //Перегруженный оператор -= - увеличение на вещественное
Текст программы.
Файл “ Class_Drobi.h”.
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <iomanip>
using namespace std;
class fraction{
int chisl, znam;
public:
friend int perevod(int &chisl, int &znam); //Перевод в правильную дробь
friend void sokrashenie(int &chisl, int &znam); //Сокращение дроби
friend fraction preobraz(double a);
fraction(); //конструктор по умолчанию дробью с целой частью
fraction(int c, int ch, int zn); //конструктор инициализации
fraction(int ch, int zn); //конструктор инициализации дробью без целой части
fraction(int c); //конструктор инициализации целым числом
fraction(double a); //конструктор инициализации дробью
fraction(char *str);
fraction(const fraction &ob); //конструктор копирования
friend ostream &operator<<(ostream &stream, fraction op); //<<
friend istream &operator>>(istream &stream, fraction &op); //>>
fraction operator = (fraction op2);
fraction operator = (int op2);
fraction operator = (double op2);
fraction operator + (int op2);
friend fraction operator + (int op1, fraction op2);
fraction operator + (fraction &op2);
friend fraction operator + (fraction op1, double op2);
friend fraction operator + (double op1, fraction op2);
fraction operator += (int op2);
fraction operator += (fraction &op2);
fraction operator += (double op2);
};
//--------------------------------Конструкторы---------------------------
fraction::fraction(){ //По умолчанию
chisl= 0;
znam= 1;
}
fraction::fraction(int c, int ch, int zn){ //Инициализации
if(c < 0) chisl= c*zn-ch;
else if(c > 0) chisl= c*zn+ch;
znam= zn;
sokrashenie(chisl,znam);
}
fraction::fraction(int ch, int zn){ //Инициализации
chisl= ch;
znam= zn;
sokrashenie(chisl,znam);
}
fraction::fraction(int c){ //Инициализации
chisl= c;
znam= 1;
}
fraction::fraction(double a){ //Инициализации
chisl= (int)(a*100); //если что добавить floor()
znam= 100;
sokrashenie(chisl,znam);
}
fraction::fraction(const fraction &ob){ //Копирования
chisl= ob.chisl;
znam= ob.znam;
}
fraction::fraction(char *str)
{
char buf[20];
char *substr= buf;
strcpy(buf, str);
int ch= 0, zn=1, c=0;
if(strstr(str," "))
c= atoi(strtok_s(substr, " ", &substr));
if(strstr(str, "/")){
ch= atoi(strtok_s(substr, "/", &substr));
zn= atoi(substr);
}else ch= atoi(substr);
if(c < 0) ch= c*zn-ch;
else if(c > 0) ch= c*zn+ch;
chisl= ch;
znam= zn;
sokrashenie(chisl,znam);
}
//-------------------------------------------Функции-члены-----------------------------
fraction preobraz(double a){
fraction temp;
temp.chisl= (int)(a*1000);
temp.znam= 1000;
sokrashenie(temp.chisl, temp.znam);
return temp;
}
int perevod(int &chisl, int &znam){
int cel= 0;
if(abs(chisl) > znam){
cel= (int)(floor((double)(chisl/znam)));
chisl-= cel*znam; //chisl-= cel*znam;
}
if(chisl < 0)chisl= -chisl;
return cel;
}
void sokrashenie(int &ch, int &zn)
{
if(ch == 0){zn= 1;}
else if(ch == zn){ch= zn= 1;}
else if(ch < zn){
int n= ch;
bool temp= 1;
while((ch != 1) && temp){
if(((ch%2) == 0) && ((zn%2) == 0)){
n= ch/= 2;
zn/= 2;
}else{
temp= 0;
for(int i= 3; i <= n; i+= 2){
if((ch%i) == 0)
if((zn%i) == 0){
n= ch/= i;
zn/= i;
temp= 1;
break;
}
}
}
}
}else{
int n= zn;
bool temp= 1;
while((zn != 1) && temp){
if((((zn%2) == 0) && (ch%2) == 0)){
ch/= 2;
n= zn/= 2;
}else{
temp= 0;
for(int i= 3; i <= n; i+= 2){
if((ch%i) == 0)
if((zn%i) == 0){
ch/= i;
n= zn/= i;
temp= 1;
break;
}
}
}
}
}
}
//----------------------------------Перегрузка операторов ввода-вывода-----------------
ostream &operator << (ostream &stream, fraction op){ //<< << << << << << << << << << << << << << << << << << <<
int cel= perevod(op.chisl, op.znam);
sokrashenie(op.chisl,op.znam);
if(cel == 0){
if(op.chisl == 0) stream <<op.chisl <<"\n";
else stream <<op.chisl <<"/" <<op.znam <<"\n";
return stream;
}else{
if(op.chisl == 0) stream <<op.chisl <<"\n";
else if(op.znam == 1) stream <<op.chisl <<"\n";
else stream <<cel <<" " <<op.chisl <<"/" <<op.znam <<"\n";
return stream;
}
}
istream &operator >> (istream &stream, fraction &op){ //>> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >>
char *str;
try{
str= new char[20];
}catch(bad_alloc xa){
cout <<"Ошибка.\n";
system("Pause");
exit(EXIT_FAILURE);
}
gets(str);
char buf[20];
char *substr= buf;
strcpy(buf, str);
int ch= 0, zn=1, c=0;
if(strstr(str," "))
c= atoi(strtok_s(substr, " ", &substr));
if(strstr(str, "/")){
ch= atoi(strtok_s(substr, "/", &substr));
zn= atoi(substr);
}else ch= atoi(substr);
if(c < 0) ch= c*zn-ch;
else if(c > 0) ch= c*zn+ch;
op.chisl= ch;
op.znam= zn;
sokrashenie(op.chisl,op.znam);
return stream;
}
//= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
fraction fraction::operator = (fraction op2){ //fraction= int
znam= op2.znam;
chisl= op2.chisl;
return *this;
}
fraction fraction::operator = (int op2){ //fraction= int
znam= 1;
chisl= op2;
return *this;
}
fraction fraction::operator = (double op2){ //fraction= double
fraction temp;
temp= preobraz(op2);
znam= temp.znam;
chisl= temp.chisl;
return *this;
}
//-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/
//+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
fraction fraction::operator + (int op2){ //fraction= fraction+int
fraction temp;
temp.chisl= chisl+op2*znam;
temp.znam= znam;
sokrashenie(temp.chisl, temp.znam);
return temp;
}
fraction operator + (int op1, fraction op2){ //fraction= int+fraction
return (op2+op1);
}
fraction fraction::operator + (fraction &op2){ //fraction= fraction+fraction
fraction temp;
temp.znam= znam*op2.znam;
temp.chisl= chisl*op2.znam+op2.chisl*znam;
sokrashenie(temp.chisl, temp.znam);
return temp;
}
fraction operator + (fraction op1, double op2){ //fraction= fraction+double
return (op1+preobraz(op2));
}
fraction operator + (double op1, fraction op2){ //fraction= double+fraction
return (op2+preobraz(op1));
}
//-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/
//+= += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += +=