2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2, 3  След.
 
 Задание на Delphi
Сообщение02.10.2010, 21:10 
Необходимо решить одну задачку на делфи, но в программировании смыслю мало. Задача такая: необходимо рассчитать функцию $\[y(x)\]$ которая задана так:
$\[y(x) = \frac{{{x^3}}}{A}\]$ если A=-2;$\[y(x) = \sin (A - x)\]$ если A=10;$\[y(x) = \ln (\frac{A}{{{x^2}}})\]$ если A=4. Значение параметра A вводит пользователь. Компонент ввода Edit, Вывода ListBox. x берётся из промежутка $\[x \in [ - 6;6]\]$ c шагом 1. Необходимо вывести полученные значения функции в двумерный массив(размерности, как я полагаю, 13x3, по кол-ву значений). Необходимо наличие оператора Case..of.Необходимо наличие 4 видов операторов цикла(видимо для переборки x). Так же нужно сделать меню с возможностью нахождения макс/мин элементов массива, суммы всех элементов, произведение всех эл-тов массива, сумму всех отриц. элементов массива, произведение отриц. эл-тов, сумму и произведение всех полож. эл-тов массива. Так же сделать вывод всех положительных и отрицательных эл-тов массива.
Вопрос для начала состоит в том, как с помощью цикла перебрать все значения x, рассчитать 3 вида функции и загнать их в массив. Пытался сделать что то типа такого:
Case A of
-2:
for x := -6 to 6 do
j:=0;
Begin
j:=j+1;
y:=(x*x*x)/A;
matrix[1,j]:=y;
end;
10:
for x := -6 to 6 do
j:=0;
Begin
j:=j+1;
y:=sin(A-x);
matrix[2,j]:=y;
....
но результатов ноль, а ошибок куча...

 
 
 
 Re: Задание на Delphi
Сообщение02.10.2010, 21:50 
Аватара пользователя
Я бы вынес присвоение j=0 перед case of.
Первый цикл For, второй While, третий Repeat until. Три кейса три цикла.
Какой там может быть двумерный массив, ума не приложу. Ведь значение А вводится один раз. Или массив рассчитывается предварительно? Тогда да.

 
 
 
 Re: Задание на Delphi
Сообщение02.10.2010, 21:53 
Ms-dos4 в сообщении #358429 писал(а):
Необходимо решить одну задачку на делфи, но в программировании смыслю мало. Задача такая: необходимо рассчитать функцию $\[y(x)\]$ которая задана так:
$\[y(x) = \frac{{{x^3}}}{A}\]$ если A=-2;$\[y(x) = \sin (A - x)\]$ если A=10;$\[y(x) = \ln (\frac{A}{{{x^2}}})\]$ если A=4.

Я лишь одно могу сказать -- что постановка задачки откровенно безграмотна. В задачке, где речь идёт о вещественных числах, выставлять в качестве критерия выбора значения целочисленных переменных -- откровенно нелепо.

Но -- преподы, они такия. С начальством спорить бессмысленно, да.

 
 
 
 Re: Задание на Delphi
Сообщение02.10.2010, 21:54 
А мне не кажется что если j:=0 вынести в самое начало, то в след. цикле отсчёт пойдёт от последнего полученного значения j(т.е. от 13)?
ewert, но что то ведь можно сделать?

 
 
 
 Re: Задание на Delphi
Сообщение02.10.2010, 22:00 
Аватара пользователя
У Вас после do стоит единственный оператор j=0; Он и выполняется у Вас 13 раз, а то что в Begin End - всего один.
При вынесении j=0: в case of будет выполнен только один случай. И никакого следующего цикла не будет.

 
 
 
 Re: Задание на Delphi
Сообщение02.10.2010, 22:24 
Примерно так?
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
  matrix = array[1..13,1..3] of integer;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  m: matrix;
  A,x,y,i,j : Integer;


implementation

{$R *.dfm}
begin
j:=0
Case A of -2:
for x := -6 to 6 do
begin
j:=j+1;
y:=(x*x*x)/A;
m[1,j]:=y;
end;
10:
While -6<=x<=6 do
begin
j:=j+1;
y:=sin(A-x);
m[2,j]:=y;
end;
4:
Repeat
x:=-6
j:=j+1;
y:=Ln(A/(x*x));
m[3,j]:=y;
x:=x+1
until x>6
end.

 
 
 
 Re: Задание на Delphi
Сообщение02.10.2010, 22:33 
Аватара пользователя
Я не знаю дельфи, но некоторые общеязыковые конструкции у Вас ошибочны.
Первый цикл нормально. Можно, конечно, вместо деления на А умножать, но ни к чему. Во втором цикле не определяется x, а в третьем он не меняется. Лучше анализировать j.
А вообще зачем нужно j, если x- целое число?
И А целое. Не будет ли там ошибки при делении, в смысле не будет ли результат округляться до целого?
Да и массив у Вас целочисленный. А как же синус, дроби?

 
 
 
 Re: Задание на Delphi
Сообщение02.10.2010, 22:47 
Ну j нужно для записи в массив. Т.е. j это номер столбца. Мы результат каждого цикла пишем в соответствующий столбец. Тип переменных сменил так
Код:
type
  TForm1 = class(TForm)
  matrix = array[1..13,1..3] of real;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  m: matrix;
  A,x,y,i,j : real;

А как же тогда сделать 2 и 3 цикл?

 
 
 
 Re: Задание на Delphi
Сообщение02.10.2010, 22:56 
Аватара пользователя
Может быть набраться смелости и всё выкинуть?
Код:
Case A of
-2:
for x := -6 to 6 do
begin
m[1,x+7]:=(x*x*x)/A;
end;

10:
x:=-6
While x<=6 do
begin
m[2,x+7]:=sin(A-x);
x:=x+1;
end;

4:
x:=-6;
Repeat
m[3,j]:=Ln(A/(x*x));
x:=x+1;
until x>6
end.

 
 
 
 Re: Задание на Delphi
Сообщение03.10.2010, 01:03 
Спс. Внёс некоторые исправления. Но теперь на 40 и 48 строке (end; после 2й и 3й функцией он пишет Constant expression expected. Только не пойму к чему там нужна константа...
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.  
  12.   private
  13.     { Private declarations }
  14.   public
  15.     { Public declarations }
  16.   end;
  17.  
  18. var
  19.   Form1: TForm1;
  20.   y,i,j : real;
  21.   matrix: array[1..13,1..3] of real;
  22.   A,x : integer;
  23.  
  24. implementation
  25.  
  26. {$R *.dfm}
  27. begin
  28. Case A of -2:
  29. for x := -6 to 6 do
  30. begin
  31. matrix[1,x+7]:=(x*x*x)/A;
  32. end;
  33.  
  34. 10:
  35. x:=-6;
  36. While x<=6 do
  37. begin
  38. matrix[2,x+7]:=sin(A-x);
  39. x:=x+1;
  40. end;
  41.  
  42. 4:
  43. x:=-6;
  44. Repeat
  45. matrix[3,x+7]:=Ln(A/(x*x));
  46. x:=x+1;
  47. until x>6
  48. end;
  49. end.
  50.  

 
 
 
 Re: Задание на Delphi
Сообщение03.10.2010, 01:42 
Аватара пользователя

(syntax вместо code)

Ms-dos4, использование тега code -- это уже хорошо, но тег syntax -- это ещё лучше (см. выше).
Вставьте
Код:
[syntax lang=pascal lines=n]
, и поиск строк 40 и 48 не потребует от желающих Вам помочь почти никаких усилий.


Кстати, насколько я помню, в Паскале в операторе case могут стоять одиночные операторы или блоки begin ... end. Поэтому попробуйте после строки 34 вставить begin, а после строки 40 -- соответствующий ему end. Ну и с третьим случаем то же самое.

 
 
 
 Re: Задание на Delphi
Сообщение03.10.2010, 03:05 
Toucan, да, спс, вы были правы. Вот что получается.Добавил поля для ввода А и дописал else на случай если A не совпадёт с нужными. И можете сказать, какой командой можно вывести двумерный массив в ListBox?
код: [ скачать ] [ спрятать ]
  1. unit Unit1; 
  2.  
  3. interface 
  4.  
  5. uses 
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  7.   Dialogs, StdCtrls; 
  8.  
  9. type 
  10.   TForm1 = class(TForm) 
  11.   Edit1: TEdit; 
  12.   Label1: TLabel; 
  13.   ListBox1: TListBox; 
  14.  
  15.   private 
  16.     { Private declarations } 
  17.   public 
  18.     { Public declarations } 
  19.   end; 
  20.  
  21. var 
  22.   Form1: TForm1; 
  23.   y : real; 
  24.   matrix: array[1..13,1..3] of real; 
  25.   A,x,i,j : integer; 
  26.   Edit1: TEdit; 
  27.   Label1: TLabel; 
  28.   ListBox1: TListBox; 
  29.  
  30. implementation 
  31.  
  32. {$R *.dfm} 
  33. begin 
  34. A := StrToInt(Edit1.Text); 
  35. Case A of -2: 
  36. for x := -6 to 6 do 
  37. begin 
  38. matrix[1,x+7]:=(x*x*x)/A; 
  39. end; 
  40.  
  41. 10: 
  42. begin 
  43. x:=-6; 
  44. While x<=6 do 
  45. begin 
  46. matrix[2,x+7]:=sin(A-x); 
  47. x:=x+1; 
  48. end; 
  49. end; 
  50. 4: 
  51. begin 
  52. x:=-6; 
  53. Repeat 
  54. matrix[3,x+7]:=Ln(A/(x*x)); 
  55. x:=x+1; 
  56. until x>6 
  57. end; 
  58. else 
  59. ShowMessage(А должно принимать значения -2;4;10); 
  60. end; 
  61. end. 

 
 
 
 Re: Задание на Delphi
Сообщение03.10.2010, 14:00 
Дописал ещё вывод матрицы в ListBox, но программа не работает. Он пишет Project Project1.exe raiser exception class EAccesViolation with message 'AccesViolation at addres 00403EB4 in module Project1.exe. Read of address FFFFFFF7. Process stopped. Use Step or run to Continue. Это при A=10 или -2. Если взять A=4, то он будет ругается что на ноль делить нельзя(в выражении A/(x^2). Так как обойти в цикле случай x=0 в данном выражении?. А компилятор сам по себе ошибки не указывает только предупреждения о том что желательно использовать локально заданные переменные. Если же взять А не подходящим под критерии, то он как полагается выведет сообщение ShowMessage, но затем всё равно появится ошибка как и в случае 10 и -2.
код: [ скачать ] [ спрятать ]
  1. unit Unit1; 
  2.  
  3. interface 
  4.  
  5. uses 
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  7.   Dialogs, StdCtrls; 
  8.  
  9. type 
  10.   TForm1 = class(TForm) 
  11.   Edit1: TEdit; 
  12.   Label1: TLabel; 
  13.   Label2: TLabel; 
  14.   Button1: TButton; 
  15.   ListBox1: TListBox; 
  16.   procedure Button1Click(Sender: TObject); 
  17.  
  18.   private 
  19.     { Private declarations } 
  20.   public 
  21.     { Public declarations } 
  22.   end; 
  23.  
  24. var 
  25.   Form1: TForm1; 
  26.   y : real; 
  27.   matrix: array[1..13,1..3] of real; 
  28.   A,x : integer; 
  29.   i,j : byte; 
  30.   Edit1: TEdit; 
  31.   Label1: TLabel; 
  32.   Label2: TLabel; 
  33.   Button1: TButton; 
  34.   ListBox1: TListBox; 
  35.   StrTmp : String; 
  36.   prim:array[1..3,1..3] of string; 
  37. implementation 
  38.  
  39. {$R *.dfm} 
  40. procedure TForm1.Button1Click(Sender: TObject); 
  41. begin 
  42. A := StrToInt(Edit1.Text); 
  43. Case A of -2: 
  44. for x := -6 to 6 do 
  45. begin 
  46. matrix[1,x+7]:=(x*x*x)/A; 
  47. end; 
  48.  
  49. 10: 
  50. begin 
  51. x:=-6; 
  52. While x<=6 do 
  53. begin 
  54. matrix[2,x+7]:=sin(A-x); 
  55. x:=x+1; 
  56. end; 
  57. end; 
  58. 4: 
  59. begin 
  60. x:=-6; 
  61. Repeat 
  62. matrix[3,x+7]:=Ln(A/(x*x)); 
  63. x:=x+1; 
  64. until x>6 
  65. end; 
  66. else 
  67. ShowMessage('À äîëæíî ïðèíèìàòü çíà÷åíèÿ -2;4;10'); 
  68. end; 
  69. for i := 1 to 13 do begin 
  70. StrTmp := ''; 
  71. for j := 1 to 3 do begin 
  72. if StrTmp <> '' then begin 
  73. StrTmp := StrTmp + Char(9); 
  74. end; 
  75. StrTmp := StrTmp + prim[i,j]; 
  76. end; 
  77. ListBox1.Items.Add(StrTmp); 
  78. end; 
  79. end; 
  80. end. 

 
 
 
 Re: Задание на Delphi
Сообщение03.10.2010, 14:19 
Размер массива prim определён как $3\times 3$ (кстати, не понятно, он что - пустой), а в цикле вывода обращаетесь к prim[13, 3].

 
 
 
 Re: Задание на Delphi
Сообщение03.10.2010, 14:22 
Вы как-нибудь определитесь с размерностью массива matrix. У Вас в нём 13 строк и 3 столбца, а в строке 46 Вы пытаетесь писать в столбцы с 1-го по 13-й.

 
 
 [ Сообщений: 31 ]  На страницу 1, 2, 3  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group