08.01.2013, 23:43 | #1 (permalink) |
Member
Регистрация: 06.01.2012
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Описать свой тип данных для простой дроби на Паскале
Порядок выполнения работы: 1. Описать следующий минимум операций: a. ввод значения в переменную своего типа с клавиатуры; b. вывод значения переменной своего типа на экран монитора; c. арифметические операции: сложение, вычитание, умножение, деление; d. уникальные операции для своего типа данных. 2. На языке программирования Pascal или другом языке реализовать свой тип данных (в виде модуля). 3. Написать тестовую программу, которая подключает разработанный вами модуль и использует все ваши операции. Никак не пойму как это можно сделать? Помогите пожалуйста. |
08.01.2013, 23:43 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Скорее всего в похожих обсуждениях вы найдете множество полезных советов Описать процедуру Описать алгоритм Нужно описать принцип действия принципиальной схемы Помогите пожалуйста описать схему. Усилитель на микросхеме к174ун7 Описать запись с именем ORDER, содержащую следующие поля... Строки/файлы: описать запись с именем ORDER, содержащую следующие поля... |
09.01.2013, 12:36 | #2 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Например, так:
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. Код:
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. |
10.01.2013, 00:12 | #5 (permalink) |
Member
Регистрация: 27.02.2010
Сообщений: 659
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1312
|
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
10.01.2013, 09:38 | #6 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Посмотрите в Help Вашего Паскаля - какие форматы параметров этой процедуры требуются. Возможно, Code нужно задать, как Word или Byte, или нельзя почему-то подставлять непосредственно поле записи. Если не получится одолеть, сделаем функцию Fr_inp по-другому, без Val. Но не хотелось бы. И да, напишите подробно, что за ошибка возникает.
|
10.01.2013, 20:08 | #7 (permalink) |
Member
Регистрация: 06.01.2012
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
У меня в Паскале Val(s,v,code) процедура s - string, v - integer, real, и code - integer такие параметры. А ошибку выдает в 33 строке. Процедура Val с параметрами указанных типов не найдена.
|
11.01.2013, 09:55 | #8 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
Код:
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; |
|
19.01.2013, 17:15 | #9 (permalink) |
Member
Регистрация: 06.01.2012
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Да ABC, везде поменяла на Integer, но выдает ошибку в процедуре Function Fr_Inp:frct;
в месте Fr_Inp.Nom:=W; И выдает ошибку:"нельзя присвоить левой части" |
19.01.2013, 17:18 | #10 (permalink) | ||
Member
Регистрация: 06.01.2012
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
код
Цитата:
Цитата:
|
||
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|