Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 08.01.2013, 23:43   #1 (permalink)
An4ik7689
Member
 
Регистрация: 06.01.2012
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Описать свой тип данных для простой дроби на Паскале

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

1. Описать следующий минимум операций:
a. ввод значения в переменную своего типа с клавиатуры;
b. вывод значения переменной своего типа на экран монитора;
c. арифметические операции: сложение, вычитание, умножение, деление;
d. уникальные операции для своего типа данных.
2. На языке программирования Pascal или другом языке реализовать свой тип данных (в виде модуля).
3. Написать тестовую программу, которая подключает разработанный вами модуль и использует все ваши операции.

Никак не пойму как это можно сделать? Помогите пожалуйста.
An4ik7689 вне форума   Ответить с цитированием

Старый 08.01.2013, 23:43
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Скорее всего в похожих обсуждениях вы найдете множество полезных советов

Описать процедуру
Описать алгоритм
Нужно описать принцип действия принципиальной схемы
Помогите пожалуйста описать схему. Усилитель на микросхеме к174ун7
Описать запись с именем ORDER, содержащую следующие поля...
Строки/файлы: описать запись с именем ORDER, содержащую следующие поля...

Старый 09.01.2013, 12:36   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от An4ik7689 Посмотреть сообщение
Никак не пойму как это можно сделать? Помогите пожалуйста.
Например, так:

1. Модуль:
Код:
Unit Fract;

INTERFACE

Type frct=Record
           Nom:LongInt;
           Denom:LongInt;
          End;

Function Fr_Inp:frct;
Procedure Fr_Out(Fo:frct);
Function Fr_Sum(Fsm1,Fsm2:frct):frct;
Function Fr_Dif(Fdf1,Fdf2:frct):frct;
Function Fr_Mul(Fml1,Fml2:frct):frct;
Function Fr_Div(Fdv1,Fdv2:frct):frct;

IMPLEMENTATION

Function Fr_Inp:frct;
var
 S,S1:String;
 i:Byte;
 Code:Integer;
begin
 Write('Enter the simple fraction in the form xxxx/yyyy: ');
 Readln(S);
 S1:='';
 i:=0;
 Repeat
  Inc(i);
  If S[i]<>'/' then S1:=S1+S[i];
 Until S[i]='/';
 Val(S1,Fr_Inp.Nom,Code);
 S1:='';
 Repeat
  Inc(i);
  S1:=S1+S[i];
 Until i=Length(S);
 Val(S1,Fr_Inp.Denom,Code);
end;

Procedure Fr_Out(Fo:frct);
begin
 If Fo.Nom<0 then write('-');
 If Abs(Fo.Denom)>1 then
  Write(Abs(Fo.Nom),'/',Abs(Fo.Denom))
 else
  Write(Abs(Fo.Nom));
end;

Function Fr_Sum(Fsm1,Fsm2:frct):frct;
var
 d:Longint;
 C:frct;
 bo:boolean;
begin
 C.Denom:=Fsm1.Denom*Fsm2.Denom;
 C.Nom:=Fsm1.Nom*Fsm2.Denom+Fsm2.Nom*Fsm1.Denom;
 Repeat
  d:=1;
  bo:=true;
  repeat
   Inc(d);
   if ((C.Nom mod d)=0) and ((C.Denom mod d)=0) then
    begin
     C.Nom:=C.Nom div d;
     C.Denom:=C.Denom div d;
     bo:=false;
    end;
  until not(bo) or (d>=Abs(C.Nom)) or (d>=Abs(C.Denom));
 Until bo;
 Fr_Sum.Nom:=C.Nom;
 Fr_Sum.Denom:=C.Denom;
end;

Function Fr_Dif(Fdf1,Fdf2:frct):frct;
var
 d:Longint;
 C:frct;
 bo:boolean;
begin
 C.Denom:=Fdf1.Denom*Fdf2.Denom;
 C.Nom:=Fdf1.Nom*Fdf2.Denom-Fdf2.Nom*Fdf1.Denom;
 Repeat
  d:=1;
  bo:=true;
  repeat
   Inc(d);
   if ((C.Nom mod d)=0) and ((C.Denom mod d)=0) then
    begin
     C.Nom:=C.Nom div d;
     C.Denom:=C.Denom div d;
     bo:=false;
    end;
  until not(bo) or (d>=Abs(C.Nom)) or (d>=Abs(C.Denom));
 Until bo;
 Fr_Dif.Nom:=C.Nom;
 Fr_Dif.Denom:=C.Denom;
end;

Function Fr_Mul(Fml1,Fml2:frct):frct;
var
 d:Longint;
 C:frct;
 bo:boolean;
begin
 C.Nom:=Fml1.Nom*Fml2.Nom;
 C.Denom:=Fml1.Denom*Fml2.Denom;
 Repeat
  d:=1;
  bo:=true;
  repeat
   Inc(d);
   if ((C.Nom mod d)=0) and ((C.Denom mod d)=0) then
    begin
     C.Nom:=C.Nom div d;
     C.Denom:=C.Denom div d;
     bo:=false;
    end;
  until not(bo) or (d>=Abs(C.Nom)) or (d>=Abs(C.Denom));
 Until bo;
 Fr_Mul.Nom:=C.Nom;
 Fr_Mul.Denom:=C.Denom;
end;

Function Fr_Div(Fdv1,Fdv2:frct):frct;
var
 d:Longint;
 C:frct;
 bo:boolean;
begin
 C.Nom:=Fdv1.Nom*Fdv2.Denom;
 C.Denom:=Fdv1.Denom*Fdv2.Nom;
 Repeat
  d:=1;
  bo:=true;
  repeat
   Inc(d);
   if ((C.Nom mod d)=0) and ((C.Denom mod d)=0) then
    begin
     C.Nom:=C.Nom div d;
     C.Denom:=C.Denom div d;
     bo:=false;
    end;
  until not(bo) or (d>=Abs(C.Nom)) or (d>=Abs(C.Denom));
 Until bo;
 Fr_Div.Nom:=C.Nom;
 Fr_Div.Denom:=C.Denom;
end;

End.
2. Тестовая программа:
Код:
Uses Fract;

Var
 a,b,r:frct;
 Ch:Char;

Begin
 a:=Fr_Inp;
 b:=Fr_Inp;
 Write('Action? ("+","-","*","/") ');
 Readln(Ch);
 Case Ch of
  '+': r:=Fr_Sum(a,b);
  '-': r:=Fr_Dif(a,b);
  '*': r:=Fr_Mul(a,b);
  '/': r:=Fr_Div(a,b);
 end;
 Write('Result: ');
 Fr_Out(r);
 Readln;
End.
Vladimir_S вне форума   Ответить с цитированием
Старый 09.01.2013, 21:14   #3 (permalink)
An4ik7689
Member
 
Регистрация: 06.01.2012
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Вот это да, спасибо огромное.
An4ik7689 вне форума   Ответить с цитированием
Старый 09.01.2013, 23:38   #4 (permalink)
An4ik7689
Member
 
Регистрация: 06.01.2012
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

А что за процедура Val в модуле? по ней ошибку выдает
An4ik7689 вне форума   Ответить с цитированием
Старый 10.01.2013, 00:12   #5 (permalink)
kreol
Member
 
Аватар для kreol
 
Регистрация: 27.02.2010
Сообщений: 659
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1312
По умолчанию

Цитата:
Сообщение от An4ik7689 Посмотреть сообщение
А что за процедура Val в модуле? по ней ошибку выдает
Строку переводит в число
kreol вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 10.01.2013, 09:38   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от An4ik7689 Посмотреть сообщение
А что за процедура Val в модуле? по ней ошибку выдает
Посмотрите в Help Вашего Паскаля - какие форматы параметров этой процедуры требуются. Возможно, Code нужно задать, как Word или Byte, или нельзя почему-то подставлять непосредственно поле записи. Если не получится одолеть, сделаем функцию Fr_inp по-другому, без Val. Но не хотелось бы. И да, напишите подробно, что за ошибка возникает.
Vladimir_S вне форума   Ответить с цитированием
Старый 10.01.2013, 20:08   #7 (permalink)
An4ik7689
Member
 
Регистрация: 06.01.2012
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

У меня в Паскале Val(s,v,code) процедура s - string, v - integer, real, и code - integer такие параметры. А ошибку выдает в 33 строке. Процедура Val с параметрами указанных типов не найдена.
An4ik7689 вне форума   Ответить с цитированием
Старый 11.01.2013, 09:55   #8 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от An4ik7689 Посмотреть сообщение
У меня в Паскале Val(s,v,code) процедура s - string, v - integer, real, и code - integer такие параметры. А ошибку выдает в 33 строке. Процедура Val с параметрами указанных типов не найдена.
Понятно. Не нравится, стало быть, формат второго параметра LongInt. Хорошо, попробуйте так:
Код:
Function Fr_Inp:frct;
var
 S,S1:String;
 i:Byte;
 W,Code:Integer;
begin
 Write('Enter the simple fraction in the form xxxx/yyyy: ');
 Readln(S);
 S1:='';
 i:=0;
 Repeat
  Inc(i);
  If S[i]<>'/' then S1:=S1+S[i];
 Until S[i]='/';
 Val(S1,W,Code);
 Fr_Inp.Nom:=W;
 S1:='';
 Repeat
  Inc(i);
  S1:=S1+S[i];
 Until i=Length(S);
 Val(S1,W,Code);
 Fr_Inp.Denom:=W;
end;
Надеюсь, у Вас не АВС-Паскаль? Потомо что если АВС, то там надо вообще LongInt всюду заменить на Integer.
Vladimir_S вне форума   Ответить с цитированием
Старый 19.01.2013, 17:15   #9 (permalink)
An4ik7689
Member
 
Регистрация: 06.01.2012
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Да ABC, везде поменяла на Integer, но выдает ошибку в процедуре Function Fr_Inp:frct;
в месте Fr_Inp.Nom:=W; И выдает ошибку:"нельзя присвоить левой части"
An4ik7689 вне форума   Ответить с цитированием
Старый 19.01.2013, 17:18   #10 (permalink)
An4ik7689
Member
 
