2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2, 3  След.
 
 Задание на Delphi
Сообщение02.10.2010, 21:10 
Заслуженный участник


25/02/08
2961
Необходимо решить одну задачку на делфи, но в программировании смыслю мало. Задача такая: необходимо рассчитать функцию $\[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 
Заслуженный участник
Аватара пользователя


13/08/08
14430
Я бы вынес присвоение j=0 перед case of.
Первый цикл For, второй While, третий Repeat until. Три кейса три цикла.
Какой там может быть двумерный массив, ума не приложу. Ведь значение А вводится один раз. Или массив рассчитывается предварительно? Тогда да.

 Профиль  
                  
 
 Re: Задание на Delphi
Сообщение02.10.2010, 21:53 
Заслуженный участник


11/05/08
32166
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 
Заслуженный участник


25/02/08
2961
А мне не кажется что если j:=0 вынести в самое начало, то в след. цикле отсчёт пойдёт от последнего полученного значения j(т.е. от 13)?
ewert, но что то ведь можно сделать?

 Профиль  
                  
 
 Re: Задание на Delphi
Сообщение02.10.2010, 22:00 
Заслуженный участник
Аватара пользователя


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

 Профиль  
                  
 
 Re: Задание на Delphi
Сообщение02.10.2010, 22:24 
Заслуженный участник


25/02/08
2961
Примерно так?
Код:
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 
Заслуженный участник
Аватара пользователя


13/08/08
14430
Я не знаю дельфи, но некоторые общеязыковые конструкции у Вас ошибочны.
Первый цикл нормально. Можно, конечно, вместо деления на А умножать, но ни к чему. Во втором цикле не определяется x, а в третьем он не меняется. Лучше анализировать j.
А вообще зачем нужно j, если x- целое число?
И А целое. Не будет ли там ошибки при делении, в смысле не будет ли результат округляться до целого?
Да и массив у Вас целочисленный. А как же синус, дроби?

 Профиль  
                  
 
 Re: Задание на Delphi
Сообщение02.10.2010, 22:47 
Заслуженный участник


25/02/08
2961
Ну 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 
Заслуженный участник
Аватара пользователя


13/08/08
14430
Может быть набраться смелости и всё выкинуть?
Код:
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 
Заслуженный участник


25/02/08
2961
Спс. Внёс некоторые исправления. Но теперь на 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 
Админ форума
Аватара пользователя


19/03/10
8952

(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 
Заслуженный участник


25/02/08
2961
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 
Заслуженный участник


25/02/08
2961
Дописал ещё вывод матрицы в 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 


16/06/10
199
Размер массива prim определён как $3\times 3$ (кстати, не понятно, он что - пустой), а в цикле вывода обращаетесь к prim[13, 3].

 Профиль  
                  
 
 Re: Задание на Delphi
Сообщение03.10.2010, 14:22 
Заслуженный участник


09/08/09
3438
С.Петербург
Вы как-нибудь определитесь с размерностью массива matrix. У Вас в нём 13 строк и 3 столбца, а в строке 46 Вы пытаетесь писать в столбцы с 1-го по 13-й.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу 1, 2, 3  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group