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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 21.06.2012, 17:39   #1
}|{eka
Пользователь
 
Регистрация: 01.04.2012
Сообщений: 16
По умолчанию Поменять в двумерном массиве местами первый и последний столбец

Помогите пожалуйста с решением задачи, у меня есть решение но не получается сделать уже по-разному пробовал, вот задача:
1)Задан массив А[1..5,1..6]. Поменять в нем местами первый и последний столбец.

1)
Код:
 unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, Spin, Grids;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Label3: TLabel;
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
 
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{ TForm1 }
 
procedure TForm1.Button3Click(Sender: TObject);
begin
   form1.StringGrid1.Clean;
   form1.Button2.Enabled:=false;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
 a:array[1..5,1..6] of integer;
 i,j:integer;
 
begin
 randomize;
   For i:=1 to  5 do
   For j:=1 to 6 do
       begin
 
   a[i,j]:=random(100);
       form1.StringGrid1.Cells[i-1,j-1]:=inttostr(a[i,j]);
       end;
       form1.Button2.Enabled:=true;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
 var a:array[1..5,1..6] of integer;  i,j,k:integer;
 begin
 a[i,j]:=strtoint(form1.StringGrid1.Cells[i-1,j-1]);
 for i:=1 to 5 do
   for j:= 1 to 6 do
   a[i,j]:=i*j;
 for i:=1 to 5 do
 begin
   k:=a[i,1];
   a[i,1]:=a[i,6];
   a[i,6]:=k;
 end;
    for i:=1 to 5 do
      for j:= 1 to 6 do
      form1.StringGrid2.Cells[i-1,j-1]:=inttostr(a[i,j]);
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
  form1.StringGrid2.Clean;
  form1.Button2.Enabled:=false;
end;



initialization
  {$I unit1.lrs}
 
end.

Последний раз редактировалось Stilet; 21.06.2012 в 20:15.
}|{eka вне форума
Старый 21.06.2012, 17:45   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Проверьте:
Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, Spin, Grids;

type
  
  { TForm1 }
  
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Label3: TLabel;
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  
  private 
  { private declarations }
  public 
  { public declarations }
  end;

var
  Form1: TForm1;
  a: array[1..5, 1..6] of integer;

implementation

{ TForm1 }

procedure TForm1.Button3Click(Sender: TObject);
begin
  form1.StringGrid1.Clean;
  form1.Button2.Enabled := false;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j: integer;
begin
  randomize;
  for i := 1 to 5 do
    for j := 1 to 6 do
    begin      
      a[i, j] := 100-random(50);
      form1.StringGrid1.Cells[j - 1, i - 1] := inttostr(a[i, j]);
    end;
  form1.Button2.Enabled := true;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i, j, k: integer;
begin
  for i := 1 to 5 do
  begin
    k := a[i, 1];
    a[i, 1] := a[i, 6];
    a[i, 6] := k;
  end;
  for i := 1 to 5 do
    for j := 1 to 6 do
      form1.StringGrid2.Cells[j - 1, i - 1] := inttostr(a[i, j]);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  form1.StringGrid2.Clean;
  form1.Button2.Enabled := false;
end;

initialization
{$I unit1.lrs}

end.
Во-первых, не имеет смысла создавать 2 локальных массива, а затем во второй процедуре считывать из стринггрида, причем только ОДНО значение, да и по неизвестным индексам i и j (они не инициализированы).
Во-вторых, во второй процедуре происходит заново заполнение массива.
В-третьих, индексация в массиве и стриггриде транспонированная (хотя это дело вкуса).
В-четвертых, не забывайте про кнопочку # для оформления кода.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 21.06.2012 в 17:49.
BDA на форуме
Старый 21.06.2012, 17:48   #3
AlexMas
Пользователь
 
Аватар для AlexMas
 
Регистрация: 30.05.2012
Сообщений: 69
По умолчанию

Вот это:
Цитата:
Сообщение от }|{eka Посмотреть сообщение
a[i,j]:=strtoint(form1.StringGrid1.Cells[i-1,j-1]);
for i:=1 to 5 do
for j:= 1 to 6 do
a[i,j]:=i*j;
заменить на это:
Код:
 for i:=1 to 5 do
   for j:= 1 to 6 do
     a[i,j]:=strtoint(form1.StringGrid1.Cells[i-1,j-1]);
AlexMas вне форума
Старый 21.06.2012, 18:17   #4
}|{eka
Пользователь
 
Регистрация: 01.04.2012
Сообщений: 16
По умолчанию

Спасибо вам AlexMas и BDA, я заменил строчки
Код:
a[i,j]:=strtoint(form1.StringGrid1.Cells[i-1,j-1]);
for i:=1 to 5 do
for j:= 1 to 6 do
a[i,j]:=i*j;
на
Код:
for i:=1 to 5 do
   for j:= 1 to 6 do
     a[i,j]:=strtoint(form1.StringGrid1.Cells[i-1,j-1]);
и все работает правильно спасибо вам огромное, как оформить код я не знал, извините если что не так теперь буду знать когда в следующий раз создам тему
}|{eka вне форума
Старый 21.06.2012, 19:00   #5
}|{eka
Пользователь
 
Регистрация: 01.04.2012
Сообщений: 16
По умолчанию

извините то что пишу сейчас не по теме, BDA, я здесь видел ваше решение задачи: На воду опущен шар радиуса r, изготовленный из вещества плотности p (p<1). Найти расстояние от центра шара до поверхности воды. Указание. При составлении программы воспользоваться формулой объема шарового сегмента высоты h: V = pi*h2 (3r - h)/3, где r - радиус шара, h - высота шарового сегмента

я попробовал сделать с помощью форм, например вводишь радиус r=45, вводишь плотность p=1 (0;1) и ответ получается Высота выше воды -45, а если радиус вводишь тот же, а плотность =0 то ответ = 45 и так любое число вводишь в радиус и ответ такой же как значение радиуса это правильно или нет? и если нет то как эту задачу можно решить я находил формулы радиус и плотность точно надо вводить, а найти нужно L, L=|r-h|
r,будет известно при вводе, h находится по формуле: h=h^2*(3*r-h)*1000-4*p*r^3 (1000 это плотность пресной воды ну наверно можно ввести плотность морской воды 1030)

вот моя программа по вашему коду сделал но скорее всего не правильно сделана математическая модель:
Код:
unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ExtCtrls, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    procedure Button1Click(Sender: TObject);

  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  Form1: TForm1; 

implementation

{ TForm1 }


procedure TForm1.Button1Click(Sender: TObject);
const
  e=0.00001;

var
  R,p,h,d,c:real;


begin

r:=strtoint(form1.Edit1.Text);
p:=strtoint(form1.Edit2.Text);


 begin
  h:=0;
  d:=4*r;
  c:=4*p*r*r*r;
  while abs(h*h*(3*r-h)-c)>e do
  begin
    if d*(h*h*(3*r-h)-c)<0 then
      d:=d/2
    else
      d:=-d/2;
    h:=h+d;
  end;

 end;
  form1.Label5.Caption:='Высота выше воды   '+floattostrf((r-h),fffixed,0,1);

end;


initialization
  {$I unit1.lrs}

end.
}|{eka вне форума
Старый 21.06.2012, 19:17   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

В том решении я принимаю плотность воды за 1, т.е. 1 кг/м^3, и просто не пишу ее в формулах.
Такой ответ программа выдает, потому что плотность должна быть дробной и лежать в диапазоне (0;1).
При p=1, очевидно, шар должен быть полностью погружен в воду, т.е. минимальная разница между центром шара и уровнем воды как раз радиус.
При p=0, также очевидно, шару совершенно не нужно погружаться в воду (воздух никак не учитывается), и он лежит на поверхности, что опять же обозначает разницу в радиус.

Кстати, похоже, в решении есть ошибка - сейчас еще разок обдумаю и напишу точно.

Нет, все же нету
Код:
uses
  crt;

const
  e = 0.00001;
  pv=1.03;

var
  R, p, h, d, c: real;

begin
  writeln('Input R and p:');
  readln(R, p);
  h := 0;
  d := 4 * r;
  c := 4 * p * r * r * r;
  while abs(pv * h * h * (3 * r - h) - c) > e do
  begin
    if d * (pv * h * h * (3 * r - h) - c) < 0 then
      d := d / 2
    else
      d := -d / 2;
    h := h + d;
  end;
  writeln('Heigth above the water: ', (r - h):0:3);
  readln;
end.
Добавил плотность воды.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 21.06.2012 в 20:11.
BDA на форуме
Старый 21.06.2012, 20:19   #7
}|{eka
Пользователь
 
Регистрация: 01.04.2012
Сообщений: 16
По умолчанию

Спасибо вам за ответ
}|{eka вне форума
Закрытая тема


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удалить строку и столбец в двумерном массиве mozg2011 Общие вопросы Delphi 41 04.04.2012 16:41
Pascal.поменять местами первый и последний символ в последнем слове Kris92 Помощь студентам 5 07.07.2010 14:00
В массиве T(k) найти первый и последний нулевые элементы farrrell Фриланс 4 07.04.2010 20:47
Задача на СИ в заданной матрице поменять местами первую строку и первый столбец %( defol-777 Помощь студентам 2 14.01.2009 09:59
в двумерном массиве целых чисел поменять местами стороки и столбы с одинаковыми номерами. Lilu Паскаль, Turbo Pascal, PascalABC.NET 2 03.04.2008 16:27