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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2008, 21:49   #1
Juhn
Пользователь
 
Регистрация: 09.12.2007
Сообщений: 36
По умолчанию Исправление ошибок в проге

Есть такая программа:
Код:
program chisla;
function sar(const a, b:integer):real; 
begin
        sar:=(a + b)/2;
end;

function num(var i1, i2:integer):integer; 
var     
	i:integer;
begin
        i:=0;
        while i1<>0 do begin 
                inc(i); 
                i1:=i1 div 10; 
        end;

        while i2<>0 do begin
                inc(i);
                i2:=i2 div 10;
        end;

        num:=i; 

var 
a, b:integer;
begin
        repeat 
                writeln('Vvedite a');   readln(a);
                writeln('Vvedite b');   readln(b);
        until(a<b); 
        writeln('summa chisel:', (a+b));
        writeln('srednee arifmeticheskoe:', sar(a,b):4);
        writeln('kolichestvo cifr:', num(a,b));
readln;
end.
1.Ошибка в следующем, сумма и арифметическое считается правильно, а вот количество цифр почему - то пишется 1, а не 2, хотя написано writeln('kolichestvo cifr:', num(a,b)); Как сделать что бы выдавало кол-во цифр 2 ?
2. Не поможете разобраться с данными строками:
function sar(const a, b:integer):real;
function num(var i1, i2:integer):integer;

Какой тип к этим переменным присваевается ? реальный или переменный? а то в скобках например integer а за скобками ещё и real. Вообщем помогите как расписать эти строки.
Заранее спасибо.

Последний раз редактировалось Alex21; 15.01.2008 в 22:33. Причина: Код оформляем, согласно требованиям оформления
Juhn вне форума Ответить с цитированием
Старый 15.01.2008, 22:18   #2
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Сам бы писал, не спрашивал бы.
1.
Цитата:
i:=0;
while i1<>0 do begin
inc(i);
i1:=i1 div 10;
Берешь двухзначное число, делишь его на 10. Целая часть числа=1. Если еще раз разделить, уловие while i1<>0 do begin не даст, следовательно результат=1. Значит что нужно? Перед началом цикла поставить i:=1;

2.
Цитата:
function sar(const a, b:integer):real;
function num(var i1, i2:integer):integer; Какой тип к этим переменным присваевается ? реальный или переменный? а то в скобках например integer а за скобками ещё и real. Вообщем помогите как расписать эти строки.
Будет время, расскажи нам темным про реальный и переменный типы по-подробнее.
function sar(const a, b:integer):real; - по словам:
function - это функция; sar - название ее (сокращенно от среднего арифметического); const - вообще не нужно; a,b -два числа люблго типа, в данном случае - целого (nteger); :real; - тип результата, который выдает функция, в данном случае вещественный тип real;, т.к. в результате деления по определению целое число лишь частный случай.
function num(var i1, i2:integer):integer; первое и второе слова см. выше; var - убери; i1, i2:integer - поскольку условия задачи не видал, могу предположить, что это целые числа; последнее слово см. выше;
Вроде все.
puporev вне форума Ответить с цитированием
Старый 15.01.2008, 22:35   #3
Juhn
Пользователь
 
Регистрация: 09.12.2007
Сообщений: 36
По умолчанию

Спасибо, очень помогло. Только вот.. i:=0; - это зануление значения i как я понимаю, тоесть нужно ещё перед этим вписать i:=1 ? тоесть так:
i:=1;
i:=0;
while i1<>0 do begin
inc(i);
i1:=i1 div 10;

Тогда тоже самое нужно будет сделать и со следующим циклом (там где i2). И как описать эту строку i:=1; ? присвоение i единичного значения ?
Juhn вне форума Ответить с цитированием
Старый 15.01.2008, 22:47   #4
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
это зануление значения i как я понимаю, тоесть нужно ещё перед этим вписать i:=1 ? тоесть так:
i:=1;
i:=0;
Никакого "зануления не бывает". Перед началом цикла некоторым переменным присваиваеся начальное значение. Оно может быть не только 0 или1, а любое число и даже формула. Поэтому i:=0 - убрать. Во втором цикле все аналогично. Обычно I:=0 пишут, если нужно в цикле подсчитать сумму I:=I+a; Если в цикле идет умножение? то перед циклом пишут I:=1; в цикле I:=I*a; Это наиболее часто встречается при решении задач типа школьных.
puporev вне форума Ответить с цитированием
Старый 15.01.2008, 22:55   #5
Juhn
Пользователь
 
Регистрация: 09.12.2007
Сообщений: 36
По умолчанию

Понятно поменял, но теперь вообще не понимаю как это вычисляется, например ввёл a=1, b=3, выдал кол-во цифр 2, а ввёл а=1, б=12, выдал кол-во цифр вообще 3, непонятно как это там считается, явно что то нитак, может ещё какая - то дополнительная строчка (какая - нибудь формула) в программе нужна для подсчитывания цифр ?
Juhn вне форума Ответить с цитированием
Старый 15.01.2008, 23:14   #6
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Напиши подробно условие задачи, я не понимаю, что у тебя делает function num(var i1, i2:integer):integer;
puporev вне форума Ответить с цитированием
Старый 15.01.2008, 23:18   #7
Juhn
Пользователь
 
Регистрация: 09.12.2007
Сообщений: 36
По умолчанию

Условие такое:
даны 2 числа а и б, притом а < б. Найти их сумму, ср. арифметическое и кол-во цифр. (Использовать циклы Repeat-Until, while-do, только вот я сам не знаю или 2 цикла вместе или можно и с любым из двух, поэтому здесь сразу 2, но если можно с одним, то думаю тоже пойдёт, если меньше заморочек будет).
Juhn вне форума Ответить с цитированием
Старый 15.01.2008, 23:44   #8
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Чтобы долго не рассказывать я написал маленькую программу, как работает твоя функция. Конечно ее нужно делать для одного числа, а использовать можно хоть для ста чисел, пока руки не отнимутся. Всегда к своему коду прилагай подробное условие в оригинале, а не пересказанное своими словами. Если бы условие было, я тебе час назад все бы выдал. А I:=0; это правильно.
Код:
uses crt;
var a,b:longint;
    numa,numb:integer;
function num(a:longint):integer;
var i:integer;
begin
i:=0;
while a<>0 do
   begin
     inc(i);
     a:=a div 10;
   end;
num:=i;
end;
begin
clrscr;
write('a=');readln(a);
write('b=');readln(b);
writeln('numa=',num(a));
writeln('numb=',num(b));
readln;
end.
Еще сменил тип для вводимых чисел, чтобы можно было вводить числа до 2000000000.
puporev вне форума Ответить с цитированием
Старый 15.01.2008, 23:59   #9
Juhn
Пользователь
 
Регистрация: 09.12.2007
Сообщений: 36
По умолчанию

Так это нужно вставить куда - то в мою программу, или это отдельная программа ? Просто что она считает ? Всегда выдает результат numa=1, numb=1.
Juhn вне форума Ответить с цитированием
Старый 16.01.2008, 06:37   #10
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Не знаю, что ты там пишешь, у меня все нормально работает. У тебя в первом коде еще такой косяк: ты сначала описываешь функции, а потом раздел переменных, а нужно наоборот. Вот весь код, а в приложении работающая программа.
Код:
program chisla;
uses crt;
var a,b:longint;
    numa,numb:integer;
function sar(a,b:longint):real;
begin
sar:=(a+b)/2;
end;
function num(a:longint):integer;
var i:integer;
begin
i:=0;
while a<>0 do
   begin
     inc(i);
     a:=a div 10;
   end;
num:=i;
end;
begin
clrscr;
write('a=');readln(a);
write('b=');readln(b);
writeln('sr arifm a,b=',sar(a,b):6:2);
writeln('numa=',num(a));
writeln('numb=',num(b));
readln;
end.
Вложения
Тип файла: rar JHUN1.rar (322 байт, 9 просмотров)
puporev вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бинарное исправление звука DaRKSPiRT Общие вопросы C/C++ 2 01.09.2008 11:53
update или исправление записей в таблицах. Roof БД в Delphi 4 15.08.2008 15:35
исправление формы. sila Microsoft Office Excel 15 10.07.2008 12:01