Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по Delphi:)
Форумы Дома Индорил > Клуб > Таверна
Страницы: 1, 2
Krinn
кто хорошо разбирается? и может помочь? надо прогу написать к экзамену... у меня пару вопросовsmile.gif
Krinn
в принципе задача простенькая...
для расчета значения функции f(x)=Ei(x)=0,577216+ln(-x)+сумма от 1 до бесконечности по k
x(в степени k)/(k!k). При х<0. результаты расчетов отобразить в таблице и построить график функции. Обеспечить сохранение результатов на магнитном диске, а так же их считывание с магнитного диска и отображение на экране. Начальное конечное значение, шаг изменения аргумента зазвеется пользователем.

Ограничение на область допустимых значении исходных данных отображаетя на форме. Точность 4 символа. Прога должна проверять допустимось исходных данных, введенных пользователем.
Михахан
Что именно тебя смущает?
Krinn
да многое... саму функцию не наю как сделать... график ещё могу... да и сохранение чтение с диска мы не проходили... а инета у меня нет... с мобилы не вариант искать...
Ky
1) Рисуется форма, куда вводятся:
Хмин
Хмах
шаг по х
точность для суммы ряда
---
Форма снабжается Кнопкой "Считать" и проверкой допустимости введенных значений.

2) По кнопке "считать",
в цикле от мин до макс с заданным шагом вычисляешь значения функции
сумму ряда считаешь внутренним циклом. Расчет заканчивается если очередное слагаемое по модулю меньше точности (или может пополам). Для расчета компонентов ряда нужны переменные максимальной размерности, которую может дать дельфи. Не знаю, хватит ли обычного дабла.
к!к - это кто? Факториал так нынче пишут или еще что?

3) по окончании расчетов отображается окно с введенными выше параметрами расчета (сверху), гридом с колонками х и ф(х) (слева) и графиком справа. Для формирования грида надо использовать возможности и структуру данных соответствующего элемента Дельфи. Для графика если есть это в Дельфях (подозреваю что есть). Если это все не лезет, можно сделать закладки. В принципе, можно и одним окном обойтись, только грид исходно пустой.

Кнопки: Возврат, Сохранить, Загрузить.

При нажатии кнопки "сохранить", требовать ввести имя файла.
При нажатии кнопки "Загрузить" использовать стандартный встроенный браузер для выбора файла. Далее прочитать и отобразить. Файл должен содержать исходные параметры и результаты расчета.

А Дельфи я не знаю smile.gif Справочник по классам и элементам так и так нужен.
Михахан
Во Ку выдала от радости за новые плечи smile.gif

Цитата
к!к - это кто? Факториал так нынче пишут или еще что?

Возможно.
Мне кажется, что факториал К, помноженный на К.
Вычисление факториала часто пишут примером для рекурсивной функции.
iMagus
Чтобы такую программку написать, Делфи знать не надо - нужен только справочник и немного интуиции для понимания интерфейса среды разработки.
Krinn
угу... к фактериал умножить на к... эх... это всё понятно... мне б как это записать... а то у нас препод... прочитайте тут.. а ничего не объясняет. я не понимаю много простоsad.gif искал сам смотрел... всё равно ничего не понятноsad.gif

Имагус да я смотрел справочник... но я не пойму... записываю как там а не получаетсяsad.gif

я просто тупойsad.gif эх... а прога к понедельнику нужнаsad.gif
Ky
Ну я например не знаю, как называется и устроен набор данных в дельфях, который с гридом связывается для отображения smile.gif В который собственно складируются результаты вычислений.

Собственно, у Кринки должна быть среда дельфийская.
А в оной среде надобно искать объекты и классы, потребные для задачи: грид, графики, браузер, работа с последовательными файлами.
В хелпах все должно быть.
iMagus
Впрочем, да, если нет вообще никакого опыта в программировании, справочник может и не помочь. Но до понедельника у тебя есть возможность этот опыт приобрести yes.gif
Krinn
ха... у меня компа нетsmile.gif мы вообще проги не писали просто... так бы хоть чё то похоже было бы...
Михахан
Цитата
Ну я например не знаю, как называется и устроен набор данных в дельфях, который с гридом связывается для отображения smile.gif В который собственно складируются результаты вычислений.

А никак.
Вернее - в Гриде можно хранить данные, но только в текстовом формате. Для внесения и извлечения придется конвертировать из формата в формат.
Так что лучше хранить в массиве, а в гриде только отображать.
Ky
Крин, там все тупо на этом уровне.

Есть класс (или объект).

Например, файл. Пусть он называется File (ищи в справочнике как именно называется).
У последовательного файла должны быть функции( методы):

Open (в параметрах как открываем)
Read (переменная куда пишем) - пишет с того места где остановилось в переменную и сдвигается по файлу
Write (переменная откуда) - пишет эту переменную в текущее место файла
Close (закрыть)

Еще там может быть функция продвинуться на сколько-то байт, или в риде мб переменная сколько пропустить.

То есть, если ты определил F как File, то говоришь

F.Open (на запись, например)
F. Write (a) - запишет перепенную а в файл там где в нем стоит "движок"
и т.д.

Как это называется и устроено в дельфях я не знаю, но последовательные файлы везде одни и те же. Открыл - подвинулся на сколько-то байт - прочитал - записал - закрыл.

Грид - это таблица на экране, которая связывается с набором данных. Читаем в справочнике, как устроено то и другое, определяем нужные объекты. Значения аргумента и функции пишем в этот набор данных, и они отобразятся сами. В старой VS были рекордсеты - последовательные наборы данных, где переход к следующему элементу определялся функциями Move. То есть, набор данных, опять же, последовательный.

Мих, так не бывает.

Если работать с БД, то в дельфях 100 процентов есть функции которые результат запроса не в попу помещают а куда-то, и не из попы в грид кладут а из этого куда-то smile.gif

Я не знаю, как можно написать программу, работающую в интерактивной среде, без этой среды smile.gif
Михахан
Для баз данных существует класс TDBGrid.
Там можно указать на Datasource, который в свою очередь связывается с таблицей (компонент Table или аналог), которая в свою очередь связывается непосредственно с базой данных.
Все программирование тут заключается в настройке компонентов.
Но вот будет ли приемлемым использование баз данных?

А есть компонент класса TGrid, который предназначен только для отображения информации в табличном виде. Довольно примитивный.
Если не изменяет память, у данного компонента есть набор ячеек Cells. К ячейкам можно получить доступ, указав колонку и ряд. Данные в ячейках хранятся только в формате string.
Возможно, со времен Дельфи-2005 с Гридом что-то изменилось, в чем я лично сомневаюсь.
Ky
Мих, не буду спорить, не работала в дельфях. Немного побаловалась с с++ - аналогом, но лет 100 назад smile.gif
uber
Кринн,а текст программы у тебя будут смотреть?

а то можно на сях написать,к примеру...
Ky
Итого, Крынь, упражнение номер 1:

Вычислить функцию с заданными параметрами и поместить в двумерный массив (х,ф(х))
Имеются ли трудности, если есть, то спроси, если нет, то текст положи тут smile.gif
Podk
Зачем двумерный массив, если мы знаем на каком интервале считаем значения и шаг?
Ky
Может, чтобы второй раз не вычислять, когда в грид совать надо будет? Впрочем, сие неважно smile.gif Можно и вычислить, дело вкуса smile.gif
Krinn
во всем трудности... текст будут смотреть... чтоб именно в делфи...
я ж говорю вообще не программировали...
iMagus
И компа нет...
Krinn
нету... тока вот в комп клуб пойду в воскресенье... но денег на него много надоsmile.gif
Ky
Пиши тут текст вышеозначенной функции smile.gif
будем учить на ходу.

countit (double Xmin, double Xmax, double Xstep, double prec)

end

перепиши заголовок на паскале (дельфи) и вставь что внутри должно быть для расчета smile.gif
Krinn
дык в начале написанаsmile.gif я дурак ) не то написал.. )
Krinn
unit Kop;

interface

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

