Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблема 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;
hydroxychloroquine 200 mg for sa
viagra pfizer 50 mg
where can i buy prednisone witho
Xenical Manufacturer Coupon
nishaknapp
Why not settling on games that is fun and at the same time your earning. Well it'll make suspense because the game is well but dude just try it and it gave me hope while pandemic is real rn. Play Like a Pro with These Online Casino Tips
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.