Форум программистов, компьютерный форум CyberForum.ru

Lazarus

Войти
Регистрация
Восстановить пароль
 
wladgreeniv
6 / 6 / 2
Регистрация: 12.05.2009
Сообщений: 26
#1

Сумма строк чисел в файле - Lazarus

10.12.2016, 16:36. Просмотров 398. Ответов 10
Метки нет (Все метки)

Уважаемые эксперты!
Огромная просьба помощи!
Есть файл INPUT.txt со строками чисел, разделенных пробелами.
Необходимо на memo1 вывести содержимое файла,
а на memo2 сумму чисел каждой строки
Код не работает. Где ошибка?
Содержимое файла выводит

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
procedure TForm1.Button1Click(Sender: TObject);
var
  i,a,l,z,zv:integer;
  s,zs,v:string;
begin
  memo1.Lines.LoadFromFile('INPUT.txt');
  for i:=0 to  memo1.Lines.count-1 do
    begin
     s:=memo1.Lines[i];
     l:=length(s);
     for a:=1 to l do
       begin
        v:=s[a];
        if (v<>' ') or (a=l) then
          zs:=zs+v
         else
          begin
           val(zs,z);
           zv:=zv+z;
           zs:='';
          end;
       end;
       Memo2.Lines.add('Сума чисел '+inttostr(zv));
       zv:=0;
      end;
end;
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
qwertehok
1264 / 1283 / 272
Регистрация: 29.08.2013
Сообщений: 8,351
10.12.2016, 18:13     Сумма строк чисел в файле #2
Цитата Сообщение от wladgreeniv Посмотреть сообщение
Код не работает.
код то работает

рановато ты итог выводишь - ты его только по строке посчитал, выводишь и тут же обнуляешь

Плюс
В цикле по строкам легче будет функцией StringReplace убрать все пробелы, а дальше просто считать сумму
И давай переменным осмысленные имена
wladgreeniv
6 / 6 / 2
Регистрация: 12.05.2009
Сообщений: 26
10.12.2016, 18:27  [ТС]     Сумма строк чисел в файле #3
qwertehok, спасибо за ответ!

Удалять пробелы нельзя, числа разные. Имеют разное количество цифр.
Вот содержимое файла:

1 23 45
2 58 8
23 5 68
2 4 5 6
12 5 896
12 5 87 4
1 25 6 98
1 2 5 6 87
125 4 7 86

Добавлено через 3 минуты
Получилось!!!

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
procedure TForm1.Button1Click(Sender: TObject);
var
  i,a,l,z,zv:integer;
  s,zs,v:string;
begin
  memo1.Lines.LoadFromFile('INPUT.txt');
  for i:=0 to  memo1.Lines.count-1 do
    begin
     s:=memo1.Lines[i];
     l:=length(s);
     zv:=0;
     for a:=1 to l do
       begin
        v:=s[a];
        if (v<>' ') or (a=l) then zs:=zs+v;
        if (v=' ') or (a=l) then
          begin
           val(zs,z);
           zv:=zv+z;
           zs:='';
          end;
       end;
       Memo2.Lines.add('Сума чисел '+inttostr(zv));
       zv:=0;
     end;
