Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2007, 17:22   #1
kitty
Пользователь
 
Регистрация: 28.11.2007
Сообщений: 12
Восклицание Как найти проиизведение в одномерном массиве?

В одномерном массиве, состоящем из 10 элементов, найти произведение элементов массивов, расположенных между первым и вторым нулевым элементами...нужно использовать опереаторы for, if...написать программу в паскале...
kitty вне форума Ответить с цитированием
Старый 30.11.2007, 17:56   #2
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Допустим у нас есть последовательность чисел:
1 4 5 0 2 6 1 0 5 9 (массив)
Попытаемся подумать как же найти произведение между нулями...
1. Надо найти номера элементов массива в котором стоят нули. В нашем примере это 4 и 8.
2. Надо определить какой из них левее, чтоб цикл провести с права на лево.
3. Перемножить всё что между нулями.

АДД: пункт 2 ненужен, так как я придумал другой способ.
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...

Последний раз редактировалось Карась; 30.11.2007 в 18:36.
Карась вне форума Ответить с цитированием
Старый 30.11.2007, 18:15   #3
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Короче так примерно....
Код:
program Znaki;

{$APPTYPE CONSOLE}


var mas: array [1..10] of integer;
    i, left, right, rez: integer;


begin
rez := 1;
Writeln ('Zapolnite masiv...');
for i := 1 to 10 do Readln(mas[i]); Writeln ('Gotovo...');
Writeln;

for i := 1 to 10 do
if mas[i] = 0 then begin left := i; Break;
end;

for i := left + 1 to 10 do
if mas[i] = 0 then begin right := i; Break;
end;

for i := left + 1 to right - 1 do
rez:= rez * mas[i];

Writeln; Writeln (rez); Readln;
end.
Правда тут есть один недостаток если нули стоят подряд (например 1 2 3 0 0 4 6 3.... ) то программа получит 1. Что неверно.
Эта ошибка решается путём проверки равенства left + 1 = right - 1 ?
Попробуйте сами
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...

Последний раз редактировалось Карась; 30.11.2007 в 18:37.
Карась вне форума Ответить с цитированием
Старый 30.11.2007, 18:50   #4
aljkerh
Пользователь
 
Регистрация: 30.10.2007
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Карась Посмотреть сообщение
Короче так примерно....


Эта ошибка решается путём проверки равенства left + 1 = right - 1 ?
Попробуйте сами
надо делать две проверки:
скоре если left = right то rez:=0
(если оставить left + 1 = right - 1 то программа будет выводить не то )

и если left > right то rez:=0
aljkerh вне форума Ответить с цитированием
Старый 30.11.2007, 18:56   #5
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Смотри внимательно как определяется left и right.
right никогда неможет быть меньше чем left.

Цитата:
скоре если left = right .......
Таково в моей программе неможет быть.

Цитата:
и если left > right то rez:=0
А в условии написанно
Цитата:
...расположенных между первым и вторым нулевым элементами...
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 30.11.2007, 19:11   #6
aljkerh
Пользователь
 
Регистрация: 30.10.2007
Сообщений: 22
По умолчанию

я говорю только относительно проверки.

если проверять left + 1 = right - 1
1. 1 2 3 0 0 4 6 3 5 1, в этом случае rez = 1;
2. 1 2 3 0 5 4 6 3 5 1, в этом случае rez = 1;
3. 1 2 3 0 5 0 6 3 5 1, в этом случае rez = 0.

если проверять left = right
1. 1 2 3 0 0 4 6 3 5 1, в этом случае rez = 0;
2. 1 2 3 0 5 4 6 3 5 1, в этом случае rez = 0 здесь еще надо проверять left > right, т.е. в массиве один нуль;
3. 1 2 3 0 5 0 6 3 5 1, в этом случае rez = 5.
aljkerh вне форума Ответить с цитированием
Старый 30.11.2007, 19:27   #7
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

ага.. есть неточности

Тогда всё обработка кривотни выглядит так:

Код:
..........
..........
if left + 1 = right then rez := 0;
if mas[right] = 0 then rez := 0;

Writeln; Writeln (rez); Readln;
end.
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 30.11.2007, 20:01   #8
aljkerh
Пользователь
 
Регистрация: 30.10.2007
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Карась Посмотреть сообщение
ага.. есть неточности

Тогда всё обработка кривотни выглядит так:

Код:
..........
..........
if left + 1 = right then rez := 0;
if mas[right] = 0 then rez := 0;

Writeln; Writeln (rez); Readln;
end.
Во втором условии косяк.
если right нет => right=0, а mas[0]-косяк массив от 1..10.(поэтому я и использовал left > right)
можно сделать:
if right = 0 then rez := 0;
aljkerh вне форума Ответить с цитированием
Старый 30.11.2007, 20:23   #9
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
Правда тут есть один недостаток если нули стоят подряд (например 1 2 3 0 0 4 6 3.... ) то программа получит 1. Что неверно.
С чего бы это? По моему в этом случае rez:= rez * mas[i] = 1*0=0.
puporev вне форума Ответить с цитированием
Старый 30.11.2007, 20:27   #10
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

верно...

Теперь второе условие должно быть таким:

Код:
if right = 0 then rez := 0;
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Колличество четных элементов в одномерном массиве forsy Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 21.05.2008 15:01
Найти сумму последних L положительных элементов в массиве A={a[i]}. Assembler Kasim Помощь студентам 2 16.12.2007 16:12
В одномерном масиве найти длинную цепочку стоящих попарно различных элементов Махряк Помощь студентам 0 05.12.2007 20:00
В одномерном масиве найти длинную цепочку стоящих попарно различных элементов Махряк Помощь студентам 0 29.11.2007 23:09
В целочисленном массиве найти самое часто повторяющееся число Алена Помощь студентам 2 01.11.2007 19:46