В общем,господа компьютерщики,задачка,я уверен,простейшая для программиста,но я - ламер в программировании...Прошу вас,помогите решить!!! За помощь ГАРАНТИРУЮ 4 плюса вам в репутацию, а также 100 сексо на ваш счет,и мою огромную вам благодарность(плюсы в репутацию и сексо - тому,кто решит задачку верно,и напишет решение в этой теме). А звучит задача следующим образом: Дан файл f,компоненты которого являются целыми числами...Создать обьект,имеющий метод,позволяющий переписать данный файл таким образом,чтобы не было двух соседних чисел с одним знаком,а числа шли: - положительные - в порядке возрастания, отрицательные - в порядке убывания. ПРОШУ ВАС,ПОМОГИТЕ!!!
Это сообщение отредактировал Tanzilit - 16-05-2006 - 17:08
void MyClass::Convert() { // читаем файл в список и закрываем его std::ifstream ifs("f"); if(!ifs) { std::cout << "file not found" << std::endl; return; }
// сортируем числа по возрастанию, копируем отрицательные в другой список и сортируем их по убыванию 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":
QUOTE
1 3 2 -6 878 -67 100 4589 -0
Результат:
QUOTE
0 -6 1 -67 2 -878 3 -878 100 -878 4589 -878
Это сообщение отредактировал GregZ - 16-05-2006 - 22:27
Tanzilit
Вот спасибо!!! Единственная проблема - мне нужно,чтобы заработало на древнем досовском компиляторе Barland C++ version 3.0...Если заработает,как и обещал,плюсы и сексо(мне эти сексо все равно не нужны)
GregZ
QUOTE (Tanzilit @ 16.05.2006 - время: 23:22)
Вот спасибо!!! Единственная проблема - мне нужно,чтобы заработало на древнем досовском компиляторе Barland C++ version 3.0...Если заработает,как и обещал,плюсы и сексо(мне эти сексо все равно не нужны)
Не заработает :) Небыло там шаблонов и STL :)
Надо было тебе сразу указывать версию компилятора. А преподу советую прочесть лекцию на тему современных языков программирования.
Tanzilit
кОРОЧЕ ALGORITHM И LIST - ТАКИХ ПОДКЛЮЧАЕМЫХ БИБЛИОТЕК В моем старом компиляторе нет...А мне нужно,чтобы на нем шла...но все равно,спасибо... p.s.Нельзя ли ту же прогу,но без иопользования этих 2-х подключаемых библиотек???
Tanzilit
Greqz,тебе все равно ОГРОМНОЕ СПАСИБО,извини,что по своей дурости не написал,что надо... Слушай,ты видимо,программер,и для тебя это раз плюнуть...В общем,если у тебя ADSL интернет...Или у самого есть старый компилятор borland c++ 3.0...В общем...Не мог бы ты сделать,чтобы пошло на старом компиляторе? Просто я не уверен,что преподавателю понравится такой ваниант.как ты предложил... Что же касается современных языков,то я первокурсник,мы изучаем самые основы,а потом уже,на старших курсах,будем изучать все современное...
Прошу прощения, но задача не имеет решения, как некорректно поставленная. Во-первых непонятно, что делать, если количество положительных и отрицательных чисел не совпадает, а во-вторых неясно, как трактовать 0, поскольку оный бывает как плюс, так и минус. Да и вообще, за "создать обьект,имеющий метод" на месте клавиатурами убивать надо. :) Во времена моей учебы преподаватель, уличенный в некорректности постановки задачи, автоматом в репу плюс :) записывал.
Я не умничаю, мне просто интересно, как можно сделать то, чего сделать нельзя? Вы просто подумайте, КАК можно переписать файл, состоящий только из последовательности цифры 0 и пробелов (отвечает условиям задачи), чтобы он соответствовал условию той же задачи??? Я плакаль (с).
Так что по примеру GregZ'а советую преподу "убей сибя ап стену!"...
AngeLR
QUOTE (JeyLo @ 17.05.2006 - время: 13:55)
Прошу прощения, но задача не имеет решения, как некорректно поставленная. Во-первых непонятно, что делать, если количество положительных и отрицательных чисел не совпадает, а во-вторых неясно, как трактовать 0, поскольку оный бывает как плюс, так и минус. Да и вообще, за "создать обьект,имеющий метод" на месте клавиатурами убивать надо. :) Во времена моей учебы преподаватель, уличенный в некорректности постановки задачи, автоматом в репу плюс :) записывал.
Я не умничаю, мне просто интересно, как можно сделать то, чего сделать нельзя? Вы просто подумайте, КАК можно переписать файл, состоящий только из последовательности цифры 0 и пробелов (отвечает условиям задачи), чтобы он соответствовал условию той же задачи??? Я плакаль (с).
Так что по примеру GregZ'а советую преподу "убей сибя ап стену!"...
У нас препод тоже долб.Рассказывает всё,но почему то никто не понимает:) А тё советую всё таки показать хоть такую версию. + от препода получишь,да и репутацию в его глазах тоже повысишь(типо - во умеет парень програмировать).
Сори, не за репутацию и сексо делал. Просто выдалась свободная минутка. Боюсь для старого борланда не смогу написать - банально нет времени. Могу для тебя откомпилировать этот код под DOS другим современным досовым компилятором - djgpp. По крайней мере сможет продемонстрировать функциональность преподавателю. Если что - обращайся. Либо здесь, либо стучись в аську. Информация в профайле.
Сори, не за репутацию и сексо делал. Просто выдалась свободная минутка. Боюсь для старого борланда не смогу написать - банально нет времени. Могу для тебя откомпилировать этот код под DOS другим современным досовым компилятором - djgpp. По крайней мере сможет продемонстрировать функциональность преподавателю. Если что - обращайся. Либо здесь, либо стучись в аську. Информация в профайле.
Откомпилируй,пожалуйста... Очень поможешь.... Буду весьма благодарен...
GregZ
QUOTE (Tanzilit @ 18.05.2006 - время: 18:09)
Откомпилируй,пожалуйста... Очень поможешь.... Буду весьма благодарен...
Теперь только завтра. На RSDN правильно обратился, но там тебе сначала косточки перемоют :) сам не рад будешь.
JeyLo
Скачал... Аж слезы на глазах... Ностальгияяяяяя..... В аттачменте скомпилированный этим самым TC...
public: // Вставить элемент в массив int insertItem ( int* &pArray, int nSize, int nItem ) { // Если массив еще пуст, то делаем все быстро. if ( !nSize ) { return ( pArray = new int[1]) ? pArray[0] = nItem , 1: 0; };
// Декларация переменных int* pNewArray = 0; // Выделяем память для нового массива данных if ( !(pNewArray = new int[nSize+1]) ) { // Ошибка выделения памяти. Все в сад смотреть на звезды lil' delete pArray; return 0; };
// Чуть-чуть задекларируемся int nInjectionPoint = nSize; pArray[nInjectionPoint] = nItem;
// Наш элемент всплывает вверх // с помощью простейшей пузырьковой сортировки while ( nInjectionPoint ) { if ( pArray[nInjectionPoint] < pArray[nInjectionPoint-1] ) { int nYetAnotherVariable = pArray[nInjectionPoint]; pArray[nInjectionPoint] = pArray[nInjectionPoint-1]; pArray[nInjectionPoint-1] = nYetAnotherVariable; }; nInjectionPoint--; };
// Создаем объект CMyObject* pObject = new CMyObject ( argv[1] ); if ( pObject ) { if ( pObject->Convert() ) { // Все хорошо, все сконвертировалось }; delete pObject; };
Не было цели "укоротить" или "realloc" использовать. Вы тогда еще про qsort напомните мне, про isdigit и прочая-прочая-прочая... Вообще нужно было даже fprintf и atoi не использовать. Да, можно и укоротить.. Думаю строк до традцати, используя стандартные библиотеки (STL - это на то время совсем не стандарт)... Но зачем? Человек должен и хотя бы понять, как оно все работает. И научиться обрабатывать ошибки, а то получаются всякие неучи... Лишь бы "написать", а там хоть трава не расти...
Не нервничайте, никто не хочет никому ничего доказать. :) А про пробел - ну так вместо "if ( buffer[i] == ' ' || buffer[i] == EOF ) {" напишите "if ( ( buffer[i] == ' ' && i ) || buffer[i] == EOF ) {" и все... Тоже мне, проблема... :)
GregZ
Ничего личного, просто заметил небольшую ошибку, вот и сообщил.
К слову, так я таки был х лет университеским ассистентом, и скажу, что я лично за Гришино решение вполне вкатал бы баранку с просьбой подойти на беседу. (При том что оно мне вполне нравится).
Есть некий ожидаемый уровень решения для человека. Чел который пишет такие вопросы программирует без-году неделю. Вопрос на уровне курса: "Вдение в программирование" или скажем следующий за ним. У нас это был второй скажем семестр (примерно в это время 2й-3й месяц учебы). А вы тут STL. Хоть и люблю я его.
Это явное решение на уровне человека с заметным х-летним опытом. Помните была шутка кто как пишет "Hello world!". Так вот это именно типичный senior programmer
tetro
Да вдогонку JeyLo по поводу некорректоностей, но в качестве унивеситеского ассистента. Мой типичный ответ, который я давал при раздаче первой домашки: все неточности в формулировках имеете право трактовать как вам более удобно (но консистентно). Часто нет желания писать длинную простыню оговорок и спец. трактовок граничных случаев: получается длиннее, чем решение. Да и человек должен учиться видеть проблемы сам.
GregZ
QUOTE (tetro @ 22.05.2006 - время: 17:26)
Это явное решение на уровне человека с заметным х-летним опытом. Помните была шутка кто как пишет "Hello world!". Так вот это именно типичный senior programmer
Что Вы, я не усложнял совершенно. Все на уровне базовых знаний STL. Вот если бы замутить итераторы в нужно порядке... Этот паттерн так и просится сюда для обхода элементов списка. Тогда да...
JeyLo
QUOTE (GregZ @ 23.05.2006 - время: 00:29)
Что Вы, я не усложнял совершенно.
2GregZ: Реалии таковы, что не все такие как Вы, GregZ.... Подавляющему большинству программистов (а как же 1С?) даже элементарные темплейты в тягость. А Вы про усложнение.. :) Впрочем не буду ломать стереотипы.
2Tetro: Одно дело неточности, это да, согласен... Тут же задача из серии "ну замутите мне чё..."
tetro
GregZ, милейший, вы мне отвечаете на уровне: "я не понимаю что здесь можно не понимать..." Напомнили мне одного моего приятеля, который будучи в армии зарабатывал пописывая статьи по программирования в Dr. Dobbs. Я не говорю что решение сложно, я говорю, что оно не соответсвует по применяемым методам ожидаемому уровню: т.е. если Чел бы подошел ко мне и ответил на наводящие вопросы по основам STL то 100 его, а вот если нет, то увы списал :(
2JeyLo: А почему бы нет: для 1-2 семестра и даже далее вполне. Т.е. условия приближенные к реальным: точные формулировки никто не обещал: учитесь приводить задачу к решаемому уровню. Здесь вполне случай, что если описать все хвосты, то проще написать решение...
Более того учитесь читать задачу глазами специалиста: понимать где главная линия, а где детали. Т.е. я заранее согласен, что вы __все__ детали протрактуете как вам будет удобнее, но разумно. Например, лишние числа одного из знаков в хвост (остаток - не волнует), 0 может быть или только положительным или только отрицательным или любым но конкретный 0 всегда имеет некий знак (т.е. перед всеми 0 можно поставить знак в соответствии с их трактовкой)
Это сообщение отредактировал tetro - 24-05-2006 - 12:05