end;
Почему, когда я не вставляю в код zv:=0; , (после l:=length(s)
то первую строку просчитывает неправильно? (выдает очень большое число)
qwertehok
1264 / 1283 / 272
Регистрация: 29.08.2013
Сообщений: 8,351
10.12.2016, 18:57     Сумма строк чисел в файле #4
Цитата Сообщение от wladgreeniv Посмотреть сообщение
Удалять пробелы нельзя, числа разные.
мне почему то подумалось что числа <10

Цитата Сообщение от wladgreeniv Посмотреть сообщение
выдает очень большое число
а ты попробуй в пустом проекте объявить переменную Integer и вывести ее на экран
wladgreeniv
6 / 6 / 2
Регистрация: 12.05.2009
Сообщений: 26
10.12.2016, 19:12  [ТС]     Сумма строк чисел в файле #5
Цитата Сообщение от qwertehok Посмотреть сообщение
а ты попробуй в пустом проекте объявить переменную Integer и вывести ее на экран
Так вроде после первого прохождения цикла обсчитывается первая строка и zv присваивается сумма ее чисел

Добавлено через 4 минуты
Цитата Сообщение от wladgreeniv Посмотреть сообщение
а ты попробуй в пустом проекте объявить переменную Integer и вывести ее на экран
Выводит 5513368. Я думал, при создании переменной ей автоматом присваивается значение 0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
22699 / 14841 / 4260
Регистрация: 22.10.2011
Сообщений: 26,288
Записей в блоге: 4
10.12.2016, 22:37     Сумма строк чисел в файле #6
Цитата Сообщение от wladgreeniv Посмотреть сообщение
при создании переменной ей автоматом присваивается значение 0
только если она глобальная. Локальные переменные компилятором не инициализируются, это забота программиста.
wladgreeniv
6 / 6 / 2
Регистрация: 12.05.2009
Сообщений: 26
11.12.2016, 21:12  [ТС]     Сумма строк чисел в файле #7
Цитата Сообщение от volvo Посмотреть сообщение
только если она глобальная. Локальные переменные компилятором не инициализируются, это забота программиста.
Большое спасибо,volvo. Перенес обьявление переменной в глобальную, убрал строчку zv:=0; , (после l:=length(s) - все работает.
А не подскажешь, как

Delphi
1
2
if (v<>' ') or (a=l) then zs:=zs+v;
if (v=' ') or (a=l) then
заменить одним условием?
wladgreeniv
6 / 6 / 2
Регистрация: 12.05.2009
Сообщений: 26
13.12.2016, 06:34  [ТС]     Сумма строк чисел в файле #8
Вот кошерное решение

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.Button1Click(Sender: TObject);
begin
  memo1.Lines.LoadFromFile('INPUT.txt');  //читаем файл в мемо
  for i:=0 to  memo1.Lines.count-1 do     //цикл по строкам мемо
    begin
     s:=memo1.Lines[i];                   //считывание очередной строки
     l:=length(s);                        //вычисление ее длины
     if s[l]<>' ' then s:=s+' ';          //добавление пробела в конец строки, если его нет
     repeat                               //цикл по строке, пока не вырежем все символы
       v:=Copy(s,1,Pos(' ',s)-1);         //выделяем группу символов до пробела
       z:=StrToInt(v);                    //преобразовываем в число
       zv:=zv+z;                          //находим сумму
       Delete(s,1,Length(v)+1);           //удаляем символы с пробелом
     until Length(s) = 0;
     Memo2.lines.Add('Сума чисел '+IntToStr(zv));       //выводим на мемо сумму чисел очередной строки
     zv:=0;                               //обнуляем сумму
    end;
 Memo2.lines.SaveToFile('OUTPUT.txt');    //выводим результат в файл
end;
FalleNSofT
41 / 29 / 15
Регистрация: 27.02.2013
Сообщений: 70
13.12.2016, 08:09     Сумма строк чисел в файле #9
wladgreeniv, можно и так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure TForm1.Button1Click(Sender: TObject);
var
  list: TStringList;
  i, k, sum: integer;
begin
  memo1.Lines.LoadFromFile('INPUT.txt');
  list := TStringList.Create;
  try
    Memo2.Clear;
    for k := 0 to Memo1.Lines.Count - 1 do
    begin
      list.Clear;
      sum := 0;
      list.Text := Stringreplace(Memo1.Lines.Strings[k], ' ', #13#10,
        [rfReplaceAll, rfIgnoreCase]);
      for i := 0 to list.Count - 1 do
        sum := sum + StrToInt(trim(list.Strings[i]));
      memo2.Lines.Add('Сумма чисел ' + IntToStr(sum));
    end;
  finally
    list.Free;
    Memo2.Lines.SaveToFile('OUTPUT.txt');
  end;
end;
wladgreeniv
6 / 6 / 2
Регистрация: 12.05.2009
Сообщений: 26
15.12.2016, 19:19  [ТС]     Сумма строк чисел в файле #10
Вот самый простой код

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure TForm1.Button1Click(Sender: TObject);
var
  f:text;
  v,s:integer;
begin
memo1.Lines.LoadFromFile('INPUT.txt');
AssignFile(f,'input.txt');
Reset(f);
while not seekeof(f) do
 begin
 s:=0;
 while not seekeoln(f) do
   begin
     read(f, v);
     inc(s, v);
   end;
   readln(f);
   memo2.lines.Add('Сумма чисел '+inttostr(s));
 end;
CloseFile(f);
end;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2017, 13:32     Сумма строк чисел в файле
Еще ссылки по теме:

Lazarus В текстовом файле посчитать количество строк
Lazarus Поиск совпадений в файле c текстом
Lazarus Найти сумму всех различных двузначных чисел из этого текста и вывести список этих чисел
Lazarus Неправильно вычисляется сумма элементов массива
Найти произведение положительных чисел и определить количество чисел, принадлежащих промежутку и стоящих Lazarus

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
wladgreeniv
6 / 6 / 2
Регистрация: 12.05.2009
Сообщений: 26
02.01.2017, 13:32  [ТС]     Сумма строк чисел в файле #11
Решение еще проще.
Аналогов не видел нигде.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
k,m,i,ii,n,Sum:integer; 
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  StringGrid1.LoadFromCSVFile('INPUT.txt',' ');
  k:=StringGrid1.ColCount;
  m:=StringGrid1.RowCount;
  for ii:=0 to m-1 do
   for i:=0 to k-1 do
     if StringGrid1.Cells[i,ii]<>'' then
      begin
       Sum:=Sum+StrToInt(StringGrid1.Cells[i,ii]);
       inc(n);
      end;
  label4.Caption:=IntToStr(n);  label6.Caption:=IntToStr(Sum);
end;
Yandex
Объявления
02.01.2017, 13:32     Сумма строк чисел в файле
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru