• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Описать свой тип данных для простой дроби на Паскале

An4ik7689

Новые
Регистрация
6 Янв 2012
Сообщения
18
Реакции
0
Баллы
0
Описать свой тип данных для простой дроби на Паскале

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

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

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

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.
 
Вот это да, спасибо огромное.
 
А что за процедура Val в модуле? по ней ошибку выдает
 
А что за процедура Val в модуле? по ней ошибку выдает
Посмотрите в Help Вашего Паскаля - какие форматы параметров этой процедуры требуются. Возможно, Code нужно задать, как Word или Byte, или нельзя почему-то подставлять непосредственно поле записи. Если не получится одолеть, сделаем функцию Fr_inp по-другому, без Val. Но не хотелось бы. И да, напишите подробно, что за ошибка возникает.
 
У меня в Паскале Val(s,v,code) процедура s - string, v - integer, real, и code - integer такие параметры. А ошибку выдает в 33 строке. Процедура Val с параметрами указанных типов не найдена.
 
У меня в Паскале 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.
 
Да ABC, везде поменяла на Integer, но выдает ошибку в процедуре Function Fr_Inp:frct;
в месте Fr_Inp.Nom:=W; И выдает ошибку:"нельзя присвоить левой части"
 
код
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<>'/' then S1:=S1+S;
Until S='/';
Val(S1,W,Code);
Fr_Inp.Nom:=W;
S1:='';
Repeat
Inc(i);
S1:=S1+S;
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.
 
Да ABC, везде поменяла на Integer, но выдает ошибку в процедуре Function Fr_Inp:frct;
в месте Fr_Inp.Nom:=W; И выдает ошибку:"нельзя присвоить левой части"
Ох, вот же наказание с этим уродским изделием №2!
Ладно, попробуйте так:
Function Fr_Inp:frct;
var
S,S1:String;
i:Byte;
W,Code:Integer;
QQQ:frct;
begin
Write('Enter the simple fraction in the form xxxx/yyyy: ');
Readln(S);
S1:='';
i:=0;
Repeat
Inc(i);
If S<>'/' then S1:=S1+S;
Until S='/';
Val(S1,W,Code);
QQQ.Nom:=W;
S1:='';
Repeat
Inc(i);
S1:=S1+S;
Until i=Length(S);
Val(S1,W,Code);
QQQ.Denom:=W;
Fr_Inp:=QQQ;
end;
 
Назад
Сверху