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

Дроби!классы - C++

Восстановить пароль Регистрация
 
тупой
0 / 0 / 0
Регистрация: 04.04.2011
Сообщений: 15
27.01.2012, 19:43     Дроби!классы #1
что исправить чтобы скомпилировалось?
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
// дроби.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <string.h>
using namespace std;
class Fraction
{
  private:
    int m_Numerator;
    int m_Denominator;
    bool m_Corrupt;
  public:
    Fraction( int number, int denominator, bool positive );
    void parseFraction( const std::string &fractionString );
    void reduceFraction();
    std::string toString();
    // Getters
    int getNumerator() { return m_Numerator; }
    int getDenominator() { return m_Denominator; }
    bool getCorrupt() { return m_Corrupt; }
    // Setters
    void setNumerator( int numerator ) { m_Numerator = numerator; }
    void setDenominator( int denominator ) { m_Denominator = denominator; }
    // Own operators
    Fraction& operator + ( const Fraction &mulFraction );
    Fraction& operator - ( const Fraction &mulFraction );
    Fraction& operator * ( const Fraction &mulFraction );
    Fraction& operator / ( const Fraction &mulFraction );
};
int findNOD( int a, int b )
{
  while( b > 0)
  {
    int c = a % b;
    a = b; b = c;
  }
  return a;
};
int findNOK( int a, int b )
{
  return findNOD( a, b ) * a * b;
};
Fraction::Fraction( int numerator = 1, int denominator = 1, bool positive = true ) :
m_Numerator(numerator), m_Denominator(denominator), m_Corrupt(false)
{
  if( m_Denominator == 0 ) m_Corrupt = true;
  if( !positive && numerator >= 0 ) m_Numerator *= -1;
};
void Fraction::parseFraction( const std::string &fractionString )
{
  if( fractionString != "" )
  {
    bool positive; // Знак выражения
    unsigned int offset = 0; // На сколько символов сдвигать поиск служебных
    switch (fractionString[0])
    {
      // Проверяем знак, если он вообще существует, сдвигаем поиск на один символ вправо
      case '+': positive = true; offset = 1; break;
      case '-': positive = false; offset = 1; break;
      default: positive = true; offset = 0; break;
    }
    unsigned int slashPos = fractionString.find( "/" ); // Ищем вхождение "/" в строку
    unsigned int spacePos = fractionString.find(" "); // Ищем вхождение пробела, который разделяет целую часть и дробную.
    // Если пробел существует, значит в выражении есть целая часть дроби
    if( spacePos != std::string::npos )
    {
      int fullPart = atoi( fractionString.substr(offset, spacePos-offset).c_str() ); // Шаманим
      int tempNumerator = atoi( fractionString.substr(spacePos+1, slashPos-offset).c_str() ); // С бубном
      // Stay the same
      m_Denominator = atoi( fractionString.substr(slashPos+1, fractionString.size()).c_str() ); // Лучше даже не пытаться понять эти строки
      // 2 3/9 -> 21/9
      m_Numerator = fullPart * m_Denominator + tempNumerator; // Переводим всё выражение в неправильную дробь
    }
    else
    {
      m_Numerator = atoi( fractionString.substr(offset, slashPos-offset).c_str() ); // Если же целой части не существует
      m_Denominator = atoi( fractionString.substr(slashPos+1, fractionString.size()).c_str() ); // Просто парсим
    }
    if( !positive ) m_Numerator *= -1; // Ставим нужный знак числителю
    this->reduceFraction(); // Сокращаем дробь (реализуем далее)
  }
};
void Fraction::reduceFraction()
{
  if( !m_Corrupt )
  {
    int nod = findNOD( abs(m_Numerator), m_Denominator );
    this->setNumerator( m_Numerator / nod );
    this->setDenominator( m_Denominator / nod );
  }
};
std::string Fraction::toString()
{
  std::string formattedFraction;
  if( m_Numerator < 0 ) formattedFraction.append( "-" );
  formattedFraction.append( abs(m_Numerator) / m_Denominator );
  formattedFraction.append( " " );
  formattedFraction.append( abs(m_Numerator) % m_Denominator );
  formattedFraction.append( "/" );
  formattedFraction.append( m_Denominator );
};
Fraction& Fraction::operator * ( const Fraction &mulFraction )
{
  if( !this->m_Corrupt && !mulFraction.m_Corrupt )
  {
    this->setNumerator( m_Numerator * mulFraction.m_Numerator );
    this->setDenominator( m_Denominator * mulFraction.m_Denominator );
    this->reduceFraction();
  }
  return *this;
};
Fraction& Fraction::operator / ( const Fraction &mulFraction )
{
  if( !this->m_Corrupt && !mulFraction.m_Corrupt )
  {
    this->setNumerator( m_Numerator * mulFraction.m_Denominator );
    this->setDenominator( m_Denominator * mulFraction.m_Numerator );
    this->reduceFraction();
  }
  return *this;
};
Fraction& Fraction::operator - ( const Fraction &mulFraction )
{
  int relNumerator;
  int mulNumerator;
  if( !this->m_Corrupt && !mulFraction.m_Corrupt )
  {
    int unionDenominator = findNOK( m_Denominator, mulFraction.m_Denominator );
    relNumerator = m_Numerator * mulFraction.m_Denominator;
    mulNumerator = m_Denominator * mulFraction.m_Numerator;
    this->setNumerator( relNumerator - mulNumerator );
    this->setDenominator( unionDenominator );
    this->reduceFraction();
  }
  return *this;
};
Fraction& Fraction::operator + ( const Fraction &mulFraction )
{
  int relNumerator;
  int mulNumerator;
  if( !this->m_Corrupt && !mulFraction.m_Corrupt )
  {
    int unionDenominator = findNOK( m_Denominator, mulFraction.m_Denominator );
    relNumerator = m_Numerator * unionDenominator;
    mulNumerator = mulFraction.m_Numerator * unionDenominator;
    this->setNumerator( relNumerator * mulNumerator );
    this->setDenominator( unionDenominator );
    this->reduceFraction();
  }
  return *this;
};
 
