Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным. / 17 сообщений из 17, страница 1 из 1
11.06.2013, 00:07
    #38293350
alexander4321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
Добрый день ! Требуется произведение элементов массива, расположенных между максимальным кратным 10 и минимальным четным элементами. Вот код программы:
Код: sql
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.
program khren;
const n = 20;
var mas : array[1..n] of integer;
    i, max, min, b, c, sum : integer;
begin
    randomize;
    for i := 1 to n do
    begin
    mas[i] := 1 + random(20);
    writeln(mas[i]);
    end;
begin
    max := mas[1];
    for i := 1 to n do
        if (max < mas[i]) and (mas[i] mod 10 = 0) then begin
        max := mas[i]; b:= i;  
        end;
    end;
    begin
        min := mas[1];
        for i := 1 to n do
        if (min > mas[i]) and (i mod 2 = 0) then begin
        min := mas[i]; c := i; 
        end;
    end;
    sum := 1;
    begin
        if b < c then  
            begin
                for i := (b+1) to (c-1) do
                sum := sum * mas[i];
            end
        else if c > b then
            begin
                for i := (c+1) to (b-1) do
                sum := sum * mas[i];
            end;
    end;
    writeln('max index = ',b, '    ','min index = ', c);
    writeln('Rezultat =', sum);
    readln;
end.


Иногда правильно рассчитывает, но чаще всего неправильно. Откуда то берется индекс 0 временами. Не посмотрите, в чем ошибка? Спасибо!
...
Рейтинг: 0 / 0
11.06.2013, 02:23
    #38293391
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
Вы забыли проверить случаи, когда минимум/максимум не найдены (например, в массиве нет кратных 10) - вот у вас и не инициализируются соответствующие индексы. Просто добавьте проверку ( b>0 and c>0 ).
Кроме того:
- поиск и минимума, и максимума можно вести за один проход - вставьте обе проверки внутрь одного цикла
- не требуется двух циклов для умножения - просто проведите сравнение, и поменяйте местами значения b,c если необходимо (if (b>c) => c:=b,b:=c; if (b>0)&(c>b+1) => считаем произведение else "Предупреждение!")
- аккуратнее относитесь к переполнению - произведение может внезапно выйти за диапазон integer , если вы по каким-либо причинам измените n или random() ; можно просто все переменные (кроме sum ) описать как shortint
...
Рейтинг: 0 / 0
11.06.2013, 21:00
    #38294659
alexander4321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
Сделал поиск min и max за один проход. Надеюсь, что получилось действительно за один проход, а не через один проход.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
begin
    max := mas[1];
    min := mas[1];
    for i := 1 to n do
        if (max < mas[i]) and (mas[i] mod 10 = 0) then begin
        max := mas[i]; b:= i;
        end;    
        if (min > mas[i]) and (i mod 2 = 0) then begin
        min := mas[i]; c := i;  
        end;
    end;    



Здесь происходит умножение за один цикл
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
begin
    sum := 1;
    if (b > 0) and (c > 0) then
    begin
        if (b > c) then t:=c; c:=b; b:=t;
        if (b > 0) and (c > (b+1)) then
            begin
                for i := (b+1) to (c-1) do
                sum := sum * mas[i];
            end;
    end;
    end;
    writeln('max index = ',b, '    ','min index = ', c);
    writeln('Rezultat =', sum);


Результат выдает неверный. Также опять появляются нулевые индексы.
...
Рейтинг: 0 / 0
11.06.2013, 22:23
    #38294713
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
alexander4321Результат выдает неверный. Также опять появляются нулевые индексы.Добавь блок распечатывающий весь массив. Погоняй программу до тех пор пока она не выдаст неправильные результаты.
Теперь замени создание случайного массива на тот который увидел в последнем (неправильном) прогоне.
А теперь думай что в этом массиве исходных данных такого-этакого что твой алгоритм обработки не справляется. Как решишь эту загадку, заменяй ручное создание исходного массива обратно на случайный.
Повторяй весь цикл пока не уверишься что все работает как надо.
...
Рейтинг: 0 / 0
12.06.2013, 00:10
    #38294769
alexander4321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
Вот полный код программы
Код: sql
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.
program khren;
const n = 20;
var mas : array[1..n] of shortint;
    i, max, min, b, c, t : shortint;
    sum : integer;
begin
    randomize;
    for i := 1 to n do
    begin
    mas[i] := 1 + random(20);
    write(mas[i], ', ');
    writeln;
    end;
    begin
    max := mas[1];
    min := mas[1];
    for i := 1 to n do
        if (max < mas[i]) and (mas[i] mod 10 = 0) then begin
        max := mas[i]; b:= i;
        end;    
        if (min > mas[i]) and (i mod 2 = 0) then begin
        min := mas[i]; c := i;  
        end;
    end;
    writeln('min = ', min, '  ', 'index = ', c);
    writeln('max = ', max, '  ', 'index = ', b);
    begin
    sum := 1;
    if (b > 0) and (c > 0) then
    begin
        if (b > c) then t:=c; c:=b; b:=t;
        if (b > 0) and (c > (b+1)) then
            begin
                for i := (b+1) to (c-1) do
                sum := sum * mas[i];
            end;
    end;
    end;
    writeln('max index = ',b, '    ','min index = ', c);
    writeln('Rezultat =', sum);
    readln;
end.


Для начала нужно определиться с индексами элементов массива. Припоминаю, что индексы элементов в массиве нумеруются с нуля. Во всех примерах по переборке массивов встречал первым индексом единицу
Код: sql
1.
for i := 1 to n do


Поэтому, сильно не ломая над этим голову, предполагаю, что нумерация индексов в созданном в моей программе массиве тоже начинается с единицы. Добавил в программу перед вычислением произведения и возможной исходя из условия заменой min и max вывод значения min и max, а также их индексов. Интересный получился результат: прилагаю скриншот результата работы программы, на котором виден и 1-й и 20-й индекс массива. Напоминаю, что в массиве только 20 элементов, а в этом случае получается 21.
...
Рейтинг: 0 / 0
12.06.2013, 00:17
    #38294775
alexander4321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
Вчера мне посоветовали осуществлять поиск min и max за один проход. Я переписал код. Сейчас смотрю на результаты: получается, что max правильно, а min не правильно.
Вот данный код
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
begin
    max := mas[1];
    min := mas[1];
    for i := 1 to n do
        if (max < mas[i]) and (mas[i] mod 10 = 0) then begin
        max := mas[i]; b:= i;
        end;    
        if (min > mas[i]) and (i mod 2 = 0) then begin
        min := mas[i]; c := i;  
        end;
    end;


Уверен, что есть здесь ошибка. Поэтому и min находится неправильно. Не подскажете, что здесь нужно подкорректировать?
...
Рейтинг: 0 / 0
12.06.2013, 00:39
    #38294785
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
alexander4321Вчера мне посоветовали осуществлять поиск min и max за один проход. Я переписал код. Сейчас смотрю на результаты: получается, что max правильно, а min не правильно.
Вот данный код
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
begin
    max := mas[1];
    min := mas[1];
    for i := 1 to n do
        if (max < mas[i]) and (mas[i] mod 10 = 0) then begin
        max := mas[i]; b:= i;
        end;    
        if (min > mas[i]) and (i mod 2 = 0) then begin
        min := mas[i]; c := i;  
        end;
    end;


Уверен, что есть здесь ошибка. Поэтому и min находится неправильно. Не подскажете, что здесь нужно подкорректировать?

минимальным ЧЁТНЫМ :) А Вы за основу для минимального берёте mas[1] .

P.S. Если видите, что имена переменных подсвечиваются синим - немедленно их меняйте (на данном уровне не критично, но если будете более-менее большой проект создавать - будут проблемы). Вот у Вас переменные min и max используются, а это имена стандартных функций в модуле math. Если его к проекту подрубить - начнёте ошибку компиляции ловить и не будете понимать почему.
...
Рейтинг: 0 / 0
12.06.2013, 00:55
    #38294795
alexander4321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
Програмёр,

Тогда не получится найти min и max за один проход.
Получается, что при поиске max
Код: sql
1.
for i := 1 to n


При поиске min массив перебирается со второго элемента
Код: sql
1.
for i := 2 to n


Так что ли?
...
Рейтинг: 0 / 0
12.06.2013, 01:01
    #38294798
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
alexander4321Програмёр,

Тогда не получится найти min и max за один проход.
Получается, что при поиске max
Код: sql
1.
for i := 1 to n


При поиске min массив перебирается со второго элемента
Код: sql
1.
for i := 2 to n


Так что ли?

там же написано i mod 2 = 0 . ) Первый элемент никак не попадёт под это правило... как и 3-й, 5-й и т.д. )) Так что min:=mas[2] и не паримся ;)

P.S. Не забываем переименовать переменные ))
...
Рейтинг: 0 / 0
12.06.2013, 01:19
    #38294806
alexander4321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
Програмёр,

Понял это дело. Спасибо!
При поиске минимума и максимума за 2 прохода (как в первоначальном варианте было) это прекрасно работает
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
begin
    maximum := mas[1];
    for i := 1 to n do
        if (maximum < mas[i]) and (mas[i] mod 10 = 0) then begin
        maximum := mas[i]; b:= i;
        end;
    end;
    begin
        minimum := mas[2];
        for i := 2 to n do
        if (minimum > mas[i]) and (i mod 2 = 0) then begin
        minimum := mas[i]; c := i;
        end;
    end;
    writeln('min = ', minimum, '  ', 'index = ', c);
    writeln('max = ', maximum, '  ', 'index = ', b);


Но вот как это все записать в коде поиска минимума и максимума за один проход?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
begin
    maximum := mas[1];
    minimum := mas[2];
    for i := 1 to n do
        if (maximum < mas[i]) and (mas[i] mod 10 = 0) then begin
        maximum := mas[i]; b:= i;
        end;    
        if (minimum > mas[i]) and (i mod 2 = 0) then begin
        minimum := mas[i]; c := i;
        end;
    end;
    writeln('min = ', minimum, '  ', 'index = ', c);
    writeln('max = ', maximum, '  ', 'index = ', b);


Один проход он и есть один проход. Если задаю перебор массива от 1 до n, то это будет задано для всех операторов. А мне получается нужно для поиска одного значения перебрать весь массив, а для поиска другого параметра только часть массива. Реально так сделать за один проход или нет?
...
Рейтинг: 0 / 0
12.06.2013, 01:34
    #38294812
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
alexander4321,

Вам же всёровно каждый элемент массива проийти надо. Вот Вы его и проходите, но выбираете только нужные Вам. Другое дело для улучшения производительности, условия можно местами поменять и после проверки условия до and, если оно равно false, следующее проверяться не будет... Но это уже заморочки, которые Вам, пока что по крайней мере, не нужны. Так что код можно считать рабочим и имеющим полное право на существование ;) (моё мнение)
...
Рейтинг: 0 / 0
12.06.2013, 01:39
    #38294815
alexander4321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
Програмёр Так что код можно считать рабочим и имеющим полное право на существование ;) (моё мнение)
Если это о втором варианте кода (с поиском за один проход), то там с минимумом ерунда какая-то получается. Там даже индексы со значением 0 (ноль) присутствуют, хотя в коде четко сказано для i от 1 до n.
Если ничего не придумаю, то придется лучше оставить поиск за два прохода - там хотя бы результат верный.
...
Рейтинг: 0 / 0
12.06.2013, 10:35
    #38294911
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
alexander4321,

индекс 0 - потому что перед циклом надо написать
Код: pascal
1.
b:=1; c:=2;



А почему элементы неверно считает, я уже сказал (и пояснил что сделать). Как видите, оно минимальным выводит первый :)
...
Рейтинг: 0 / 0
12.06.2013, 12:44
    #38295008
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
alexander4321,

еще можно в этой ветке спросить.
...
Рейтинг: 0 / 0
12.06.2013, 20:27
    #38295381
alexander4321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
Подкорректировал код. Переменной sum присвоил значение longint, иначе результат вычислений чаще всего выходил за рамки значений типа integer. Сейчас все работает. Вот код:
Код: sql
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.
program khren;
const n = 20;
var mas : array[1..n] of integer;
    i, maximum, minimum, b, c : word;
    sum : longint;
    begin
    randomize;
    for i := 1 to n do
    begin
    mas[i] := 1 + random(40);
    writeln(mas[i]);
    end;
begin
    maximum := mas[1];
    b := 1;
    for i := 1 to n do
        if (maximum < mas[i]) and (mas[i] mod 10 = 0) then begin
        maximum := mas[i]; b:= i;
        end;
    end;
    begin
        minimum := mas[2];
        c := 2;
        for i := 2 to n do
        if (minimum > mas[i]) and (i mod 2 = 0) then begin
        minimum := mas[i]; c := i;
        end;
    end;
    writeln('min = ', minimum, '  ', 'index = ', c);
    writeln('max = ', maximum, '  ', 'index = ', b);
    sum := 1;
    begin
        if b < c then  
            begin
                for i := (b) to (c) do
                sum := sum * mas[i];
            end
        else
            begin
                for i := (b) downto (c) do
                sum := sum * mas[i];
            end;
    end;
    writeln('max index = ',b, '    ','min index = ', c);
    writeln('Rezultat =', sum);
    readln;
end.



Осталась пара вопросов.
1) Поиск минимума и максимума в массиве у меня получается осуществить только за два прохода. Вот код поиска минимума и максимума за один проход
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
begin
    maximum := mas[1];
    minimum := mas[2];
    b := 1; c := 2;
    for i := 1 to n do
        if (maximum < mas[i]) and (mas[i] mod 10 = 0) then begin
        maximum := mas[i]; b:= i;
        end;    
        if (minimum > mas[i]) and (i mod 2 = 0) then begin
        minimum := mas[i]; c := i;
        end;
    end;
    writeln('min = ', minimum, '  ', 'index = ', c);
    writeln('max = ', maximum, '  ', 'index = ', b);


По большому счету препод не будет придираться к рабочему варианту (в два прохода). Но просто самому интересно, что в этом коде неправильно.

2) При поиске максимума есть условие, что он должен быть кратным 10. Когда диапазон значений массива был от 1 до 20 периодически в массиве не было элементов со значениями 10 или 20. В этом случае значение максимум присваивалось какому-нибудь другому элементу. Я решил эту проблему увеличив диапазон значений элементов массива от 1 до 40. При таком раскладе точно появляется хотя бы один элемент, кратный 10. Не подскажете, как бы в коде записать условие о выводе, допустим, предупреждения об отсутствии подходящего для максимального значения элемента при отсутствии такового в полученном массиве (например, если диапазон значений элементов массива опять сделаю от 1 до 20)?

Спасибо!
...
Рейтинг: 0 / 0
13.06.2013, 07:07
    #38295588
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
alexander4321,

а) b:=1; c:=2;
Я же вам советовал - проверять наличие минимума/максимума по истинности ( b>0 and c>0 ). А это означает, что надо первоначально присваивать b:=0; c:=0; - и тогда как раз и работает все в один проход, и есть возможность выдать предупреждение об отсутствии миниума или максимума, удовлетворяющего условиям поиска.
б) Чётный элемент и чётный номер элемента - это, как бы, две большие разницы. Я склоняюсь к тому, что у вас всё же должна быть проверка ( mas[i] mod 2 = 0 ).
в) Начальные значения для Max и Min при переборе по возможности задаются таким образом, чтобы они лежали вне возможного диапазона значений, с которыми будет проводиться сравнение. Таким образом, начальное присвоение может выглядеть так: min:=41; max:=0;

С учетом вышеизложенного, должен правильно работать даже тот ваш код 14423406 , надо только формулировку фраз во Writeln() правильно построить
...
Рейтинг: 0 / 0
14.06.2013, 21:49
    #38298351
alexander4321
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным.
Понял, спасибо!
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Произведение элементов массива, расположенных между максимальным кратным 10 и минимальным. / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]