Консультация № 178582
23.05.2010, 05:01
0.00 руб.
23.05.2010, 13:12
0 7 1
Здравствуйте, уважаемые Эксперты! =)
Помогите, пожалуйста, решить такую задачу:
Дан текстовый файл, в котором записано произвольное количество строк. В каждой строке записаны подряд цифры, т.е. в каждой строке записано одно число (рязрядность может быть любой). Вывести на экран сумму всех записанных в файле чисел.
Например, входные данные:
1
123
123456
1223446899075232
6684
Ответом должна быть строка:
1223446899873979

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

Заранее благодарю за помощь=)

Обсуждение

давно
Академик
320937
2216
23.05.2010, 08:22
общий
John_the_Revelator:
Доброе утро! Складывать нужно построчно, тогда Вам не потребуется знать общее количество строк. Для этого напишем функцию
function sum(s1,s2: string): string; Если укажете язык программирования , будет реализация.
Неизвестный
23.05.2010, 12:47
общий
извините, что не указала ранее) паскаль
давно
Модератор
137394
1850
23.05.2010, 17:41
общий
1
123
123456
1223446899075232
6684
Ответом должна быть строка:
1223446899873979
Ответом не может быть такая строка. Проверим последнюю цифру 1+3+6+2+4=6
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Неизвестный
23.05.2010, 17:55
общий
Извините, ошибка в условии(
1
123
123456
1223446899075232
6684
668483
давно
Академик
320937
2216
23.05.2010, 20:21
общий
это ответ
Здравствуйте, John_the_Revelator!. ABC-Pascal
Текст программы
Код:
program p178582;
{ Дан текстовый файл, в котором записано произвольное количество строк.
В каждой строке записаны подряд цифры, т.е. в каждой строке записано
одно число (рязрядность может быть любой). Вывести на экран сумму всех
записанных в файле чисел. }

function sum(var s1,s2: string):string;
// сложение строк цифр, результат - строка
var
l1, l2: integer; // длина первой строки
i : integer; // длина второй строки
s3 : string; // строка - результат
carry : 0..1; // флаг переноса 0,1
digit : 0..9; // десятичная цифра
num : integer; // сумма цифр в текущем разряде
begin
l1 := length(s1);
l2 := length(s2);

// приписываем нули в короткой строку слева, выравниваем по длине
if l1>l2 then
for i:= 1 to l1-l2 do
s2 := '0'+s2
else if l2>l1 then
begin
for i:= 1 to l2-l1 do
s1 := '0'+s1;
l1:= l2;
end;

s3 := ''; // вначале результат пуст
carry := 0; // флаг переноса - в нуль
for i:= l1 downto 1 do
begin
num := ord(s1[i])-ord('0')+ord(s2[i])-ord('0')+carry;
digit := num mod 10; // цифра суммы разрядов
s3:= chr(digit+ord('0'))+s3; // приписываем эту цифру слева
carry := num div 10;
end;
if carry=1 then // приписывем перенос слева от результата
s3:='1'+s3;
sum := s3;
end;

var
f: text; // файловая переменная
fname: string; // имя файла
s1, s2, s3: string; // строки
first_string: boolean; // для "украшательства"
len: integer; //
begin
fname := 'a.dat'; // файл данных
if not FileExists(fname) then
begin
writeln('файл не существует');
readln;
exit;
end
else
begin
len := 0;
s1:='0';
assign(f, fname);
reset(f);
first_string := true;
while not eof(f) do
begin
readln(f, s2);
if not first_string then
write('+')
else
first_string := false;
if len >70 then
begin
len := 0;
writeln;
end;
write(s2);
len := len+length(s2);
s1:= sum(s1,s2); // складываем предыдущую сумму с новой строкой
end;
close(f);
end;
write('=');
writeln(s1);
readln;
end.


Содержание файла a.dat
Код:
1
123
123456
1223446899075232
6684
668483

Пример вывода
Код:
1+123+123456+1223446899075232+6684+668483=1223446899873979


Неизвестный
24.05.2010, 13:46
общий
num := ord(s1[i])-ord('0')+ord(s2[i])-ord('0')+carry;
digit := num mod 10; // цифра суммы разрядов
s3:= chr(digit+ord('0'))+s3; // приписываем эту цифру слева
carry := num div 10;

А зачем здесь ord? разве эта функция не определяет код символа в ascii таблице?
Неизвестный
24.05.2010, 13:55
общий
John_the_Revelator:
Нам нужна цифра, которая соответствует "этому" символу. Попробуйте создать такую простую программу
Код:
var c: Byte;
BEGIN for c:=32 to 255 do Write(c:3,' ',chr(c),' '); END.

Увидите коды букв и символы с этими кодами. С клавиатуры считываем код символа!
Форма ответа