Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
lavengerl
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 77
#1

Дроби - C++

20.09.2011, 00:57. Просмотров 1309. Ответов 20
Метки нет (Все метки)

Вот простенькая прога, делаю лабу..
работает с двумя дробями у которых числитель и знаменатель в отдельных переменных.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
#include <conio.h>
using namespace std;
 
class rational
{
public:
    int a,b,c,d,oper,res1,res2;
void init(void);
void read(void);
void proc(void);
void display(void);
};
 
void rational::read(void)
{
    cout<<"vvedit 1 drob"<<endl;
    cin>>a;
    cout<<"-"<<endl;
    cin>>b;
    cout<<"vvedit 2 drob"<<endl;
    cin>>c;
    cout<<"-"<<endl;
    cin>>d;
 
}
void rational::init(void)
{
cout<<"initialization"<<endl;
}
void rational::proc(void)
{
    cout<<"oberit bajany operaciy"<<endl;
    cout<<"1-add\n2-sub\n3-mul\n4-div\n5-equal\n6-greate\n7-less:"<<endl;
    cin>>oper;
 
    switch(oper)
    {
    case 1: cout<<"Suma:"<<endl; res1=a*d+b*c; res2=b*d;break;
    case 2: cout<<"riznucia:"<<endl; res1=a*d-b*c; res2=b*d;break;
    case 3: cout<<"dobutok:"<<endl; res1=a*c; res2=b*d;break;
    case 4: cout<<"4astka:"<<endl; res1=a*d; res2=b*c;break;
    case 5: cout<<"equals:"<<endl; res1=a/b; res2=b/c;break;
    
 
 
default: cout<<"nemae takoi operacii";
    }
}
void rational::display(void)
{
    cout<<endl<<res1<<endl<<"-"<<endl<<res2;
}
void main()
{
rational obj;
obj.init();
obj.read();
obj.proc();
obj.display();
getch();
}
сделал операции +,-,/,*, осталось сделать equal, greate и less как я понял встроенными функциями, но беспонятия как ими пользоватся. Помогите плиз.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2011, 00:57     Дроби
Посмотрите здесь:

Дроби - C++
Помогите решить тут

Дроби - C++
можете объяснить что делает каждая функция #include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;stdlib.h&gt; #include &quot;fraction.h&quot; ...

Дроби - C++
Borland C ++ Даны натуральные числа X и Y, являющиеся числителем и знаменателем дроби соответственно. Вывести на экран все общие делители...

Обыкновенные дроби - C++
Как осуществить вывод чисел в виде обыкновенных дробей в С++?

Обыкновенные дроби - C++
Составить программу выполняющая арифметические операции над обыкновенными дробями,результат должен быть несократимой дробью

Дроби!классы - C++
что исправить чтобы скомпилировалось?// дроби.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; ...

Структура дроби - C++
Есть структура, которая описывает смешанную дробь. Надо найти сумму дробей через функцию.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.09.2011, 01:24     Дроби #2
Цитата Сообщение от lavengerl Посмотреть сообщение
осталось сделать equal, greate и less как я понял встроенными функциями
покажите вашу реализацию не "встроенными функциями"

и ваше задание в студию, на 99.9 уверен что вы неправильно его поняли
lavengerl
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 77
20.09.2011, 01:46  [ТС]     Дроби #3
задание номер 28 на втором рисунке вначале указано таже что должна иметь прога. не уверен что less и great есть в с++)))
но equal видел где-то, но понять как им пользоватся не смог.
Миниатюры
Дроби   Дроби  
Criss009
1 / 1 / 0
Регистрация: 04.08.2011
Сообщений: 52
20.09.2011, 01:55     Дроби #4
Домашняя работа
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
20.09.2011, 02:39     Дроби #5
тебе нужен класс, представляющий дробь. в private должны быть переменные под числитель и знаменатель. в public должны быть конструктор дроби, вывод дроби.

