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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2008, 02:50   #1
[Smarik]
Веб-разработчик
Форумчанин
 
Аватар для [Smarik]
 
Регистрация: 16.01.2008
Сообщений: 451
По умолчанию Процедуры (Pascal)

Задача такая:
Даны 2 числа (a,b) определить какое из чисел содержит в своей записи больше цифр (подсчет ведут k1,k2) далее определить сумма цифр какого из чисел является наименьшей (подсчет ведут s1,s2)
Проблема в том что паскаль почему то требует begin перед while a<>0 do в каждой процедуре (наверное из за того что тип переменных нужно указывать в процедуре а не в начале программы если так плиз формат записи)
далее если расставить beginы то следующая ошибка неверная ссылка на процедуры в
if kol (k1) > kol2 (k2) then (writele('kol a>b')) else (writele('kol b>a'));
if sum (s1) > sum2 (s2) then (writele('sum a>b')) else (writele('sum b>a'));
(Возможно ошибка по той же причине что и 1)
Вот весь код:
Код:
program prog;
var a,b,k1,k2,a1,b1,s1,s2:integer;
procedure kol;
while a<>0 do
begin
a1:=a mod 10;
k1:=k1+1;
a1:=a div 10;
end;
end;
procedure kol2;
while b<>0 do
begin
b1:=b mod 10;
k2:=k2+1;
b1:=b div 10;
end;
end;
procedure sum;
while a<>0 do
begin
a1:=a mod 10;
s1:=s1+1;
a1:=a div 10;
end;
end;
procedure sum2;
while b<>0 do
begin
b1:=b mod 10;
s2:=s2+1;
b1:=b div 10;
end;
end;
begin
writeln('vvedite a:');
readln(a);
writeln('vvedite b:');
readln(b);
if kol (k1) > kol2 (k2) then (writele('kol a>b')) else (writele('kol b>a'));
if sum (s1) > sum2 (s2) then (writele('sum a>b')) else (writele('sum b>a'));
end.
Цитата:
Код вставляем в тег [CОDE][/СОDЕ] или пользуемся кнопкой # (расширенный режим). Модератор.
Я ваш новый друг, смиритесь!

Последний раз редактировалось AlDelta; 16.01.2008 в 10:27. Причина: [code]
[Smarik] вне форума Ответить с цитированием
Старый 16.01.2008, 03:20   #2
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Ну во первых правильно что компилятор требует Begin перед while.. Допиши везде.

Цитата:
то следующая ошибка неверная ссылка на процедуры в
if kol (k1) > kol2 (k2) then (writele('kol a>b'))
Kol(k1) - передаём в процедуру переменную k1. Смотрим на прцедуру:

Код:
procedure kol;
Явно чевото нехватает...... везде надо дописать что передаём процедуре.


Код:
procedure kol(var k1: integer);
begin
  while a <> 0 do
    begin
      a1 := a mod 10;
      k1 := k1+1;
      a1 := a div 10;
    end;
end;
И совершенно непонятно что мы отправляем процедурам, значения то незаданны.
Код:
if kol(k1) > kol2(k2) then writele('kol a>b') else (writele('kol b>a'));
if sum(s1) > sum2(s2) then (writele('sum a>b')) else (writele('sum b>a'));
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 16.01.2008, 12:46   #3
[Smarik]
Веб-разработчик
Форумчанин
 
Аватар для [Smarik]
 
Регистрация: 16.01.2008
Сообщений: 451
По умолчанию

Цитата:
Сообщение от Карась Посмотреть сообщение
И совершенно непонятно что мы отправляем процедурам, значения то незаданны.
Код:
if kol(k1) > kol2(k2) then writele('kol a>b') else (writele('kol b>a'));
if sum(s1) > sum2(s2) then (writele('sum a>b')) else (writele('sum b>a'));
Ну так вроде вызываю переменную k1 и k2 в етих переменных идет подсчет количества цифр разве не так? тоже самое с s1 и s2 обьясните что не так...
Я ваш новый друг, смиритесь!
[Smarik] вне форума Ответить с цитированием
Старый 16.01.2008, 13:41   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
определить какое из чисел содержит в своей записи больше цифр
Цифры преврати в строку и сравнивай уже строки
Цитата:
определить сумма цифр какого из чисел является наименьшей
Ну тоже в строку превращаеш, потом в два цикла для одного и другого числа превращаеш каждый элемент строки (там цифра числа будет) в число и суммируеш. Потом сравнивай результы.

Или ты с синтаксисом завтыкал?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.01.2008, 14:14   #5
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

1. Процедуру нельзя использовать в выражениях...
Цитата:
Обращение к процедуре производится простым указанием её имени в нужном месте программы (но не в составе какого-либо выражения!) со списком ..........
2. Может лучше отправлять в процедуру два числа в ней же сравнить и вывести на экран результат...


