![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
Shmaniche |
![]() ![]()
Сообщение
#1
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: ![]() ![]() ![]() |
Есть одна программа на Паксале позволяющая это делать. Переписать на С++, но не моу найти где допустил ошибку. Мин. и макс. элементы ищет, а дальше нет.
![]() На 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;
}
Помогите пжста найти ошибку! |
IUnknown |
![]()
Сообщение
#2
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата if (mass[j]=i) /* Проверяеть есть ли среди элементов данного массива элемент,
равный предполагаемому. Если равный есть, то...
*/
|
Shmaniche |
![]() ![]()
Сообщение
#3
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: ![]() ![]() ![]() |
"=" - это не проверка, а присваивание в Сях. Используй "==". Там еще в нескольких местах нужно то же самое исправить... Это я после Паскаля еще путаюсь. Спасибо, исправил. Еще в "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 - тоже ошибка. ![]()
#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 |
Shmaniche |
![]()
Сообщение
#4
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: ![]() ![]() ![]() |
Дан массив: 1, 3, 5, 7, 9. Надо чтобы результат был 2, 4, 6, 8, т.е. все числа не входящие в данным массив и не выходящие за него границы! У меня же получается 2, 4, 5, 6, 7, то есть цифры 5 и 7 лишние, а 8 вообще не находит
![]() Сообщение отредактировано: Shmaniche - 28.05.2012 7:50 |
IUnknown |
![]()
Сообщение
#5
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Тебе достаточно сделать так:
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. Не усложняй код. ![]() |
Shmaniche |
![]() ![]()
Сообщение
#6
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: ![]() ![]() ![]() |
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} эта проверка не работает ![]() ![]() Сообщение отредактировано: Shmaniche - 28.05.2012 15:11 |
IUnknown |
![]()
Сообщение
#7
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата Вот так лучше: Нет, не лучше! Не "улучшай" то, в чем не разобрался. Твой код будет врать, что не нашел чисел, после того, как напечатает часть из них (если не будет найдено ПОСЛЕДНЕЕ число в интервале - выведется сообщение. Запусти на данных: mass[N]={1, 3, 5, 8, 9}; и убедись), чтобы сделать диагностику "нет чисел, входящих в интервал" надо считать напечатанные числа.Цитата Ради спортивного интереса хотелось бы найти ошибку в коде выше Это без меня, я не копаюсь в чужих кодах. Запускай отладчик и ищи, где начинает работать не так, как положено. Если уж ты берешься править чужое - значит, в работе отладчика точно сможешь разобраться ![]() |
Shmaniche |
![]() ![]()
Сообщение
#8
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: ![]() ![]() ![]() |
Нет, не лучше! Не "улучшай" то, в чем не разобрался. Твой код будет врать, что не нашел чисел, после того, как напечатает часть из них (если не будет найдено ПОСЛЕДНЕЕ число в интервале - выведется сообщение. Запусти на данных: mass[N]={1, 3, 5, 8, 9}; и убедись) Ввел 1, 3, 5, 8, 9. Вывелось 2, 4, 6, 7. Что не так? , чтобы сделать диагностику "нет чисел, входящих в интервал" надо считать напечатанные числа. Пока не знаю как это сделать. Надо подумать. Это без меня, я не копаюсь в чужих кодах. Запускай отладчик и ищи, где начинает работать не так, как положено. Как вариант подсказали:
/* Поиск целых чисел между мин. и макс. элементами, которых нет в массиве */
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"); // Перевод на новую строку.
Кажется правильно работает ![]() Сообщение отредактировано: Shmaniche - 28.05.2012 15:24 |
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 0:30 |