наиболее очевидным решением задачи является создание дружественных функций div, mul, equal и т.д. для этого реализуешь их (логично, что на вход будут поступать два указателя на дроби) вне класса, а в самом классе объявляешь эти ф-ции дружественными (friend), чтобы они имели доступ к секции private.
lavengerl
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 77
20.09.2011, 08:37  [ТС]     Дроби #6
мало что понял, спасибо)
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
20.09.2011, 12:28     Дроби #7
Цитата Сообщение от lavengerl Посмотреть сообщение
сделал операции +,-,/,*, осталось сделать equal, greate и less как я понял встроенными функциями, но беспонятия как ими пользоватся
перегружай операторы
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
20.09.2011, 13:07     Дроби #8
lavengerl, присоединяюсь к Nameless One.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
 
class Rational
{
private:
    int top,
        bottom;
 
public:
    // конструкторы
    Rational( int _top = 1, int _bottom = 1 ) : top(_top), bottom(_bottom) { };
    Rational( const Rational& r ) : top( r.top ), bottom( r.bottom ) { };
 
    Rational & operator+= ( const Rational &r );
 
    // ввод - вывод
    friend std::ostream & operator<<( std::ostream &os, const Rational &r );
    friend std::istream & operator>>( std::istream &is, Rational &r );
};
 
Rational & Rational::operator+= ( const Rational &r )
{
    // согласно условию
    top = top * r.bottom + bottom * r.top;
    bottom *= r.bottom;
 
    return *this;
}
 
//----------------------------------------------------------------------------
 
// использует метод operator+= - зачем переписывать по 20 раз?
Rational operator+ ( const Rational &r1, const Rational &r2 )
{
    Rational r = r1;
    r += r2;
    return r;
}
 
// вывод
std::ostream & operator<<( std::ostream &os, const Rational &r )
{
    os << r.top << '/' << r.bottom;
    return os;
}
 
// ввод
// формат:
// 1/2  1  / 4  12/ 258
std::istream & operator>>( std::istream &is, Rational &r )
{
    int top;
    is >> top;
 
    char ch;
    is >> ch;
 
    if( ch != '/' )
    {
       is.setstate( std::ios::failbit );
       return is;
    }
 
    is >> r.bottom;
    r.top = top;
 
    return is;
}
 
//----------------------------------------------------------------------------
 
int main()
{
    Rational a( 1, 2 );
    Rational b( 2, 2 );
 
    std::cout << a << ' ' << a + b << ' ' << b + a << '\n';
    std::cout << "a: ";
    std::cin >> a;
    std::cout << a;
 
    return 0;
}
Остальные операции сам, по аналогии.

Добавлено через 10 минут
Да, и ещё там в задании говорится о функции сокращения, которая вызывается при всех арифметических операциях. Её не имеет смысла делать public.
lavengerl
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 77
20.09.2011, 21:16  [ТС]     Дроби #9
а имеет смысл ее делать приват?) я просто не шарю..
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
20.09.2011, 21:19     Дроби #10
lavengerl, инкапсуляция. Одна из основ ООП. Вместо предоставления свободного доступа к полям класса всем желающим, обеспечьте их надёжным интерфейсом.
lavengerl
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 77
20.09.2011, 21:49  [ТС]     Дроби #11
talis, если вам не трудно, не могли бы вы написать коментарии возле каждой строчки, ато я так ничего почти не понимаю.. хотелось бы разобратся. Ато написано как то заумно очень, а я привык к стандартному нубскому написанию вроде того что я писал)
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
20.09.2011, 22:57     Дроби #12
lavengerl, вы знаете, я затрудняюсь кратко и понятно описать этот код. Когда я пытаюсь его объяснить, на ум приходит либо аналогичный код на C++ (ибо лаконичнее это выразить сложно), либо проекты огромных статей. Давайте, лучше вы просто будете спрашивать, что не понятно, а я либо объясню кратко, где это возможно, либо отошлю к статьям, если объяснение будет слишком большим.
lavengerl
0 / 0 / 0
Регистрация: 18.09.2011
Сообщений: 77
21.09.2011, 15:20  [ТС]     Дроби #13
окей. ну тогда начнем сначала)
зачем создаются эти переменные?
C++
1
int top, bottom;
Каким образом используються эти конструкторы? я такого синтаксиса никогда еще не видел)
C++
1
2
Rational( int _top = 1, int _bottom = 1 ) : top(_top), bottom(_bottom) { };
Rational( const Rational& r ) : top( r.top ), bottom( r.bottom ) { };
Зачем ввод-вывод делать так?) не проще ли cin, cout? И что значит "friend std::"
C++
1
2
friend std::ostream & operator<<( std::ostream &os, const Rational &r );
friend std::istream & operator>>( std::istream &is, Rational &r );
Что делает эта функция? что такое Rational & Rational? и что такое r.bottom;
C++
1
2
3
4
5
6
7
Rational & Rational::operator+= ( const Rational &r )
{
    // согласно условию
    top = top * r.bottom + bottom * r.top;
    bottom *= r.bottom;
 
    return *this;
Что и от кого принимает эта функция? И кому возвращает?

C++
1
2
3
4
5
6
Rational operator+ ( const Rational &r1, const Rational &r2 )
{
    Rational r = r1;
    r += r2;
    return r;
}
опять же вывод то что вывод понял но как он действует нет.. Ибо всегда чтоб вывести просто писал cout<<...
C++
1
2
3
4
5
6
// вывод
std::ostream & operator<<( std::ostream &os, const Rational &r )
{
    os << r.top << '/' << r.bottom;
    return os;
}
тут если можно т опострочно, ато ниодно слово неясно)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// ввод
// формат:
// 1/2  1  / 4  12/ 258
std::istream & operator>>( std::istream &is, Rational &r )
{
    int top;
    is >> top;
 
    char ch;
    is >> ch;
 
    if( ch != '/' )
    {
       is.setstate( std::ios::failbit );
       return is;
    }
 
    is >> r.bottom;
    r.top = top;
 
    return is;
}

