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

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> рекурсия- расстановка знаков
сообщение
Сообщение #1


Новичок
*

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

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


помогите, пожалуйста, разобраться с задачей

Для заданного набора целых чисел без знака расставить между ними арифметические знаки сложения, деления, и умножения так, чтобы результат вычисления полученного арифметического выражения был минимальным. Число знаков умножения в этом выражении должно быть равным или на 2 больше, чем знаков сложения, а знаков сложения- равно или на 1 больше, чем знаков деления. В наборе должно быть не менее четырех чисел, а в полученном выражении должны присутствовать все три арифметических знака.

(умножение и деление имеют приоритет перед операциями сложения и вычитания, деление производится с остатком)



Сообщение отредактировано: Екатерина7 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


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

Решение без приоритетов несложное. Собственно, вот оно..
const
m=10;

type
tNum= double;

var
n,Ad,Mu,Di: integer;
Arg: array[1..m]of tNum;
Oper,MinOper: array[2..m]of char;
Res,Min: tNum;
Start: boolean;


procedure Count;
var
a,Res0: tNum;
begin
if n=m then begin
if (Di>0) and ((Mu=Ad)or(Mu-Ad=2)) and ((Ad=Di)or(Ad-Di=1)) and (Start or(Res<Min)) then begin
Min:=Res;
MinOper:=Oper;
Start:=false
end
end
else begin
Res0:=Res;
a:=Arg[n];
Inc(n);

Oper[n]:='+';
Inc(Ad);
Res:=Res0+a;
Count;
Dec(Ad);

Oper[n]:='*';
Inc(Mu);
Res:=Res0*a;
Count;
Dec(Mu);

Oper[n]:='/';
Inc(Di);
Res:=Res0/a;
Count;
Dec(Di);

Dec(n)
end
end;

var
i: integer;

begin
Randomize;
for i:=1 to m do Arg[i]:=Random*2;
Start:=true;
Res:=Arg[1];
Ad:=0;
Mu:=0;
Di:=0;
n:=1;
Count;
Write(Min:10,' : ');
for i:=1 to m do begin
if i>1 then Write(' ',MinOper[i],' ');
Write(Arg[i]:5:2);
end;
WriteLn;
ReadLn
end.

Я его слишком придирчиво не проверял (не на чем, не считать же на бумажке)). Нашедшему существенную ошибку - плюс в репу)).
Катя, спрашивай, что неясно.

Его можно в принципе переделать и на приоритеты..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

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

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


я же вроде там в скобочках дописала..
(умножение и деление имеют приоритет перед операциями сложения и вычитания, деление производится с остатком)


Добавлено через 5 мин.
еще несовсем понятно эта строчка Res,Min: tNum;
и вот это Dec(Ad);

Добавлено через 1 мин.
Dec(Ad);- это результат операции какой-то?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(Екатерина7 @ 23.11.2009 19:02) *
я же вроде там в скобочках дописала..
Извиняюсь, не заглянул наверх (лучше говорить по ходу темы)

Цитата
еще несовсем понятно эта строчка Res,Min: tNum;
и вот это Dec(Ad);
Dec(Ad);- это результат операции какой-то?
Res - это сам результат выполнения операций. В самом начале он равен первому числу, потом "накапливается" по мере выполнения.
Min - это минимальный из всех Res, то есть то, что мы ищем. Мы его обновляем по мере встечи более маленьких значений Res.

Dec(x) - это операция уменьшения x на 1, то есть эквивалентно записи: x:=x-1

Спрашивай дальше.

Если приоритет нужно учитывать, решение нужно дорабатывать. Подумай, как. Я тоже )).


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

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

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


спасибо огромное тебе!!!! подумаю над решением и вопросами..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






а что такое Start?
например, Start:=false
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(Гость @ 23.11.2009 22:09) *
а что такое Start?
например, Start:=false
Start - логическая переменная, с помощью которой мы инициализируем Min жизненным значением, а не среднепотолочным. При самой первой встрече допустимой комбинации знаков мы заносим ее в Min (чтобы потом уточнять), а переменную Start сбрасываем в ложь.

Как я и полагал, учет приоритета операций потребовал вполне ощутимыз изменений, но далеко не катастрофических. Прога остается вполне узнаваемой. Кстати, в том варианте (выше), действительно есть ошибки - но все, прием заявок на плюс в репу закончен)).

Общая логика проги сохранилась. Екатерина, ты можешь приблизительно прокомментировать, что там к чему? Хотя бы сказать, где там использована рекурсия - можешь? И зачем.
Или вот такой совсем конкретный вопрос: какой цели служит массив Oper?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Екатерина7   рекурсия- расстановка знаков   23.11.2009 1:10
мисс_граффити   Екатерина, перенести тему в "Задачи на заказ…   23.11.2009 2:33
Екатерина7   Екатерина, перенести тему в "Задачи на заказ…   23.11.2009 2:54
Lapp   Согласия на перенос, как я понял, не поступало... …   23.11.2009 9:09
Гость   соображений никаких нет.. с рекурсией не работала.…   23.11.2009 16:43
Гость   соображений никаких нет.. с рекурсией не работала.…   23.11.2009 17:00
Lapp   Остается открытым вопрос про приоритеты операций. …   23.11.2009 22:51
Екатерина7   я же вроде там в скобочках дописала.. (умножение …   23.11.2009 23:02
Lapp   я же вроде там в скобочках дописала.. Извиняюсь, н…   23.11.2009 23:31
Екатерина7   спасибо огромное тебе!!!! подумаю …   23.11.2009 23:42
Гость   а что такое Start? например, Start:=false   24.11.2009 2:09
Lapp   а что такое Start? например, Start:=falseStart …   24.11.2009 10:50
Гость   массив Oper- массив знаков. так?   24.11.2009 13:35
Гость   рекурсия используется в самом конце программы? че…   24.11.2009 14:00
Unconnected   Присваивание логической переменной значения false.…   24.11.2009 2:16
Lapp   массив Oper- массив знаков. так?Так. Вопрос был, …   24.11.2009 15:31
Екатерина7   нет, спасибо, не нужно восстанавливать.. Добавлен…   25.11.2009 3:02
Unconnected   Ну как бы да, применяется здесь... Т.е. процедура …   25.11.2009 3:18
Lapp   Да. Достаточно было указать на три вызова процеду…   25.11.2009 6:31
Екатерина7   спасибо большое!!!   25.11.2009 18:44
Екатерина7   несовсем пойму, как она выполняется..точнее вообще…   8.12.2009 1:21
Lapp   несовсем пойму, как она выполняется..точнее вообще…   8.12.2009 2:41
Екатерина7   смотри, например 319155=8+2+1+8*10*10*7/9/4/5 во…   8.12.2009 14:09
Lapp   Гм.. И мне тоже непонятно. Кать, откуда ты береш…   8.12.2009 22:28
Екатерина7   хм... все, нашла ошибку! спасибо! вес прав…   9.12.2009 2:58
Lapp   хм... все, нашла ошибкуИзвини - ошибку в чем? Вро…   9.12.2009 3:36
Екатерина7   да, ошибка была не у тебя.. все нормально. если …   9.12.2009 11:36
Lapp   если не трудно, сможешь объяснить, пожалуйста :bl…   9.12.2009 11:55
volvo   Я тоже кое чего не понимаю... Например, откуда ты …   8.12.2009 14:29


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

 





- Текстовая версия 29.04.2024 6:59
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name