Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.05.2013, 15:59
Restart Restart вне форума
Прохожий
 
Регистрация: 17.05.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Сумма столбцов в Stringrid

Мне нужно чтобы программа считала сумму всех ячеек столбца и выводила их в другой Stringrid.


Код:
var
  Form1: TForm1;
  SG1  :  Array[1..5,1..4] Of integer;  //входной массив (стринггрид1)
  SG2  :  Array[1..4] Of integer;	  //исходной массив (стринггрид2)
  i, j, s :  Integer;                          //переменные...(сумма, строки, столбцы)

Код:
begin
   For i:=1 To 5 Do
   For j:=1 To 4 Do
    If  (StrnGrd1.Cells[j-1,i-1]='') Then
      SG1[i,j] := 0
    Else
      SG1[i,j] := StrToInt(StrnGrd1.Cells[j-1,i-1]);  //если ячейки пустые, записать туда "ноль"
For i:=1 To strngrd1.ColCount Do                       //для каждого столбца
    Begin
S:=0;
for j:=1 to 5 do begin                                      //считаем сумму каждой ячейки
     S:=s+SG1[i,j];
end;
    SG2[i]:=S;                                                //присваиваем сумму ячейке матрицы SG2
    End;

   For i:=1 To 4 Do                                    
   StrnGrd2.Cells[0,i-1] := FloatToStr(SG2[i])      //Вывод в другой стринггрид (Stringgrid2 или strngrd)
end;

StrnGrd - тоже самое, что и stringgrid.

Программа работает, но считает неправильно.
В чем может быть проблема?


http://clip2net.com/s/54UMIS - картинка

Последний раз редактировалось Restart, 17.05.2013 в 18:23.
Ответить с цитированием
  #2  
Старый 17.05.2013, 17:00
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Ничего не могу понять в этом коде, хоть отформатируй по человечески и подпиши, что значат переменные.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 17.05.2013, 18:22
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Restart
...Программа работает, но считает неправильно...
Вроде это суммирует правильно, проверьте
Код:
var
  SG1  : array [0..4, 0..3] of integer =
      (( 34, -23,  48,  47),
      ( -14,  29,  8 ,  37),
      (  46,  13, -12,  41),
      ( -3 ,  17,  38,  5 ),
      ( -11, -22,  18, -6));


procedure TForm1.Button1Click(Sender: TObject);
var
Col, Row: integer;
begin

 for Row:= 0 to StringGrid1.RowCount-1 do //  Заполнение грида

  for Col:= 0 to StringGrid1.ColCount-1 do
   StringGrid1.Cells[Col, Row]:= IntToStr(SG1[Row, Col]);

end;

procedure TForm1.Button2Click(Sender: TObject);
var
Col, Row, Sum: integer;
begin

   for Row := 0 to StringGrid1.RowCount-1 do   

    begin
     Sum:= 0;

      for Col := 0 to StringGrid1.ColCount-1 do // Сложение всех колонок
       Sum:= Sum + StrToInt(StringGrid1.Cells[Col, Row]);

     StringGrid2.Cells[0, Row]:= IntToStr(Sum);
    end;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Restart (17.05.2013)
  #4  
Старый 17.05.2013, 18:45
Restart Restart вне форума
Прохожий
 
Регистрация: 17.05.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Вроде это суммирует правильно, проверьте
Да, вы все правильно сделали, но здесь одна моя ошибка, я не сказал, что нужно даные вводить рандомно:
Код:
begin
  Randomize;
  For i:=1 To 5 Do
  For j:=1 To 4 Do
  Strngrd1.Cells[j-1,i-1] := FloatToStr(Random(80)-25);
end;

Проблем у меня с этим не будет, я переделаю.

Ваш код работает, и считает, но не столбцы, а строки.
Нужно как-то изменить:
Код:
begin
 
   for Row := 0 to StringGrid1.RowCount-1 do  
 
    begin
     Sum:= 0;
 
      for Col := 0 to StringGrid1.ColCount-1 do // Сложение всех колонок
       Sum:= Sum + StrToInt(StringGrid1.Cells[Col, Row]);
 
     StringGrid2.Cells[0, Row]:= IntToStr(Sum);
    end;
end;

и тут я всегда зависаю...
Ответить с цитированием
  #5  
Старый 17.05.2013, 18:50
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

переменные местами поменять
сейчас слева направо, сверху вниз, а надо сверху вниз и слева направо.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #6  
Старый 17.05.2013, 18:57
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Ну и неплохо бы учитывать, что могут быть названия колонок, строк. А тогда индекс начальный не 0 будет. Желательно использовать для задания границ грида специальные свойства хранящие эту инфу.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
Restart (17.05.2013)
  #7  