тут впринципе ясно но когда создавал экземпляр то обычно писал имя класса::омя обьекта, а тут имя неймспейса::и cout. не ясно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    Rational a( 1, 2 );
    Rational b( 2, 2 );
 
    std::cout << a << ' ' << a + b << ' ' << b + a << '\n';
    std::cout << "a: ";
    std::cin >> a;
    std::cout << a;
 
    return 0;
}
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.09.2011, 16:13     Дроби #14
Цитата Сообщение от lavengerl Посмотреть сообщение
зачем создаются эти переменные?
top - верхняя часть дроби, bottom - нижняя. Числитель и знаменатель это.

Цитата Сообщение от lavengerl Посмотреть сообщение
Каким образом используються эти конструкторы? я такого синтаксиса никогда еще не видел)
Rational( int _top = 1, int _bottom = 1 ) : top(_top), bottom(_bottom) { };

Параметры с присвоением - это параметры по-умолчанию. То есть, если вы не указали их при вызове функции (в данном случае - при создании объекта), используются указанные здесь значения. После двоеточия - вызов других конструкторов. То есть, переменная top инициализируется значением _top, переменная bottom - значением _bottom. Да, встроенные типы тоже можно инициализировать конструкторами.

Rational( const Rational& r ) : top( r.top ), bottom( r.bottom ) { };
Конструктор копирования. В качестве аргумента передаётся ссылка на другой объект типа Rational. В части конструкторов видно, что вы копируем данные из этого переданного объекта в создаваемый.

То есть можно:

C++
1
2
Rational rat1( 1, 2 ); // 1/2
Rational rat2( rat1 ); // 1/2
Цитата Сообщение от lavengerl Посмотреть сообщение
Зачем ввод-вывод делать так?) не проще ли cin, cout? И что значит "friend std::"
cin не врубится в объект типа Rational. То есть cin >> rat1; оно не поймёт, так же, как и cout << rat1;. Эти функции помогают cin'у понять такое выражение.

friend говорит о том, что эта функция имеет доступ к закрытым частям класса.

std::ostream - это объект ostream из пространства имён std. То есть мы возвращаем ссылку на объект типа std::ostream

