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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> по непонятным причинам прога валится, непонятно почему именно здесь 
:(
    Опции темы
johnyblackbird2
Дата 8.1.2012, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет! Тут такая проблема есть. Здесь приведён участок кода, весь код кидать не стал, там его слишком много. Вообще я тут работаю с массивом экземпляров класса fraction(обыкновенные дроби), для которого я перегрузил все операторы.  Если ещё что-то нужно кинуть, например перегрузку какого-то оператора, то я кину..
Прога валится по непонятным причинам именнов том месте, которое я указал в коде.
Код

int forbidden[m], forbiddent[m];
for(int f=0; f<m;f++)
{
 forbidden[f]=0;
 forbiddent[f]=0;
}
int mn=1, p, nt=1;
for(int i=0; i<m; i++)
{
  for(int k=1; k<n+1; k++)
  {
    bool flag=0;
    for(int f=0; f<m; f++)
    {
    if(k==forbidden[f]) flag=1;
    }
   if((mas[0][k]<mas[0][mn])&&(flag==0)) {
   mn=k;
   p++;
   }
   else continue;
   out<<mn<<endl;
  }
 if (p==0) {
 mn=-1;
 out<<"No solve for your sistem";
 break;
 }
 for(int j=1; j<m+1; j++)
 {
 bool flag=0;
 for(int f=0; f<m; f++)
    {
    if(j==forbiddent[f]) flag=1;
    }
 fraction ra, rb;
 ra=mas[j][0]/mas[j][mn];
 rb=mas[nt][0]/mas[nt][mn];
 if((ra<rb)&&(flag==0)) nt=j;
 else continue;
 }
out<<"nt="<<nt<<endl;
fraction h;
for(int j=0; j<m+1; j++){
 h=mas[j][mn]/mas[nt][mn];
 out<<h<<endl;//Здесь валится прога, абсолютно непонятно почему  именно здесь
out<<"k";// k уже не выводится
 
 for(int k=0; k<n+m+1; k++)
  {
  mas[j][k]=mas[j][k]-h*mas[nt][k];
  }
 }
printmatrix(m, n, out, mas);
forbidden[i]=mn;
forbiddent[i]=nt;
}

PM MAIL   Вверх
boostcoder
Дата 8.1.2012, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



покажи перегрузку вывода для fraction.

Добавлено через 48 секунд
или весь fraction покажи. если он не сильно большой.
PM WWW   Вверх
johnyblackbird2
Дата 8.1.2012, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

friend ofstream & operator<< (ofstream &out, fraction &v){
 out.width(6);
 out<<v.a<<"/";
 out<<v.b;
 return out;
 } 


Это сообщение отредактировал(а) johnyblackbird2 - 8.1.2012, 16:17
PM MAIL   Вверх
boostcoder
Дата 8.1.2012, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



показывай весь fraction.
PM WWW   Вверх
johnyblackbird2
Дата 8.1.2012, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

#ifndef _SIMPLEX_H
#define _SIMPLEX_H
#include<fstream>
#include<iostream>
#include<stdio.h>
#include <string>
using namespace std;
/*using std::ostream;
using std::istream;
using std::string;*/
class fraction
{
protected:
 int a, b;
public:
 fraction();
 fraction(const int &v);
 inline int gcd(int c, int d)
{
    // пока числа не равны 0
    while(c!=0 && d!=0)
    {
       if(c>=d) c=c%d;
           else c=c%d;
    }
   return c+d; // Одно - ноль
  }
 inline int lcm(int c, int d)
  {
   int cm;
   cm = (c * d) / gcd(c, d);
   return cm;
  } 
 fraction & operator= (const fraction &v);
 fraction & operator+ (const fraction &v);
 fraction & operator* (const fraction &v);
 fraction & operator- (const fraction &v);
 fraction & operator/ (const fraction &v);
 int  operator== (const fraction &v);
 int  operator< (const fraction &v);
 int  operator> (const fraction &v);
  ~fraction();
inline void puta(const int val){
a=val;}
 //void puta(const int val);
 friend ifstream & operator>> (ifstream &in, fraction &v){
    in>>v.a;      
 }
 friend ofstream & operator<< (ofstream &out, fraction &v){
 out.width(6);
 out<<v.a<<"/";
 out<<v.b;
 return out;
 } 
};

Код

#include"simplex.h"
 fraction::fraction()
 {
    a=0;
    b=1;
 }
 fraction::fraction(const int &v){
 
 }
 fraction::~fraction(){}
 
 //присваивание
 fraction & fraction::operator= (const fraction &v){
  if (this!= &v){
   a=v.a; b=v.b;
   return *this;
   }
  }
  //сложение
  fraction & fraction::operator+ (const fraction &v){
   fraction temp;
   if(b==v.b){
   temp.b = b; 
   temp.a = a + v.a;
   }
  else{
  temp.b = lcm(b, v.b); 
  temp.a = a*(temp.b/b) + v.a*(temp.b/v.b);
  }
  return temp;
  }
fraction & fraction::operator- (const fraction &v){
 fraction temp;
   if(b==v.b){
    temp.b = b; 
    temp.a = a-v.a;
    }
   else{
    temp.b = lcm(b, v.b); 
    temp.a = a*(temp.b/b)-v.a*(temp.b/v.b);
   }
   return temp;
  }
 fraction & fraction::operator* (const fraction &v){
    fraction temp;
    temp.a = a * v.a;
    temp.b = b * v.b;
    return temp;
 };
 
fraction & fraction::operator/ (const fraction &v){
 fraction temp;
 temp.a=a*v.b;
 temp.b=b*v.a;
 return temp;
}
/*void fraction::puta(const int val){
a=val;*/
int  fraction::operator> (const fraction &v){
 if(b==v.b){
  if (a>v.a) return 1;
  else return 0;
  }
 if(a==v.a){
   if(b>v.b) return 0;
   else return 1;
  }
 else{
  int l=lcm(b, v.b); 
  int s=(a*l/v.b);
  int r=(v.a*l/b);
  if(s>r) return 1;
  else return 0;
  }
}
int  fraction::operator< (const fraction &v){
 if(b==v.b){
  if (a<v.a) return 1;
  else return 0;
  }
 if(a==v.a){
   if(b<v.b) return 0;
   else return 1;
  }
 else{
  int l=lcm(b, v.b); 
  int s=(a*l/v.b);
  int r=(v.a*l/b);
  if(s<r) return 1;
  else return 0;
  }
}
int  fraction::operator== (const fraction &v){
int l=lcm(b, v.b); 
  int s=(a*l/v.b);
  int r=(v.a*l/b);
  if(r==s) return 1;
  else return 0;
}


PM MAIL   Вверх
mes
Дата 8.1.2012, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата

Код

fraction & fraction::operator/ (const fraction &v){
 fraction temp;
 temp.a=a*v.b;
 temp.b=b*v.a;
 return temp;
}


возвращаете ссылку на временную переменную ? smile   на старой VS компилите, раз компилятор не делает замечание ?



Это сообщение отредактировал(а) mes - 8.1.2012, 17:35


--------------------
PM MAIL WWW   Вверх
Result
Дата 8.1.2012, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Чему равно значение "mas[nt][mn]" на 45 строке из первого поста при выполнении ?.

Не очень понял код, как мне думается в строке 45 перед вызовом оператора присвоения 
Код

fraction & operator= (const fraction &v);

будет создан временный объект через конструктор с интом
Код

fraction(const int &v);
 
Но поскольку в теле конструктора ничего не делается, возникает непонятность смысла.

Думаю что тут стоит делать сеттеры-геттеры:
Код

  void setNumerator(int arg){
    a = arg;
  }
  int getNumerator(){return a;}

  void setDenominator(int arg){
    //мб проверка на ноль
    b = arg;
  }
  int getDenominator(){return b;}


Еще можно прикрутить конструктор с двумя параметрами, чисто если на будущее:
Код

  fraction::fraction(int numerator, int denominator):a(numerator), b(denominator){}



и в строке 45 заменить на:
Код

  h.setNumarator(mas[j][mn]);
  h.setDenominator(mas[nt][mn]);


Теперь благодаря геттерам можно избавиться от френдов, заменив их примерно на:
Код

template <class charT, class traits>
inline
std::basic_ofstream<charT,traits>&
operator << (std::basic_ofstream<charT,traits>& out_stream,
             const fraction& f)
{
    out_stream.width(0);

    out_stream << f.getNumerator() << '/' << f.getDenominator();

    return out_stream;
}

Оператор ввода по аналогии.


Это сообщение отредактировал(а) Result - 8.1.2012, 18:15
PM   Вверх
johnyblackbird2
Дата 8.1.2012, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я вообще в g++ компилю. И, кстати, там были ворнинги, но я тогда не особо понял, почему они там. Сейчас исправил, ворнингов нет, но прога падает всё в том же месте. То есть дело не в этом.

Добавлено через 13 минут и 19 секунд
Цитата

Чему равно значение "mas[nt][mn]" на 45 строке из первого поста при выполнении ?.

mas[nt][mn]=5/1; nt=3; mn=2
По поводу сеттеров-геттеров я пытался это сделать(метод puta), но не понял, как вызывать эти меноды для элемента массива. Там ведь уже нельзя так обращаться к методам. Я же не могу написать вроде mas[j][k].getvalue. 
Конструктор копирования вообще там написал на всякий случай, он пустой и ничего не делает, его можно закомментить.
Самое же непонятное, что значение h(46 строка) выводится, а всё что дальше - уже нет.
PM MAIL   Вверх
Result
Дата 8.1.2012, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Значит mas это двумерный массив фрактионов, а не интов?

ЗЫ. Конструктор копирования будет:
Код

fraction(const fraction &v);


Добавлено через 12 минут и 10 секунд
Цитата(johnyblackbird2 @ 8.1.2012,  17:45)
По поводу сеттеров-геттеров я пытался это сделать(метод puta), но не понял, как вызывать эти меноды для элемента массива. Там ведь уже нельзя так обращаться к методам. Я же не могу написать вроде mas[j][k].getvalue. 

Хм...

Код

#include <iostream>

class Some{
   public:
      Some():field_(999){}
      void setValue(int arg){field_ = arg;}
      void print(){
         std::cout << "field = " << field_ << std::endl;
      }
   private:
      int field_;
};

int main(){
   Some s[2][3];
   s[0][0].print();
   s[1][1].print();
   
   s[0][0].setValue(222);
   s[1][1].setValue(333);
   
   s[0][0].print();
   s[1][1].print();
   return 0;
}

PM   Вверх
johnyblackbird2
Дата 8.1.2012, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Значит mas это двумерный массив фрактионов, а не интов?

именно
PM MAIL   Вверх
johnyblackbird2
Дата 8.1.2012, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, насчёт массивов, что-то я тупанул, что нельзя методы так вызывать. Но я всё же хочу узнать, почему падает прога. 
PM MAIL   Вверх
mes
Дата 9.1.2012, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(johnyblackbird2 @  8.1.2012,  16:45 Найти цитируемый пост)
Сейчас исправил,

покажите как ..




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


Новичок



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

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



Цитата

покажите как ..

Убрал & перед перед именем функции прегрузки оператора. Вот так:
Код

fraction  operator/ (const fraction &v);

И так же для +, - и *.
PM MAIL   Вверх
Result
Дата 10.1.2012, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(johnyblackbird2 @ 8.1.2012,  16:17)
Код

 //присваивание
 fraction & fraction::operator= (const fraction &v){
  if (this!= &v){
   a=v.a; b=v.b;
   return *this;
   }
  }

Еще тут заметил неточность, нужно :
Код

fraction & fraction::operator= (const fraction &v){
  if (this!= &v){
    a=v.a; b=v.b;
  }
  return *this;
}

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


Бывалый
*


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

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



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

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

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

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

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


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

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


 




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


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

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