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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с одномерными массивами 
:(
    Опции темы
Максим1989
Дата 12.6.2011, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте! 
Есть задание на одномерные массивы: 

Сформировать одномерный массив целых чисел используя датчик случайных чисел. 
Распечатать получившийся массив.
Поменять местами min и max элементы.
Удалить из массива все элементы, превышающие его среднее значение более, чем на 10 %.
Распечатать полученный массив. 

Помогите, пожалуйста, кто-нибудь дописать код , не соображу никак.

Код

#include <iostream.h>
#include <conio.h>
#include <stdlib.h>

int main()
{
    const int n = 10;
    int mas[n];

    randomize();
    cout<<"Massiv imeet vid: ";
    for(int i = 0; i < n; i++)
    {
        mas[i] = random(10); // заполняем
        cout << mas[i] << " "; // выводим
    }
    cout << endl;

    int indexMin = 0, indexMax = 0;
    for(int i = 0; i < n; i++) // ищем мин/макс
    {
        if(mas[i] < mas[indexMin]) indexMin = i;
        if(mas[i] > mas[indexMax]) indexMax = i;
    }
    cout << "min = " << mas[indexMin] << endl;
    cout << "max = " << mas[indexMax] << endl;

    // Меняем местами
    int t = mas[indexMin];
    mas[indexMin] = mas[indexMax];
    mas[indexMax] = t;

    // Результат ...
    for(int i = 0; i < n; i++)
    {
        cout << mas[i] << " ";
    }
    cout << endl;
    getch();
    return 0;
}

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



**


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

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



Код

#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
int main()
{
    const int n = 10;
    int mas[n];
    randomize();
    cout<<"Massiv imeet vid: ";
    for(int i = 0; i < n; i++)
    {
        mas[i] = random(10); // заполняем
        cout << mas[i] << " "; // выводим
    }
    cout << endl;
    int indexMin = 0, indexMax = 0;
    int sred = 0;
    for(int i = 0; i < n; i++) // ищем мин/макс
    {
        if(mas[i] < mas[indexMin]) indexMin = i;
        if(mas[i] > mas[indexMax]) indexMax = i;
        sred += mas[i]; // scladyvaem vse elementy
    }
    sred /= n; // srednee zna4enie
    int sred10 = sred + sred/10; // nuzhnye 10% +

    cout << "min = " << mas[indexMin] << endl;
    cout << "max = " << mas[indexMax] << endl;
    // Меняем местами
    int t = mas[indexMin];
    mas[indexMin] = mas[indexMax];
    mas[indexMax] = t;

    for(int i = 0; i < n; ++i)
    {
        if(mas[i] > sred10)
        { 
            for(int j = i ; j < n - 1; ++j) // peremesjaem vse elementy
            {
                mas[j] = mas[j+1];
             }
         }
     }
    // Результат ...
    for(int i = 0; i < n; i++)
    {
        cout << mas[i] << " ";
    }
    cout << endl;
    getch();
    return 0;
}


так же будет удален и max элемент.
PM MAIL   Вверх
volatile
Дата 12.6.2011, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(asmdzen @  12.6.2011,  12:34 Найти цитируемый пост)
  for(int i = 0; i < n; ++i)
    {
        if(mas[i] > sred10)
        { 
            for(int j = i ; j < n - 1; ++j) // peremesjaem vse elementy
            {
                mas[j] = mas[j+1];
             }
         }
     }
Здесь можно очень неплохо соптимизировать...вложенный цикл лишний.


Цитата(asmdzen @  12.6.2011,  12:34 Найти цитируемый пост)
    // Результат ...
    for(int i = 0; i < n; i++)

имхо выведет все n элементов, мы вроде что-то удаляли, разве не так?
PM MAIL   Вверх
Максим1989
Дата 12.6.2011, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



asmdzen. Спасибо большое за отзыв! Вы сделали большую работу, но:
После того как поменялись местами min и max элементы, получившийся массив уже не выводится не экран.
Я много раз запускал программу и увидел что элементы, превышающие его среднее значение более, чем на 10 % не удаляются. (Или очень редко - проверил на калькуляторе).
Скажите, а почему после того как из массива удаляются все элементы, превышающие его среднее значение более, чем на 10 % в массиве всё равно остается 10 чисел?


Это сообщение отредактировал(а) Максим1989 - 12.6.2011, 13:57
PM MAIL   Вверх
asmdzen
Дата 12.6.2011, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


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

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



volatile, покажете как без внутреннего цикла? что-то я запутался, вроде простая задача )
PM MAIL   Вверх
volatile
Дата 13.6.2011, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(asmdzen @  12.6.2011,  15:23 Найти цитируемый пост)
покажете как без внутреннего цикла?

Код

    int src = 0;
    int dst = 0;
    while (src < n)
    {
        if(mas[src] > sred10)
        {
           ++src; 
           continue; // Просто пропускаем элемент, без сдвига оставшегося массива.
        }
        if(src != dst)
           mas[dst] = mas[src];
        ++src;
        ++dst;
     }


Добавлено @ 01:56
Ну и выводим оставшиеся элементы
Код

    // Результат ...
    for(int i = 0; i<dst; i++)
    {
        cout << mas[i] << " ";
    }


Это сообщение отредактировал(а) volatile - 13.6.2011, 02:05
PM MAIL   Вверх
Максим1989
Дата 13.6.2011, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ура!!! Работает!!! (Вроде как надо) Спасибо за помощь!!!
Надеюсь я правильно скомпоновал все исправления?

Код

#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
int main()
{
    const int n = 10;
    int mas[n];
    randomize();
    cout<<"Massiv imeet vid: ";
    for(int i = 0; i < n; i++)
    {
        mas[i] = random(10); // заполняем
        cout << mas[i] << " "; // выводим
    }
    cout << endl;
    int indexMin = 0, indexMax = 0;
    int sred = 0;
    for(int i = 0; i < n; i++) // ищем мин/макс
    {
        if(mas[i] < mas[indexMin]) indexMin = i;
        if(mas[i] > mas[indexMax]) indexMax = i;
        sred += mas[i]; // scladyvaem vse elementy
    }
    sred /= n; // srednee zna4enie
    int sred10 = sred + sred/10; // nuzhnye 10% +
    cout << "min = " << mas[indexMin] << endl;
    cout << "max = " << mas[indexMax] << endl;
    // Меняем местами
    int t = mas[indexMin];
    mas[indexMin] = mas[indexMax];
    mas[indexMax] = t;

    // Результат ...
    for(int i = 0; i < n; i++)
    {
        cout << mas[i] << " ";
    }
    cout << endl;
   //-----------------------
    int src = 0;
    int dst = 0;
    while (src < n)
    {
        if(mas[src] > sred10)
        {
           ++src;
           continue; // Просто пропускаем элемент, без сдвига оставшегося массива.
        }
        if(src != dst)
           mas[dst] = mas[src];
        ++src;
        ++dst;
     }
    // Результат ...
    for(int i = 0; i<dst; i++)
    {
        cout << mas[i] << " ";
    }
   //-----------------------

    getch();
    return 0;
}

А вот это: int src = 0;
                  int dst = 0;
это новые переменные? Как их лучше назвать?
А про такое зарезервированное слово "continue" я даже не слышал! Интересно.

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



**


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

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



сократил )
Код

int dst = 0;
for(int src = 0; s < n; ++s){
   if(mas[src] < sred10)
   {
      if(src != dst) mas[dst] = mas[src];
      ++ dst;
   }
}



Максим1989, чем вас эти названия не устраивают?
PM MAIL   Вверх
Максим1989
Дата 13.6.2011, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо!
PM MAIL   Вверх
bsa
Дата 13.6.2011, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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




M
bsa
Максим1989, если ответ на вопрос получен, то пометь тему решенной


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

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

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

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

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


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

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


 




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


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

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