Код:
program Project1;

{$APPTYPE CONSOLE}
uses
  SysUtils;

Var a1, a2 : integer;

procedure Srav_kol(var a1, a2: integer);
begin
If Length(IntToStr(a1)) = Length(IntToStr(a2)) Then
  Writeln ('Kol a1 = a2');
If Length(IntToStr(a1)) > Length(IntToStr(a2)) Then
  Writeln ('Kol a1 > a2');
If Length(IntToStr(a1)) < Length(IntToStr(a2)) Then
  Writeln ('Kol a1 < a2');
end;

begin
Readln(a1, a2);
Srav_kol(a1, a2);
Readln;
end.
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 16.01.2008, 14:44   #6
[Smarik]
Веб-разработчик
Форумчанин
 
Аватар для [Smarik]
 
Регистрация: 16.01.2008
Сообщений: 451
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Цифры преврати в строку и сравнивай уже строки

Ну тоже в строку превращаеш, потом в два цикла для одного и другого числа превращаеш каждый элемент строки (там цифра числа будет) в число и суммируеш. Потом сравнивай результы.

Или ты с синтаксисом завтыкал?
Число в строку? как? научите...не помню такого.

Цитата:
Сообщение от Карась Посмотреть сообщение
2. Может лучше отправлять в процедуру два числа в ней же сравнить и вывести на экран результат...


Код:
program Project1;

{$APPTYPE CONSOLE}
uses
  SysUtils;

Var a1, a2 : integer;

procedure Srav_kol(var a1, a2: integer);
begin
If Length(IntToStr(a1)) = Length(IntToStr(a2)) Then
  Writeln ('Kol a1 = a2');
If Length(IntToStr(a1)) > Length(IntToStr(a2)) Then
  Writeln ('Kol a1 > a2');
If Length(IntToStr(a1)) < Length(IntToStr(a2)) Then
  Writeln ('Kol a1 < a2');
end;

begin
Readln(a1, a2);
Srav_kol(a1, a2);
Readln;
end.
если честно не понимаю етот код, вернее смысл и проведенная операция ясна, но если меня тыкнут носом в Length, IntToStr ничего разумного не скажу. Впервые вижу данные операторы поетому для меня не лучший вариант.
Чтобы конкретно вас не запутать (или я один в тупике?) выложу измененный код опишу ошибку и помогите исправить конкретно ее...
Код:
program prog;
var a,b:integer;
procedure kol(var k1,a1:integer); 
begin
while a<>0 do
begin
a1:=a mod 10; {Ищет последнюю цифру в числе}
k1:=k1+1; {Подсчитывает сколько чисел нашел}
a1:=a div 10; {Отбрасывает последнюю цифру числа}
end;
end;
procedure kol2(var k2,b1:integer); {аналогичная процедура для числа b}
begin
while b<>0 do
begin
b1:=b mod 10;  
k2:=k2+1; 
b1:=b div 10;
end;
end;
procedure sum(var a1,s1:integer); 
begin
while a<>0 do
begin
a1:=a mod 10; {Ищет последнюю цифру в числе}
s1:=s1+1; {Подсчитывает сумму цифр числа}
a1:=a div 10; {Отбрасывает последнюю цифру числа}
end;
end;
procedure sum2(var b1,s2:integer); {аналогичная процедура для числа b}
begin
while b<>0 do
begin
b1:=b mod 10;
s2:=s2+1;
b1:=b div 10;
end;
end;
begin
writeln('enter a:');
readln(a);
writeln('enter b:');
readln(b);
if kol(k1) > kol2(k2) then (writeln('a>b')) else (writeln('b>a'));
if sum(s1) > sum2(s2) then (writeln('a>b')) else (writeln('b>a'));
end.
Ошибка 143: Ошибочная ссылка на процедуру или функцию
Код:
if kol(k1) > kol2(k2) then (writeln('a>b')) else (writeln('b>a'));
if sum(s1) > sum2(s2) then (writeln('a>b')) else (writeln('b>a'));
В моем понимании я обращаюсь к процедуре и конкретно к переменной K1,K2,S1,S2.
Я ваш новый друг, смиритесь!
[Smarik] вне форума Ответить с цитированием
Старый 16.01.2008, 14:52   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Число в строку?
Проседура Val - Число превращает в строку
Процедура STR - Строку в число
Все описано в хелпе по паскалю с примерами.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
процедуры Killbrum Помощь студентам 5 10.06.2008 08:59
процедуры FIIR БД в Delphi 9 26.02.2008 11:26
процедуры FIIR Помощь студентам 2 26.02.2008 08:12
Процедуры и функции 11111 Помощь студентам 10 26.11.2007 15:06
Вызов процедуры Monoflextor Общие вопросы Delphi 2 28.04.2007 17:32