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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2017, 11:02   #1
SEXTANT
Пользователь
 
Регистрация: 10.11.2016
Сообщений: 27
По умолчанию [Delphi]: Процедуры и функции (перечисляемые типы данных: найти интервал между нотами)

Объявлены типы и переменные :
TYPE НОТА = ( ДО, РЕ, МИ, ФА, СОЛЬ, ЛЯ, СИ) ;
ИНТЕРВАЛ = ( СЕКУНДА, ТЕРЦИЯ, КВАРТА, КВИНТА, СЕКСТА,
СЕПТИМА) ;
VAR n1, n2: НОТА; i: ИНТЕРВАЛ ;
Определить i - интервал, образованный нотами n1 и n2 (n1<>n2) : секунда - это интервал из двух соседних ( по кругу ) нот ( например ре и ми, си и до ), терция - интервал через ноту ( фа и ля, си и ре) и т.д.
Решить с использованием процедур или функций.
SEXTANT вне форума Ответить с цитированием
Старый 13.02.2017, 11:02   #2
SEXTANT
Пользователь
 
Регистрация: 10.11.2016
Сообщений: 27
По умолчанию

Как сделать помогите
SEXTANT вне форума Ответить с цитированием
Старый 13.02.2017, 11:20   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Что конкретно не получается?

нужно ввести два значения в n1 и n2, взять разницу i:=abs(ord(n2)-ord(n1))-1;
и полученную разницу вывести в виде строкового значения.

ссылки на полезные статьи:

http://delphi-prg.ru/rabota-s-tipami...islyaemye-tipy

http://www.compdoc.ru/prog/pascal/us...ed_types_data/

http://www.delphisources.ru/pages/fa...o_strings.html

p.s. какие именно операции сделать процедурами, какие - функциями, я не могу сказать,
тут либо уточняйте у преподавателя, либо полная свобода творчества - выдумывайте сами!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.02.2017, 14:46   #4
SEXTANT
Пользователь
 
Регистрация: 10.11.2016
Сообщений: 27
По умолчанию

проблема с выводом, делаю через case в п/п
не понимаю что написать в г/п и как вывести интервал
SEXTANT вне форума Ответить с цитированием
Старый 19.02.2017, 13:48   #5
SEXTANT
Пользователь
 
Регистрация: 10.11.2016
Сообщений: 27
По умолчанию [Delphi]: Процедуры и функции

Объявлены типы и переменные :
Код:
TYPE НОТА = ( ДО, РЕ, МИ, ФА, СОЛЬ, ЛЯ, СИ) ;
ИНТЕРВАЛ = ( СЕКУНДА, ТЕРЦИЯ, КВАРТА, КВИНТА, СЕКСТА,
СЕПТИМА) ;
VAR n1, n2: НОТА; i: ИНТЕРВАЛ ;
Определить i - интервал, образованный нотами n1 и n2 (n1<>n2) : секунда - это интервал из двух соседних ( по кругу ) нот ( например ре и ми, си и до ), терция - интервал через ноту ( фа и ля, си и ре) и т.д.
Решить с использованием процедур или функций.

Все сделал, но не работает интервал по кругу т.е <си и до> и тд.

Код:
procedure TForm1.Button1Click(Sender: TObject);
type nota=(doo,re,mi,fa,sol,lya,si);
     interval=(sek,ters,kvart,kvint,sekta,septima);
var n1,n2:nota; i:interval;  a:integer;

function abc(n,n3:nota):integer;
  begin
    abc:=abs(ord(n3)-ord(n))-1;
  end;

begin
  case combobox1.ItemIndex of
    0: n1:=doo;
    1: n1:=re;
    2: n1:=mi;
    3: n1:=fa;
    4: n1:=sol;
    5: n1:=lya;
    6: n1:=si;
  end;
  case combobox2.ItemIndex of
    0: n2:=doo;
    1: n2:=re;
    2: n2:=mi;
    3: n2:=fa;
    4: n2:=sol;
    5: n2:=lya;
    6: n2:=si;
  end;
 if n1<>n2 then begin

    a:=abc(n1,n2);
  case a of
    0: Label1.Caption:= ' Интервал: Секунда ' ;
    1: Label1.Caption:= ' Интервал: Терция ' ;
    2: Label1.Caption:= ' Интервал: Кварта '  ;
    3: Label1.Caption:= ' Интервал: Квинта '  ;
    4: Label1.Caption:= ' Интервал: Секста '  ;
    5: Label1.Caption:= ' Интервал: Септима '  ;
  end;
  end
    else Label1.Caption:= ' Ноты не могут быть выбраны одиннаковые ' ;


