Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Нахождение "особого" элемента в массиве.   Найти похожие ветки 

 
Boortwint ©   (2010-03-16 11:01) [0]

Здравствуйте. Имеется задача: Задана матрица размером 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.

Код работает, но ваши замечания приму.
Помогите найти "особый" элемент в каждом столбце.


 
Boortwint ©   (2010-03-16 11:03) [1]

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


 
Kerk ©   (2010-03-16 11:04) [2]

"Сумма всех остальных элементов своего столбца" - это сумма всех элементов столбца минус значение текущего элемента.


 
Kerk ©   (2010-03-16 11:04) [3]


> Boortwint ©   (16.03.10 11:03) [1]
>
> По возможности отредактируйте код, пожалуйста, чтобы задача
> выполнялась.
> Если лень разбираться в этих джунглях, то напишите свой.

А вот это ты зря написал :)


 
oldman ©   (2010-03-16 11:04) [4]


> Собственно, я смог суммировать элементы по каждым столбцам
> массива, но вот найти этот самый "особый" элемент вообще
> не понимаю как.


Элемент больше полусуммы
Если сумма всех элементов =10, "особый" элемент >5


 
oldman ©   (2010-03-16 11:21) [5]

После
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 "особый" элемент найден


 
Anatoly Podgoretsky ©   (2010-03-16 11:28) [6]

Что бы не считать сто раз, для каждого числа, стоит просчитать полные суммы столбцов.


 
Boortwint ©   (2010-03-16 12:20) [7]


if  Cells[j,i]>(sum/2) then Edit3.text:="есть особый элемент";

Когда пишу так, то компиляция не проходит. Пишет "incompatible types: "String" and "Extended".

if  StrToInt(Cells[j,i])>(sum/2) then Edit3.text:="есть особый элемент"; - вот так компиляция проходит, но при нажатии кнопки расчета выбивает ошибку.


 
oldman ©   (2010-03-16 12:26) [8]


> при нажатии кнопки расчета выбивает ошибку.


Интересно, какую?


 
Boortwint ©   (2010-03-16 12:50) [9]


> Интересно, какую?

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:52) [10]

перед суммированием ячейку проверяем не "непустую", а перед конвертацией нет?


 
Boortwint ©   (2010-03-16 13:14) [11]


>
> перед суммированием ячейку проверяем не "непустую", а перед
> конвертацией нет?

Спасибо.
Странно. Теперь ошибка не вылетает, хотя я проводил тест программы с заполнением всех ячеек массива, то есть пустых в ней не было.

if Cells[j,i]<>"" then
if StrToInt(Cells[j,i])>sum/2 then
Edit3.Text:="Работает;


Но код не работает почему-то... Не выводит он в Edit текст.


 
oldman ©   (2010-03-16 13:22) [12]

Значит нет "особых" элементов...

или
sum/2
пиши
(sum/2)


 
Boortwint ©   (2010-03-16 13:34) [13]

К сожалению, они есть.
Пример:
   j1 j2 j3
i1  1  1  1
i2  1  1  1
i3  4  4  4
"особые" элементы здесь есть, но программа на них не реагирует.


 
oldman ©   (2010-03-16 13:37) [14]

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


 
Boortwint ©   (2010-03-16 13:42) [15]

Сделал, спасибо большое за помощь.

procedure TForm1.Button2Click(Sender: TObject);
var
sum,y:integer;
 begin
with StringGrid1 do
       begin
y:=0;  {&#238;&#225;&#237;&#243;&#235;&#255;&#229;&#236; &#241;&#247;&#229;&#242;&#247;&#232;&#234; "&#238;&#241;&#238;&#225;&#251;&#245;" &#247;&#232;&#241;&#229;&#235;}
Sum:=0;
Memo1.Text:="";
for j:=1 to M do
             begin
for i:=1 to N do
if Cells[j,i]<>"" then {&#229;&#241;&#235;&#232; &#255;&#247;&#229;&#233;&#234;&#224; &#231;&#224;&#239;&#238;&#235;&#237;&#229;&#237;&#224;, &#242;&#238; &#241;&#243;&#236;&#236;&#232;&#240;&#238;&#226;&#224;&#242;&#252; &#229;&#229; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#229;}
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;

{&#226;&#251;&#226;&#238;&#228;&#232;&#236; &#240;&#229;&#231;&#243;&#235;&#252;&#242;&#224;&#242; &#226; &#242;&#229;&#234;&#241;&#242;&#238;&#226;&#238;&#229; &#239;&#238;&#235;&#229;}
Memo1.Lines.Add("&#241;&#243;&#236;&#236;&#224; "+IntToStr(j)+" = "+FloatToStrF(sum,ffFixed,8,0));
Sum:=0;
             end;
       end;
 end;


Написал код, если кому интересно, где ошибка была. Жирным шрифтом обозначен кусок, который считает и записывает количество особых чисел в текстовое поле.


 
MBo ©   (2010-03-16 14:52) [16]

маленький совет - работать надо с массивом.
Грид использовать только для отображения результатов.
Тогда несложный алгоритм не будет загроможден нагромождением тудасюдапреобразований



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.207 c
15-1273841536
pasha_golub
2010-05-14 16:52
2010.08.27
Просьба владельцам телефонов


4-1232437513
Anklav
2009-01-20 10:45
2010.08.27
однозначное определение 2+ окон с одним заголовком


15-1275679642
REX
2010-06-04 23:27
2010.08.27
Комментарии


15-1268404840
Илья_
2010-03-12 17:40
2010.08.27
Ошибка при отладке программы с помощью функции Trace into


15-1266662604
oldman
2010-02-20 13:43
2010.08.27
Майкрософт прикалывается?