Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс_Комплексные числа, помогите исправить ошибки 
V
    Опции темы
Djen1k
Дата 8.10.2009, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 4.3.2009

Репутация: нет
Всего: нет



Всем доброго вечера.Начинаю пост(и)гать азы программирования.Нужно написать класс для работы с комплексными числами...есть наметки помогите исправить ошибки:
Код

// Complex_class.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream.h>
#include <conio.h>
#include <math.h>

class Complex // класс компелексных чисел
{
   double re, im; // целая и мнимая части
   
// создаем конструкторы   
public:
   
   Complex() {};
   
   Complex (double r) // конструктор по умолчанию
   {
      re = r; 
      im = 0;
   }
   
   Complex (double r, double i) // конструктор по умолчанию
   {
      re = r; 
      im = i;
   } 
   
   Complex (Complex &c) // конструктор копирования
   {
      re = c.re; 
      im = c.im;
   }
   
   ~Complex() {}
   
   float abs() // Модуль комплексного числа
   {
      return sqrt(re * re - im * im);
   }     

   Complex & operator = (Complex &c) // перегрузка оператора присваивания
   {
      re = c.re;
      im = c.im;

      return (*this);
   }

   Complex Complex::operator + (Complex &c) // перегрузка оператора сложения
   {
      Complex temp;

      temp.re = re + c.re;
      temp.im = im + c.re;

      return temp;
   }

   Complex Complex::operator - (Complex &c) // перегрузка оператора вычитания
   {
      Complex temp;

      temp.re = re - c.re;
      temp.im = im - c.re;
    
      return temp;
   }

   Complex Complex::operator * (Complex &c) // перегрузка оператора умножения
   {
      Complex temp;

      temp.re = re*c.re;
      temp.im = re*c.im;

      return temp;
   }

   Complex Complex::operator / (Complex &c) // перегрузка оператора деления
   {
      Complex temp;

      double r = c.re * c.re + c.im * c.im;
      temp.re = (re * c.re + im * c.im) / r;
      temp.re = (im * c.re - re * c.im) / r;

      return temp;
   }   

   friend ostream &operator<<(ostream &, Complex &); // перегрузка оператора <<
   friend istream &operator>>(istream &, Complex &); // перегрузка оператора >>

};

ostream &operator<<(ostream &out, complex &c)
{
   out << "(" << c.re << ") + I (" << c.im << "\n";
   
   return out;
}

istream &operator>>(istream &in, Complex &c)
{
   in >> c.re >> c.im;
   
   return in;
}

int _tmain(int argc, _TCHAR* argv[])
{
    Complex value1(5,2);
    Complex value2(3,-3);
    
    cout << value1 << " " << value2 << endl;
     
    cout << value1 + value2 << endl;
    
    cout << value1 - value2 << endl;
    
    cout << value1 * value2 << endl;
    
    cout << value1 / value2 << endl;    
    
    value1 = value2;
    
    cout << value1 << " = " << value2 << endl;
    
    return 0;
    return 0;
}


Это сообщение отредактировал(а) Djen1k - 8.10.2009, 20:59
PM MAIL   Вверх
zim22
Дата 8.10.2009, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Djen1k @  8.10.2009,  19:56 Найти цитируемый пост)
    
Код

return 0;   
return 0;


 smile 
мало return'oв. минимум нужно десять.
***
ошибка всего-лишь одна. слово комплекс с Большой буквы нужно написать
Код

ostream &operator<<(ostream &out, complex &c)


Это сообщение отредактировал(а) zim22 - 8.10.2009, 20:07


--------------------
PM MAIL   Вверх
Anikmar
Дата 8.10.2009, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(zim22 @  8.10.2009,  20:05 Найти цитируемый пост)
ошибка всего-лишь одна. слово комплекс с Большой буквы нужно написать


Цитата(Djen1k @  8.10.2009,  19:56 Найти цитируемый пост)
постягать

Почему одна?  smile 


PM MAIL ICQ   Вверх
Djen1k
Дата 8.10.2009, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 4.3.2009

Репутация: нет
Всего: нет



Все равно чего-то не могу её собрать в MVS 08
Что-то у меня ошибок больше выдает
Код

------ Build started: Project: Complex_class, Configuration: Debug Win32 ------
Compiling...
Complex_class.cpp
e:\ci\complex_class\complex_class\complex_class.cpp(92) : error C2143: syntax error : missing ';' before '&'
e:\ci\complex_class\complex_class\complex_class.cpp(92) : error C2433: 'ostream' : 'friend' not permitted on data declarations
e:\ci\complex_class\complex_class\complex_class.cpp(92) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\ci\complex_class\complex_class\complex_class.cpp(92) : error C2061: syntax error : identifier 'ostream'
e:\ci\complex_class\complex_class\complex_class.cpp(92) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\ci\complex_class\complex_class\complex_class.cpp(92) : error C2805: binary 'operator <<' has too few parameters
e:\ci\complex_class\complex_class\complex_class.cpp(93) : error C2143: syntax error : missing ';' before '&'
e:\ci\complex_class\complex_class\complex_class.cpp(93) : error C2433: 'istream' : 'friend' not permitted on data declarations
e:\ci\complex_class\complex_class\complex_class.cpp(93) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\ci\complex_class\complex_class\complex_class.cpp(93) : error C2061: syntax error : identifier 'istream'
e:\ci\complex_class\complex_class\complex_class.cpp(93) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\ci\complex_class\complex_class\complex_class.cpp(93) : error C2805: binary 'operator >>' has too few parameters
e:\ci\complex_class\complex_class\complex_class.cpp(40) : warning C4244: 'return' : conversion from 'double' to 'float', possible loss of data
e:\ci\complex_class\complex_class\complex_class.cpp(97) : error C2143: syntax error : missing ';' before '&'
e:\ci\complex_class\complex_class\complex_class.cpp(97) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\ci\complex_class\complex_class\complex_class.cpp(97) : error C2086: 'int ostream' : redefinition
        e:\ci\complex_class\complex_class\complex_class.cpp(92) : see declaration of 'ostream'