int main()
{
 
  return 0;
};
Вот что пишет
Для всех выходных данных обновления не требуется.
1> дроби.cpp
1>c:\users\admin\documents\visual studio 2010\projects\дроби\дроби\дроби.cpp(53): error C2678: бинарный "=": не найден оператор, принимающий левый операнд типа "const std::string" (или приемлемое преобразование отсутствует)
1> c:\program files\microsoft visual studio 10.0\vc\include\xstring(707): может быть "std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(std::basic_string<_Elem,_Traits,_Ax> &&)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> c:\program files\microsoft visual studio 10.0\vc\include\xstring(761): или "std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(const std::basic_string<_Elem,_Traits,_Ax> &)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> c:\program files\microsoft visual studio 10.0\vc\include\xstring(766): или "std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(const _Elem *)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> c:\program files\microsoft visual studio 10.0\vc\include\xstring(771): или "std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(_Elem)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> при попытке сопоставить список аргументов "(const std::string, const char [1])"
1>c:\users\admin\documents\visual studio 2010\projects\дроби\дроби\дроби.cpp(98): error C2664: std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::append(const std::basic_string<_Elem,_Traits,_Ax> &): невозможно преобразовать параметр 1 из "int" в "const std::basic_string<_Elem,_Traits,_Ax> &"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> Причина: невозможно преобразовать "int" в "const std::basic_string<_Elem,_Traits,_Ax>"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> Ни один конструктор не смог принять исходный тип, либо разрешение перегрузки конструктора неоднозначно
1>c:\users\admin\documents\visual studio 2010\projects\дроби\дроби\дроби.cpp(100): error C2664: std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::append(const std::basic_string<_Elem,_Traits,_Ax> &): невозможно преобразовать параметр 1 из "int" в "const std::basic_string<_Elem,_Traits,_Ax> &"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> Причина: невозможно преобразовать "int" в "const std::basic_string<_Elem,_Traits,_Ax>"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> Ни один конструктор не смог принять исходный тип, либо разрешение перегрузки конструктора неоднозначно
1>c:\users\admin\documents\visual studio 2010\projects\дроби\дроби\дроби.cpp(102): error C2664: std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::append(const std::basic_string<_Elem,_Traits,_Ax> &): невозможно преобразовать параметр 1 из "int" в "const std::basic_string<_Elem,_Traits,_Ax> &"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> Причина: невозможно преобразовать "int" в "const std::basic_string<_Elem,_Traits,_Ax>"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> Ни один конструктор не смог принять исходный тип, либо разрешение перегрузки конструктора неоднозначно


 Комментарий модератора 
