Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.076 c
9-1187036732
Mr.Vlad
2007-08-14 00:25
2010.08.27
GLODEManager


15-1269281948
Нехочуха
2010-03-22 21:19
2010.08.27
Природа в цифрах


15-1268248494
кот
2010-03-10 22:14
2010.08.27
как прочитать ПЗУ через параллельный порт


11-1220147198
Jon
2008-08-31 05:46
2010.08.27
Audio Input Monitor


15-1271709002
Юрий
2010-04-20 00:30
2010.08.27
С днем рождения ! 20 апреля 2010 вторник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский