Читання чисел з файлу в TStringGrid



Розглянемо задачу.

У рядку файлу zisla.txt через пробіл записані різноцифрові числа. Підрахувати кількість чисел та обчислити їхню суму.

    Ця задача просто вирішується за допомогою контролу TStringGrid.


Розміщуємо його на формі. 


Прибираємо всі рядки та стовпчики – він при читанні з файлу сам вирішить, скільки їх створювати.  ColCount - 0, RowCount - 0.

Маємо такий вигляд


Читаємо файл на StringGrid – всього один рядок коду, і числа із файлу будуть розміщені в комірки StringGrid.       
    
StringGrid1.LoadFromCSVFile('INPUT.txt',' ');

StringGrid1 – ім’я об’єкту в проекті, LoadFromCSVFile – завантаження даних з файлу, 'INPUT.txt' – ім’я файлу,  ' ' – символ-роздільник чисел у файлі. В нашому випадку пробіл. Якщо числа розділені другим символом, наприклад комою, то потрібно вказати її.

Отже, ми маємо завантажені числа в комірки StringGrid1. У нас вийшов як би об’єктний масив чисел, які можна опрацьовувати в циклі по індексах. І це без оголошення та заповнення масиву, яке робити не потрібно. Масив вже створено і заповнено одним рядком програмного коду – тільки бери тепер о опрацьовуй! Я зменшив висоту StringGrid1 на один рядок чисел.

Результат


Якщо комірки StringGrid заширокі, ширину можна підрегулювати властивістю  DefaultColWidth.

Кількість чисел теж отримуємо в один рядок  k:=StringGrid1.ColCount; 
            В змінну k типу integer отримали значення властивості ColCount (кількість стовпчиків) – комірок у рядку StringGrid.

  Суму чисел отримуємо в циклі   for i:=0 to k-1 do 
                                                            Sum:=Sum+StrToInt(StringGrid1.Cells[i,0]);

            Звісно, і – лічильник циклу. Індексація комірок StringGrid починається з нуля, тому цикл проходить від 0 до k-1 (максимальний індекс комірки на одиницю менший, ніж кількість комірок).

Як отримати число із StringGrid1? Доступ до конкретної комірки такий же, як і в ExcelПотрібно вказати номер стовпчика та рядка (Column та Rows). Це властивість Cells[стовпчик, рядок]. Нумерація і рядків, і стовпчиків починається з нуля. Оскільки в нас один рядок, то другий елемент Cells в нас 0. А от перший елемент змінюється в циклі від 0 до останнього k-1.

Все, що знаходиться в комірках StringGrid, має рядковий тип StringОскільки в нас змінна для отримання суми чисел Sum  типу integer, то отримане значення комірки переводимо в число за допомогою StrToInt.

           Після виконання циклу в змінній Sum буде сума всіх чисел із StringGrid. Повний код програми:

var
  k,i,Sum:integer;

procedure TForm1.Button1Click(Sender: TObject);
var
  k,i,Sum:integer;
begin
  StringGrid1.LoadFromCSVFile('INPUT.txt',' ');
  k:=StringGrid1.ColCount;
  for i:=0 to k-1 do Sum:=Sum+StrToInt(StringGrid1.Cells[i,0]);
  label4.Caption:=IntToStr(k);
  label6.Caption:=IntToStr(Sum);
end;

Як бачите, все досить просто.



Розглянемо ще задачу. Трішки складнішу.

У рядках файлу zisla.txt через пробіл записані різноцифрові числа. Підрахувати кількість чисел та обчислити їхню суму.

           Як бачите, тут вже декілька рядків з числами. Але це ускладнює програмний код всього на два рядки.

Програма працює так:


Я розтягнув StringGrid в висоту, щоб помістилися п’ять рядків чисел з файлу.

Стосовно програмного коду – додаємо ще одну змінну, щоб отримати кількість рядків

m:=StringGrid1.RowCount;

І цикли будуть два – по рядках і стовпчиках (додаємо змінну а лічильника циклу по стовпчиках)

for i:=0 to m-1 do
   for a:=0 to k-1 do
    Sum:=Sum+StrToInt(StringGrid1.Cells[a,i]);

Щоб не ускладнювати програмний код, кількість чисел можна вирахувати як m*k.

Ось такий вийшов код:

var
  k,m,i,a,Sum:integer;

procedure TForm1.Button1Click(Sender: TObject);
begin
  StringGrid1.LoadFromCSVFile('INPUT.txt',' ');
  k:=StringGrid1.ColCount;
  m:=StringGrid1.RowCount;
  for i:=0 to m-1 do
   for a:=0 to k-1 do
    Sum:=Sum+StrToInt(StringGrid1.Cells[a,i]);
  label4.Caption:=IntToStr(k*m);
  label6.Caption:=IntToStr(Sum);
end;    

Немає коментарів:

Дописати коментар