Такие полотна ошибок - под кат!


Добавлено через 3 минуты
ошибку по бинарному "!=" на 53 строчке!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2012, 19:43     Дроби!классы
Посмотрите здесь:

C++ Дроби
C++ Дроби
C++ Обыкновенные дроби
C++ Классы в C++. Переворот дроби.
Цепные дроби C++
C++ Оператор For и дроби
C++ Обыкновенные дроби
C++ Дроби
Сокращение дроби C++
C++ Дроби
Класс дроби C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Teravisor
30 / 30 / 3
Регистрация: 07.08.2011
Сообщений: 89
27.01.2012, 20:00     Дроби!классы #2
Для начала исправьте:
Строка 53:
string::empty
Замените на этот оператор.
Строки 98,100,102:
string::append
Вы подаете туда инт, а объединять можно только две строки. Преобразуйте число в строку, после этого делайте append, преобразовать например коммандой itoa(мне просто она нравится, способов много)
тупой
0 / 0 / 0
Регистрация: 04.04.2011
Сообщений: 15
27.01.2012, 20:42  [ТС]     Дроби!классы #3
Цитата Сообщение от Teravisor Посмотреть сообщение
Для начала исправьте:
Строка 53:
string::empty
Замените на этот оператор.
Строки 98,100,102:
string::append
Вы подаете туда инт, а объединять можно только две строки. Преобразуйте число в строку, после этого делайте append, преобразовать например коммандой itoa(мне просто она нравится, способов много)
Напиши пожалуйста подробно про 98 100 и 102 строку за первую спасибо!а то что-то не пойму!
Teravisor
30 / 30 / 3
Регистрация: 07.08.2011
Сообщений: 89
27.01.2012, 20:58     Дроби!классы #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
std::string Fraction::toString()
{
  std::string formattedFraction;
  char buffer[sizeof(int)*8+1];//больше этого числа символов ну никак не сможет быть. Можно уменьшить немного.
  if( m_Numerator < 0 ) formattedFraction.append( "-" );
  sprintf(buffer,"%d",abs(m_Numerator) / m_Denominator);//Записываем число в буфер.
  formattedFraction.append( buffer );
  formattedFraction.append( " " );
  sprintf(buffer,"%d",abs(m_Numerator) % m_Denominator);
  formattedFraction.append( buffer );
  formattedFraction.append( "/" );
  sprintf(buffer,"%d",m_Denominator);
  formattedFraction.append( buffer);
  return formattedFraction; //Отсутствие этой строчки не заметил. Нужна.
};
atoi к сожалению, не всеми компиляторами понимается, поэтому написал по стандарту.
Вроде должно работать.
тупой
0 / 0 / 0
Регистрация: 04.04.2011
Сообщений: 15
27.01.2012, 21:33  [ТС]     Дроби!классы #5
Цитата Сообщение от Teravisor Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
std::string Fraction::toString()
{
  std::string formattedFraction;
  char buffer[sizeof(int)*8+1];//больше этого числа символов ну никак не сможет быть. Можно уменьшить немного.
  if( m_Numerator < 0 ) formattedFraction.append( "-" );
  sprintf(buffer,"%d",abs(m_Numerator) / m_Denominator);//Записываем число в буфер.
  formattedFraction.append( buffer );
  formattedFraction.append( " " );
  sprintf(buffer,"%d",abs(m_Numerator) % m_Denominator);
  formattedFraction.append( buffer );
  formattedFraction.append( "/" );
  sprintf(buffer,"%d",m_Denominator);
  formattedFraction.append( buffer);
  return formattedFraction; //Отсутствие этой строчки не заметил. Нужна.
};
atoi к сожалению, не всеми компиляторами понимается, поэтому написал по стандарту.
Вроде должно работать.
у меня на 53 все равно выскакивает ошибка !напиши как надо!это ошибку не выдает!
Teravisor
30 / 30 / 3
Регистрация: 07.08.2011
Сообщений: 89
27.01.2012, 22:22     Дроби!классы #6
if( fractionString != "" )
заменить на
if( !fractionString.empty() )

Я думал, вы сообразили...
Yandex
Объявления
27.01.2012, 22:22     Дроби!классы
Ответ Создать тему
Опции темы

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