Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Micren
Статус: Практикант
Рейтинг: 248
∙ повысить рейтинг >>
Лысков Игорь Витальевич
Статус: Младший модератор
Рейтинг: 205
∙ повысить рейтинг >>
_Ayl_
Статус: 3-й класс
Рейтинг: 104
∙ повысить рейтинг >>

∙ / КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 1321 от 02.06.2009, 23:35
Администратор рассылки: Dr_Andrew, Младший модератор
В рассылке: подписчиков - 627, экспертов - 142
В номере: вопросов - 1, ответов - 1

Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке:
оценить выпуск >>

Вопрос № 168458: Здравствуйте Уважаемые эксперты. Помогите пожалуйста решить одну проблему. Написать программу, в которой вводится одномерный массив из N целых чисел (n задается пользователем) массив должен быть динамическим.Написать функцию, в которой в ко...



Вопрос № 168458:

Здравствуйте Уважаемые эксперты. Помогите пожалуйста решить одну проблему.

Написать программу, в которой вводится одномерный массив из N целых чисел (n задается пользователем)
массив должен быть динамическим.Написать функцию, в которой в конец массива добавляются все элементы, лежащее левее первого нулевого элемента.Вывести полученный массив на экран.
Если нулевых элементов нет выдать соответствующее сообщение.

Отправлен: 28.05.2009, 19:35
Вопрос задал: Ходин Артем Андреевич, Посетитель
Всего ответов: 1
Страница вопроса >>


Отвечает Micren, Практикант :
Здравствуйте, Ходин Артем Андреевич.
Программа C++:
Код:

#include <locale>
#include <limits>
#include <iostream>
#include <new.h>
#include <iomanip>
#include <ctime>
#include <cstdlib>

using namespace std;

// Обработчик ошибок выделения памяти
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;
}

Проверял MS VS 2008
Пример работы:
Код:

Введите количество элементов в исходном массиве:20
Исходный массив:
-6 -15 -3 -5 14 24 4 18 5 0 -15 -14 6 -11 -12 -1
-7 12 -16 -11
Результирующий массив:
-6 -15 -3 -5 14 24 4 18 5 0 -15 -14 6 -11 -12 -1
-7 12 -16 -11 -6 -15 -3 -5 14 24 4 18 5

Ответ отправил: Micren, Практикант
Ответ отправлен: 29.05.2009, 00:20

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 249996 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!



    Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке:
    оценить выпуск >>

    подать вопрос экспертам этой рассылки >>

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров >>

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.0 beta от 24.05.2009

    В избранное