Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
uTorrent
1 / 1 / 1
Регистрация: 14.09.2010
Сообщений: 54
#1

Найти значение 3-го по величине элемента и значение всех элементов массива, которые его превышают, заменить на найденное значение - C++

10.04.2011, 19:05. Просмотров 1952. Ответов 15
Метки нет (Все метки)

Работа с массивами:
0
Миниатюры
Найти значение 3-го по величине элемента и значение всех элементов массива, которые его превышают, заменить на найденное значение  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2011, 19:05
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Найти значение 3-го по величине элемента и значение всех элементов массива, которые его превышают, заменить на найденное значение (C++):

Найти значение 3-го по величине элемента и значения всех элементов массива, которые его превышают, заменить на найденное значение
Найти значение 3-го по величине элемента и значения всех элементов массива,...

Найти количество нулевых элементов массива и заменить их на найденное значение
Задание: Найти количество нулевых элементов и заменить их на найденное...

Ограничить значение всех элементов массива, абсолютные значения которых превышают средние
Огласить масив целых чисел и заполнить его случайными значениями.Размер масива...

найти значение третьего по величине элемента массива
найти значение третьего по величине элемента массива размерность массива 200 ...

Замена всех элементов массива, значение которых превышает среднее значение, максимальным элементом
Написать функцию для замены всех элементов массива значение которых превышает...

Ограничить значение всех элементов, абсолютные значения которых превышают среднее для позитивных и негативных элементов
Помогите пожалуйста с лабораторной Ограничить значение всех элементов,...

15
Rexer
165 / 164 / 46
Регистрация: 10.10.2010
Сообщений: 725
10.04.2011, 19:47 #2
Уважаемый,вы не поленитесь,напишите условие нормально,а не в таком виде,что не разглядеть.
Напишите-постараемся решить,а иначе никак
0
uTorrent
1 / 1 / 1
Регистрация: 14.09.2010
Сообщений: 54
10.04.2011, 22:51  [ТС] #3
Найти значение 3-го по величине элемента и значение всех элементов массива, которые его превышают, заменить на найденное значение
0
Rexer
165 / 164 / 46
Регистрация: 10.10.2010
Сообщений: 725
12.04.2011, 16:30 #4
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
#include<stdlib.h>
#define N 200
int main(void)
{
    int mass[N];
    int i,j,t,max;
    srand(time(NULL));
    for(i = 0;i < N;i++)
        mass[i] = rand() % 100 + 1;
    for(i = 0;i < N;i++)
    printf("%5d",mass[i]);
    max = mass[0];
        for( j = 0;j < N; j++)
        for(i = 0; i < N - j; i++)
            {
                if(mass[i] > mass[i + 1])
                {
                    t = mass[i];
                    mass[i] = mass[i + 1];
                    mass[i + 1] = t;
                }
            }
            printf("\n\n");
for(i = 0;i < N;i++)
    printf("%5d",mass[i]);
}
Выводите элементы 96,97,98,99 - это и будет ответ на вашу задачу
1
popov654
32 / 32 / 7
Регистрация: 09.04.2011
Сообщений: 119
12.04.2011, 17:17 #5
Rexer, элементы могут быть повторяющимися. Нельзя совершенно однозначно сказать, сколько выводить.
Потом, у Вас там по-моему ошибка, надо i в начале цикла принять равным 1, иначебудет выход за границы массива.
И ещё, это не самый оптимальный метод для данной задачи. Если в массиве 100 элементов, сортировка пузырьком (без учёта обменных операций) займёт (1+99) / 2 * 100 = 5000 итераций. Тем временем как при "тупом" подходе с поиском третьего минимума мы решим задачу за 4 прохода, что равносильо 400 итераций + накладные. Но это, согласитесь, быстрее.
1
Rexer
165 / 164 / 46
Регистрация: 10.10.2010
Сообщений: 725
13.04.2011, 13:00 #6
за массив выходить не должно
понятно,что не самый оптимальный,но для меня так легче,напишите свой вариант,если хотите
там написано - вывести третьего по величине и вывести после него три,в условие мое решение подходит,если повторяющиеся нужно,как в условии,все равно выводить после них 3 элемента,я это и делаю.
0
popov654
32 / 32 / 7
Регистрация: 09.04.2011
Сообщений: 119
13.04.2011, 22:33 #7
за массив выходить не должно
Ошибаетесь,
for( j = 0; j < N; j++)
for(i = 0; i < N - j; i++)
{
if(mass[i] > mass[i + 1])
{
t = mass[i];
mass[i] = mass[i + 1];
mass[i + 1] = t;
}
}
Так виднее?) Подставьте 0 во второй цикл вместо j, и посмотрите, что будет

вывести третьего по величине и вывести после него три
Так как Вы узнаете, где третий по величине? Я имею в виду, что первые два могут повторяться заранее неизвестное число раз (на практике как правило в среднем от 1 до 4). Я не увидел в Вашем коде, как эта проблема обходится, вот и всё
2
neske
1527 / 894 / 192
Регистрация: 26.03.2010
Сообщений: 3,074
13.04.2011, 22:52 #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <ctime>
#include <algorithm>
#include <iterator>
 
int rnd (void)
{
    return rand()%100;
}
 
bool sort (int x, int y)
{
    return (x>y);
}
 
int main (void)
{
    const int SIZE = 10; // в вашем случае - 200.
    int MAS [SIZE];
    //
    std::cout << "Start array: ";
    srand (time (NULL));
    std::generate (MAS, MAS+SIZE, rnd);
    std::copy (MAS, MAS+SIZE, std::ostream_iterator <int> (std::cout, " "));
    std::cout << std::endl;
    //
    std::sort (MAS, MAS+SIZE, sort);
    int third = MAS [2];
    std::fill (MAS + 3, MAS + SIZE, third);
    //
    std::cout << "Finish array: ";
    std::copy (MAS, MAS+SIZE, std::ostream_iterator <int> (std::cout, " "));
    std::cout << std::endl;
    std::cout << "The third largest element: " << third;
    std::cout << std::endl;
 
    return 0;
}
0
Rexer
165 / 164 / 46
Регистрация: 10.10.2010
Сообщений: 725
13.04.2011, 23:07 #9
Ой,ошибся,надо не i = 1 только,а j = 1
Очепятался,да,надо добавить условие не повторения,но это просто if дописать и все при выводе
Спасибо за то,что указали на ошибки!
0
popov654
32 / 32 / 7
Регистрация: 09.04.2011
Сообщений: 119
13.04.2011, 23:13 #10
Не, ну Вы даёте...
Та же самая проблема! Ну кто Вам сказал, что третий элемент после сортировки - третий по величине?
Да, и вот спрашивающий не сказал, код нужен на C или C++. C++ я не очень знаю, поэтому могу только на C решение написать...
Но логику-то это не меняет! В общем, код на русском, словами :
Сортируем массив, заводим счётчик, ставим в 1. Заводим две переменных, в одной храним текущее значение, в другой - предыдущее. Присваиваем второй последний элемент сортированного массива, а первой - предпоследний. Далее проверяем переменные на неравенство, если они не равны увеличиваем счётчик, если счётчик стал равен 2, выходим из цикла; "сдвигаем" наши переменные на один индекс назад. Далее идём по массиву обратно до "хвоста" и заменяем все элементы на значение, хранящееся в первой из двух переменных. ВСЁ.

Можно вообще без сортировки сделать, тогда если немного исхитриться и написать побольше кода, можно вообще всё за два прохода сделать: за первый найти третий по величине, за второй - позаменять всё что надо.

Добавлено через 38 секунд
Rexer Не за что