Старый 17.05.2013, 19:06
Restart Restart вне форума
Прохожий
 
Регистрация: 17.05.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
а надо сверху вниз и слева направо.
Так?
Код:
begin
       for Col := 0 to StringGrid1.ColCount-1 do 
    begin
     Sum:= 0;
      for Row := 0 to StringGrid1.RowCount-1 do
        Sum:= Sum + StrToInt(StringGrid1.Cells[Col, Row]); 
      StringGrid2.Cells[0, Row]:= IntToStr(Sum);
    end;
end;

не работает
Ответить с цитированием
  #8  
Старый 17.05.2013, 19:08
Restart Restart вне форума
Прохожий
 
Регистрация: 17.05.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Ну и неплохо бы учитывать, что могут быть названия колонок, строк. А тогда индекс начальный не 0 будет..
Да, спасибо. Но в моем примере их нет.
Картинка
http://clip2net.com/s/54UMIS
Ответить с цитированием
  #9  
Старый 17.05.2013, 19:16
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Страдалецъ
...Желательно использовать для задания границ грида специальные свойства хранящие эту инфу.
Ну да,за это отвечают FixedRows и FixedCols, но их можно не учитывать т.к. судя по рисунку они равны нулю.

Наверное ещё хорошо бы сделать так
Код:
var
SG1: array  of integer;
...
begin

SetLength(SG1, StringGrid1.RowCount,StringGrid1.ColCount); 
...
end;
мало ли, вдруг размерность грида изменится.


Оффтоп:
Цитата:
Сообщение от Restart
...считает, но не столбцы, а строки...
Это русский способ, построчное сложение, есть ещё еврейский - тоже построчно, но от конца к началу, а с верху к низу столбиком, вроде или японский или китайский вариант (кто-то там из них с иероглифами так мутит) - не, китайский код нам не нужен!

Последний раз редактировалось Alegun, 17.05.2013 в 19:27.
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Restart (17.05.2013)
  #10  
Старый 17.05.2013, 19:27
Restart Restart вне форума
Прохожий
 
Регистрация: 17.05.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
не, китайский код нам не нужен!
Может немного японского тогда?
Ответить с цитированием
  #11  
Старый 17.05.2013, 19:54
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Restart
Может немного японского тогда?
Можно хоть на суахили, только тогда и второй грид извратить немного тоже нужно, расположив его под первым гридом и изменив кол-во строк до одной, а столбцов до 4х.
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
Col, Row, Sum: integer;
begin
  for Col := 0 to StringGrid1.ColCount-1 do
    begin
     Sum:= 0;
     for Row := 0 to StringGrid1.RowCount-1 do
       Sum:= Sum + StrToInt(StringGrid1.Cells[Col, Row]);
        StringGrid2.Cells[Col, 0]:= IntToStr(Sum);
    end;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Restart (17.05.2013)
  #12  
Старый 17.05.2013, 20:15
Restart Restart вне форума
Прохожий
 
Регистрация: 17.05.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Можно хоть на суахили, только тогда и второй грид извратить немного тоже нужно, расположив его под первым гридом и изменив кол-во строк до одной, а столбцов до 4х.

Да, это оно, работает
Спасибо.

Но, ведь же есть какой-то способ, чтобы вывести их в столбец (во втором стринггриде)?
Ответить с цитированием
  #13  
Старый 17.05.2013, 20:24
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Можно, нужно добавить ещё одну переменную типа integer, напр b, потом в самом начале процедуры задать её как ноль, а в цикле... не можно проще, вот так
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
Col, Row, Sum: integer;
begin
    for Col := 0 to StringGrid1.ColCount-1 do
    begin
     Sum:= 0;
     for Row := 0 to StringGrid1.RowCount-1 do
       Sum:= Sum + StrToInt(StringGrid1.Cells[Col, Row]);
        StringGrid2.Cells[0, Col]:= IntToStr(Sum);
      end;
end;
только всё равно у второго грида четыре строки нужны, сумм 4 всего будет.
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Restart (17.05.2013)
  #14  
Старый 17.05.2013, 20:35
Restart Restart вне форума
Прохожий
 
Регистрация: 17.05.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
не можно проще, вот так...
Да, то что нужно.
Просто и елементарно.
Я действительно долго мучался как правильно написать...
Спасибо.
Вы мне очень помогли
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:30.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter