Четверг, 09.01.2025
Pascal 4 All
[ · Новые сообщения · Участники · Правила форума · Поиск · RSS ]

 

  • Страница 1 из 1
  • 1
Модератор форума: Seqular, Pavel  

Сложение, вычитание, умножение и деление...
YuRaSДата: Понедельник, 19.05.2008, 23:12 | Сообщение # 1
Новичок
Группа: Пользователи
Сообщений: 8
Репутация: 0
Замечания: 0%
Статус: Offline
Здравствуйте уважаемые посетители и модераторы столь замечательного форума. У меня есть на ваш суд задача о действиях с дробями: Напишите программу, которая производит сложение, умножение, вычитание, деление 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.


МУДРОСТЬЮ ЦАРИ ЦАРСТВУЮТ...
 
AlexanderДата: Вторник, 20.05.2008, 05:50 | Сообщение # 2
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Я когда-то кому-то такое делал biggrin .
Quote
условие задачи не предполагает использования каких-либо других вариантов типа подпрограмм

Чушь. Преподы не мазохисты,без подпрограмм это будет абсолютно нечитаемо.
Правда сейчас вижу, что можно ускорить... И деление на нуль не отслеживается... Короче чутка ещё подлатай, а так вполне сносно.
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.


Скажем дружно- нафиг нужно!
 
YuRaSДата: Вторник, 20.05.2008, 06:26 | Сообщение # 3
Новичок
Группа: Пользователи
Сообщений: 8
Репутация: 0
Замечания: 0%
Статус: Offline
Да... Интересный вариант ... Но насчёт того, чтобы делать программу без процедур - это правда... может мой универ, мои преподы такие суровые ... но да ладно ... объясню что и как должно делаться . Спасибо за вариант решения! Премного благодарен . book prof prof prof respect respect respect

МУДРОСТЬЮ ЦАРИ ЦАРСТВУЮТ...
 
AlexanderДата: Вторник, 20.05.2008, 08:03 | Сообщение # 4
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Quote
насчёт того, чтобы делать программу без процедур - это правда

Бред... Тогда процедуры для сложения умножения и т.д. пишите в операторе case, а после него пишите код для упрощения дроби.


Скажем дружно- нафиг нужно!
 
  • Страница 1 из 1
  • 1
Поиск:

Copyright MyCorp © 2025
Используются технологии uCoz
javascript:;" rel="nofollow" onclick="loginPopupForm(); return false;