Здравствуйте уважаемые посетители и модераторы столь замечательного форума. У меня есть на ваш суд задача о действиях с дробями: Напишите программу, которая производит сложение, умножение, вычитание, деление 2-х дробей... в формате x/y , где х и у - натуральные числа. У меня есть готовый вариант умножения и деления, но вот с остальными действиями туго пришлось. Я использовал тип данных record, string, ну и простые типы... условие задачи не предполагает использования каких-либо других вариантов типа подпрограмм, файлов или динамических структур... Выношу свои задумки по поводу умножения и деления : Program lb6N2; uses crt; type drobi=record cisliteli:integer; znam:word; end; var f1,f2,f3:drobi; s:string; p,cod,d:integer; Begin clrscr; writeln('Vvedite pervuiu drobi v formate x/y, gde x,y - naturalinie cisla'); readln(s); p:=pos('/',s); val(copy(s,1,p-1),f1.cisliteli,cod); val(copy(s,p+1,length(s)-p),f1.znam,cod); writeln('Vvedite vtoruiu drobi '); readln(s); p:=pos('/',s); val(copy(s,1,p-1),f2.cisliteli,cod); val(copy(s,p+1,length(s)-p),f2.znam,cod); with f3 do begin znam:=f1.znam*f2.znam; cisliteli:=f1.cisliteli*f2.cisliteli; p:=2; d:=1; if cisliteli>znam then cod:=cisliteli else cod:=znam; repeat if (cisliteli mod p=0) and (znam mod p=0) then d:=p; inc(p); until (p>cod div 2); cisliteli:=cisliteli div d; znam:=znam div d; writeln('Proizvedenie:',cisliteli,'/',znam); end; with f3 do begin znam:=f1.znam*f2.znam; cisliteli:=f1.cisliteli*f2.cisliteli; p:=2; d:=1; if cisliteli>znam then cod:=cisliteli else cod:=znam; repeat if (cisliteli mod p=0) and (znam mod p=0) then d:=p; inc(p); until (p>cod div 2); cisliteli:=cisliteli div d; znam:=znam div d; Writeln('delenie:',cisliteli,'/',znam); end; readkey; end. МУДРОСТЬЮ ЦАРИ ЦАРСТВУЮТ...
условие задачи не предполагает использования каких-либо других вариантов типа подпрограмм
Чушь. Преподы не мазохисты,без подпрограмм это будет абсолютно нечитаемо. Правда сейчас вижу, что можно ускорить... И деление на нуль не отслеживается... Короче чутка ещё подлатай, а так вполне сносно.
Code
uses crt; type drob=record chislitel,znamenatel:LongInt; end; {============================================================================} procedure uproshenie(var x:drob); var temp,i:longInt; begin if x.znamenatel<0 then begin x.chislitel:=-x.chislitel; x.znamenatel:=-x.znamenatel; end; if x.chislitel mod x.znamenatel=0 then begin x.chislitel:=x.chislitel div x.znamenatel; x.znamenatel:=1; exit; end else if x.znamenatel mod x.chislitel=0 then begin x.znamenatel:=x.znamenatel div x.chislitel; x.chislitel:=1; exit; end; if x.chislitel>x.znamenatel then temp:=abs(x.znamenatel) shr 1 else temp:=abs(x.chislitel) shr 1; for i:=temp downto 2 do if (x.chislitel mod i=0) and (x.znamenatel mod i=0) then begin x.chislitel:=x.chislitel div i; x.znamenatel:=x.znamenatel div i; exit; end; end; {============================================================================} procedure slogenie(x,y:drob;var R:drob); begin x.chislitel:=x.chislitel*y.znamenatel; y.chislitel:=x.znamenatel*y.chislitel; R.znamenatel:=x.znamenatel*y.znamenatel; R.chislitel:=x.chislitel+y.chislitel; uproshenie(R); end; {============================================================================} procedure umnogenie(x,y:drob;var R:drob); begin R.chislitel:=x.chislitel*y.chislitel; R.znamenatel:=x.znamenatel*y.znamenatel; uproshenie(R); end; {============================================================================} procedure delenie(x,y:drob;var R:drob); begin R.chislitel:=x.chislitel*y.znamenatel; R.znamenatel:=x.znamenatel*y.chislitel; uproshenie(R); end; {============================================================================} procedure vichitanie(x,y:drob;var R:drob); begin y.chislitel:=-y.chislitel; slogenie(x,y,R); end; {============================================================================} var x,y:drob; c:char; begin ClrScr; ReadLn(x.chislitel,x.znamenatel,y.chislitel,y.znamenatel); repeat c:=ReadKey; until (c='+') or (c='-') or (c='*') or (c='/'); case c of '+': Slogenie(x,y,x); '-': Vichitanie(x,y,x); '/': Delenie(x,y,x); '*': Umnogenie(x,y,x); end; WriteLn(x.chislitel:10,x.znamenatel:10); ReadKey; end.
Да... Интересный вариант ... Но насчёт того, чтобы делать программу без процедур - это правда... может мой универ, мои преподы такие суровые ... но да ладно ... объясню что и как должно делаться . Спасибо за вариант решения! Премного благодарен . МУДРОСТЬЮ ЦАРИ ЦАРСТВУЮТ...
насчёт того, чтобы делать программу без процедур - это правда
Бред... Тогда процедуры для сложения умножения и т.д. пишите в операторе case, а после него пишите код для упрощения дроби. Скажем дружно- нафиг нужно!