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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2009, 02:26   #1
delphyok
Пользователь
 
Регистрация: 22.02.2009
Сообщений: 19
Вопрос Подскажите кто знает, как реализовать

Здравствуйте!

Требуется решить задачу под названием замок. Суть простая, есть кодовый замок, в нем несколько чисел, я условно назвал их разрядами, каждое из которых может принимать несколько значений. Требуется посчитать максимальное количество сочетаний этих чисел, и вывести на экран эти сочетания. Вся сложность задачи заключается, в том, что количество разрядов и их значения задаются пользователем.
Например, имеется три числа: значение первого – от 1 до 3, второго – от 1 до 2, в третьем только одно значение. Как высчитать варианты я понял, нужно всего-лишь перемножить значения всех разрядов. Получается – 6 вариаций:
111
121
211
221
311
321
Когда известно сколько всего разрядов, вывести сочетания не проблема, но вот как сделать, чтобы результат зависел от пользователя ума не приложу. Набросал начало программы:

Код:
program zamok;
var
    a, x : array [1..1000] of integer;
    n,i,nras : integer;
    znach : longint;

begin
    write('Введите колличество разрядов числа: ');
    readln(nras);
  {Присваение значений каждому разряду}
    for i := 1 to nras do
     	begin
    	writeln('Введите значение ',i,'-го разряда: ');
        	readln(a[i])
     	end;
  {Подсчет колличества вариантов сочетаний}
	znach := 1;
	for i := 1 to nras do
    	znach := znach * a[i];
           writeln('Максимальное количество вариантов - ', znach);
           writeln('Вот они: ');
  {Вариант программы, с тремя разрядами}
    for x[1] := 1 to a[1] do
      for x[2] := 1 to a[2] do
        for x[3] := 1 to a[3] do
         writeln(x[1], x[2], x[3]);
readln{Чтобы прочесть результаты}

end.
В последнем цикле сделал вариант с тремя разрядами, как быть дальше не знаю, ведь чем больше разрядов, тем больше вложенных циклов, как же это можно описать программно, чтобы результат от пользователя зависел Подскажите кто знает
delphyok вне форума Ответить с цитированием
Старый 03.03.2009, 02:42   #2
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Может я как-то не правильно понял, но если нужны все сочетания...
Цитата:
Например, имеется три числа: значение первого – от 1 до 3, второго – от 1 до 2, в третьем только одно значение.
Почему так? Почему, например не учитывается сочетание "112"..?
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 03.03.2009, 02:47   #3
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

delphyok, Если нужно именно так, как вы написали (когда максимальное значение каждого последующего разряда на 1 меньше предыдущего), то так:

Код:
uses crt;
var
a : array[1..1000] of byte;
i,n,m : integer;
znach : longint;


function znfun(k : integer) : longint;
 var i,j,rz : integer;
 begin
 if k>n then
  begin
  znfun := 1;
  for j:=1 to k-1 do
   write(a[j]);
  writeln;
  exit;
  end;
 rz := 0;
 for i:=1 to m-k+1 do
  begin
  a[k]:=i;
  rz := rz + znfun(k+1);

  end;
 znfun := rz;
 end;

begin
clrscr;
write('Vvedite kolichestvo razryadov: ');
readln(n);
write('Vvedite kolichestvo znachenij 1-ogo razryada: ');
readln(m);
znach := znfun(1);
writeln;
writeln('Kolichestvo variantov: ',znach);
readln;
end.
А вообще логичнее было бы, если б значения каждого разряда не могли повторяться (123 - можно, 112 - нельзя) или если бы все разряды имели одинаковый максимум.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 03.03.2009 в 02:49.
Sazary вне форума Ответить с цитированием
Старый 03.03.2009, 03:09   #4
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Sazary, просто он писал:
Цитата:
... задачу под названием замок. Суть простая, есть кодовый замок, в нем несколько чисел ...
В кодовых замках может быть комбинация 112...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 03.03.2009, 03:12   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

DomiNick Ну да.. Но, может быть, это какой-нибудь особенный замок собственной сборки

