Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблема StringGrid
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Pirate
Помогите пожалуйста

Есть стринг грид с такими значениями:

- 600 600 1400 600 3000
- 1500 800 700 1000 4000
- 900 4800 700 600 7000

Вопрос: как поделить первые три столбца на последний т.е 600 на 3000 1500 на 4000 900 на 7000 также нужно поделить и остальные два,и как потом работать с полученными числами


мисс_граффити
циклами поэлементно...
не совсем понятно, в чем проблема.
Tan
Мне кажется тут речь о том, что Pirate не знает как обратиться к ячейкам StringGrid и получить оттуда нужные данные.
Form1.StringGrid1.Cells[i,j] - так ты обращаешься к элементу стрингрида, где i - номер столбика (0..n), а j - номер ряда (0..n) - заметь, что отличается от массивов. Так как ты работаешь со строкой, можешь объявить переменную типа string (например s) и присвоить ей значение ячейки StringGrid, например s := Form1.StringGrid1.Cells[0,0] - верхний левый элемент. Теперь, используя функцию StrToInt, ты можешь из строки получить число типа integer (с вещественными аналонично StrToFloat), а можно и сделать сразу a := StrToInt (Form1.StringGrid1.Cells[0,0]), где а - переменная типа integer. Теперь, используя цикл for, можно производить различные манипуляции с данными ячеек StringGrid, что тебе и требуется.
Отредактировано -> см. пост Better Kind.
Pirate
Цитата(Tan @ 13.01.2008 0:41) *

Мне кажется тут речь о том, что Pirate не знает как обратиться к ячейкам StringGrid и получить оттуда нужные данные.
Form1.StringGrid1.Cells[i,j] - так ты обращаешься к элементу стрингрида, где i - номер столбика (0..n), а j - номер ряда (0..n) - заметь, что отличается от массивов. Так как ты работаешь со строкой, можешь объявить переменную типа string (например s) и присвоить ей значение ячейки StringGrid, например s := Form1.StringGrid1.Cells[0,0] - верхний левый элемент. Теперь, используя функцию IntToStr, ты можешь из строки получить число типа integer, а можно и сделать сразу s := IntToStr (Form1.StringGrid1.Cells[0,0]); Теперь, используя цикл for, можно производить различные манипуляции с данными ячеек StringGrid, что тебе и требуется.


Уважаемый Тан не могли бы вы мне привести примерчег с моими данными ,у меня при делении 600 на 3000 возникает ошибка.Как потом данные из каждого из столбоц занести в массив?
Tan
Покажи как ты делаешь и станет понятнее откуда ошибка. Допустим мы хотим занести данные из 1го по счёту столбца в массив : for i := 1 to N do massiv[i] := StrToInt (Form1.StringGrid1.Cells[0,i - 1]); То есть проходим по строкам, а столбик константный, если же ты хочешь занести в массив одновременно несколько столбиков со значениями, необходим ещё внешний цикл по столбикам.
Better Kind
Цитата(Tan @ 13.01.2008 0:41) *
Теперь, используя функцию IntToStr , ты можешь из строки получить число типа integer


Вещественный тип надо использовать. Ну и разумеется внимательней смотрим, что пишем. Перевод строки в число делает StrToFloat, а не наоборот.

Tan
Я просто показал пример как загнать данные в массив. Я же не использовал деление.
Pirate

Вообщем я понял что нужно - поделить 3 столбца на последний, а результаты загнать в массив и вывести в мемо - как?

Ошибок не возникает, но как сделать деление циклами поочередно?
Tan
Приведи пожалуйста пример исходных данных и данных на выходе, непонятно как заполнять массив. Допустим поделили все элементы первого столбика на последний, записали в массив. Потом поделил второй на последний, после этого продолжаем писать в тот же массив или создаём и заполняем новый?
volvo
Цитата(Better Kind)
Вещественный тип надо использовать.
С чего бы это? Потому, что тебе так хочется? Неправильно хочется, значит... Содержимое ячеек - целочисленное, значит можно использовать StrToInt...

Pirate, все очень просто: 2 вложенных цикла - внешний по строкам, внутренний - по столбцам грида (деление i-го элемента где i = 0 .. n-1 каждой строки на n-ый), и запись результатов в массив, разумеется (хотя можно и сразу записывать в Memo, это уже по желанию)...

Ты бы привел хотя бы наброски своего кода, а то такое ощущение, что ты ждешь, когда все сделают за тебя и выложат здесь все на блюдечке...
Better Kind
Цитата(volvo @ 15.01.2008 12:11) *
Содержимое ячеек - целочисленное, значит можно использовать StrToInt...
Пардон, повелительное наклонение слова "надо" можно отбросить.
Проще всего избежать исключиния можно используя StrToIntDef.
Pirate

Вообщем я начал потихоньку разбираться, тип должен быть Реал т.к при StrToInt возникает ошибка
Я со стринггридом не дружу честно говоря но и не жду пока сделают всё за меня как препдположил Volvo
Набросков вот именно что нет, я не могу понять как всё это дело после деления присвоить массиву
Volvo два вложенных цикла т.е For i:=0 to StringGrid.ColCount-1 do For i:=0 to StringGrid.RowCount-1 do
Так ещё в чем проблема предпоследний столбец не используется,что делать?

Добавлено через 9 мин.
У меня это только первый пункт решения моей задачи

Какой массив должен быть в результате :

A= 0,2 0,375 0,12
0,13 0,2 0,68
0,2 0,25 0,85
100
Потом мне необходимо отнять получ массив от массива 010 т.е от еденичной матрицы и найти определитель 001

Помогите сделать хотя бы деление столбцов на последний
Pirate
Для заполнения

procedure TForm1.Button1Click(Sender: TObject);
begin

StringGrid1.Cells[0,0]:='600';
StringGrid1.Cells[0,1]:='1500';
stringgrid1.Cells[0,2]:='900';
StringGrid1.Cells[1,0]:='400';
StringGrid1.Cells[1,1]:='800';
stringgrid1.Cells[1,2]:='4800';
StringGrid1.Cells[2,0]:='1400';
StringGrid1.Cells[2,1]:='700';
stringgrid1.Cells[2,2]:='700';
StringGrid1.Cells[3,0]:='600';
StringGrid1.Cells[3,1]:='1000';
stringgrid1.Cells[3,2]:='600';
StringGrid1.Cells[4,0]:='3000';
StringGrid1.Cells[4,1]:='4000';
stringgrid1.Cells[4,2]:='7000';
end;

Вот как я сделал:

procedure TForm1.Button2Click(Sender: TObject);
var A:array [0..3] of real;
B:array [0..3] of real;
C:array [0..3] of real;
i : integer;

begin
try
for i:=0 to StringGrid1.RowCount-1 do
begin
A[i] := strtofloat(StringGrid1.Cells[0,i]) / strtofloat(StringGrid1.Cells[StringGrid1.ColCount-1,i]);
B[i]:=strtofloat(StringGrid1.Cells[1,i]) / strtofloat(StringGrid1.Cells[StringGrid1.ColCount-1,i]);
C[i]:=strtofloat(StringGrid1.Cells[2,i]) / strtofloat(StringGrid1.Cells[StringGrid1.ColCount-1,i]);

здесь набросок вычитания единичной матрицы из полученой
можно как цикл оформить это всё?

A[0]:=1-A[0];
A[1]:=0-a[1];
A[2]:=0-a[2];

B[0]:=0-b[0];
B[1]:=1-b[1];
B[2]:=0-b[2];

C[0]:=0-c[0];
C[1]:=0-c[1];
C[2]:=1-c[2];

Memo1.Lines[i]:=FloatTostr(c[i]);
end;
except
on EConvertError do MessageBox(Form1.Handle,'Неправильный ввод данных!',nil,0);
on EZeroDivide do MessageBox(Form1.Handle,'Деление на ноль нах!',nil,0);
end;


А можно сделать чтбы после запятой было две цифры т.е вместо 0,1333333333333333 было 0,13
и ещё как в мемо сделать вывод построчно чтобы Первая строка была равна a[i] вторая b[i] 3 c[i]
Pirate
var A:array [0..3,0..3] of real;
i : integer;

begin
try
for i:=0 to StringGrid1.RowCount-1 do
begin
Вот сделал двумерный массив помогите транспанировать или сделать вывод в Мемо построчно
A[i,0] := strtofloat(StringGrid1.Cells[0,i]) / strtofloat(StringGrid1.Cells[StringGrid1.ColCount-1,i]);
A[i,1]:=strtofloat(StringGrid1.Cells[1,i]) / strtofloat(StringGrid1.Cells[StringGrid1.ColCount-1,i]);
A[i,2]:=strtofloat(StringGrid1.Cells[2,i]) / strtofloat(StringGrid1.Cells[StringGrid1.ColCount-1,i]);



Memo1.Lines[i]:=FloatTostr(A[i,0]);
end;
except
on EConvertError do MessageBox(Form1.Handle,'Неправильный ввод данных!',nil,0);
on EZeroDivide do MessageBox(Form1.Handle,'Деление на ноль нах!',nil,0);
end;

end;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.