Регистрация: 06.01.2012
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

код
Цитата:
Program Drob;
Uses mDrob;

Var
a,b,r:frct;
Ch:Char;

Begin
a:=Fr_Inp;
b:=Fr_Inp;
Write('Action? ("+","-","*","/") ');
Readln(Ch);
Case Ch of
'+': r:=Fr_Sum(a,b);
'-': r:=Fr_Dif(a,b);
'*': r:=Fr_Mul(a,b);
'/': r:=Fr_Div(a,b);
end;
Write('Result: ');
Fr_Out(r);
Readln;
End.
модуль
Цитата:
Unit mDrob;

INTERFACE

Type frct=Record
Nom:LongInt;
Denom:LongInt;
End;

Function Fr_Inp:frct;
Procedure Fr_Out(Fo:frct);
Function Fr_Sum(Fsm1,Fsm2:frct):frct;
Function Fr_Dif(Fdf1,Fdf2:frct):frct;
Function Fr_Mul(Fml1,Fml2:frct):frct;
Function Fr_Div(Fdv1,Fdv2:frct):frct;

IMPLEMENTATION

Function Fr_Inp:frct;
var
S,S1:String;
i:Byte;
W,Code:Integer;
begin
Write('Enter the simple fraction in the form xxxx/yyyy: ');
Readln(S);
S1:='';
i:=0;
Repeat
Inc(i);
If S[i]<>'/' then S1:=S1+S[i];
Until S[i]='/';
Val(S1,W,Code);
Fr_Inp.Nom:=W;
S1:='';
Repeat
Inc(i);
S1:=S1+S[i];
Until i=Length(S);
Val(S1,W,Code);
Fr_Inp.Denom:=W;
end;

Procedure Fr_Out(Fo:frct);
begin
If Fo.Nom<0 then write('-');
If Abs(Fo.Denom)>1 then
Write(Abs(Fo.Nom),'/',Abs(Fo.Denom))
else
Write(Abs(Fo.Nom));
end;

Function Fr_Sum(Fsm1,Fsm2:frct):frct;
var
d:integer;
C:frct;
bo:boolean;
begin
C.Denom:=Fsm1.Denom*Fsm2.Denom;
C.Nom:=Fsm1.Nom*Fsm2.Denom+Fsm2.Nom*Fsm1.Denom;
Repeat
d:=1;
bo:=true;
repeat
Inc(d);
if ((C.Nom mod d)=0) and ((C.Denom mod d)=0) then
begin
C.Nom:=C.Nom div d;
C.Denom:=C.Denom div d;
bo:=false;
end;
until not(bo) or (d>=Abs(C.Nom)) or (d>=Abs(C.Denom));
Until bo;
Fr_Sum.Nom:=C.Nom;
Fr_Sum.Denom:=C.Denom;
end;

Function Fr_Dif(Fdf1,Fdf2:frct):frct;
var
d:integer;
C:frct;
bo:boolean;
begin
C.Denom:=Fdf1.Denom*Fdf2.Denom;
C.Nom:=Fdf1.Nom*Fdf2.Denom-Fdf2.Nom*Fdf1.Denom;
Repeat
d:=1;
bo:=true;
repeat
Inc(d);
if ((C.Nom mod d)=0) and ((C.Denom mod d)=0) then
begin
C.Nom:=C.Nom div d;
C.Denom:=C.Denom div d;
bo:=false;
end;
until not(bo) or (d>=Abs(C.Nom)) or (d>=Abs(C.Denom));
Until bo;
Fr_Dif.Nom:=C.Nom;
Fr_Dif.Denom:=C.Denom;
end;

Function Fr_Mul(Fml1,Fml2:frct):frct;
var
d:integer;
C:frct;
bo:boolean;
begin
C.Nom:=Fml1.Nom*Fml2.Nom;
C.Denom:=Fml1.Denom*Fml2.Denom;
Repeat
d:=1;
bo:=true;
repeat
Inc(d);
if ((C.Nom mod d)=0) and ((C.Denom mod d)=0) then
begin
C.Nom:=C.Nom div d;
C.Denom:=C.Denom div d;
bo:=false;
end;
until not(bo) or (d>=Abs(C.Nom)) or (d>=Abs(C.Denom));
Until bo;
Fr_Mul.Nom:=C.Nom;
Fr_Mul.Denom:=C.Denom;
end;

Function Fr_Div(Fdv1,Fdv2:frct):frct;
var
d:integer;
C:frct;
bo:boolean;
begin
C.Nom:=Fdv1.Nom*Fdv2.Denom;
C.Denom:=Fdv1.Denom*Fdv2.Nom;
Repeat
d:=1;
bo:=true;
repeat
Inc(d);
if ((C.Nom mod d)=0) and ((C.Denom mod d)=0) then
begin
C.Nom:=C.Nom div d;
C.Denom:=C.Denom div d;
bo:=false;
end;
until not(bo) or (d>=Abs(C.Nom)) or (d>=Abs(C.Denom));
Until bo;
Fr_Div.Nom:=C.Nom;
Fr_Div.Denom:=C.Denom;
end;

End.
An4ik7689 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 13:13.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.