Цитата Сообщение от lavengerl Посмотреть сообщение
Что делает эта функция? что такое Rational & Rational? и что такое r.bottom;
C++
1
2
3
4
5
6
7
Rational & Rational::operator+= ( const Rational &r )
{
    // согласно условию
    top = top * r.bottom + bottom * r.top;
    bottom *= r.bottom;
 
    return *this;
Rational & - это тип возвращаемого значения. Ссылка на объект типа Rational.
Rationa::operator+= - это имя функции из класса Rational.
( const Rational &r ) - это параметр, который она принимает. Ссылка на объект типа Rational.

r.bottom - это переменная bottom из объекта r (см. параметры функции)
bottom - это переменная из текущего объекта

return *this; - возвращается ссылка на себя.

Цитата Сообщение от lavengerl Посмотреть сообщение
Что и от кого принимает эта функция? И кому возвращает?
C++
1
2
3
4
5
6
Rational operator+ ( const Rational &r1, const Rational &r2 )
{
    Rational r = r1;
    r += r2;
    return r;
}
Принимает ссылки на два объекта типа Rational. Возвращает результат их сложения. В выражении

C++
1
2
3
Rational a(1, 2);
Rational b(2, 4);
Rational c = a + b; /* вот тут происходит её вызов. a попадает в первый параметр, b - во второй. Возвращаемое значение присваивается c.*/
Цитата Сообщение от lavengerl Посмотреть сообщение
опять же вывод то что вывод понял но как он действует нет.. Ибо всегда чтоб вывести просто писал cout<<...
cout - это объект типа ostream, привязанный к выводу на stdout (стандартный вывод). Однако, ofstream file( "file.txt" ); - это тоже объект ostream (ofsteram наследуется от ostream). Соответственно, можно сделать так: cout << rat1; file << rat1; Есть много типов, которые наследуют от ostream. Эта функция учит их все работать с типом Rational.

Цитата Сообщение от lavengerl Посмотреть сообщение
тут если можно т опострочно, ато ниодно слово неясно)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// ввод
// формат:
// 1/2  1  / 4  12/ 258
std::istream & operator>>( std::istream &is, Rational &r )
{
    int top;
    is >> top; // из is вводим число в top
 
    char ch;
    is >> ch; // далее вводим следующий символ (кроме пробелов, переносов, табов и так далее)
 
    if( ch != '/' ) // если этот символ - не прямой слэш
    {
       is.setstate( std::ios::failbit ); // то произошла ошибка при вводе числа : формат не соблюдён
       return is; // выходим
    }
 
    is >> r.bottom; // если слеш найден, вводим нижнюю часть числа
    r.top = top; // и обновляем верхнюю из переменной top
 
    return is; // возвращаем is
}
Цитата Сообщение от lavengerl Посмотреть сообщение
тут впринципе ясно но когда создавал экземпляр то обычно писал имя класса::омя обьекта, а тут имя неймспейса::и cout. не ясно.
Я не писал using namespace std;, поэтому мне нужно было вручную указывать, что те-то объекты и те-то типы находятся в пространстве имён std.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2011, 16:16     Дроби
Еще ссылки по теме:

Оператор For и дроби - C++
Написать при помощи оператора For..... которая считает величину (см. прикрепленный файл) { int n,K; float S,a; ...

Класс дроби - C++
Реализуйте класс Дробь. Необходимо хранить числитель и знаменатель в качестве переменных-членов. Реализуйте функции-члены для ввода данных...

Цепные дроби - C++
Помогите пожалуйста,не могу найти ошибку,косяк с выводом. Необходимо Реализовать программу для разложения конечной цепной дроби. ...

Сокращение дроби - C++
Даны натуральные числа a и b, обозначающие соответственно числитель и знаменатель дроби. Сократите дробь, т.е найти такие натуральные p и...

Сокращение дроби - C++
Есть класс дроби с полями Чисельник и Знаменник. надо написать функцию сокращение дроби. сделать функцию дружественной и т.п. я умею, мне...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
21.09.2011, 16:16     Дроби #15
Цитата Сообщение от talis Посмотреть сообщение
После двоеточия - вызов других конструкторов. То есть, переменная top инициализируется значением _top, переменная bottom - значением _bottom. Да, встроенные типы тоже можно инициализировать конструкторами.
оно еще называется списком инициализации
Yandex
Объявления
21.09.2011, 16:16     Дроби
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru