Помощь - Поиск - Пользователи - Календарь
Полная версия: Перечислимые типы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Mr. Anderson
Условие задачи:
type единица=(дец,км,м,мм,см);
длина=real;
var х:длина; р:единица;
Значение переменной х, означающее длину в единицах р, заменить на величину в метрах.

-----------------------------------------------------------------------------------
Проблема в том, что нельзя применять процедуры read(p)/write(p)
Но нужно ухитриться написать программу так, чтобы можно выбирать любую из перечислинных единиц и после переводить в метры (не через простое присвоение, например, p:=dec; !!! )

У меня пока вот что получилось:

program numtypes;
uses crt;
const name='A:\numtypes.out';
type yedinitsa=(dec,km,m,mm,sm);
     dlina=real;
var  x:dlina;
     p:yedinitsa;
     ch:char;
     i:integer;
     f:text;
begin
     assign(f,name);
     rewrite(f);
     writeln(f,'Laboratornaya rabota 8. Perechislimiye tipi');
     writeln(f,'Zadaniye: znacheniye x, oznachayuscheye dlinu v yedinitsaj p,');
     writeln(f,'zamienit na vielichinu v mietraj');
     repeat;
     clrscr;
     writeln('Vvieditie dlinu x v yedinitsaj p');
     read(x); write(' m^'); readln(i);
     if x>=0 then
        begin
             writeln(f,'Rezultat');
             case i of
             -1:writeln(f,0.1*x:7:5,' metrov ');
             3:writeln(f,1000*x:7:5,' metrov');
             1:writeln(f,x:7:5,'  metrov');
             -3:writeln(f,0.001*x:7:5,' metrov');
             -2:writeln(f,0.01*x:7:5,' metrov');
             end;
        end
     else writeln('Error !');
     readln;
     writeln;
     write('Again - Y, else exit ');
     read(ch);
     until upcase (ch) <> 'Y';
close(f);
readln;
end.


Возможно надо как-то связать i и p... blink.gif


volvo
Смотри, что можно сделать:
uses crt;
type
  yedinitsa=(dec,km,m,mm,sm);
  dlina=real;
const
  title: array[yedinitsa] of string = (
    'dec','km','m','mm','sm'
  );
  mult: array[yedinitsa] of real = (
    0.1, 1000, 1, 0.001, 0.01
  );

var
  x:dlina;
  p:yedinitsa;

  ch:char;
  i:integer;
  ix: yedinitsa;
begin
  repeat;
     clrscr;
     writeln('Vvieditie dlinu x v yedinitsaj p');
     write('X = '); readln(x);

     write('P [ ');
     for ix := low(yedinitsa) to high(yedinitsa) do
       write(succ(ord(ix)), ')' + title[ix] + ' ');
     write('] = ');

     repeat
       readln(i);
     until (i - 1) in [ord(low(yedinitsa)) .. ord(high(yedinitsa))];

     writeln('result = ', x*mult[yedinitsa(i - 1)]:7:5, ' m.');

     writeln;
     write('Again - Y, else exit ');
     read(ch);
  until upcase (ch) <> 'Y';
  readln;
end.

(вводишь длину, и НОМЕР единицы измерения, который показывается в списке)...
Mr. Anderson
Спасибо за помощь
thx smile.gif




Добавлено через 13 мин.
Есть вопрос: а зачем в строке
write(succ(ord(ix)), ')' + title[ix] + ' ');
плюсы, вместо запятых? они на что-нибудь влияют?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.