Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 99, средняя оценка - 4.95
Shman
3 / 3 / 2
Регистрация: 30.04.2012
Сообщений: 212
26.05.2012, 11:25     Найти в массиве минимальный и максимальный элементы. Вывести последовательность значений из этого диапазона, не встречающихся в данном массиве #1
Найти в массиве минимальный и максимальный элементы.
Вывести последовательность значений из этого диапазона, не встречающихся в данном массиве.

Мин и макс элементы я нашел, а как выполнить вторую част задания? Точнее что это за последовательность такая? И какой массив имеется ввиду под данным? С мин и макс. элементами или без них? Вот наработка:

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
#include <stdio.h> // Подключаем
#include <conio.h> // модули.
 
const int N = 5;
int main()
{     
 int mass[N]; 
 int i, min, max; 
 
 printf(" Vvedite massiv iz 5 elementov: \n"); 
 
  for (i=0; i<N; i++) 
   { printf(" Vvedite element[%d]: ", i);
     scanf("%d", &mass[i]); }
 
  /* Нахождение минимального элемента */
  min=mass[0]; // Первый элемент принимаем за минимальный.
  for(i=1; i<N; i++) 
   if(mass[i]<min) // Если следущий элемент меньше минимального, то...
    { min=mass[i]; } // назначаем его минимальным.
      
   /* Ннахождение максимального элемента */
  max=mass[0]; // Первый элемент принимаем за максимальный.
  for(i=1; i<N; i++) 
   if (mass[i]>max) // Если следущий элемент больше максимального, то...
   { max=mass[i]; } // назначаем его максимальным.
   
  printf("\n Min element = %d.", min); // Выводим минимальный элемент.
  printf("\n Max element = %d.", max); // Выводим минимальный элемент.
  
 getch(); 
 return 0; 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2012, 11:25     Найти в массиве минимальный и максимальный элементы. Вывести последовательность значений из этого диапазона, не встречающихся в данном массиве
Посмотрите здесь:

найти максимальное из чисел встречающихся в данном одномерном массиве более одного раза C++
Переставить максимальный и минимальный элементы в массиве. C++
C++ Найти в массиве максимальный и минимальный элементы в массиве и их количество
C++ максимальный и минимальный элементы в линейном массиве
Переставить максимальный и минимальный элементы в массиве C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Venzo
 Аватар для Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
26.05.2012, 11:46     Найти в массиве минимальный и максимальный элементы. Вывести последовательность значений из этого диапазона, не встречающихся в данном массиве #2
допустим у вас массив 5 2 7 8 1 9
min = 1, max = 9
если я правильно понял, то нужно вывести элементы 3 4 6

Можно брать числа, отличающиеся на 1 от предыдущего(начальный - больше на 1 от максимального)
т.е берете вначале min+1 - ищите его в массиве, если не найден, то выводите; затем ищите min+2, min+3 и т.д, пока min+i < max

Можно отсортировать массив. Затем, просматривая массив, проверять на равенство предыдущему просмотренному.
5 2 7 8 1 9
после сортировки
1 2 5 7 8 9
берем min+1 и a[1], равны, идем дальше
берем min+2 и a[2], не равны, печатаем min+2
берем min+3 и a[2], не равны, печатаем min+3
берем min+4 и a[2], равны, идем дальше
берем min+5 и a[3], не равны, печатаем
берем min+6 и a[3], равны, идем дальше

и так далее. думаю 2й вариант получше будет, хотя он тоже не айс

можно еще смотреть разность между соседними элементами(после сортировки) и от этого плясать. a[1]-a[0]=1, значит идем дальше
a[2]-a[1]=3, делаем цикл, печатающий (3-1) элементов: (a[1]+1), (a[1]+2)
и так далее.
Shman
3 / 3 / 2
Регистрация: 30.04.2012
Сообщений: 212
26.05.2012, 17:28  [ТС]     Найти в массиве минимальный и максимальный элементы. Вывести последовательность значений из этого диапазона, не встречающихся в данном массиве #3
Пытался что-то придумать без сортировки, но не работает . Помогите исправить код. Ручной ввод массива временно отключил.

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <stdio.h>
#include <conio.h> 
 
const int N = 5;
int main()
{     
 int 
 mass[N]={8, 6, 9, 2, 4,}; 
 int i, j, min, max, buffer; 
 bool FlagOk, Flag;
 
 /* printf(" Vvedite massiv iz 5 elementov: \n");
 
   for (i=0; i<N; i++) 
   { printf(" Vvedite element[%d]: ", i);
     scanf("%d", &mass[i]); } 
 */
 
  printf("\n Ishodniy massiv: "); 
  for (int i=0; i<N; i++)
  { printf("%d. ", mass[i]); } 
 
  Flag=false; // Устанавливаем флаг на ложь.
  min=0; max=0; // Обнуляем минимальное и максимальное значения.
 
  /* Нахождение минимального и максимального элементов */
  for(i=1; i<N; i++) 
   { if(mass[i] < mass[min])  // Если следущий элемент меньше минимального, то...
      { min=i; } // назначаем его минимальным.
     if(mass[i] > mass[max])  // Если следущий элемент больше максимального, то...   
      { max=i; } // назначаем его минимальным.
   }
  printf("\n \n Min element = %d.", mass[min]); // Выводим минимальный элемент.
  printf("\n \n Max element = %d.", mass[max]); // Выводим максимальный элемент.
 
  /* Поиск целых чисел между мин. и макс. элементами, которых нет в массиве */
  Flag=false; // Отмечаем, что искомые числа пока не найдены.
  for (i=mass[min]+1; i<mass[max]-1; i++) /*  Т.к. мин. и макс. элементы по условию 
                                              не должны принадлежать промежутку, 
                                              то и цикл начинается с числа больше 
                                              минимального на 1 и заканчивается 
                                              числом меньшим максимального на 1.
                                           */
   { FlagOk=true; // Предполагать, что текущее целое число будет одним из искомых.
     for(j=1; j<N; j++)
      { if (mass[j]=i) /*  Проверяеть есть ли среди элементов данного массива элемент, 
                           равный предполагаемому. Если равный есть, то... 
                       */
       { FlagOk = false; // значит, что число не является искомым и...
         break; } // цикл проверки данного числа прекратить и перейти к следующему числу.         
       if ((Flag = false) && (FlagOk)) /* Если же равный элемент в массиве не был найден, 
                                          и такой элемент оказался первым найденным, тогда...
                                       */                                       
        { Flag = true; // Отмечается, что хотя бы одно число уже найдено.
        printf("\n \n Celye chisla meghdu min & max elem. kotoryh net v massive: "); } /* Ввыести
                                 целые числа между мин. и макс элементами, которых нет в массиве. */                                         
       if (FlagOk) // Если же равный элемент не был найден в данном массива, тогда...
        { printf(" %d.", i); } // вывести это число.
      }
   }
   if (Flag=false) // Если же ни одного искомого числа не было найдено, тогда...   
    { printf("\n \n Celye chisel megdu min. & max. elem. massiva net"); } /* вывести
                     сообщение, что чисел между мин. и макс.  элементами массива нет. */
  
 getch(); 
 return 0; 
}
Мин и макс число находит и выводит, а дельше никак . ПОМОГИТЕ НАЙТИ ОШИБКУ!
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
26.05.2012, 17:40     Найти в массиве минимальный и максимальный элементы. Вывести последовательность значений из этого диапазона, не встречающихся в данном массиве #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <algorithm>
#include <iterator>
 
int main()
{
    int arr[] = {5, 2, 7, 8, 1, 9};
    const std::size_t N = sizeof(arr) / sizeof(*arr);
    std::copy(arr, arr + N, std::ostream_iterator<int>(std::cout, " ") );
    std::cout<< std::endl;
    int x = *std::min_element(arr, arr + N);
    while (x != *std::max_element(arr, arr + N) )
    {
        if (std::find(arr, arr + N, x) == arr + N)
            std::cout<< x<< " ";
        x++;
    }    
    return 0;
}
Shman
3 / 3 / 2
Регистрация: 30.04.2012
Сообщений: 212
27.05.2012, 09:18  [ТС]     Найти в массиве минимальный и максимальный элементы. Вывести последовательность значений из этого диапазона, не встречающихся в данном массиве #5
MrGluck, мне бы хотелось узнать где ошибка в моей программе, а не узнать новый алгоритм?! Вы не поищите? Есть подобный на Паскале, он работает:

Pascal
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
program mass;
uses crt;
var Mass: array [1..100] of integer;
    i, N, j, Min, Max: integer;
 Flag, FlagOk: boolean;
begin
 
 clrscr;
 writeln('Введите размер массива');
 readln(N);
 
 for i:=1 to N do
 begin
  write('[', i,']= ');
  readln(Mass[i]);
 end;
 
 writeln;
 writeln('Данный одномерный массив чисел');
 for i:= 1 to N do
  write(Mass[i],' ');
 
 Flag := false;
 Min:= 1;
 Max:= 1;
 for i:=2 to N do
 begin
  if Mass[i] < Mass[Min] then  Min:=i;
  if Mass[i] > Mass[Max] then  Max:=i;
 end;
 writeln;
 writeln;
 writeln('Минимальный элемент массива: ', Mass[Min]);
 writeln('Максимальный элемент массива: ', Mass[Max]);
 Flag := false;
 writeln;
 
 for i:= Mass[Min]+1 to Mass[Max]-1 do
 begin
  FlagOk := true;
  for j:=1 to N do
   if Mass[j]=i then
   begin
    FlagOk := false;
    break;
   end;
   if (Flag = false) and (FlagOk) then
   begin
    Flag := true;
    writeln('Целые числа между мин. и макс. элементами, которых нет в массиве: ');
   end;
   if FlagOk then
    write(i,' ');
 end;
  if Flag = false then
   writeln('Целых чисел между элементами массива нет');
   readln; 
end.

Добавлено через 13 часов 1 минуту
Нашел причину по которой вторая часть программы не работала. "=" - это не проверка на равенство, а присваивание в Сpp, равенство - "==". Это я после Паскаля еще путаюсь, исправил. Еще в "for(j=1; j<N; j++)" букву N заменил на 2, чтобы найденые числа не повторялись N раз. НО, когда я ввожу в массив 1, 3, 5, 7, 9 среди чисел не найденных в массиве оказывается 7, т.е. 2, 4, 5, 6, 7, что является ошибкой. А когда 1, 2, 3, 4, 5, то вылазит 3 - тоже ошибка. Почему?
Вот новый код:
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdio.h> 
#include <conio.h> 
 
const int N = 5;
int main()
{     
 int 
 mass[N]={1, 3, 5, 7, 9}; 
 int i, j, min, max; 
 bool FlagOk, Flag;
 
  printf("\n Ishodniy massiv: "); 
  for (int i=0; i<N; i++)
  { printf("%d. ", mass[i]); } 
 
  Flag=false; // Устанавливаем флаг на ложь.
  min=0; max=0; // Обнуляем минимальное и максимальное значения.
 
  /* Нахождение минимального и максимального элементов */
  for(i=1; i<N; i++)
   { if(mass[i] < mass[min])  // Если следущий элемент меньше минимального, то...
      { min=i; } // назначаем его минимальным.
     if(mass[i] > mass[max])  // Если следущий элемент больше максимального, то...   
      { max=i; } // назначаем его минимальным.
   }
  printf("\n \n Min element = %d.", mass[min]); // Выводим минимальный элемент.
  printf("\n \n Max element = %d.", mass[max]); // Выводим максимальный элемент.
 
  /* Поиск целых чисел между мин. и макс. элементами, которых нет в массиве */
  Flag=false; // Отмечаем, что искомые числа пока не найдены.
  for (i=mass[min]+1; i<mass[max]-1; i++) /*  Т.к. мин. и макс. элементы по условию 
                                              не должны принадлежать промежутку, 
                                              то и цикл начинается с числа больше 
                                              минимального на 1 и заканчивается 
                                              числом меньшим максимального на 1.
                                           */
   { FlagOk=true; // Предполагать, что текущее целое число будет одним из искомых.
     for(j=1; j<2; j++)
      { if (mass[j]==i) /*  Проверяеть есть ли среди элементов данного массива элемент, 
                           равный предполагаемому. Если равный есть, то... 
                       */
       { FlagOk = false; // значит, что число не является искомым и...
         break; } // цикл проверки данного числа прекратить и перейти к следующему числу.         
       if ((Flag==false) && (FlagOk)) /* Если же равный элемент в массиве не был найден, 
                                          и такой элемент оказался первым найденным, тогда...
                                       */                                       
        { Flag = true; // Отмечается, что хотя бы одно число уже найдено.
        printf("\n \n Celye chisla meghdu min & max elem. kotoryh net v massive: \n "); } /* Ввыести
                                 целые числа между мин. и макс элементами, которых нет в массиве. */                                         
       if (FlagOk) // Если же равный элемент не был найден в данном массива, тогда...
        { printf(" %d.", i); } // вывести это число.
      }
   }
   if (Flag==false) // Если же ни одного искомого числа не было найдено, тогда...   
    { printf("\n \n Celye chisel megdu min. & max. elem. massiva net"); } /* вывести
                     сообщение, что чисел между мин. и макс.  элементами массива нет. */
  
 getch();
 return 0;
}
Добавлено через 2 часа 4 минуты
Неужели никто не знает? О_о
Catstail
Модератор
 Аватар для Catstail
21423 / 10208 / 1662
Регистрация: 12.02.2012
Сообщений: 17,082
27.05.2012, 09:35     Найти в массиве минимальный и максимальный элементы. Вывести последовательность значений из этого диапазона, не встречающихся в данном массиве #6
Правильная формулировка этой задачи должна быть такая: вывести все числа, стоящие между максимальным и минимальным, и больше нигде в данном массиве.
Shman
3 / 3 / 2
Регистрация: 30.04.2012
Сообщений: 212
27.05.2012, 11:29  [ТС]     Найти в массиве минимальный и максимальный элементы. Вывести последовательность значений из этого диапазона, не встречающихся в данном массиве #7
Catstail, ЧИТАЙ ВНИМАТЕЛЬНО!
Вывести последовательность значений из этого диапазона, НЕ ВСТРЕЧАЮИХСЯ в данном массиве. То есть все числа КРОМЕ 1, 3, 5, 7, 9 от мин до макс элемента массива. Правильный ответ должен быть 2, 4, 6, 8! Собсвенно, моя программа это и должна делать, но где-то зарылась ошибка и она выводит 2, 4, 5, 6, 7 .
Catstail
Модератор
 Аватар для Catstail
21423 / 10208 / 1662
Регистрация: 12.02.2012
Сообщений: 17,082
28.05.2012, 07:48     Найти в массиве минимальный и максимальный элементы. Вывести последовательность значений из этого диапазона, не встречающихся в данном массиве #8
Мне нет особой необходимости напрягаться - это твоя задача, а не моя. Формулировки должны быть четкими и недвусмысленными. А твоя формулировка расплывчата.
Shman
3 / 3 / 2
Регистрация: 30.04.2012
Сообщений: 212
28.05.2012, 08:41  [ТС]     Найти в массиве минимальный и максимальный элементы. Вывести последовательность значений из этого диапазона, не встречающихся в данном массиве #9
Catstail, я тебе все на пальцах объясил!
Дан массив: 1, 3, 5, 7, 9. Надо чтобы результат был 2, 4, 6, 8, т.е. все числа НЕ входящие в данным масив и НЕ выходящие за него ГРАНИЦЫ! У меня же получается 2, 4, 5, 6, 7, то есть цифры 5 и 7 лишние, а 8 вообще не находит. Чем эта формулировка не понятна?
Catstail
Модератор
 Аватар для Catstail
21423 / 10208 / 1662
Регистрация: 12.02.2012
Сообщений: 17,082
28.05.2012, 10:25     Найти в массиве минимальный и максимальный элементы. Вывести последовательность значений из этого диапазона, не встречающихся в данном массиве #10
Вот решение твоей детской задачки:

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
#include "stdio.h"
 
 
int main(int argc, char* argv[])
{
 
    int Arr[]={1,3,5,7,9};
 
    int max,min,i,j,k;
 
    // Ищем маскимум и минимум
 
    max=Arr[0];
    min=Arr[0];
 
    for (i=0; i<=4; i++)
    {
        if (Arr[i] > max) max=Arr[i];
        if (Arr[i] < min) min=Arr[i];
    }
 
    // Выводим числа из диапазона [min,max], не входящие в исх. массив
 
    for (i=min; i<=max; i++)
    {
        k=0;
        for (j=0; j<=4; j++)
            if (Arr[j]==i) k=-1;
        if (k == 0) printf("%d\n",i);
    }
 
    return 0;
}
Миниатюры
Найти в массиве минимальный и максимальный элементы. Вывести последовательность значений из этого диапазона, не встречающихся в данном массиве  
Shman
3 / 3 / 2
Регистрация: 30.04.2012
Сообщений: 212
28.05.2012, 13:03  [ТС]     Найти в массиве минимальный и максимальный элементы. Вывести последовательность значений из этого диапазона, не встречающихся в данном массиве #11
Catstail, спасибо. А если массив: 1, 2, 3, 4, 6? Т.е. чисел в промежутке нет? Я добавил проверку, но при исходном массиве выводится не только числа между ними, но и что чисел нет.
C++
1
2
3
4
5
6
7
8
9
10
11
12
k=-1;
   for (i=min; i<=max; i++)   
    { k = 0; 
       for (j=0; j<N; j++)
        { if (mass[j]==i)
           { k = -1;} 
        }
       if (k == 0) 
        { printf ("\n \n Naydeno celoey chislo: %d.", i ); } 
    }
   if (k == -1)
    { printf("\n \n Celyh chisel megdu min. & max. elem. & ne vhodyachih v massiv net."); }
Catstail
Модератор
 Аватар для Catstail
21423 / 10208 / 1662
Регистрация: 12.02.2012
Сообщений: 17,082
28.05.2012, 13:53     Найти в массиве минимальный и максимальный элементы. Вывести последовательность значений из этого диапазона, не встречающихся в данном массиве #12
Неправильно добавил. Вот:

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
#include "stdio.h"
 
int main(int argc, char* argv[])
{
 
    int Arr[]={1,2,3,4,5};
 
    int max,min,i,j,k,m;
 
    // Ищем маскимум и минимум
 
    max=Arr[0];
    min=Arr[0];
 
    for (i=0; i<=4; i++)
    {
        if (Arr[i] > max) max=Arr[i];
        if (Arr[i] < min) min=Arr[i];
    }
 
    // Выводим числа из диапазона [min,max], не входящие в исх. массив
 
    m=0;
 
    for (i=min; i<=max; i++)
    {
        k=0;
        for (j=0; j<=4; j++)
            if (Arr[j]==i) k=-1;
        if (k == 0) 
        {
            printf("%d\n",i);
            m++;
        }
    }
   
    if (m == 0) printf("There is no numbers!\n");
 
    return 0;
}
Кстати, для массива {1 2 3 4 6} должно напечататься 5.
Миниатюры
Найти в массиве минимальный и максимальный элементы. Вывести последовательность значений из этого диапазона, не встречающихся в данном массиве  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2012, 14:15     Найти в массиве минимальный и максимальный элементы. Вывести последовательность значений из этого диапазона, не встречающихся в данном массиве
Еще ссылки по теме:

C++ Найти в массиве минимальный и максимальный элементы. Вывести в порядке возрастания все целые числа из интервала
C++ В двухмерном массиве найти максимальный и минимальный элементы и их координаты в массиве
Ассемблерная вставка. Найти минимальный и максимальный элементы в массиве и их сумму C++

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

Или воспользуйтесь поиском по форуму:
Shman
3 / 3 / 2
Регистрация: 30.04.2012
Сообщений: 212
28.05.2012, 14:15  [ТС]     Найти в массиве минимальный и максимальный элементы. Вывести последовательность значений из этого диапазона, не встречающихся в данном массиве #13
Цитата Сообщение от Catstail Посмотреть сообщение
Кстати, для массива {1 2 3 4 6} должно напечататься 5.
Это я вместо 5 нечаяно напечатал 6. Спасибо за вариант .
Yandex
Объявления
28.05.2012, 14:15     Найти в массиве минимальный и максимальный элементы. Вывести последовательность значений из этого диапазона, не встречающихся в данном массиве
Ответ Создать тему
Опции темы

Текущее время: 00:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru