Форум: "Начинающим";
Текущий архив: 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; {îáíóëÿåì ñ÷åò÷èê "îñîáûõ" ÷èñåë}
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;
Написал код, если кому интересно, где ошибка была. Жирным шрифтом обозначен кусок, который считает и записывает количество особых чисел в текстовое поле.
← →
MBo © (2010-03-16 14:52) [16]маленький совет - работать надо с массивом.
Грид использовать только для отображения результатов.
Тогда несложный алгоритм не будет загроможден нагромождением тудасюдапреобразований
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.061 c