Добавлено через 2 минуты
А, ну да, конечно j, прошу прощения. Я просто привык, что i внешняя и не заметил, что у Вас наоборот)
0
From_Tula
40 / 40 / 10
Регистрация: 22.05.2009
Сообщений: 485
13.04.2011, 23:42 #11
Цитата Сообщение от popov654 Посмотреть сообщение
за первый найти третий по величине
интересно как ты за один проход всего массива найдешь 3 эл-нт по величине без сортировки???
0
Rexer
165 / 164 / 46
Регистрация: 10.10.2010
Сообщений: 725
13.04.2011, 23:47 #12
Мне тоже кажется без сортировки не решить
0
From_Tula
40 / 40 / 10
Регистрация: 22.05.2009
Сообщений: 485
13.04.2011, 23:53 #13
Rexer, без сортировки решается спокойно.
1 шаг, нашли за один проход минемальный эл-нт
2 шаг, нашли за один проход минемальный эл-нт который больше того который нашли в 1 шаге
3 шаг, нашли за один проход минемальный эл-нт который больше того который нашли во 2 шаге
4 шаг, заменили все элементы которые больше того который нашли на 3 шаге.

тут просто вопрос про итерации уже пошел
0
Rexer
165 / 164 / 46
Регистрация: 10.10.2010
Сообщений: 725
13.04.2011, 23:58 #14
Дак разве не проще сделать сортировку?И не парить себе мозг?
прописывать все это муторно уж больно
0
From_Tula
40 / 40 / 10
Регистрация: 22.05.2009
Сообщений: 485
14.04.2011, 00:29 #15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
for(i=0;i<100;i++)
if(mas[i]>max)
max=mas[i];
 
for(j=0;j<3;j++)
{
min=max;
   for(i=0;i<100;i++)
   {
      if(j==0)
      max_p=mas[i]-1;//для первого прохода тока
      
      if(mas[i]<min && mas[i]>max_p)
      {
          min=mas[i];
      }
 
   }
max_p=min;
}
 
max_p;//будет 3 по величине эл-ом
щас компилятора нет под рукой что бы проверить, но примерно выглядеть будет так.
и останется потом тока заменить и всё
0
vlad310362
1 / 1 / 1
Регистрация: 09.02.2013
Сообщений: 18
29.05.2013, 17:06 #16
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define n 200
int main()
{
  int mas[n],zn,i,j,k, max1,max2,max3,x;
  for(i=0;i<n;++i){
    mas[i] = 0+rand()%100;
    printf("%3d ",mas[i]);}
    printf("\n");
    printf("\n");
    getch(); 
  max1 = mas[0];
  max2 = mas[0];
  max3 = mas[0];
  for(i=0;i<n;i++){
  if (mas[i]>max1){max1=mas[i];}
}
printf("max1 %3d\n",max1);
for(i=0;i<n;i++){
if((mas[i]>max2)&&(mas[i]<max1)){max2=mas[i];}
}
printf("max2 %3d\n",max2);
for(i=0;i<n;i++){
if((mas[i]>max3)&&(mas[i]<max2)){max3=mas[i];}
}
printf("max3 %3d\n",max3);
 
for(i=0;i<n;i++){
if(mas[i]>max3){mas[i]=max3;}
printf("%3d ",mas[i]);
}
 max1 = mas[0];
 for(i=0;i<n;i++){
 if (mas[i]>max1){max1=mas[i];}
}
printf("max1 %3d\n",max1);
 
 
getch();                                                     
return 0;
}
0
29.05.2013, 17:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2013, 17:06
Привет! Вот еще темы с решениями:

Заменить максимальное значение массива средним арифметическим его элементов с нечетных позиций
Помогите с задачкой! Голову сломал уже. В одномерном массиве целых чисел...

Найти наименьшее положительное значение элемента массива и его индекс
Дан одномерный числовой массив, все элементы которого различны. Найти...

В одномерном массиве определить среднее значение всех элементов,значение которых превышает среднее значение
в произвольно заданном одномерном массиве определить среднее значение всех...

Найти значение и индексы максимального по абсолютной величине элемента матрицы
Дана прямоугольная матрица b. Найти в ней значение и индексы максимального по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru