Выпуск № 1321 от 02.06.2009, 23:35
Администратор рассылки: Dr_Andrew, Младший модератор
В рассылке: подписчиков - 627, экспертов - 142
В номере: вопросов - 1, ответов - 1
Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке: оценить выпуск >>
Вопрос № 168458: Здравствуйте Уважаемые эксперты. Помогите пожалуйста решить одну проблему. Написать программу, в которой вводится одномерный массив из N целых чисел (n задается пользователем) массив должен быть динамическим.Написать функцию, в которой в ко...
Вопрос № 168458:
Здравствуйте Уважаемые эксперты. Помогите пожалуйста решить одну проблему.
Написать программу, в которой вводится одномерный массив из N целых чисел (n задается пользователем) массив должен быть динамическим.Написать функцию, в которой в конец массива добавляются все элементы, лежащее левее первого нулевого элемента.Вывести полученный массив на экран. Если нулевых элементов нет выдать соответствующее сообщение.
//
Обработчик ошибок выделения памяти int handle_memory(size_t size) { throw bad_alloc(); }
// Шаблонная функция для требуемой по условию операции template<class T> void transport(T* &arr,size_t& length) { // Ищем первый нулевой элемент size_t zeroindex=0; for(size_t i=0;i<length;++i) { if(arr[i]==0) { // Если найден - выходим zeroindex=i; break; } } // Если есть элементы для
копирования if(zeroindex) { // Считаем новый размер массива size_t newLength=zeroindex+length; // Это для того, чтоб мы могли сгенерировать исключение bad_alloc в обработчике // т.к. realloc этого не делает #ifdef _MSC_VER _PNH handler=_set_new_handler(handle_memory); int mode=_set_new_mode(1); #endif // Попытка перераспределить память для массива T* newArr=static_cast<T*>(realloc(arr,sizeof(T)*newLength)); #ifdef _MSC_VER _set_new_mode(mode); _set_new_handler(handler); #endif //
Если операция прошла успешно if(newArr) { // Теперь наш массив может быть в другом месте arr=newArr; // Позиция куда копировать size_t to=length; // Размер массива изменился length=newLength; // Копируем for(size_t i=0;i<zeroindex;++i,++to) { arr[to]=arr[i]; } } } }
int main() { locale::global(locale("russian_r
ussia.866")); srand(static_cast<unsigned int>(time(0))); size_t N=0; // Вводим количество элементов while(true) { wcout<<L"Введите количество элементов в исходном массиве:"; wcin>>N; if(wcin.fail()) { wcout<<L"Ошибочный ввод"; wcin.clear(); wcin.ignore(numeric_limits<streamsize>::max(),L'\n'); } else { wcin.ignore(numeric_limits<streamsize>::max(),L'\n'); break; } } //
Указатель на наш массив int* arr=0; try { // Выделяем память arr=new int[N]; // Заполним массив случайными значениями и распечатаем его wcout<<L"Исходный массив:"<<endl; for(size_t i=0;i<N;++i) { arr[i]=static_cast<int>(static_cast<double>(rand())/RAND_MAX*50-25); wcout<<setw(4)<<arr[i]<<' '; } wcout<<endl;<
br> // Вызов функции для выполнения работы согласно условия transport(arr,N); // Распечатаем результат wcout<<L"Результирующий массив:"<<endl; for(size_t i=0;i<N;++i) { wcout<<setw(4)<<arr[i]<<' '; } wcout<<endl; } catch (bad_alloc) { wcout<<L"Ошибка выделения памяти"<<endl; } if(arr) { // Освободим память delete[] arr; } system("PAUSE"); return
0; }
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.