Форум программистов, компьютерный форум, киберфорум
Наши страницы

Lazarus

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

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

10.12.2016, 16:36. Просмотров 461. Ответов 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;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2016, 16:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сумма строк чисел в файле (Lazarus):

В текстовом файле посчитать количество строк - Lazarus
Помогите пожалуйста как посчитать кол-во строк в текстовом файле

Сумма чисел - Lazarus
Найти сумму четных, нечетных и нулевых элементов вектора

Найти подмножество, сумма чисел которого будет максимальной степенью числа 2 - Lazarus
Существует массив massiv (динамический) Нужно найти подмножество, сумма чисел которого будет максимальной степенью числа 2 ...

В файле целых чисел поменять местами минимальный среди положительных, и третий по счёту простой элементы - Lazarus
Создать типизированный фаил, куда записать n целых чисел. В фаиле поменять местами минимальный среди положительных и третий по счёту...

Сумма чисел в файле - PascalABC.NET
Дан файл. В файле могут быть записаны десятичные цифры и все, что угодно. Надо вычислить сумму всех чисел, записанных в файле. ...

Сумма чисел в файле [Turbo Prolog] - Prolog
&quot;Записать результат сложения чисел, содержащихся в файлах в третий&quot; получается вывести числа с файла а вот просуммировать и записать в...

10
qwertehok
1587 / 1578 / 334
Регистрация: 29.08.2013
Сообщений: 10,553
10.12.2016, 18:13 #2
Цитата Сообщение от wladgreeniv Посмотреть сообщение
Код не работает.
код то работает

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

Плюс
В цикле по строкам легче будет функцией StringReplace убрать все пробелы, а дальше просто считать сумму
И давай переменным осмысленные имена
0
wladgreeniv
6 / 6 / 2
Регистрация: 12.05.2009
Сообщений: 29
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)
то первую строку просчитывает неправильно? (выдает очень большое число)
0
qwertehok
1587 / 1578 / 334
Регистрация: 29.08.2013
Сообщений: 10,553
10.12.2016, 18:57 #4
Цитата Сообщение от wladgreeniv Посмотреть сообщение
Удалять пробелы нельзя, числа разные.
мне почему то подумалось что числа <10

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

Добавлено через 4 минуты
Цитата Сообщение от wladgreeniv Посмотреть сообщение
а ты попробуй в пустом проекте объявить переменную Integer и вывести ее на экран
Выводит 5513368. Я думал, при создании переменной ей автоматом присваивается значение 0
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
24007 / 15988 / 4836
Регистрация: 22.10.2011
Сообщений: 28,281
Записей в блоге: 5
10.12.2016, 22:37 #6
Цитата Сообщение от wladgreeniv Посмотреть сообщение
при создании переменной ей автоматом присваивается значение 0
только если она глобальная. Локальные переменные компилятором не инициализируются, это забота программиста.
1
wladgreeniv
6 / 6 / 2
Регистрация: 12.05.2009
Сообщений: 29
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
заменить одним условием?
0
wladgreeniv
6 / 6 / 2
Регистрация: 12.05.2009
Сообщений: 29
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;
0
FalleNSofT
44 / 32 / 17
Регистрация: 27.02.2013
Сообщений: 79
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;
1
wladgreeniv
6 / 6 / 2
Регистрация: 12.05.2009
Сообщений: 29
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;
0
wladgreeniv
6 / 6 / 2
Регистрация: 12.05.2009
Сообщений: 29
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;
0
02.01.2017, 13:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2017, 13:32
Привет! Вот еще темы с ответами:

Сумма чисел выбранного столбца в файле - Pascal
Дан текстовый файл со строками чисел. Числа одинакового индекса (например, третьи по порядку числа каждой строки) сложить, задав...

Найти в файле строку, сумма чисел которой минимальна - C (СИ)
Задача: Создать текстовый файл, состоящий из случайного количества (не более 30-и) строк. В каждой строке файла содержится случайное...

Найти в файле строку, сумма чисел которой максимальна - Turbo Pascal
Ребят, помогите, пожалуйста, найти сумму. Кусочек написал, что не правильно? Создать текстовый файл, состоящий из случайного...

Подсчет количества четных и сумма нечетных чисел в файле - Turbo Pascal
День добрый. Помогите, написал программу, но не работает, выдает &quot;Ошибка 100: ошибка чтения с диска&quot;. Файл находится в той же папке, что и...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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