Задачка по Си++

DELETED
5/16/2006, 6:58:00 PM
В общем,господа компьютерщики,задачка,я уверен,простейшая для программиста,но я - ламер в программировании...Прошу вас,помогите решить!!! За помощь ГАРАНТИРУЮ 4 плюса вам в репутацию, а также 100 сексо на ваш счет,и мою огромную вам благодарность(плюсы в репутацию и сексо - тому,кто решит задачку верно,и напишет решение в этой теме).
А звучит задача следующим образом:
Дан файл f,компоненты которого являются целыми числами...Создать обьект,имеющий метод,позволяющий переписать данный файл таким образом,чтобы не было двух соседних чисел с одним знаком,а числа шли: - положительные - в порядке возрастания, отрицательные - в порядке убывания.
ПРОШУ ВАС,ПОМОГИТЕ!!!
DELETED
5/17/2006, 2:22:26 AM
Лови. Компилировал VS8.0.
drinks.gif

CODE
#include <list>
#include <fstream>
#include <algorithm>
#include <iostream>

class MyClass
{
public:
 void Convert();
};

void MyClass::Convert()
{
 // читаем файл в список и закрываем его
 std::ifstream ifs("f");
 if(!ifs)
 {
   std::cout << "file not found" << std::endl;
   return;
 }

 std::list<int> pnums;
 std::copy(std::istream_iterator<int>(ifs), std::istream_iterator<int>(), std::back_inserter(pnums));
 ifs.close();

 // сортируем числа по возрастанию, копируем отрицательные в другой список и сортируем их по убыванию
 std::list<int> nnums;
 pnums.sort();
 nnums.splice(nnums.begin(), pnums, pnums.begin(), std::find_if(pnums.begin(), pnums.end(), std::bind2nd(std::greater<int>(), -1)));
 nnums.sort(std::greater<int>());

 // если нет положительных или отрицательных чисел - ошибка
 if(nnums.empty() || pnums.empty())
 {
   std::cout << "there are no positive or negative numbers" << std::endl;
   return;
 }

 // получаем итераторы двух списков с выбираем внешние на основе большего количества чисел
 std::list<int>::iterator iit = pnums.begin(), iit_end = pnums.end(), eit = nnums.begin(), eit_end = nnums.end();
 if(pnums.size() > nnums.size())
 {
   std::swap(iit, eit);
   std::swap(iit_end, eit_end);
 }

 // записываем поочередно положительные и отрицательные числа в файл
 std::ofstream ofs("f", std::ios::out | std::ios::trunc);
 for(; eit != eit_end; ++eit)
 {
   ofs << *eit << " " << *iit << " ";
   // в более коротком одном из списков последнее число записывает в файл недостающее число раз для 1-ого условия
   if(iit != iit_end)
     ++iit;
   if(iit == iit_end)
     --iit;
 }
}

int main()
{
 MyClass my;
 my.Convert();
}


Тестировал на файле "f":

1 3 2 -6 878 -67 100 4589 -0


Результат:

0 -6 1 -67 2 -878 3 -878 100 -878 4589 -878
DELETED
5/17/2006, 3:22:27 AM
Вот спасибо!!!
Единственная проблема - мне нужно,чтобы заработало на древнем досовском компиляторе Barland C++ version 3.0...Если заработает,как и обещал,плюсы и сексо(мне эти сексо все равно не нужны)
DELETED
5/17/2006, 3:28:36 AM
(Tanzilit @ 16.05.2006 - время: 23:22) Вот спасибо!!!
Единственная проблема - мне нужно,чтобы заработало на древнем досовском компиляторе Barland C++ version 3.0...Если заработает,как и обещал,плюсы и сексо(мне эти сексо все равно не нужны)
Не заработает :)
Небыло там шаблонов и STL :)

Надо было тебе сразу указывать версию компилятора. А преподу советую прочесть лекцию на тему современных языков программирования.
DELETED
5/17/2006, 3:53:11 AM
кОРОЧЕ ALGORITHM И LIST - ТАКИХ ПОДКЛЮЧАЕМЫХ БИБЛИОТЕК В моем старом компиляторе нет...А мне нужно,чтобы на нем шла...но все равно,спасибо...
p.s.Нельзя ли ту же прогу,но без иопользования этих 2-х подключаемых библиотек???
DELETED
5/17/2006, 4:06:38 AM
Greqz,тебе все равно ОГРОМНОЕ СПАСИБО,извини,что по своей дурости не написал,что надо...
Слушай,ты видимо,программер,и для тебя это раз плюнуть...В общем,если у тебя ADSL интернет...Или у самого есть старый компилятор borland c++ 3.0...В общем...Не мог бы ты сделать,чтобы пошло на старом компиляторе? Просто я не уверен,что преподавателю понравится такой ваниант.как ты предложил...
Что же касается современных языков,то я первокурсник,мы изучаем самые основы,а потом уже,на старших курсах,будем изучать все современное...
DELETED
5/17/2006, 4:07:49 AM
Вот ссылка,по которой можно скачать Borland c++ 3.0
https://underworld.hut1.ru/download/program...++/TURBOC30.rar
Весит ВСЕГо около 2 мегабайтов!!!
DELETED
5/17/2006, 5:55:39 PM
Прошу прощения, но задача не имеет решения, как некорректно поставленная. Во-первых непонятно, что делать, если количество положительных и отрицательных чисел не совпадает, а во-вторых неясно, как трактовать 0, поскольку оный бывает как плюс, так и минус. Да и вообще, за "создать обьект,имеющий метод" на месте клавиатурами убивать надо. :) Во времена моей учебы преподаватель, уличенный в некорректности постановки задачи, автоматом в репу плюс :) записывал.


Я не умничаю, мне просто интересно, как можно сделать то, чего сделать нельзя? Вы просто подумайте, КАК можно переписать файл, состоящий только из последовательности цифры 0 и пробелов (отвечает условиям задачи), чтобы он соответствовал условию той же задачи??? Я плакаль (с).

Так что по примеру GregZ'а советую преподу "убей сибя ап стену!"...
AngeLR
5/17/2006, 6:21:04 PM
(JeyLo @ 17.05.2006 - время: 13:55) Прошу прощения, но задача не имеет решения, как некорректно поставленная. Во-первых непонятно, что делать, если количество положительных и отрицательных чисел не совпадает, а во-вторых неясно, как трактовать 0, поскольку оный бывает как плюс, так и минус. Да и вообще, за "создать обьект,имеющий метод" на месте клавиатурами убивать надо. :) Во времена моей учебы преподаватель, уличенный в некорректности постановки задачи, автоматом в репу плюс :) записывал.


Я не умничаю, мне просто интересно, как можно сделать то, чего сделать нельзя? Вы просто подумайте, КАК можно переписать файл, состоящий только из последовательности цифры 0 и пробелов (отвечает условиям задачи), чтобы он соответствовал условию той же задачи??? Я плакаль (с).

Так что по примеру GregZ'а советую преподу "убей сибя ап стену!"...
Гы... а я уже не реагирую, у сестры моей жены подобный препод, ни одной задачи грамотно поставить не может, но упорно пытается... меня это уже просто умиляет... как говорится - сказочный долбо*б © smile.gif
WorldSin
5/17/2006, 8:28:51 PM
У нас препод тоже долб.Рассказывает всё,но почему то никто не понимает:)
А тё советую всё таки показать хоть такую версию.
+ от препода получишь,да и репутацию в его глазах тоже повысишь(типо - во умеет парень програмировать).
DELETED
5/18/2006, 3:06:44 AM
(Tanzilit @ 17.05.2006 - время: 00:07)Вот ссылка,по которой можно скачать Borland c++ 3.0
https://underworld.hut1.ru/download/program...++/TURBOC30.rar
Весит ВСЕГо около 2 мегабайтов!!!
Сори, не за репутацию и сексо делал. Просто выдалась свободная минутка. Боюсь для старого борланда не смогу написать - банально нет времени. Могу для тебя откомпилировать этот код под DOS другим современным досовым компилятором - djgpp. По крайней мере сможет продемонстрировать функциональность преподавателю. Если что - обращайся. Либо здесь, либо стучись в аську. Информация в профайле.
DELETED
5/18/2006, 10:09:34 PM
(GregZ @ 18.05.2006 - время: 00:06) (Tanzilit @ 17.05.2006 - время: 00:07)Вот ссылка,по которой можно скачать Borland c++ 3.0
https://underworld.hut1.ru/download/program...++/TURBOC30.rar
Весит ВСЕГо около 2 мегабайтов!!!
Сори, не за репутацию и сексо делал. Просто выдалась свободная минутка. Боюсь для старого борланда не смогу написать - банально нет времени. Могу для тебя откомпилировать этот код под DOS другим современным досовым компилятором - djgpp. По крайней мере сможет продемонстрировать функциональность преподавателю. Если что - обращайся. Либо здесь, либо стучись в аську. Информация в профайле.
Откомпилируй,пожалуйста...
Очень поможешь....
Буду весьма благодарен...
DELETED
5/19/2006, 12:08:45 AM
(Tanzilit @ 18.05.2006 - время: 18:09) Откомпилируй,пожалуйста...
Очень поможешь....
Буду весьма благодарен...
Теперь только завтра.
На RSDN правильно обратился, но там тебе сначала косточки перемоют :) сам не рад будешь.
DELETED
5/19/2006, 3:22:21 PM
Скачал... Аж слезы на глазах... Ностальгияяяяяя..... В аттачменте скомпилированный этим самым TC...

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <memory.h>

// Что-то странное :)
#define max(a,b) (( a > b ) ? a : b )

// Класс, экземпляр которого (объект) и будет создан
class CMyObject {
public:
// Конструктор
CMyObject ( char* szFileName = 0 ) : m_szFileName(0) {
  SetFile ( szFileName );
};

// Установить имя файла
void SetFile ( char* szFileName ) {
  if ( m_szFileName ) delete m_szFileName;
  m_szFileName = 0;
  if ( szFileName ) {
  if ( m_szFileName = new char ) {
    strcpy (m_szFileName, szFileName );
  };
  }
};

int Convert ( char* szFileName = 0 ) {
  // Устанавливаем имя файла
  if ( szFileName ) SetFile (szFileName);
  // Проверяем валидность..
  if ( !m_szFileName ) return -1;

  // И начинаем
  // Массив позитивных чисел
  int* pPositiveNumbers = 0; int nPositiveNumbers = 0;

  // Массив отрицательных чисел
  // 0 записываем в положительные
  int* pNegativeNumbers = 0; int nNegativeNumbers = 0;

  FILE *stream;
  char buffer; // Хватит-с..
  int  i = 0;  // На всякий случай...

  // Откроем поток для чтения
  if( !( stream = fopen( m_szFileName, "r" )) ) {
  printf ( "Файл не найден." ); // ... Убей сибя ап стену!
  return 0;
  };

  // Навсегда...
  int bIsEof = 1;
  while ( bIsEof ) {
  // Начинаем-с читать...
  buffer = fgetc( stream );
  if ( buffer == ' ' || buffer == EOF ) {
    if (  buffer == EOF ) {
    bIsEof = 0;
    };
    buffer = 0;
    int nYetAnotherNumber;
    if ( ( nYetAnotherNumber = atoi ( buffer ) ) > 0 ) {
    if ( !( nPositiveNumbers = insertItem ( pPositiveNumbers, nPositiveNumbers, nYetAnotherNumber ) ) ) {
      // Ну все, приехали... Память кончилась, пришел старческий маразм..
      exit(0);
    };
    } else {
    if ( !( nNegativeNumbers = insertItem ( pNegativeNumbers, nNegativeNumbers, nYetAnotherNumber ) ) ) {
      // Ну все, приехали... Память кончилась, пришел старческий маразм..
      exit(0);
    };
    };

    i = -1;
  } else if ( i > 11 || ( ( buffer < '0' || buffer > '9' ) && buffer != '-' ) || (buffer == '-' && i != 0) ) {
    fclose ( stream );
    if ( pPositiveNumbers ) delete pPositiveNumbers;
    if ( pNegativeNumbers ) delete pNegativeNumbers;
    printf ( "Файл имеет неправильный формат." ); // ... Убей сибя ап стену - 2!
    return 0;
  }
  i++;

  };

  // Закрываемся...
  fclose ( stream );

  // Код возврата
  int nResult = 0;

  if ( nNegativeNumbers == nPositiveNumbers || nNegativeNumbers-1 == nPositiveNumbers || nNegativeNumbers+1 == nPositiveNumbers ) {
  if( ( stream = fopen( m_szFileName, "w" )) ) {
    for ( int i = 0; i < max(nNegativeNumbers, nPositiveNumbers); i ++ ) {
    if ( i < nPositiveNumbers ) {
      fprintf ( stream, "%d ", pPositiveNumbers );
    };
    if ( nNegativeNumbers - i > 0 ) {
      fprintf ( stream, "%d ", pNegativeNumbers );
    };
    };
    fclose ( stream );
    printf ( "Готово!" );
    nResult = 1;
  } else {
    printf ( "Невозможно открыть файл на запись." );
  };
  } else {
  printf ( "Количество положительных и отрицательных чисел не совпадает." ); // ... Убей сибя ап стену - 3!
  };

  if ( pPositiveNumbers ) delete pPositiveNumbers;
  if ( pNegativeNumbers ) delete pNegativeNumbers;

  return nResult;
};

// Деструктор
~CMyObject () {
  if ( m_szFileName ) delete m_szFileName;
};

private:
// Имя файла
char* m_szFileName;

public:
// Вставить элемент в массив
int insertItem ( int* &pArray, int nSize, int nItem ) {
  // Если массив еще пуст, то делаем все быстро.
  if ( !nSize ) {
  return ( pArray = new int) ? pArray = nItem , 1: 0;
  };

  // Декларация переменных
  int* pNewArray = 0;
  // Выделяем память для нового массива данных
  if ( !(pNewArray = new int) ) {
  // Ошибка выделения памяти. Все в сад смотреть на звезды lil' wink.gif
  delete pArray;
  return 0;
  };

  // Переносимся
  memcpy ( pNewArray, pArray, ( nSize + 1 ) * sizeof(int) );
  delete pArray;
  pArray = pNewArray;

  // Чуть-чуть задекларируемся
  int nInjectionPoint = nSize;
  pArray = nItem;

  // Наш элемент всплывает вверх
  // с помощью простейшей пузырьковой сортировки
  while ( nInjectionPoint ) {
  if ( pArray < pArray ) {
    int nYetAnotherVariable = pArray;
    pArray = pArray;
    pArray = nYetAnotherVariable;
  };
  nInjectionPoint--;
  };

  // Уходим, уходим, уходим....
  return nSize+1;
}
};


