Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нахождение "особого" элемента в массиве. [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]

По возможности отредактируйте код, пожалуйста, чтобы задача выполнялась.
Если лень разбираться в этих джунглях, то напишите свой.
Заранее благодарю.


Наверх

Титульная страница Поиск, карта сайта Написать письмо