Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2008, 14:30   #1
Tomoyo
Пользователь
 
Регистрация: 04.11.2008
Сообщений: 32
По умолчанию Квадратная матрица в Delphi

Нужно, чтобы при вводе символа вместо цифры высвечивалась ошибка. И чтобы при введении десяичных чисел в матрицу, он считал определитель, не округляя конечное значение.
Tomoyo вне форума Ответить с цитированием
Старый 11.11.2008, 14:35   #2
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Куда вводяться числа? У этого поля наверняка есть какоенибудь ОнЧейнз.
Не округлять компьютер не может.. Такчто "до каковото знака" придётся округлить по любому.
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 11.11.2008, 14:48   #3
Tomoyo
Пользователь
 
Регистрация: 04.11.2008
Сообщений: 32
По умолчанию

Ну вот прога, мне ее тоже здесь помогали делать.
Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, XPMan, StdCtrls;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Label1: TLabel;
    Edit2: TEdit;
    Label2: TLabel;
    Button1: TButton;
    Label3: TLabel;
    Edit1: TEdit;
    Button2: TButton;
    Button3: TButton;
    procedure Button3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  Tmass=array of Real;
  Tmatrix=array of Tmass;
var
  Form1: TForm1;
  n:integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject); //создаем таблицу
begin
n:=StrToInt(Edit1.Text);
StringGrid1.ColCount:=n;
StringGrid1.RowCount:=n;
end;

procedure TForm1.Button2Click(Sender: TObject);
procedure Perestanovka(k,n:integer;var a:Tmatrix; var p:integer);//перестановка строк, если главный элемент=0
//входные параметры - к-номер текущей строки;n-размер матрицы;выходной параметр - количество перестановок -р;
var z:Real; //z-буфер для обмена элементов строк
    i,j:integer;
begin
z:=abs(a[k,k]);//модуль текущего главного элемента
i:=k;//номер текущей строки
p:=0;
for j:=k+1 to n-1 do
   begin
     if abs(a[j,k])>z then  //если в этом столбце какой-то элемент больше
        begin
          z:=abs(a[j,k]); //запоминаем этот элемент
          i:=j; //запоминаем номер строки, в которой находится этот элемент
          p:=p+1;//счетчик перестановок
        end;
   end;
if i>k then //если нужная строка ниже текущей
for j:=k to n-1 do   //меняем местами элементы строк
   begin
     z:=a[i,j];
     a[i,j]:=a[k,j];
     a[k,j]:=z;
   end;
end;
function Znak(p:integer):integer;//при перестановке меняется знак определителя
begin
if p mod 2=0 then
result:=1
else result:=-1;
end;
procedure Opr(n:integer;var a:tmatrix;var det:real);
var k,i,j,p:integer;
    r:real;
begin
det:=1.0;
for k:=0 to n-1 do
  begin
    if a[k,k]=0 then Perestanovka(k,n,a,p);//перестановка строк,если главный элемент =0
    det:=znak(p)*det*a[k,k];//вычисление определителя
    for j:=k+1 to n-1 do //пересчет коэффициентов
       begin
         r:=a[j,k]/a[k,k];
         for i:=k to n-1 do
         a[j,i]:=a[j,i]-r*a[k,i];
       end;
  end;
end;
var k,j,i:integer;
    a:Tmatrix;
    det:real;
begin
n:=strtoint(edit1.Text);
SetLength(a,n,n);//задание динамического массива
  for k:=0 to n-1 do //вывод по строкам
  for j:=0 to n-1 do  //вывод по столбцам
  a[k,j]:=strtofloat(StringGrid1.Cells[j,k]);
Opr(n,a,det);//определитель системы
Edit2.Text:=FloatToStrF(det,ffFixed,5,0);
end;


end.

Последний раз редактировалось Stilet; 11.11.2008 в 20:07.
Tomoyo вне форума Ответить с цитированием
Старый 11.11.2008, 15:08   #4
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
Edit2.Text:=FloatToStrF(det,ffFixed ,5,0);
Поставь вместо ноля сколько тебе надо цифр после запятой, на столько же увеличь число 5. Хотя определитель считается до целых. Почитал бы что-нибудь.
puporev вне форума Ответить с цитированием
Старый 11.11.2008, 16:40   #5
Tomoyo
Пользователь
 
Регистрация: 04.11.2008
Сообщений: 32
По умолчанию

Спасибо. А как сделать, чтобы при вводе символа вместо цифры высвечивалась ошибка?
Tomoyo вне форума Ответить с цитированием
Старый 11.11.2008, 17:15   #6
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

А зачем высвечивать ошибку? Просто запрети программно ввод не допустимых символов и все. Вводишь то куда? В StringGrid?
Если для StringGrid то так:
Код:
// Функция обеспечивает ввод в ячейку только допустимых символов
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
var n,row:integer;c:char;
begin
n:=strtoint(edit1.text);
case Key of
  #8,'0'..'9' :  ; // цифры и <Back Space>
           #13:      // клавиша <Enter>    //это не обязательно, это чтобы не вводиить больше n
                if StringGrid1.RowCount <=n-1 then
                  begin
                     StringGrid1.RowCount := StringGrid1.RowCount + 1;
                     keybd_event(40, 0, 0, 0);
                  end;
       '.',',': // разделитель целой и дробной частей числа
                begin
                  if Key <> DecimalSeparator then
                  Key := DecimalSeparator; // заменим разделитель на допустимый
                  if Pos(DecimalSeparator,StringGrid1.Cells[StringGrid1.Col,0]) <> 0
                  then Key := Chr(0); // запрет ввода второго разделителя
                end;
           '-':    // минус можно ввести только первым символом,
                // т.е. когда ячейка пустая
                if Length(StringGrid1.Cells[StringGrid1.Col,0]) <> 0
                      then Key := Chr(0);

        else   // остальные символы запрещены
               key := Chr(0);
    end;
end;

Последний раз редактировалось puporev; 11.11.2008 в 17:19.
puporev вне форума Ответить с цитированием
Старый 11.11.2008, 17:46   #7
Светик
Новичок
Джуниор
 
Регистрация: 11.11.2008
Сообщений: 1
По умолчанию

Определить, является ли заданная целая квадратная матрица N-го порядка магическим квадратом, т.е. такой, в которой суммы элементов во всех строках и столбцах одинаковы.
Помогите пожалуиста!!
Светик вне форума Ответить с цитированием
Старый 11.11.2008, 18:47   #8
Tomoyo
Пользователь
 
Регистрация: 04.11.2008
Сообщений: 32
По умолчанию

А что означает вот это keybd_event(40, 0, 0, 0)?
И вот это DecimalSeparator?
И еще как мне это в прогу впихнуть?
Tomoyo вне форума Ответить с цитированием
Старый 11.11.2008, 19:04   #9
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
А что означает вот это keybd_event(40, 0, 0, 0)?
Написал же выкинь все, что к #13 относится. А вообще это имитация нажатия клавиши стрелка вниз.
Цитата:
DecimalSeparator?
разделитель целой и дробной частей в вещественном числе - точка или запятая.
Цитата:
И еще как мне это в прогу впихнуть?
Создай эту процедуру, как другие создаешь. Выбери на форме StringGrid, в Инспекторе объектов выбери вкладку Event, найди OnKeyPress и в белом поле рядом с надписью два разе кликни мышкой, будет заготовка процедуры, вставь туда код.

Последний раз редактировалось puporev; 11.11.2008 в 19:08.
puporev вне форума Ответить с цитированием
Старый 11.11.2008, 21:42   #10
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

это можно покороче:
Код:
       '.',',': // разделитель целой и дробной частей числа
                begin
                  if Key <> DecimalSeparator then
                  Key := DecimalSeparator; // заменим разделитель на допустимый
                  if Pos(DecimalSeparator,StringGrid1.Cells[StringGrid1.Col,0]) <> 0
                  then Key := Chr(0); // запрет ввода второго разделителя
                end;
так
Код:
       '.',',': // разделитель целой и дробной частей числа
                begin
                  Key := DecimalSeparator; //// ПРОСТО замениить на разделитель
                  if Pos(DecimalSeparator,StringGrid1.Cells[StringGrid1.Col,0]) <> 0
                  then Key := #0; // запрет ввода второго разделителя
                end;
Alter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Квадратная матрица [C++Builder] conqueror Помощь студентам 1 28.10.2008 11:11
С++:Квадратная матрица и шахматная проблема.. Andres Помощь студентам 7 02.01.2008 21:06
Дана целочисленная квадратная матрица... kitty Помощь студентам 1 05.12.2007 07:40
Паскаль. Квадратная матрица Deimossy Помощь студентам 2 20.11.2007 13:23