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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2012, 15:27   #1
maksym08
Пользователь
 
Регистрация: 13.09.2012
Сообщений: 12
По умолчанию Нумерация счетных множеств

Привет!
Мне надо написать программу в PascalABC.
В тему я вложил рисунок, на котором есть таблица счетных множеств. Стрелками показано способ нумерации. Так програма должна, когда я, например, ввиду 1/567 или 8/96, показать мне номер етого елемента.
Помогите пожалуста! Спасибо!
Изображения
Тип файла: gif image008.gif (6.6 Кб, 65 просмотров)
maksym08 вне форума Ответить с цитированием
Старый 13.09.2012, 16:59   #2
rubius2008
Форумчанин
 
Регистрация: 19.03.2010
Сообщений: 409
По умолчанию

Что у вас конкретно не получается? Свои наработки продемонстрируйте. Если надо все с нуля чтоб кто-то за вас написал, то вам во фриланс или напишите мне в асю, за финансовое вознаграждение помогут
Есть вопросы, пишите в ЛС.
rubius2008 вне форума Ответить с цитированием
Старый 13.09.2012, 19:03   #3
maksym08
Пользователь
 
Регистрация: 13.09.2012
Сообщений: 12
По умолчанию

Цитата:
Сообщение от rubius2008 Посмотреть сообщение
Что у вас конкретно не получается? Свои наработки продемонстрируйте. Если надо все с нуля чтоб кто-то за вас написал, то вам во фриланс или напишите мне в асю, за финансовое вознаграждение помогут
Я просто не могу понять принцип нумерации, каким образом? Я думаю что это надо сделать с помощью цикла for to do, но как???
maksym08 вне форума Ответить с цитированием
Старый 13.09.2012, 19:46   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,293
По умолчанию

Код:
uses
  crt;

var
  a, i, k: integer;
  t: boolean;

begin
  k := 2; 
  i := 1; 
  a := 1;
  t := false; 
  repeat
    if t then
      while a < k do
      begin
        writeln(i, ') ', a, '/', k - a);
        inc(a);
        inc(i);
      end
    else
    begin
      while a > 0 do
      begin
        writeln(i, ') ', a, '/', k - a);
        dec(a);
        inc(i);
      end;
      a := 1;
    end;
    inc(k);
    t := not t;
  until k > 10;
  readln;
end.
Вот само получение последовательности. Скорее всего, можно придумать более быстрый алгоритм (или поискать на просторах интернета).

Вот и само решение (потестировал - работает более-менее):
Код:
uses
  crt;

var
  a, b, k: integer;

begin
  write('Input a/b: ');
  readln(a, b);
  k := a + b;
  if k mod 2 = 0 then
    writeln((k - 2) * (k - 1) div 2 + b)
  else
    writeln((k - 2) * (k - 1) div 2 + a);
end.
Сделал только потому, что самому было интересно
На самом деле это математика.
Чтобы решить такую задачу, нужно порисовать, поискать зависимости.

Аватар, сам удивился

Чуть сокращенный вариант (вряд ли лучше, просто чистая формула)
Код:
uses
  crt;

var
  a, b, k: integer;

begin
  write('Input a/b: ');
  readln(a, b);
  k := a + b;
  writeln((k - 2) * (k - 1) div 2 + b * ((k mod 2 + 1) mod 2) + a * (k mod 2));
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 13.09.2012 в 20:27.
BDA вне форума Ответить с цитированием
Старый 13.09.2012, 20:05   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Не заметил, что PascalABC, в дельфях работает
Код:
var x,y,i,j,n,k: Integer;

  x:=4; {заданная строка}
  y:=5; {заданная колонка}

  i:=1; j:=1; n:=1; k:=1;
  while (i<>x) or (j<>y) do begin
    if (i=1) and (k=1) then begin Inc(j); k:=-1; end
    else if (j=1) and (k=-1) then begin Inc(i); k:=1; end
    else begin Dec(i,k); Inc(j,k); end;
    Inc(n);
  end;
  {в n результат для заданных строки и колонки}
BDA +1 последнее решение супер
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 13.09.2012 в 20:09.
Аватар вне форума Ответить с цитированием
Старый 13.09.2012, 21:25   #6
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Альтернативный сокращённый вариант:
Код:
  readln(a[1], a[0]);
  k := a + b;
  writeln((k - 2) * (k - 1) div 2 + a[k mod 2]);
Somebody вне форума Ответить с цитированием
Старый 14.09.2012, 16:18   #7
maksym08
Пользователь
 
Регистрация: 13.09.2012
Сообщений: 12
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Код:
uses
  crt;

var
  a, i, k: integer;
  t: boolean;

begin
  k := 2; 
  i := 1; 
  a := 1;
  t := false; 
  repeat
    if t then
      while a < k do
      begin
        writeln(i, ') ', a, '/', k - a);
        inc(a);
        inc(i);
      end
    else
    begin
      while a > 0 do
      begin
        writeln(i, ') ', a, '/', k - a);
        dec(a);
        inc(i);
      end;
      a := 1;
    end;
    inc(k);
    t := not t;
  until k > 10;
  readln;
end.
Вот само получение последовательности. Скорее всего, можно придумать более быстрый алгоритм (или поискать на просторах интернета).

Вот и само решение (потестировал - работает более-менее):
Код:
uses
  crt;

var
  a, b, k: integer;

begin
  write('Input a/b: ');
  readln(a, b);
  k := a + b;
  if k mod 2 = 0 then
    writeln((k - 2) * (k - 1) div 2 + b)
  else
    writeln((k - 2) * (k - 1) div 2 + a);
end.
Сделал только потому, что самому было интересно
На самом деле это математика.
Чтобы решить такую задачу, нужно порисовать, поискать зависимости.

Аватар, сам удивился

Чуть сокращенный вариант (вряд ли лучше, просто чистая формула)
Код:
uses
  crt;

var
  a, b, k: integer;

begin
  write('Input a/b: ');
  readln(a, b);
  k := a + b;
  writeln((k - 2) * (k - 1) div 2 + b * ((k mod 2 + 1) mod 2) + a * (k mod 2));
end.
Большое спасибо!!!
maksym08 вне форума Ответить с цитированием
Старый 14.09.2012, 16:56   #8
maksym08
Пользователь
 
Регистрация: 13.09.2012
Сообщений: 12
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Код:
uses
  crt;

var
  a, i, k: integer;
  t: boolean;

begin
  k := 2; 
  i := 1; 
  a := 1;
  t := false; 
  repeat
    if t then
      while a < k do
      begin
        writeln(i, ') ', a, '/', k - a);
        inc(a);
        inc(i);
      end
    else
    begin
      while a > 0 do
      begin
        writeln(i, ') ', a, '/', k - a);
        dec(a);
        inc(i);
      end;
      a := 1;
    end;
    inc(k);
    t := not t;
  until k > 10;
  readln;
end.
Вот само получение последовательности. Скорее всего, можно придумать более быстрый алгоритм (или поискать на просторах интернета).

Вот и само решение (потестировал - работает более-менее):
Код:
uses
  crt;

var
  a, b, k: integer;

begin
  write('Input a/b: ');
  readln(a, b);
  k := a + b;
  if k mod 2 = 0 then
    writeln((k - 2) * (k - 1) div 2 + b)
  else
    writeln((k - 2) * (k - 1) div 2 + a);
end.
Сделал только потому, что самому было интересно
На самом деле это математика.
Чтобы решить такую задачу, нужно порисовать, поискать зависимости.

Аватар, сам удивился

Чуть сокращенный вариант (вряд ли лучше, просто чистая формула)
Код:
uses
  crt;

var
  a, b, k: integer;

begin
  write('Input a/b: ');
  readln(a, b);
  k := a + b;
  writeln((k - 2) * (k - 1) div 2 + b * ((k mod 2 + 1) mod 2) + a * (k mod 2));
end.
Я нашол формулу:
uses
crt;
var i, j, nomer: real;
begin
write('Vvedit i: ');
readln(i);
write('Vvedit j: ');
readln(j);
nomer:=(i+j-1)*(i+j-2)/2+i;
write('Nomer elementa = ');
writeln(nomer);
end.
maksym08 вне форума Ответить с цитированием
Старый 14.09.2012, 20:16   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,293
По умолчанию

maksym08, молодец - ваша формула почти верна.
Теперь некоторые замечания:
1) Не нужно цитировать такие большие сообщения, достаточно написать, к кому вы обращаетесь или на какое отвечаете сообщение
2) 24 часа можно редактировать свое сообщение, так что не нужно оставлять несколько сообщений подряд
3) Тип real плохо подходит для хранения целых значений
4) Деление даст вам не номер, а дробное число (хотя, в данной задаче, вроде, не дает )
5) Формула уже выведена выше и она чуть сложнее вашей

Пример для проверки вашей формулы: 1/3
Ваша формула: 4
Должно быть: 6
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 14.09.2012 в 20:21.
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование алгоритмов с использованием счетных циклических операторов liol Помощь студентам 2 15.12.2011 21:08
Пересечение множеств. С++ Демик Помощь студентам 4 13.03.2011 18:04
пересечение двух множеств Олежек Фриланс 7 10.03.2010 18:46
перетин множеств designer Паскаль, Turbo Pascal, PascalABC.NET 0 15.05.2009 12:17