int main(int argc, char* argv) {

// А аргументики где?
if ( argc < 2 ) {
  printf ( "Параметр использования: JustTask имя_файла" );
  return 0;
};

// Создаем объект
CMyObject* pObject = new CMyObject ( argv );
if ( pObject ) {
  if ( pObject->Convert() ) {
  // Все хорошо, все сконвертировалось
  };
  delete pObject;
};


return 0;
}

DELETED
5/19/2006, 5:59:11 PM
Будет ошибка при наличии в исходном файле пробела после последнего числа. Появится лишний ноль.

- для чтения можно было использовать fscanf, вышло бы короче
CODE
   for(int nYetAnotherNumber; fscanf(stream, "%d", &nYetAnotherNumber) != EOF;)
   {
     // добавление числа
   }


- для изменения размера выделенной под массив памяти есть функция realloc
DELETED
5/19/2006, 6:58:21 PM
(GregZ @ 19.05.2006 - время: 13:59) Будет ошибка при наличии в исходном файле пробела после последнего числа. Появится лишний ноль.

- для чтения можно было использовать fscanf, вышло бы короче
CODE
   for(int nYetAnotherNumber; fscanf(stream, "%d", &nYetAnotherNumber) != EOF;)
   {
     // добавление числа
   }


- для изменения размера выделенной под массив памяти есть функция realloc
Даааа... Вы действительно еще дымитесь... :))

Не было цели "укоротить" или "realloc" использовать. Вы тогда еще про qsort напомните мне, про isdigit и прочая-прочая-прочая... Вообще нужно было даже fprintf и atoi не использовать. Да, можно и укоротить.. Думаю строк до традцати, используя стандартные библиотеки (STL - это на то время совсем не стандарт)... Но зачем? Человек должен и хотя бы понять, как оно все работает. И научиться обрабатывать ошибки, а то получаются всякие неучи... Лишь бы "написать", а там хоть трава не расти...

Не нервничайте, никто не хочет никому ничего доказать. :) А про пробел - ну так вместо "if ( buffer == ' ' || buffer == EOF ) {" напишите "if ( ( buffer == ' ' && i ) || buffer == EOF ) {" и все... Тоже мне, проблема... :)
DELETED
5/20/2006, 12:05:06 AM
drinks.gif Ничего личного, просто заметил небольшую ошибку, вот и сообщил.


Даааа... Вы действительно еще дымитесь... :))


mellow.gif Не понял, что Вы хотели сказать?
tetro
5/22/2006, 9:26:25 PM
К слову, так я таки был х лет университеским ассистентом, и скажу, что я лично за Гришино решение вполне вкатал бы баранку с просьбой подойти на беседу. (При том что оно мне вполне нравится).

Есть некий ожидаемый уровень решения для человека. Чел который пишет такие вопросы программирует без-году неделю. Вопрос на уровне курса: "Вдение в программирование" или скажем следующий за ним. У нас это был второй скажем семестр (примерно в это время 2й-3й месяц учебы). А вы тут STL. Хоть и люблю я его.

Это явное решение на уровне человека с заметным х-летним опытом.
Помните была шутка кто как пишет "Hello world!". Так вот это именно типичный senior programmer wink.gif
tetro
5/22/2006, 9:37:41 PM
Да вдогонку JeyLo по поводу некорректоностей, но в качестве унивеситеского ассистента. Мой типичный ответ, который я давал при раздаче первой домашки: все неточности в формулировках имеете право трактовать как вам более удобно (но консистентно). Часто нет желания писать длинную простыню оговорок и спец. трактовок граничных случаев: получается длиннее, чем решение. Да и человек должен учиться видеть проблемы сам.
DELETED
5/23/2006, 4:29:07 AM
(tetro @ 22.05.2006 - время: 17:26) Это явное решение на уровне человека с заметным х-летним опытом.
Помните была шутка кто как пишет "Hello world!". Так вот это именно типичный senior programmer wink.gif
Что Вы, я не усложнял совершенно. Все на уровне базовых знаний STL.
Вот если бы замутить итераторы в нужно порядке... Этот паттерн так и просится сюда для обхода элементов списка. Тогда да...