Собственно, для реального кодового замка, нужно исправить в цикле:
Код:
 for i:=1 to m-k+1 do
  begin
  a[k]:=i;
  rz := rz + znfun(k+1);

  end;
на
Код:
for i:=1 to m do
  begin
  a[k]:=i;
  rz := rz + znfun(k+1);

  end;
А вот если бы имелся в виду один из старых замков, которые ставили (и где-то еще ставят) на железных дверях (где нужно зажать 3 кнопки), то код такой:
Код:
uses crt;
var
a : array[1..1000] of byte;
i,n,m : integer;
znach : longint;
fl : boolean;


function znfun(k : integer) : longint;
 var i,j,rz : integer;
 begin
 if k>n then
  begin
  znfun := 1;
  for j:=1 to k-1 do
   write(a[j]);
  writeln;
  exit;
  end;
 rz := 0;
 for i:=1 to m do
  begin
  fl := true;
  for j:=1 to k-1 do
   if i = a[j] then
    begin
    fl := false;
    break;
    end;
  if fl then
   begin
   a[k]:=i;
   rz := rz + znfun(k+1);
   end;

  end;
 znfun := rz;
 end;

begin
clrscr;
write('Vvedite kolichestvo razryadov: ');
readln(n);
write('Vvedite kolichestvo znachenij razryada: ');
readln(m);
znach := znfun(1);
writeln;
writeln('Kolichestvo variantov: ',znach);
readln;
end.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 03.03.2009 в 03:18.
Sazary вне форума Ответить с цитированием
Старый 03.03.2009, 13:23   #6
delphyok
Пользователь
 
Регистрация: 22.02.2009
Сообщений: 19
По умолчанию

Цитата:
А вообще логичнее было бы, если б значения каждого разряда не могли повторяться (123 - можно, 112 - нельзя) или если бы все разряды имели одинаковый максимум.
В этом то вся и проблема, что значения выбираются пользователем. Т.е. может быть, скажем, и 10 и 20 разрядов, а в каждом из них сколько угодно значений, и в каждом разряде они могут отличаться, а могут и совпадать, все зависит от того что введет пользователь - хоть 1000, хоть 10000, на сколько хватит памяти. И варианты сочетаний этих значений должны последовательно перебираться друг с другом. Препод сказал, кто решит, тот освобождается от экзамена, пять - автоматом . Вот сижу думаю, как сделать.

В принципе, задача не полная, это только один из этапов, в дальнейшем нужно сделать с символами, цифры - это условно, скажем, значения каждого разряда могут быть и в символьном виде, например 2-е значение первого разряда - это знак #, а 3-е значение того же разряда - знак &, и т.д. и прога должна уметь выводить все возможные сочетания. Если уметь вывести значения хотя бы в цифровом виде, то сделать их в символьном я думаю, будет уже не проблема
delphyok вне форума Ответить с цитированием
Старый 03.03.2009, 13:32   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

delphyok Ну тогда динамический массив значений каждого разряда. Пользователь вводит все возможные значения для каждого (мазохист наверное).
И цикл (нужно изменить)
Код:
 for i:=1 to m-k+1 do
Будет перебирать все значения текущего разряда.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 03.03.2009, 17:15   #8
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Вот, посмотрите, очень похожая задача
http://www.programmersforum.ru/showthread.php?t=6879
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 04.03.2009, 00:14   #9
delphyok
Пользователь
 
Регистрация: 22.02.2009
Сообщений: 19
По умолчанию

Да, действительно, очень похожа Буду разбираться, плохо только, что дельфи не знаю.. (((
delphyok вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите пожалуйста кто знает Anutik Microsoft Office Excel 7 28.02.2009 19:29
Подскажите кто знает. SIV84 Microsoft Office Excel 3 17.01.2009 11:10
Подскажите кто знает?! Proof БД в Delphi 3 06.06.2008 20:19
Ошибка класса EIdReadTimeout - подскажите, кто знает.... maryzza Общие вопросы Delphi 6 12.12.2007 17:11
Кто знает компоненты MMTOOLS(Делфи 6), подскажите! vizor9 Софт 5 11.08.2007 12:30