end;

end.




Последний раз редактировалось Вадим Мошев; 19.02.2017 в 14:26.
SEXTANT вне форума Ответить с цитированием
Старый 20.02.2017, 18:42   #6
SEXTANT
Пользователь
 
Регистрация: 10.11.2016
Сообщений: 27
По умолчанию

Решил свою проблему, кому интересно или нужна программа вот:


procedure TForm1.Button1Click(Sender: TObject);
type nota=(doo,re,mi,fa,sol,lya,si);
interval=(sek,ters,kvart,kvint,sekt a,septima);
var n1,n2:nota; int:interval; a:integer;

function abc(n1,n2:nota):integer;

begin
abc:=abs(ord(n2)-ord(n1))-1;
end;
function qwe(n1,n2:nota):integer;

begin
qwe:=abs(ord(n2)-ord(n1))-1;
end;

begin
case combobox1.ItemIndex of
0: n1:=doo;
1: n1:=re;
2: n1:=mi;
3: n1:=fa;
4: n1:=sol;
5: n1:=lya;
6: n1:=si;
end;
case combobox2.ItemIndex of
0: n2:=doo;
1: n2:=re;
2: n2:=mi;
3: n2:=fa;
4: n2:=sol;
5: n2:=lya;
6: n2:=si;
end;
if n1<>n2 then begin
if n1>n2 then begin
a:=qwe(n1,n2);
case a of
5: Label1.Caption:= ' Интервал: Секунда ' ;
4: Label1.Caption:= ' Интервал: Терция ' ;
3: Label1.Caption:= ' Интервал: Кварта ' ;
2: Label1.Caption:= ' Интервал: Квинта ' ;
1: Label1.Caption:= ' Интервал: Секста ' ;
0: Label1.Caption:= ' Интервал: Септима '
end;
end
else begin
a:=abc(n1,n2);
case a of
0: Label1.Caption:= ' Интервал: Секунда ' ;
1: Label1.Caption:= ' Интервал: Терция ' ;
2: Label1.Caption:= ' Интервал: Кварта ' ;
3: Label1.Caption:= ' Интервал: Квинта ' ;
4: Label1.Caption:= ' Интервал: Секста ' ;
5: Label1.Caption:= ' Интервал: Септима ' ;
end;
end;
end
else showmessage(' Ноты не могут быть выбраны одинаковые') ;


end;

end.
SEXTANT вне форума Ответить с цитированием
Старый 20.02.2017, 18:46   #7
SEXTANT
Пользователь
 
Регистрация: 10.11.2016
Сообщений: 27
По умолчанию

не много еще упростил:


Код:
procedure TForm1.Button1Click(Sender: TObject);
type nota=(doo,re,mi,fa,sol,lya,si);
     interval=(sek,ters,kvart,kvint,sekta,septima);
var n1,n2:nota; int:interval;  a:integer;

function abc(n1,n2:nota):integer;

  begin
    abc:=abs(ord(n2)-ord(n1))-1;
  end;

begin
  case combobox1.ItemIndex of
    0: n1:=doo;
    1: n1:=re;
    2: n1:=mi;
    3: n1:=fa;
    4: n1:=sol;
    5: n1:=lya;
    6: n1:=si;
  end;
  case combobox2.ItemIndex of
    0: n2:=doo;
    1: n2:=re;
    2: n2:=mi;
    3: n2:=fa;
    4: n2:=sol;
    5: n2:=lya;
    6: n2:=si;
  end;
 if n1<>n2 then begin
 a:=abc(n1,n2);
 if n1>n2 then
    case a of
    5: Label1.Caption:= ' Интервал: Секунда ' ;
    4: Label1.Caption:= ' Интервал: Терция ' ;
    3: Label1.Caption:= ' Интервал: Кварта '  ;
    2: Label1.Caption:= ' Интервал: Квинта '  ;
    1: Label1.Caption:= ' Интервал: Секста '  ;
    0: Label1.Caption:= ' Интервал: Септима '
    end
    else
  case a of
    0: Label1.Caption:= ' Интервал: Секунда ' ;
    1: Label1.Caption:= ' Интервал: Терция ' ;
    2: Label1.Caption:= ' Интервал: Кварта '  ;
    3: Label1.Caption:= ' Интервал: Квинта '  ;
    4: Label1.Caption:= ' Интервал: Секста '  ;
    5: Label1.Caption:= ' Интервал: Септима '  ;
  end
  end
    else showmessage(' Ноты не могут быть выбраны одинаковые') ;


end;

end.
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 21.02.2017 в 10:33.
SEXTANT вне форума Ответить с цитированием
Старый 21.02.2017, 11:11   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а я бы так написал:

Код:
procedure TForm1.Button1Click(Sender: TObject);
type nota=(doo,re,mi,fa,sol,lya,si);
     interval=(sek,ters,kvart,kvint,sekta,septima);
const interval_str : array[interval] of string =
          ('Секунда','Терция', 'Кварта','Квинта','Секста','Септима');
var n1,n2:nota; diff_interval:interval;

function interval_between(n1,n2:nota):interval;
  begin
    if n1<n2 then
      result := interval(ord(n2)-ord(n1)-1)
    else
      result := interval(ord(High(nota))-ord(n1)+ord(n2));
  end;

begin
  n1:= nota(combobox1.ItemIndex);
  n2:= nota(combobox2.ItemIndex);
  if n1=n2 then showmessage(' Ноты не могут быть выбраны одинаковые')
  else begin
    diff_interval := interval_between(n1,n2);
    Label1.Caption := ' Интервал: ' + interval_str[diff_interval];
 end;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.02.2017, 11:36   #9
SEXTANT
Пользователь
 
Регистрация: 10.11.2016
Сообщений: 27
По умолчанию

Нам просто сказали обязательно через case ))
SEXTANT вне форума Ответить с цитированием
Старый 22.02.2017, 11:52   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от SEXTANT Посмотреть сообщение
сказали обязательно через case )
ну, тогда так:
Код:
{вариант 3 - отображение через CASE}
procedure TForm1.Button1Click(Sender: TObject);
type nota=(doo,re,mi,fa,sol,lya,si);
     interval=(sek,ters,kvart,kvint,sekta,septima);
var n1,n2:nota;
    diff_interval:interval;

function interval_between(n1,n2:nota):interval;
  begin
    if n1<n2 then
      result := interval(ord(n2)-ord(n1)-1)
    else
      result := interval(ord(High(nota))-ord(n1)+ord(n2));
  end;

begin
  n1:= nota(combobox1.ItemIndex);
  n2:= nota(combobox2.ItemIndex);
  if n1=n2 then showmessage(' Ноты не могут быть выбраны одинаковые')
  else begin
    diff_interval := interval_between(n1,n2);
    case diff_interval of
      sek: Label1.Caption:= ' Интервал: Секунда ' ;
      ters: Label1.Caption:= ' Интервал: Терция ' ;
      kvart: Label1.Caption:= ' Интервал: Кварта '  ;
      kvint: Label1.Caption:= ' Интервал: Квинта '  ;
      sekta: Label1.Caption:= ' Интервал: Секста '  ;
      septima: Label1.Caption:= ' Интервал: Септима '  ;
    end;
 end;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перечисляемые типы zweina Паскаль, Turbo Pascal, PascalABC.NET 0 22.04.2013 18:15
Типы данных в Delphi. Ввод, вывод данных в Delphi Dark Raven Помощь студентам 1 06.12.2011 11:38
Перечисляемые типы. лаконичная запись. SkAndrew Общие вопросы Delphi 9 19.04.2010 20:14
Перечисляемые и ограниченные типы. Оператор варианта. Символьный тип. Alex_Gray Помощь студентам 2 14.12.2009 16:45