![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
marwell |
![]() ![]()
Сообщение
#1
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: ![]() ![]() ![]() |
нужно написать программу приведения дроби к несократимому виду.
var i,a,b,p,q:integer;
function NOD(a:integer; b:integer):integer;
begin
while(a<>0) and (b<>0) do
if a>=b then a:=a mod b
else b:=b mod a;
NOD:=a+b;
end;
function NOK (A: integer; B: integer): integer;
begin
NOK := a * b div NOD (a, b);
end;
procedure Socr(a,b:integer; var p,q:integer);
begin
if a=b then begin
p:=1;
q:=1;
end
else if NOD (a, b)<>1 then
begin
NOD (a, b);
p:=a/NOD(a, b); {вот в этой строчке выдает ошибку}
q:=b/NOD(a, b);
end;
begin
Writeln('введите числитель');
Readln(a);
Writeln('введите знаменатель');
Readln(b);
Socr(a,b);
Writeln(p,'/',q);
readln;
end.
признаюсь, в процедурах и функциях я разбираюсь не очень хорошо(((( при прогоне выдает ошибку [Error] Project2.dpr(28): Incompatible types: 'Integer' and 'Extended' не подскажите, в чем проблема? Сообщение отредактировано: marwell - 3.01.2010 18:07 |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата не подскажите, в чем проблема? Деление ВСЕГДА возвращает результат вещественного типа. Если тебе нужно делить нацело - используй Div, или приводи частное к целому типу через Trunc.Кстати, у тебя нарушена структура программы (одного End-а не хватает). А не видно этого - потому что исходник не отформатирован как положено. |
marwell |
![]()
Сообщение
#3
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: ![]() ![]() ![]() |
Деление ВСЕГДА возвращает результат вещественного типа. Если тебе нужно делить нацело - используй Div, или приводи частное к целому типу через Trunc. ааа, вот оно что! спасибо Добавлено через 2 мин. Деление ВСЕГДА возвращает результат вещественного типа. Если тебе нужно делить нацело - используй Div, или приводи частное к целому типу через Trunc. блин, опять ошибка((
var i,a,b,p,q:integer;
function NOD(a:integer; b:integer):integer;
begin
while(a<>0) and (b<>0) do
if a>=b then a:=a mod b
else b:=b mod a;
NOD:=a+b;
end;
function NOK (A: integer; B: integer): integer;
begin
NOK := a * b div NOD (a, b);
end;
procedure Socr(a,b:integer; var p,q:integer);
begin
if a=b then begin
p:=1;
q:=1;
end
else if NOD (a, b)<>1 then
begin
NOD (a, b);
p:=a div NOD(a, b);
q:=b div NOD(a, b);
end;
begin
Writeln('введите числитель');
Readln(a);
Writeln('введите знаменатель');
Readln(b);
Socr(a,b); {тут ошибка [Error] Project2.dpr(36): Not enough actual parameters}
Writeln(p,'/',q);
readln;
end.
что неправильно? |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата что неправильно? Тебе компилятор сказал, что неправильно.Ты сколько параметров передаешь в процедуру? А сколько она ждет? Кстати: Цитата else if NOD (a, b)<>1 then
begin
NOD (a, b); // <--- Вот эта строка что здесь делает ???
p:=a div NOD(a, b);
q:=b div NOD(a, b);
end;
|
marwell |
![]()
Сообщение
#5
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: ![]() ![]() ![]() |
Тебе компилятор сказал, что неправильно. Ты сколько параметров передаешь в процедуру? А сколько она ждет? Кстати: аааааа, ошибся
var i,a,b,p,q:integer;
function NOD(a:integer; b:integer):integer;
begin
while(a<>0) and (b<>0) do
if a>=b then a:=a mod b
else b:=b mod a;
NOD:=a+b;
end;
function NOK (A: integer; B: integer): integer;
begin
NOK := a * b div NOD (a, b);
end;
procedure Socr(a,b:integer; var p,q:integer);
begin
if a=b then begin
p:=1;
q:=1;
end
else if NOD (a, b)<>1 then
begin
p:=a div NOD(a, b);
q:=b div NOD(a, b);
end
else Writeln ('введенная дробь уже несократима');
end;
begin
Writeln('введите числитель');
Readln(a);
Writeln('введите знаменатель');
Readln(b);
Socr(a,b,p,q);
Writeln(p,'/',q);
readln;
end.
Сообщение отредактировано: marwell - 3.01.2010 18:45 |
marwell |
![]()
Сообщение
#6
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: ![]() ![]() ![]() |
а как с помощью этой процедуры привести дробь 1+1/2+1/3+1/4+...+1/20 к несократимому виду?
|
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Написать (или найти на форуме) процедуру сложения дробей, и привести к несократимому виду результат...
|
marwell |
![]()
Сообщение
#8
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: ![]() ![]() ![]() |
Написать (или найти на форуме) процедуру сложения дробей, и привести к несократимому виду результат...
procedure add_ratio(var res: ratio; curr: ratio);
var new_denom: longint;
begin
div_ratio(curr);
new_denom := NOK(res.denom, curr.denom);
res.num :=
res.num * (new_denom div res.denom) +
curr.num * (new_denom div curr.denom);
res.denom := new_denom;
div_ratio(res);
end;
var
curr: ratio;
const
{ Изначально результат = 0, т.е. 0/1 }
res: ratio = (num:0; denom:1);
begin
writeln('Дроби (0 в числителе для окончания подсчета)');
repeat
write('Числитель: '); readln(curr.num);
if curr.num <> 0 then begin
write('Знаменатель: '); readln(curr.denom);
if curr.denom = 0 then
repeat
writeln('Деление на 0 недопустимо!');
write('Знаменатель: '); readln(curr.denom);
until curr.denom <> 0;
add_ratio(res, curr);
end;
until curr.num = 0;
writeln('Результат = ', res.num, '/', res.denom);
end.
этот подходит? Delphi ругается на тип ratio ![]() |
marwell |
![]()
Сообщение
#9
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: ![]() ![]() ![]() |
Написать (или найти на форуме) процедуру сложения дробей, и привести к несократимому виду результат... посмотри пожалуйста, так правильно?
var a_1,a_2,b_1,b_2,p,q:integer;
function NOD(a:integer; b:integer):integer;
begin
while(a<>0) and (b<>0) do
if a>=b then a:=a mod b
else b:=b mod a;
NOD:=a+b;
end;
function NOK (A: integer; B: integer): integer;
begin
NOK := a * b div NOD (a, b);
end;
procedure Socr(a,b:integer; var p,q:integer);
begin
if a=b then begin
p:=1;
q:=1;
end
else if NOD (a, b)<>1 then
begin
p:=a div NOD(a, b);
q:=b div NOD(a, b);
end
else Writeln ('введенная дробь несократима');
end;
begin
a_1:=1;
a_2:=1;
b_1:=1;
for b_2:=2 to 20 do
begin
a_1:=(NOK(b_1, b_2) div b_1)*a_1;
a_1:=a_1+((NOK(b_1, b_2) div b_2)*a_2);
b_1:=NOK(b_1, b_2);
end;
writeln (a_1,'/',b_1);
Socr(a_1,b_1,p,q);
Writeln (p,'/',q);
readln;
end.
Сообщение отредактировано: marwell - 3.01.2010 21:26 |
marwell |
![]() ![]()
Сообщение
#10
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация: ![]() ![]() ![]() |
ну посмотрите кто-нибудь, please!!!
|
![]() ![]() |
![]() |
Текстовая версия | 19.07.2025 4:03 |