type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Label1: TLabel;
MainMenu1: TMainMenu;
N1: TMenuItem;
N3: TMenuItem;
N2: TMenuItem;
N4: TMenuItem;
SaveDialog1: TSaveDialog;
OpenDialog1: TOpenDialog;
Edit1: TEdit;
Label2: TLabel;
Image1: TImage;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Label3: TLabel;
Button4: TButton;
MemResult: TMemo;
Label4: TLabel;
Label5: TLabel;
Edit2: TEdit;
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
memResult.Lines.Clear;
Form1.Image1.Canvas.Pen.Color:=0;
Form1.Image1.Canvas.Pen.Width:=2;
Form1.Image1.Canvas.moveTo (9,5);
Form1.Image1.Canvas.LineTo (9,Image1.Height-5);
Form1.Image1.Canvas.LineTo (Image1.width-10,Image1.Height-5);
Form1.Image1.Canvas.Pen.Color:=clLime;
Form1.Image1.Canvas.Pen.Width:=2;
Form1.Image1.Canvas.MoveTo (9,Image1.Height-10);
end;



procedure TForm1.Button4Click(Sender: TObject);
begin
Form1.Image1.Canvas.Pen.Color:=0;
Form1.Image1.Canvas.Pen.Width:=2;
Form1.Image1.Canvas.moveTo (9,5);
Form1.Image1.Canvas.LineTo (9,Image1.Height-5);
Form1.Image1.Canvas.LineTo (Image1.width-10,Image1.Height-5);
Form1.Image1.Canvas.Pen.Color:=clLime;
Form1.Image1.Canvas.Pen.Width:=2;
Form1.Image1.Canvas.MoveTo (9,Image1.Height-10);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
memResult.Lines.Clear;
Form1.Image1.Canvas.Pen.Color:=0;
Form1.Image1.Canvas.Pen.Width:=2;
Form1.Image1.Canvas.moveTo (9,5);
Form1.Image1.Canvas.LineTo (9,Image1.Height-5);
Form1.Image1.Canvas.LineTo (Image1.width-10,Image1.Height-5);
Form1.Image1.Canvas.Pen.Color:=clLime;
Form1.Image1.Canvas.Pen.Width:=2;
Form1.Image1.Canvas.MoveTo (9,Image1.Height-10);
end;

procedure TForm1.N4Click(Sender: TObject);
begin
close
end;


procedure TForm1.Button3Click(Sender: TObject);
begin

Form1.Close;
end;

procedure TForm1.N3Click(Sender: TObject);
var
fp : file of char ; //объявление локальных переменных
g:char; //
begin
if opendialog1.Execute then
begin
AssignFile(fp,opendialog1.FileName);
reset(fp);
read(fp,g);
memResult.Lines.Add(g);
CloseFile(fp); // ЗАКРЫТИЕ ФАЙЛА FP
end;
end;



procedure TForm1.N2Click(Sender: TObject);

var
fp : file of char; // объявление локальных переменных
g:char; //
begin
if savedialog1.Execute then // ОТКРЫТИЕ ФАЙЛА FP //
begin
AssignFile(fp,savedialog1.FileName);
Rewrite(fp,savedialog1.filename);

Write(fp,g);
CloseFile(fp);
end; // ЗАКРЫТИЕ ФАЙЛА FP
end;


end.



Короче пока вот ничего нет, тока это тока осилил.. Но сохранение загрузка неправильно ) че то не то написал.. что именно? ) функции там пока нет тока основа...

Пока про график там тока основа типа линии ) и те вроде не совсем те...
Михахан
Кстати, о графике...
Тебе его надо вручную отрисовывать или можно использовать готовые компоненты?
Krinn
Не понял.. Он должен рисоваться по заданным значниям. Или ты не про то?
Ky
Ну кнопки рисуются самой системой программирования обычно. Элемент просто размещается на экране в интерактивном режиме без программирования. Как и тот де грид... Там куча встроенных элементиков.

Кринн, может ты будешь комментировать текст? Я что-то не очень понимаю, что именно ты делаешь при нажатии кнопок.

Про файл.
Что такое Rewrite? Ты сообщаешь, что собираешься содержимое файла переписать заново?
А если этого файла раньше не было?
Что такое g?
В нашем случае это внутренняя переменная с неопределенным значением. Нафига ее туда писать?

Опять же не зная реалий языка, такое ощущение, что читаешь ты ровно один символ в некий memresult (видимо это последовательный набор данных, куда помещаются результаты расчета), а пишешь в этот файл ровно один символ произвольного содержания.

Впрочем, я не знаю, в паскале char - это символ или строка?
Если строка, и данный тип файла сам разбирается, где строки закачиваются, то в любом случае нужны циклы:
- для чтения в каждый элемент memresult
- для записи в каждый элемент memresult

у этого мемрезалта долны быть операции перехода на начало (перед циклом), и далее цикл типа "пока не кончится"
- запись данного элемента мемрезалта
- переход к следующему
- проверка на окончание набора данных

---

В общем, Кринь, давай ты сперва вычислительную функцию отдельно напишешь? Заполняющую вышеуказанный мемрезалт smile.gif
Михахан
Я про то, что есть готовый компонент класса TChart, который только надо настроить и потом вносить координаты, а график он сам построит.
Krinn
да в том то и дело не знаю как её написать...

Миха не наюsmile.gif я дурак... мне что дали я то и говорю...
Krinn
ну как бы при внесении значений должна расчитываться функция и автоматически строится график.
Ky
Давай с графиком обождем.

Крынь, напиши тут пожалуйста функцию, которая просто рассчитывает факториал К. К - аргумент функции.
Далее этот факториал надо записать на диск в файл по имени Krinn.

Пока без всяких форм, интерактива и прочее. Никаких форм, линий, кнопок. Просто маааленькая такая функция и запись на диск.

Второй вопрос. Опиши, как устроен объект класса TMemo. Какие у него атрибуты и методы.

Krinn
хм... Ку у меня комп тока завтра будетsad.gif а так я не наю как её написать..

Tmemo - туда будут записывать результаты вычисления.

Ку ты так написала про маааленькую функцию, что мне даже стыдно стало, что ничего не наюsad.gif
Ky
Кринн, программированию учатся только программируя. Никакие лекции тут не помогут.
зачем тебе комп для функции из трех строк?
Пока давай пиши без записи на диск.
Чтобы просто возвращала факториал от к.

procedure Fact(K: int);
begin;
end;

Вставь внутрь просто расчет факториала.

Реально начинающему знать надо только одно. Программирование - это работа с памятью. Надо четко знать что ты откуда взял, что с этим сделал и куда положил. Машина будет делать ровно то, что ты напишешь.
Для каждого используемого элемента и класса надо четко знать, что оно умеет и как этим пользоваться.
Все.
Синтаксис написан с справочниках и книжках.

Я тебя не спрашиваю, зачем это тмемо надо. Я тебя спрашиваю, как оно устроено и что умеет.
Krinn

k=1000;
p=1;
for i=1 to k do p=p*i;

что-то типа так?smile.gif
Krinn
хотя всё больше и больше сомнений...
Podk
1. Зачем k=1000?
2. Ты уверен что локальные переменные объявляются именно так?
3. А вернуть результат никто не хочет?

PS В int влезет только факториал 12 или 13, не помню точно.
Ky
Примерно smile.gif
Только в функции должны быть еще определения переменных.
Без них память на i и p выделена не будет.
Если переменные определены внутри функции, то они живут только в ней (например i больше нигде не надо).
А те, что должны жить всегда должны либо определяться как глобальные (публичные), ибо возвращаться функцией.
Оформи функцию с заголовком, передачей аргумента (к) и определениями переменых.
Если переменная передается, как аргумент, она может быть использована в функции.

Когда пишешь, представь себя роботом, который делает тупо ровно то, что сказано.

Подк, р пока не определено никак smile.gif Это следующий вопрос нашей программы.
Ky
На некотором условном синтаксисе (ближе к ВБ,у меня уже все попуталось) будет примерно так:

Function Fact(int k) as double /функция имеет на входе целое и возвращает число повышенной точности и разрядности
int i /определение целой переменной с выделением памяти в функции
double p /определение переменной для результата вычислений. Переменная нужна очень большой разрядности
p=1 /сначала это 1
do i from 1 to k /цикл до к
p=p*i /рекурсивное вычисление факториала
next i /конец цикла (синтаксис бейсика)
return p /возвращаем результат
end function

1) перепиши это в синтаксисе дельфи (паскаля)
2) напиши функцию суммы ряда СУМ(1/k!) от 1 до N, где N и заданная точность задаются в виде аргументов
То есть, суммировать прекращаем, если очередное слагаемое меньше заданной точности /2
Михахан
Код
function factorial(k: integer): int64;  /аргумент k - в стандартном формате integer, результат функции - в расширенном 64-битном формате.
begin
  if k>0 then / если аргумент больше 0, то...
    factorial:=k*factorial(k-1) / ...умножаем k на факториал предыдущего числа...
  else / ...иначе...
    factorial:= 1 / ... факториал равен единице
  end;
end;



кажется так
Ky
Мих, это понятно smile.gif Но поскольку мы начинаем с полных азов, то по-моему лучше действовать абсолютно тупо, как в моем примере.

Крынь, у Михи использован синтаксис Паскаля + дан пример рекусривного использования функции.

Хоть напиши, что непонятно в этих примерах.
Krinn
ку ща... мне не удобно идти и вникать, что написано на мобилеsmile.gif ща доеду...
Krinn
Я вот вообще не очень понимаю условие..
Но все таки Мих, а если k = 1 тогда что? Я че то не особо понял...
Михахан
тогда k! = 1
Krinn
Дошло...
А вот само условие..
Начальное, конечное значение, шаг изменения аргумента задается пользователем. Вот я не пойму начальное значение x задается? и шаг его изменения? То есть там пользователь задает 1 и 8 и шаг = 1? То есть считается для х=1, потом 2 и т.д.? и по этим условиям строится график? я правильно понял?
Михахан
Видимо да.
Krinn
Хм.. Блин как бы это все записать...
Михахан
Начни с суммы для какого-либо X.
Krinn
завтра с утра напишу всю функциюsmile.gif поможете с графиком и сохранением загрузкойsmile.gif
Ky
ЭВМ - существо дискретное.
Мы не можем считать от бесконечности и до нуля, а также для бесконечного (и даже континуального) числа точек внутри любого отрезка.
Поэтому всегда вычисления дискретны. То есть приближенны.
Точность и откуда и докуда может задать пользователь - с экрана, из файла...

Эти значения скорее всего дробные.

Он может сказать:
Х от -2 до 0 через 0.5. И ты посчитаешь 4 значения.
Или от - 1000000 до 0 через 0.000001. И ты посчитаешь миллирд значений (не советую).

И сумма ряда не может быть бесконечной. Должно быть ограничение - например по точности. Когда очеедное слагаемое станет меньше этой самой точности, нужно прекратить.
Для этого есть циклы типа while или until (глянь в книжке любой по программированию).

Для очень больших или очень маленьких чисел мы должны хорошо думать - а в какую переменную они влезут? Целое (int) - это (от языка) 2 или 4 байта, и это целое. А куда влезет факториал или 1 деленная на факториал? Для этого имеются длинные целые или дробные числа повышенной точности.

Строя график, мы отмечаем на нем вычисленные точки и соединяем линиями.
--

Теперь о наборах данных, графиках, кнопках и пр.
Современная система программирования содержит обширные библиотеки классов и компонентов.
Класс определяет набор характеристик, составляющих и методов объектов данного класса. некий черный ящик, имеющий свойства, составляющие и функции.
Например, класс "файл", точнее объект этого класса, имеет имя, тип, функции Открыть, Записать, Прочитать и другие.
Класс типа "кнопка" имеет местоположение, цвет, надпись и т.д. При ее нажатии возникает в программе событие, обработку которого ты должен написать. Попытки этого отражены в твоем примере, только там делается непонятно что.

Поэтому я и прошу указать компоненты и свойства набора данных, куда ты пишешь. Как я понимаю, он содержит строки, функции создания новой строки, перемещения на начало, конец, сдвижки к следующему. И прежде чем им пользоваться, надо это узнать - как же с ним работать? ТЫ должен запихать в него все результаты твоих вычислений. И надо понять, как запихать.

Пока все. Советую начать с примера функции попроще, который я привела раньше.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2024 IPS, Inc.