Найти сумму цифр чисел, записанных в файл

Задача: 

Дан файл, в котором через пробел записаны натуральные числа. Вывести на экран суммы цифр каждого числа.

Описание переменных: 
  • f - переменная, связанная с файлом
  • c - очередной символ, считанный из файла
  • sum - сумма цифр числа
  • n - цифра
Алгоритм решения задачи: 

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

Если символ не является пробелом, то надо его преобразовать в число с помощью встроенной в Паскаль функции val(). После этого добавить это число-цифру к переменной sum.

Если же очередной символ - пробел, то надо вывести уже накопленную сумму цифр на экран и обнулить переменную sum.

Программа на языке Паскаль: 

var
    f: file of char;
    c: char;
    sum, n: word;
begin
    assign(f,'nums.txt');
    reset(f);
    sum := 0;
    while not eof(f) do begin
        read(f,c);
        if c <> ' ' then begin
            val(c, n);
            sum := sum + n;
        end
        else begin
            write(sum:5);
            sum := 0
        end;
    end;
    writeln;
end.

Например, если в файле nums.txt записаны такие данные:

45 320 854 21 12 149 15 167 34 29 188 21 123 86 111 640 

то в результате выполнения программы будет выведено:

    9    5   17    3    3   14    6   14    7   11   17    3    6   14    3   10
Примечания: 

Чтобы сумма цифр последнего числа была выведена, надо чтобы после него стоял пробел.

Комментарии

Вирішення задачі

uses crt;
var
i,s,sum:integer;
f:file of string[50];
n:string[50];
 
a:array [1..16]of string;
begin
Assign(f,'D:\чилсла.txt'); 
 
 
i:=0;
Reset(f);
while ((not eof(f))and(i<16)) do 
begin
read(f,n);
i:=i+1;
a[i]:=n;
write(a[i]);
end;
 writeln;
for i:=1 to 16 do
begin
s:=StrToInt(a[i]);// StrToInt переводить з типа стрінк в тип інтеджер
 
while s<>0 do
       begin
       sum:=sum+(s mod 10);
       s:=s div 10;
 end;
 
 writeln(a[i],'|сума цих чисел|=',sum);
sum:=0;
 
end;
writeln;
 
close(f);
 
end.

Решение

А разве такое решение не проще?И для чего надо использовать функцию val ?

USES CRT;
var c,s:integer;
    f:text;
 
begin
assign(f,'D:\Новая папка\file.txt');
reset(f);
 WHILE NOT eof(f) do
     begin
     read(F,c);
     while c<>0 do
       begin
       s:=s+(c mod 10);
       c:=c div 10;
       end;
     writeln('summa  ',s);
     s:=0;
     end;
close(f);
end.     

Это действительно намного

Это действительно намного проще) И переменных меньше!