0 / 0 / 0
Регистрация: 22.11.2012
Сообщений: 46
1

Вычислить суммы элементов в каждом столбце матрицы. Полученные суммы вывести в ListBox

03.04.2015, 22:41. Показов 822. Ответов 2
Метки нет (Все метки)

Здравствуйте, у меня такая задачка: Вычислить суммы элементов в каждом столбце матрицы. Полученные суммы вывести в компоненте ListBox. Предусмотреть возможность сортировки вычисленных сумм по возрастанию и по убыванию.
Задачку я решил, очень легко, но к ней прилагаются пункты, которые я не смог решить:
1. В случае ввода отрицательных чисел необходимо предусмотреть их
корректный ввод. Например, символ минуса ‘-’ в ячейке матрицы допускается
только один. В случае некорректного ввода числа должно выводится
сообщение об ошибке с соответствующим пояснением. Примеры
некорректного ввода: «1-2», «34-», «123-45», «789-».
2. Количество строк и столбцов задается на форме программы. По умолчанию
это матрица 5х5. То есть при запуске программы выводится матрица
размерностью 5х5, заполненная случайными целыми числами. Далее
пользователь может поменять количество строк или столбцов (например, в
поле TextBox), нажать на кнопку «Заполнить матрицу», и в StringGridдолжна
отобразиться матрица нового размера, заполненная случайными целыми
числами.

Первый пункт я решил на половину: буквы не вводятся, знаки препинания тоже, водится только один минус, но с расположением минуса я так и не решил.. да и когда я перешел в динамичный массив, то при программировании программа крашится.
Второй пункт я не сделал вообще. Да, это надо сделать через динамичный массив, но как это сделать, я так и не дошел..
Подскажите пожалуйста!

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls, ExtCtrls;
 
type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    ListBox1: TListBox;
    Button1: TButton;
    Panel1: TPanel;
    RadioGroup1: TRadioGroup;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Button3: TButton;
    procedure Button3Click(Sender: TObject);
    procedure Button2SortClick(Sender: TObject);
    procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
 
var i, j: integer;
sum: integer;
s: string;
g:boolean;
begin
g:=True;
listbox1.clear;
for i := 1 to StringGrid1.ColCount do
 for j := 1 to StringGrid1.RowCount do begin
 if StringGrid1.Cells[i,j]='' then begin showmessage('Пустая ячейка '+inttostr(i)+':'+inttostr(j)); g:=false; end;
 //if StringGrid1.Cells[i,j]='-' and pos('-', StringGrid1.Cells[i,j])>1 then begin showmessage('Не правильно набрана матрица');g:=false; end;
 end;
 
 if g=true then begin
 
with StringGrid1 do begin
for i:=1 to StringGrid1.ColCount do begin
sum:=0;
for j:=1 to StringGrid1.RowCount do
 sum:=sum+strtoint(StringGrid1.Cells[i,j]);
 listbox1.items.add(inttostr(sum));
end;
end;
 end;
end;
 
procedure TForm1.Button2SortClick(Sender: TObject);
 
var i : integer;
begin
 
 
if ListBox1.Items.Count >= 1 then
begin
ListBox1.Sorted := True;
if RadioGroup1.ItemIndex <> 0 then
begin
ListBox1.Sorted := False;
with ListBox1.Items do
for i := 0 to (Count-1) div 2 do
Exchange(i, Count-i-1)
end;
end
else
ShowMessage ('Вы сортируете пустой список')
 
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
Close
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var i,j: Integer;
begin
Randomize;
  for i := 1 to StringGrid1.RowCount do
  for j := 1 to StringGrid1.ColCount do
    begin
      StringGrid1.Cells[i,j] := inttostr(Random(11)-5);
    end;
 
   with StringGrid1 do begin
for i:=1 to RowCount do
StringGrid1.Cells[i, 0] := 'Столбец '+inttostr(i);
for j:=1 to ColCount  do
 StringGrid1.Cells[0, j] := 'Строка '+inttostr(j);
end;
 
end;
 
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
var text: array of array of string;
i,j,k,l:integer;
s: string;
begin
with StringGrid1 do begin
StringGrid1.RowCount:=k;
StringGrid1.ColCount:=l;
SetLength(text, l, k);
 
for i:=1 to l do
for j:=1 to k  do
text[i,j]:=StringGrid1.Cells[i,j];
for i:=1 to l do
for j:=1 to k  do begin
s:=text[i,j];
if (key='-')and(s<>'') and (s[length(s)]='-') then
key := chr(0)
else
case key of
'0'..'9', '-', chr(8):;
else
key:= chr(0);
 
 
end;
end;
end;
end;
 
 
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.04.2015, 22:41
Ответы с готовыми решениями:

Определить и вывести на экран сумму элементов в каждом столбце прямоугольной матрицы
В прямоугольной матрице размером М*К имеющей имя М содержатся целые числа М-число строк К-число...

Найти наибольшее из двух чисел: суммы элементов k-й строки и суммы элементов s-го столбца матрицы
Братки, спасите меня! Не могу решить эту задачу. У меня уже мозга кипит , я ничего не могу с этим...

Вычислить суммы элементов каждой строки матрицы
Дана матрица X(N,N). Вычислить суммы элементов каждой строки матрицы и наибольшую из вычисленных...

Вычислить суммы и количества элементов каждой строки матрицы
вычислить и запомнить суммы и числа элементов каждой строки матрицы.Результаты отпечатать в виде...

2
2610 / 1623 / 737
Регистрация: 23.03.2015
Сообщений: 5,096
04.04.2015, 08:53 2
Цитата Сообщение от SoulStealer Посмотреть сообщение
Первый пункт я решил на половину: буквы не вводятся, знаки препинания тоже, водится только один минус, но с расположением минуса я так и не решил..

Вот посмотрите:
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);


begin
case Key of
// Разрешение ввода цифр и "BackSpace""
#8,'0'..'9':;
// Разрешение ввода "-" только в начале строки
'-' : if Length(StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]) <>0 then Key:=#0;


//----------------------------------------------------------//
{ Замена разделителя целой и дробной части на допустимый}

{Можно определить допустимый символ-разделитель в настройке Windows
через глобальную переменную "Decimaiseparator" }
',','.' :
begin
if Key <> DecimalSeparator then Key := DecimalSeparator;
// Запрет повторного ввода разделителя
if Pos(DecimalSeparator,StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row])<>0 then Key:=#0;
end;


#13:// "Enter" - при нажатии -переход от одной ячейки к другой ( по горизонтали)

if StringGrid1.Col < StringGrid1.ColCount -1 then
begin
StringGrid1.Col:= StringGrid1.Col+1;
end
else
begin
if StringGrid1.Row<StringGrid1.RowCount-1 then
begin
StringGrid1.Row:= StringGrid1.Row+1 ;
StringGrid1.Col :=0;
end;

end ;




else
Key:=#0;


end


end;

Добавлено через 19 минут
Цитата Сообщение от SoulStealer Посмотреть сообщение
По умолчанию
это матрица 5х5. То есть при запуске программы выводится матрица
размерностью 5х5, заполненная случайными целыми числами. Далее
пользователь может поменять количество строк или столбцов (например, в
поле TextBox)... Далее
пользователь может поменять количество строк или столбцов (например, в
поле TextBox), нажать на кнопку «Заполнить матрицу»

Размер "StringGrid"а

var

i,j:Integer;
begin
// Если незадана новая матрица ,то к-во строк =5
if Edit1.Text='' then j:=5 else j:=StrToInt(Edit1.text);
// Если незадана новая матрица ,то к-во столбцов =5
if Edit2.Text='' then i:=5 else i:=StrToInt(Edit2.text);
StringGrid1.ColCount:=i;
StringGrid1.RowCount:=j;
end;


Заполнение "StringGrid"

var

i,j,m,n:Integer;
R:Double;
for m:=0 to StringGrid1.ColCount-1 do
begin
for n:=0 to StringGrid1.RowCount-1 do
begin
//Заполнение не целыми числами-так интереснее
R:=Random(100)+ Random;
StringGrid1.Cells[m,n]:=FloatTostr(RoundTo(R,-2));//Округление до сотых
end;

end;
1
0 / 0 / 0
Регистрация: 22.11.2012
Сообщений: 46
04.04.2015, 18:53  [ТС] 3
Narimanych,
Спасибо большое!!!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.04.2015, 18:53
Помогаю со студенческими работами здесь

Посчитать суммы элементов двух столбцов матрицы, вывести большую сумму
Дан двумерный массив. Посчитать сумму его двух столбцов, вывести большую сумму. Выдать...

В каждом столбце матрицы найти количество элементов, больших среднего арифметического всех элементов столбца
Дана матрица размера 5х5. В каждом её столбце найти количество элементов, больших среднего...

В каждом столбце матрицы найти количество элементов, больших среднего арифметического всех элементов столбца
Дана матрица размера MxN. В каждом ее столбце найти кол-во эл-ов, больших среднего арифмитического...

Произвести сортировку элементов в каждом четном столбце матрицы Х
Числовые элементы матрицы Х(10Х10) записаны последовательно в текстовом файле Input.txt и...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru