![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нахождение "особого" элемента в массиве. [D7, XP]
Boortwint © (2010-03-16 11:01:00)Здравствуйте. Имеется задача: Задана матрица размером NxM. Определить k – количество “особых” элементов матрицы, считая элемент “особым”, если он больше суммы остальных элементов своего столбца.
Собственно, я смог суммировать элементы по каждым столбцам массива, но вот найти этот самый "особый" элемент вообще не понимаю как.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, Math;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
Edit3: TEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
const
Nmax=10;
Mmax=10; //Максимальная размерность массива
Type
Mas2 = array[1..Nmax,1..Mmax] of extended; // Объявление типа двумерного массива размерностью Nmax
var
Form1: TForm1;
A:Mas2; // Объявление двумерного массива
N,M,i,j:integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
N:=3; // Размерность массива
Edit1.Text:=FloatToStr(N);
M:=2;
Edit2.Text:=FloatToStr(M);
{Задание числа строк и столбцов в таблицах}
StringGrid1.ColCount:=M+1;
StringGrid1.RowCount:=N+1;
{Ввод в левую верхнюю ячейку таблицы названия массива}
StringGrid1.Cells[0,0]:='Массив A:';
{Заполнение верхнего и левого столбцов поясняющими подписями}
for j:=1 to m do begin
StringGrid1.Cells[j,0]:=' j='+IntToStr(j);
end;
for i:=1 to n do begin
StringGrid1.Cells[0,i]:=' i='+IntToStr(i);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
N:=StrToInt(Edit1.Text);
M:=StrToInt(Edit2.Text);
{Задание числа строк и столбцов в таблицах}
StringGrid1.ColCount:=m+1;
StringGrid1.RowCount:=n+1;
{Заполнение верхнего и левого столбцов поясняющими подписями}
for j:=1 to m do begin
StringGrid1.Cells[j,0]:=' j='+IntToStr(j);
end;
for i:=1 to n do begin
StringGrid1.Cells[0,i]:=' i='+IntToStr(i);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
sum,y,MaxN:integer;
begin
with StringGrid1 do
begin
y:=0; {обнуляем счетчик "особых" чисел}
Sum:=0;
memo1.Text:='';
for j:=1 to M do
begin
for i:=1 to N do
if Cells[j,i]<>'' then {если ячейка заполнена, то суммировать ее значение}
Sum:=Sum+StrToInt(Cells[j,i]);
{выводим результат в текстовое поле}
Memo1.Lines.Add('сумма '+IntToStr(j)+' = '+FloatToStrF(sum,ffFixed,8,0));
Sum:=0;
end;
end;
end;
{это не важно}
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9','-','+']) then
Key:=#0;
end;
end.
Код работает, но ваши замечания приму.
Помогите найти "особый" элемент в каждом столбце.
MBo (2010-03-16 14:52:00) [1]маленький совет - работать надо с массивом.
Грид использовать только для отображения результатов.
Тогда несложный алгоритм не будет загроможден нагромождением тудасюдапреобразований
Boortwint (2010-03-16 13:42:00) [2]Сделал, спасибо большое за помощь.
procedure TForm1.Button2Click(Sender: TObject);
var
sum,y:integer;
begin
with StringGrid1 do
begin
y:=0; {îáíóëÿåì ñ÷åò÷èê "îñîáûõ" ÷èñåë}
Sum:=0;
Memo1.Text:='';
for j:=1 to M do
begin
for i:=1 to N do
if Cells[j,i]'' then {åñëè ÿ÷åéêà çàïîëíåíà, òî ñóììèðîâàòü åå çíà÷åíèå}
Sum:=Sum+StrToInt(Cells[j,i]);
for i:=1 to N do
begin
if Cells[j,i]'' then
if StrToInt(Cells[j,i])>(sum-StrToInt(Cells[j,i])) then
y:=y+1;
Edit3.Text:=IntTostr(y);
end;
{âûâîäèì ðåçóëüòàò â òåêñòîâîå ïîëå}
Memo1.Lines.Add('ñóììà '+IntToStr(j)+' = '+FloatToStrF(sum,ffFixed,8,0));
Sum:=0;
end;
end;
end;
Написал код, если кому интересно, где ошибка была. Жирным шрифтом обозначен кусок, который считает и записывает количество особых чисел в текстовое поле.
oldman (2010-03-16 13:37:00) [3]Установи контрольные визуальные сообщения что и с чем сравнивается в if.
Возможно, найдешь проблему.
Boortwint (2010-03-16 13:34:00) [4]К сожалению, они есть.
Пример:
j1 j2 j3
i1 1 1 1
i2 1 1 1
i3 4 4 4
"особые" элементы здесь есть, но программа на них не реагирует.
oldman (2010-03-16 13:22:00) [5]Значит нет "особых" элементов...
или
sum/2
пиши
(sum/2)
Boortwint (2010-03-16 13:14:00) [6]
>
> перед суммированием ячейку проверяем не "непустую", а перед
> конвертацией нет?
Спасибо.
Странно. Теперь ошибка не вылетает, хотя я проводил тест программы с заполнением всех ячеек массива, то есть пустых в ней не было.
if Cells[j,i]<>'' then
if StrToInt(Cells[j,i])>sum/2 then
Edit3.Text:='Работает;
Но код не работает почему-то... Не выводит он в Edit текст.
oldman (2010-03-16 12:52:00) [7]перед суммированием ячейку проверяем не "непустую", а перед конвертацией нет?
Boortwint (2010-03-16 12:50:00) [8]
> Интересно, какую?
Project Project.exe raised exception class EConvertError with message '''is not a valid integer value'. Process stopped. Use Step or Run to continue.
oldman (2010-03-16 12:26:00) [9]
> при нажатии кнопки расчета выбивает ошибку.
Интересно, какую?
Boortwint (2010-03-16 12:20:00) [10]
if Cells[j,i]>(sum/2) then Edit3.text:='есть особый элемент';
Когда пишу так, то компиляция не проходит. Пишет "incompatible types: 'String' and 'Extended'.
if StrToInt(Cells[j,i])>(sum/2) then Edit3.text:='есть особый элемент';- вот так компиляция проходит, но при нажатии кнопки расчета выбивает ошибку.
Anatoly Podgoretsky (2010-03-16 11:28:00) [11]Что бы не считать сто раз, для каждого числа, стоит просчитать полные суммы столбцов.
oldman (2010-03-16 11:21:00) [12]После
Memo1.Lines.Add('сумма '+IntToStr(j)+' = '+FloatToStrF(sum,ffFixed,8,0));
вставь
for i:=1 to N do
if Cells[j,i]>(sum/2) then "особый" элемент найден
или
for i:=1 to N do
if Cells[j,i]>(sum-Cells[j,i]) then "особый" элемент найден
Kerk (2010-03-16 11:04:00) [13]"Сумма всех остальных элементов своего столбца" - это сумма всех элементов столбца минус значение текущего элемента.
Kerk (2010-03-16 11:04:00) [14]
> Boortwint © (16.03.10 11:03) [1]
>
> По возможности отредактируйте код, пожалуйста, чтобы задача
> выполнялась.
> Если лень разбираться в этих джунглях, то напишите свой.
А вот это ты зря написал :)
oldman (2010-03-16 11:04:00) [15]
> Собственно, я смог суммировать элементы по каждым столбцам
> массива, но вот найти этот самый "особый" элемент вообще
> не понимаю как.
Элемент больше полусуммы
Если сумма всех элементов =10, "особый" элемент >5
Boortwint (2010-03-16 11:03:00) [16]По возможности отредактируйте код, пожалуйста, чтобы задача выполнялась.
Если лень разбираться в этих джунглях, то напишите свой.
Заранее благодарю.