Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2012, 21:19   #1
Антихурма
Новичок
Джуниор
 
Регистрация: 25.09.2012
Сообщений: 3
По умолчанию Определите ошибку в тексте программы на языке Pascal

Написал программу по заданию:
Описать процедуру вычисления суммы двух дробей типа а/b. Использовать эту процедуру для вычисления суммы 1+1/2+1/3+...+1/n и вывода результата в виде дроби a/b.


Код:
function gcd(m, n: integer): integer;
    var modulo: integer;
    begin
        modulo := m mod n;
        if modulo = 0 then
            gcd := n
        else
            gcd := gcd (n, modulo)
    end;

Procedure Add(a, b, a1, b1:integer);
var
  f: integer;
begin
  f:=b;
  b:=b*b1;
  a:=a*b1+a1*f;
  var c:=gcd(a, b);
  a:=a div c;
  b:=b div c;
end;

var
  a, b, a1, b1, n: integer;
begin
  Writeln('Введите n');
  readln(n);
  a1:=1;
  a:=1;
  b:=2;
  for var i:=2 to n-1 do
    begin
      b1:=i+1;
      add(a, b, a1, b1);
    end;
  writeln(a, '/', b);
  a:=a+n;
  var d:=gcd(a, b);
  a:=a div d;
  b:=b div d;
  writeln(a,'/',b);
end.



помогите найти ошибку. Функция gcm находит наибольшее общее кратное(для сокращения дроби). Буду признателен и стану умнее))



________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 25.09.2012 в 22:56.
Антихурма вне форума Ответить с цитированием
Старый 25.09.2012, 21:51   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,367
По умолчанию

А что за язык, если не секрет.
Вроде как одна из ветвей Паскаля

Код:
a:=a*b1+a1*f;
var c:=gcd(a, b);
a:=a div c;
Тут определение переменной в сегменте кода.
Далее:
Код:
Procedure Add(a, b, a1, b1:integer);
var
f: integer;
begin
f:=b;
b:=b*b1;
a:=a*b1+a1*f;
var c:=gcd(a, b);
a:=a div c;
b:=b div c;
end;
Аргументы переданы по значению
Код:
Procedure Add(a, b, a1, b1:integer);
но в теле функции:
Код:
b:=b*b1;
Может надо:
Код:
Procedure Add(var a, b: integer; a1, b1:integer);
Только вопросы ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 25.09.2012, 21:56   #3
Антихурма
Новичок
Джуниор
 
Регистрация: 25.09.2012
Сообщений: 3
По умолчанию

pascalABC.Net ... если можно коперни программу правильную и рабочую.. очень нужно сейчас отправить, просто это не первая такая заморочка, и моя голова уже не работает, я позже разберусь..
Антихурма вне форума Ответить с цитированием
Старый 25.09.2012, 22:37   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,367
По умолчанию

Сожалею, но на этом языке не писал.

Отмечу, что первый вопрос отпал. На этом языке так делать можно.

Второй вопрос, о типах аргументов, поставлен верно.
Так, как сделано у тебя - это неправильно.
В твоем случае в тело процедуры передаются только значения, которые хранятся в фактических переменных, проставляемых при вызове функции.
Код:
add(a, b, a1, b1);
Типы аргументов надо описывать.
Думаю, что для вычислений в процедуре надо ввести внутренние переменные, а в заголовке добавить еще пару аргументов для результата:
Код:
Procedure Add(a, b, a1, b1:integer; var ch,zn: integer);
var - признак передачи по адресу. Т.е. процедуре будет известен адрес, по которому надо вернуть результат.
Может быть так пойдет:
Код:
Procedure Add(a, b, a1, b1:integer; var ch,zn: integer);
var
ch, zn, c: integer;
begin
ch :=a*b1+b*a1;
zn := a1*b1;
c:=gcd(ch, zn);
ch:=ch div c;
zn:=zn div c;
end;
Вызов процедуры надо будет тоже править.

Как-то так ...
Как-то так, ...

Последний раз редактировалось ViktorR; 25.09.2012 в 22:39.
ViktorR вне форума Ответить с цитированием
Старый 26.09.2012, 10:48   #5
Антихурма
Новичок
Джуниор
 
Регистрация: 25.09.2012
Сообщений: 3
По умолчанию

Код:
Function logperev(x: string): boolean;
var
  f: integer;
begin
  copy(x, 1, 1);
  For var i:=1 to trunc(length(x)/2) do
    begin
      if x[i]<>x[length(x)-i+1] then
        f:=1;
      if f<>1 then logperev:=true 
        else logperev:=false;
    end;
end;
var
  c, n: integer;
  y: string;
 begin
  writeln('Введите количество чисел');
  Readln(n);
  writeln('Введите числа');
  c:=0;
  For var j:=1 to n do 
    begin
      readln(y);
      if Logperev(y) then
        c:=c+1;
    end;
  writeln(‘количество чисел палиндромов =  ‘, c);
end.


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 26.09.2012 в 11:13.
Антихурма вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в тексте программы Pascal daniil2010 Помощь студентам 3 06.05.2010 00:58
Программы расстановки переносов в тексте на русском и английском языке. Lazio Фриланс 8 15.10.2009 17:49
Сумма ряда на ЭВМ и вычисленная аналитически, программы на языке Pascal SunCHO Помощь студентам 2 02.05.2007 22:37