IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

 
 Ответить  Открыть новую тему 
> Найти в массиве минимальный и максимальный элементы., И вывести последовательность значений из этого диапазона, не встречающ
Shmaniche
сообщение 26.05.2012 20:11
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация: -  0  +


Есть одна программа на Паксале позволяющая это делать. Переписать на С++, но не моу найти где допустил ошибку. Мин. и макс. элементы ищет, а дальше нет. sad.gif

На Pascal:

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.
 



На С++:

#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("\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; 
}


Помогите пжста найти ошибку!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 26.05.2012 21:02
Сообщение #2


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Цитата
if (mass[j]=i) /*  Проверяеть есть ли среди элементов данного массива элемент, 
                           равный предполагаемому. Если равный есть, то... 
                       */
"=" - это не проверка, а присваивание в Сях. Используй "==". Там еще в нескольких местах нужно то же самое исправить...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Shmaniche
сообщение 27.05.2012 5:14
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация: -  0  +


Цитата(IUnknown @ 27.05.2012 1:02) *

"=" - это не проверка, а присваивание в Сях. Используй "==". Там еще в нескольких местах нужно то же самое исправить...

Это я после Паскаля еще путаюсь. Спасибо, исправил. Еще в "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 - тоже ошибка. sad.gif. Почему? Вот код:


#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;
}



Сообщение отредактировано: Shmaniche - 27.05.2012 5:32
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Shmaniche
сообщение 28.05.2012 7:48
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация: -  0  +


Дан массив: 1, 3, 5, 7, 9. Надо чтобы результат был 2, 4, 6, 8, т.е. все числа не входящие в данным массив и не выходящие за него границы! У меня же получается 2, 4, 5, 6, 7, то есть цифры 5 и 7 лишние, а 8 вообще не находит sad.gif. Помогите найти ошибку в коде

Сообщение отредактировано: Shmaniche - 28.05.2012 7:50
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 28.05.2012 10:42
Сообщение #5


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Тебе достаточно сделать так:

    printf("\n \n Min element = %d.", mass[min]); // Выводим минимальный элемент.
    printf("\n \n Max element = %d.", mass[max]); // Выводим максимальный элемент.
    
    printf("\n\n");

    for(i = mass[min] + 1; i < mass[max]; i++)
    {
        for(j = 0; j < N && i != mass[j]; j++);
        if(j == N) // число i найдено в массиве
        {
            printf(" %d.", i);
        }
    }
    printf("\n");
, чтобы получить все целые из интервала mass[min] .. mass[max], не присутствующие в массиве mass. Не усложняй код. smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Shmaniche
сообщение 28.05.2012 12:27
Сообщение #6


Пионер
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация: -  0  +


IUnknown
Я предпологал еще использовать следующий код:

 int flag=-1; // Отмечаем, что искомые числа пока не найдены.
   for (i=min; i<=max; i++) // Перебираем элементы от минимального до максимального.
    { flag = 0; // Предполаем, что текущее целое число будет одним из искомых.
       for (j=0; j<N; j++)
        { if (mass[j]==i) /*  Проверяеть есть ли среди элементов данного массива элемент, 
                           равный предполагаемому. Если равный есть, то... 
                       */
           { flag = -1; } // это значит, что число не является искомым.
        }
       if (flag == 0) // Если искомое число найдено...
        { printf ("\n \n Naydeno celoey chislo: %d.", i ); } // тогда выводим его.
    }
   if (flag == -1)  // Если искомое число не найдено...
   { printf("\n \n Celye chisel megdu min. & max. elem. & ne vhodyachih v massiv net."); }  /* Выводим
         сообщение, что целых чисел между мин. и макс и не входящих в массив нет. */



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

Кстати, ты забыл добавить проверку, что выводить, если числа между элементами массива не найдены (например, если дан массив 1, 2, 3, 4, 5). Вот так наверное лучше:

   for(i = mass[min] + 1; i <= mass[max] -1; i++) // Перебираем все элементы массива кроме мин. и макс.
    {
     for(j = 0; j < N && i != mass[j]; j++); /* Перебираем от 0 до значения размера массива, 
                                              исключая число равное предпологаемому */
      if(j == N) // Если число i найдено в массиве, то...
       { printf("\n \n Naydeno tseloe chislo: %d.", i); } // вывести его
    }
    if(j != N) // Если число i не найдено в массиве, то...
     { printf("\n \n Tselye chisla ne vhodyachih v massiv ne naydeny."); } /* Выводим
         сообщение, что целых чисел между мин. и макс и не входящих в массив нет. */
    printf("\n"); // Перевод на новую строку.



Хотя при массиве {1, 3, 5, 7, 8} эта проверка не работает sad.gif. Выводится 2, 4, 6 и сообщение, что числа не входящие в массив не найдены sad.gif.

Сообщение отредактировано: Shmaniche - 28.05.2012 15:11
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 28.05.2012 13:27
Сообщение #7


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Цитата
Вот так лучше:
Нет, не лучше! Не "улучшай" то, в чем не разобрался. Твой код будет врать, что не нашел чисел, после того, как напечатает часть из них (если не будет найдено ПОСЛЕДНЕЕ число в интервале - выведется сообщение. Запусти на данных: mass[N]={1, 3, 5, 8, 9}; и убедись), чтобы сделать диагностику "нет чисел, входящих в интервал" надо считать напечатанные числа.

Цитата
Ради спортивного интереса хотелось бы найти ошибку в коде выше
Это без меня, я не копаюсь в чужих кодах. Запускай отладчик и ищи, где начинает работать не так, как положено. Если уж ты берешься править чужое - значит, в работе отладчика точно сможешь разобраться dry.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Shmaniche
сообщение 28.05.2012 15:19
Сообщение #8


Пионер
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация: -  0  +


Цитата(IUnknown @ 28.05.2012 17:27) *

Нет, не лучше! Не "улучшай" то, в чем не разобрался. Твой код будет врать, что не нашел чисел, после того, как напечатает часть из них (если не будет найдено ПОСЛЕДНЕЕ число в интервале - выведется сообщение. Запусти на данных: mass[N]={1, 3, 5, 8, 9}; и убедись)


Ввел 1, 3, 5, 8, 9. Вывелось 2, 4, 6, 7. Что не так?

Цитата(IUnknown @ 28.05.2012 17:27) *

, чтобы сделать диагностику "нет чисел, входящих в интервал" надо считать напечатанные числа.


Пока не знаю как это сделать. Надо подумать.

Цитата(IUnknown @ 28.05.2012 17:27) *


Это без меня, я не копаюсь в чужих кодах. Запускай отладчик и ищи, где начинает работать не так, как положено.


Как вариант подсказали:

  /* Поиск целых чисел между мин. и макс. элементами, которых нет в массиве */
  fl=0; // Отмечаем, что искомые числа пока не найдены.
   for (i=min; i<=max; i++) // Перебираем элементы от минимального до максимального.
    { flag = 0; // Предполаем, что текущее целое число будет одним из искомых.
       for (j=0; j<N; j++)
        { if (mass[j]==i)/*  Проверяеть есть ли среди элементов данного массива элемент, 
                           равный предполагаемому. Если равный есть, то... 
                       */
           { flag = -1; } // это значит, что число не является искомым.
        }
       if (flag == 0) // Если искомое число найдено...
        { printf ("\n \n Naydeno celoey chislo: %d.", i ); // тогда выводим его.
          fl++; // Увелиниваем fl.
        } 
    }
   if (fl == 0)  // Если искомое число не найдено...
    { printf("\n \n Tselye chisla ne vhodyachih v massiv ne naydeny."); } /* Выводим
         сообщение, что целых чисел между мин. и макс и не входящих в массив нет. */
   printf("\n"); // Перевод на новую строку.



Кажется правильно работает smile.gif.

Сообщение отредактировано: Shmaniche - 28.05.2012 15:24
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 18.07.2025 0:30
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"