e:\ci\complex_class\complex_class\complex_class.cpp(97) : error C2065: 'out' : undeclared identifier
e:\ci\complex_class\complex_class\complex_class.cpp(97) : error C2065: 'c' : undeclared identifier
e:\ci\complex_class\complex_class\complex_class.cpp(97) : error C2275: 'Complex' : illegal use of this type as an expression
        e:\ci\complex_class\complex_class\complex_class.cpp(10) : see declaration of 'Complex'
e:\ci\complex_class\complex_class\complex_class.cpp(97) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
e:\ci\complex_class\complex_class\complex_class.cpp(97) : fatal error C1903: unable to recover from previous error(s); stopping compilation
Build log was saved at "file://e:\ci\Complex_class\Complex_class\Debug\BuildLog.htm"
Complex_class - 20 error(s), 1 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

PM MAIL   Вверх
zim22
Дата 8.10.2009, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Djen1k @  8.10.2009,  20:20 Найти цитируемый пост)
Что-то у меня ошибок больше выдает

Код

#include <iostream>
using namespace std;



Это сообщение отредактировал(а) zim22 - 8.10.2009, 20:24


--------------------
PM MAIL   Вверх
Djen1k
Дата 8.10.2009, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 4.3.2009

Репутация: нет
Всего: нет



Спасибо....стыдно за такие детские ошибки smile 
PM MAIL   Вверх
zim22
Дата 8.10.2009, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Djen1k @  8.10.2009,  20:31 Найти цитируемый пост)
Спасибо....стыдно за такие детские ошибки

smile пометь тему решённой


--------------------
PM MAIL   Вверх
sdukshis
Дата 15.10.2009, 17:51 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 23.3.2009

Репутация: нет
Всего: 1



У Вас немного странное представление об комплексной арифметике

Код

 float abs() // Модуль комплексного числа
   {
      return sqrt(re * re + im * im);
   }     


Код

 Complex Complex::operator * (Complex &c) // перегрузка оператора умножения
   {
      Complex temp;
      temp.re = re*c.re-im*c.im;
      temp.im = re*c.im+im*c.re;
      return temp;
   }


Так же в конструкторе по умолчанию, я бы не стал уповать на автоматическое обнуление свойств класса.
Более того 3 конструктора можно объединить в 1, для краткости
Код

Complex(const double R = 0, const double I = 0):re(R),im(I){};


Еще я бы рекомендовал использовать константные параметры и функции везде где это возможно.
PM MAIL   Вверх
zim22
Дата 15.10.2009, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(sdukshis @  15.10.2009,  17:51 Найти цитируемый пост)
Еще я бы рекомендовал использовать константные параметры и функции везде где это возможно.

Код

class NotOurClass {
public:
  NotOurClass() : ptr(new int(100)) { }
 protected:
   void print_state() {
     std::cout << *ptr;
   }
  int *ptr;
};

class OurClass : public NotOurClass {
public:
  void fcn() const {
    print_state();    // Вызывать нельзя! Константность рулит! или нет?
    ptr = 0; // Компилятор не пропустит! изменять нельзя!
    *ptr = 99; // Опа. Изменили. Компилятор молчит...
  }
};



--------------------
PM MAIL   Вверх
sdukshis
Дата 16.10.2009, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 23.3.2009

Репутация: нет
Всего: 1



Цитата(zim22 @ 15.10.2009,  18:05)
Цитата(sdukshis @  15.10.2009,  17:51 Найти цитируемый пост)
Еще я бы рекомендовал использовать константные параметры и функции везде где это возможно.

Код

class NotOurClass {
public:
  NotOurClass() : ptr(new int(100)) { }
 protected:
   void print_state() {
     std::cout << *ptr;
   }
  int *ptr;
};

class OurClass : public NotOurClass {
public:
  void fcn() const {
    print_state();    // Вызывать нельзя! Константность рулит! или нет?
    ptr = 0; // Компилятор не пропустит! изменять нельзя!
    *ptr = 99; // Опа. Изменили. Компилятор молчит...
  }
};

Наверное эта тема не очень подходит для подобных разговоров, но все же.

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

В приведенном Вами примере скорее метод NotOurClass::print_state() можно сделать константным.

Если очень необходимо в константном методе изменять свойства объекта, то можно использовать модификатор mutable.

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

Мое скромное мнение заключается в том, что объявление методов и параметров константными, способствует таким вещам как читабельность, структурированность и оптимизации компилятора.

P.S. Если компилятор молчит, когда Вам этого не хочется, то всегда есть возможность сделать его более многословным
Если это gcc, то -Wall -pedantic 


PM MAIL   Вверх
zim22
Дата 16.10.2009, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(sdukshis @  16.10.2009,  23:15 Найти цитируемый пост)
Я не очень понял, что Вы хотели сказать приведенным кодом.

моя ошибка. код привёл, а цель его приведения - не указал smile

я хотел показать, что когда у нас нет возможности модифицировать функцию базового класса (print_state), 
то из производного класса у нас не получится её вызвать в константном методе, т.к. вызываемая ф-я неконстантная.

во-вторых, хотел показать, что 
Цитата(sdukshis @  16.10.2009,  23:15 Найти цитируемый пост)
присутствует побитовая константность, но отсутствует логическая.




--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0881 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.