Форум: "Начинающим";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];
ВнизВОПРОСЫ АЛГОРИТМОВ! Найти похожие ветки
← →
crazy_corpse © (2006-07-14 15:09) [0]ПРЕДЛОЖЕНИЕ:
Предлагаю в этом раздельчике писать свои задачи и решения для них, главным здесь будет являться алгоритм решения. Использование каких-то компонентов делфи и вопросы программирования в делфи будет обсуждаться только если это непосредственно может помочь при решении задачи
ПРИЧИНА:
В инете трудно искать алгоритмы некоторых задач, а если здесь начать собирать некоторое подобие задачника то это мне как кажеться будет ничего себе.
ПОЧЕМУ ЗДЕСЬ?
Да потому что тут то все мастера и "вертяться" )). Помогут подскажут.
Еще одним условие или как бы желанием будет улучшение алгоритмов этим мастерами. Надеюсь помогут.
← →
Джо © (2006-07-14 15:15) [1]Так алгоритмы чего? Ж:)
← →
Vlad © (2006-07-14 15:16) [2]
> crazy_corpse © (14.07.06 15:09)
Так тут целый форум этому посвящен, зачем выдлять специальный раздел?
← →
DrPass © (2006-07-14 15:17) [3]
> Предлагаю в этом раздельчике писать свои задачи и решения
> для них
Ага. Ветка на одном из самых болтливых технических форумов Рунета - самое подходящее место для размещения базы алгоритмов и решений.
← →
Джо © (2006-07-14 15:19) [4]Автору: есть такой проект http://algolist.manual.ru
← →
unknown © (2006-07-14 15:20) [5]Кладовку и единую базу процедур и ф-й для чего придумывали?
← →
crazy_corpse © (2006-07-14 15:59) [6]Вот и первая моя задачка и к ней алгоритмик начнем с малого, прошу все совету по алгоритму писать не укоснительно если они возникают конечно))
Задача
Введите некоторое количество вещественных чисел. Определить произведение минимального и максимального из них.
Решение
Ну как мне кажеться числа надо вводить в массив и потом сортировать его. А как вам? Может надо просто при вводе запоминать минимальный сразу и сравнивать его с последующими? Но как бы то не было пишу алгоритм с массивом.//процедура ввода массива
//сразу возникает вопрос может можно использовать динамический массив каким то образом?
const
nmax=100;
type
tmy_array=array [1..nmax] of real;
var
a:tmy_array;
n:integer=1;
{$R *.dfm}
// вводим числа
procedure TForm1.VvestiClick(Sender: TObject);
begin
a[n]:=strtofloat(edit1.Text);
n:=n+1;
end;
var
min:real;
imin,s:integer;
i:integer;
procedure TForm1.KonecClick(Sender: TObject);
begin
//n получилась на еденицу больше так что надо бы убрать
n:=n-1;
vvesti.Visible:=false;// убераем кнопочку она нам не нужна больше
//сортировка выбором можно обсудить более "лучший метод" сортировки
for s:=1 to n-1 do begin
min:=a[s];
imin:=s;
for i:=s+1 to n do
if a[i]<min then begin
min:=a[i];
imin:=i;
end;
a[imin]:=a[s];
a[s]:=min;
end;
// Перемножаем первый и последний член
label1.caption:="Произвдеенеие первого и последнего члена равно "+
floattostr(a[1])+"*"+floattostr(a[n])+"="+floattostr(a[1]*a[n]);
//Убираем и эту кнопку показываем кнопку выхода из программы
close.Visible:=true;//для этого выбираем компоненнт bitbtn на вкладке additional и выставяем свойству kind значение bkclose;
close.Kind:=bkclose;
konec.Visible:=false;
end;
Ну вот вроде все. Для примера.
← →
crazy_corpse © (2006-07-14 16:03) [7]Удалено модератором
← →
crazy_corpse © (2006-07-14 16:09) [8]http://algolist.manual.ru
кстати по этой ссылке действительно можно нарыть много инфы, но ведь задачи решаемы в универах достаточно однообразны, и я хотел просто помочь новичкам ведь имея готовый алгоритм все просто. Да и самому было бы полезно посмотреть да пообсуждать на пригодность и универсальность сами алгоритмы а то на этой ссылке ведь не форум там опфтом то не поделишься.
← →
Джо © (2006-07-14 16:25) [9]> а то на этой ссылке ведь не форум там опфтом то не поделишься.
Там есть и форум, зачем дезинформировать?
← →
Джо © (2006-07-14 16:25) [10]http://algolist.manual.ru/forum/
← →
crazy_corpse © (2006-07-14 16:37) [11]Удалено модератором
← →
crazy_corpse © (2006-07-14 17:02) [12]Следующая задача:
Введите некоторое малое число eps>0, имеющее смысл погрешности вычисления (например, 0,001; 0,0005 и т.д.), и число x в пределах 0.5<x<10.5 и вычислите следующее выражение:
y=1+x/1!+x^2/2!+...+x^n/n!+...;
Вычисления прекратите, когда очередное слагаемое станет по модулю меньше, чем eps. Выведите x,y,eps и количество использованных слагаемых.
Поехали!
На формочку кидаем лейблы и едиты которые помогут ам ввести eps, и х, и еще один лейбл для вывода нужной инфы.
Щас вот короче начал писать и возни вопросик, Как проверить правильность ввода в edit вот в этой конкретной задаче:
пишу че то типа
procedure TForm1.Button1Click(Sender: TObject);
begin
while (eps<0) or (eps<1) do begin
eps:=strtofloat(edit1.text);
label1.Caption:="Вы вели eps не из диапазона 0..1. Повторите ввод" ;
end;
while (x<0.5) or (x>10.5) do begin
x:=strtofloat(edit2.Text);
label2.Caption:="Вы вели х не из диапазона 0,5..10,5. Повторите ввод";
end;//тут она че то по кругу начала того. В паскале проще в этом смысле
//че надо сделать?
end;
← →
Jeer © (2006-07-14 17:10) [13]2006 - 1985 = 6
Нарушаем арифметику.
← →
Плохиш © (2006-07-14 17:15) [14]
> end;//тут она че то по кругу начала того. В паскале проще
> в этом смысле
А ты что хотел. Хочешь сказать, что в паскале циклы подругому работают?
А ну живо пошёл азбуку учить.
← →
crazy_corpse © (2006-07-14 17:37) [15]ну так может подскажите как правильно и без особых усилий проверить поподает ли число из edit в диапазон?
в паскале то пишу типа в этом цикле readln(eps) к примеру, а здесь так нельзя. Вот и посоветуйте начинающим как получше фисла в программу вводить!
← →
Плохиш © (2006-07-14 17:41) [16]В азбуке "Делфи за 21 секунду" всё хорошо расписано.
← →
crazy_corpse © (2006-07-14 17:45) [17]где это?
← →
crazy_corpse © (2006-07-14 17:47) [18]я конечно понимаю, что точно можно через обработчик события клавиатуры обработать но че то мне кажеться это мутырным так что давайте об этом поговорим.
← →
Zeqfreed © (2006-07-14 18:08) [19]Выражение «детский сад в другом месте» было бы как нельзя кстати… Просто мысли в слух, не обращайте внимание, продолжайте.
← →
crazy_corpse © (2006-07-14 19:25) [20]Удалено модератором
← →
Virgo_Style © (2006-07-14 20:18) [21]Не надо было притворяться, что это не для себя %-)
P.S. Сортировать массив для того, чтобы выбрать минимальный и максимальный элемент??? У-у-у-у... Как все запущено %-)
← →
Игорь Шевченко © (2006-07-14 22:01) [22]В любом случае правила читать - оно неплохо.
← →
Leonid Troyanovsky © (2006-07-14 22:05) [23]
> Игорь Шевченко © (14.07.06 22:01) [22]
> В любом случае правила читать - оно неплохо.
And, в частном случае, графоманство - это плохо.
--
Regards, LVT.
← →
TUser © (2006-07-15 08:08) [24]crazy_corpse © (14.07.06 15:59) [6]
Введите некоторое количество вещественных чисел. Определить произведение минимального и максимального из них.
Да, это трудновато найти в интернете.
crazy_corpse © (14.07.06 15:59) [6]
Ну как мне кажеться числа надо вводить в массив и потом сортировать его. А как вам?
Мне так не кажется, т.к. проще и быстрее один раз пробежать по массиву, найдя минимум и максимум. Не за чем его сортировать. Но можешь заюзать один из сотен алгоритмов сортировки, если тебе так проще.
Мой совет автору - решил свои задачи, положи их под сукно на пару недель. Эту пару недель потрать на решение других задач, чуть посложнее. Потом вынимай из-под сукна и думаю - надо их постить на форум или нет.
← →
Галинка © (2006-07-15 19:11) [25]Примим правила игры (хотя может это и не правильно).
Проверку правильности ввода я бы сделала не по нажатию кнопки "Считать", а по выходу из самого Едита. т.е. в событии OnExit. и делается она элегантнее в защищенном блоке try ... except.... Типа такого:
procedure Form1.Edit1OnExit(...);
try
eps:=strtofloat(edit1.text);
if (eps<0) or (eps>1) then MyError=EOutOfRange;
except
on EConvertError do MessageBox(0,"Недопустимое знчение !","ОШИБКА",0);
on EOutOfRange do MessageBox(0,"Недопустимое знчение !","ОШИБКА",0);
end;
end;
← →
crazy_corpse © (2006-07-16 00:08) [26][25] Галинка © (15.07.06 19:11)
вот это уже обнадеживает)) спасибо ПРОДОЛЖИМ?
← →
Footballer © (2006-07-16 00:26) [27]Согласен с Virgo_Style © (14.07.06 20:18) [21]
> Не надо было притворяться, что это не для себя %-)
← →
Footballer © (2006-07-16 00:30) [28]crazy_corpse © (14.07.06 17:02) [12]
тут она че то по кругу начала того. В паскале проще в этом смысле
//че надо сделать?
А надовсего-навсего исправить опечатку!
> while (eps<0) or (eps<1) do begin
while (eps<0) or (eps>1) do begin
← →
crazy_corpse © (2006-07-16 12:31) [29]Я не притворялся что это не для себя и в любом случае человек делает все исключительно только для своей пользы. Но не зависимо от этого хотелось бы услышать умные коментарии по алгоритмам. Эти задачи меня попросили решить в PASCAL, я решил там их еще много. Вот для себя то я и хочу узнать как бы это делать побыстрее да получше вот цель превалирующая. Но в то же время уверен что комуто это все таки пригодиться.
← →
crazy_corpse © (2006-07-16 13:36) [30]А вот с try.. except.. мне вот что не понятно MyError какого класса он мне выдает ее как неизвестную переменую.
← →
Virgo_Style © (2006-07-16 13:54) [31]вероятно, подразумевалось raise EOutOfRange.Create(...)
← →
crazy_corpse © (2006-07-16 16:51) [32]Ладно забудем об этой задачке ее портировать на делфи все равно тупо. Вот еще одна задачка:
Написать в одном модуле алгоритм аппроксимации рядом Фурье и всю визуальную работу с ним, че то типа этого вот че я наваял.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Buttons;
type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
Label2: TLabel;
Edit2: TEdit;
Button3: TButton;
Memo1: TMemo;
Button4: TButton;
Image1: TImage;
BitBtn1: TBitBtn;
Label3: TLabel;
procedure FormCreate(Sender: TObject);
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
const
nmax=100;// ìàêñèìàëüíîå êîëëè÷åñòâî òî÷åê
kmax=5;// ìàêñèìàëüíîå êîëëè÷åñòâî ãàðìîíèê
var
n:integer=1;//êîëëè÷åñòâî òî÷åê
k:integer=3;//êîëëè÷åñòâî ãàðìîíèê
y:array [1..nmax] of real; // ìàññèâ òî÷åê êîòîðûå íàäî àïïðîêñèìèðîâ&# 224;òü
a0:real;//ïåðâûé ÷ëåí ðÿäà
suma,sumb:array [1..kmax] of real;//îñòàëüíûå ÷ëåíû ðÿäà
sa,sb:array [1..kmax] of string;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
label1.Caption:="Ââåäèòå "+inttostr(n)+"-óþ òî÷êó (íå áîëåå "+inttostr(nmax)+" òî÷åê)";
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//ââîäèì òî÷êè â ìàññèâ åñëè èõ êîëè÷åñòâî íå ïðåâûøàåò ìàêñèìàëüíîãî
if n<=nmax then begin
y[n]:=strtofloat(edit1.Text);
n:=n+1;// ïðèáûâëÿåì òî÷êó
label1.Caption:="Ââåäèòå "+inttostr(n)+"-óþ òî÷êó (íå áîëåå "+inttostr(nmax)+" òî÷åê)";
end;
button2.visible:=true;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
//óêðàøåíèå
label1.Visible:=false;
edit1.Visible:=false;
button1.Visible:=false;
edit2.Visible:=true;
edit2.Top:=edit1.Top;
edit2.Left:=edit1.Left;
label2.Visible:=true;
label2.Top:=label1.Top;
label2.Left:=label1.Left;
label2.Caption:="Ââåäèòå êîëè÷åñòâî ãîðìîíèê ðÿäà Ôóðüå (íå áîëåå "+inttostr(kmax)+")";
button2.Visible:=false;
button3.Visible:=true;
button3.Top:=button1.top;
button3.Left:=button2.Left;
button3.Caption:=button1.caption;
button3.Width:=button1.Width;
n:=n-1;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
t:array [1..nmax] of real;
cs,sn:array [1..kmax,1..nmax] of real;//cos & sin
i,j:integer;
sumy,dvan:real;
st:string;
begin
k:=strtoint(edit2.text);
t[1]:=0;
dvan:=2/n;
////////////////////////////////////
for j:=1 to k do begin
cs[j,1]:=1;
sn[j,1]:=0;
end;
///////////////////////////////////
for i:=2 to n do begin
t[i]:=t[i-1]+pi/6;
for j:=1 to k do begin
cs[j,i]:=cos(j*t[i]);
sn[j,i]:=sin(j*t[i]);
end;
end;
//////////////////////////////////
sumy:=0;
for i:=1 to n do begin
sumy:=sumy+y[i];
end;
a0:=(1/n)*sumy;
//////////////////////////////////
for j:=1 to k do begin
for i:=1 to n do begin
suma[j]:=suma[j]+dvan*y[i]*cs[j,i];
sumb[j]:=sumb[j]+dvan*y[i]*sn[j,i];
str(suma[j]:4:2,sa[j]);
str(sumb[j]:4:2,sb[j])
end;
end;
i:=1;
st:=floattostr(a0);
while i<=k do begin
st:=st+"+("+sa[i]+")*cos(t)"+"+("+sb[i]+")*sint(t)";
inc(i);
end;
button3.Visible:=false;
edit2.Visible:=false;
label2.Visible:=false;
memo1.Visible:=true;
memo1.Lines.Add("Îò÷åò:");
memo1.Lines.add("Êîëè÷åñòâî òî÷åê:"+inttostr(n));
memo1.Lines.Add("Êîîðäèíàòû òî÷åê:");
for i:=1 to n do
memo1.Lines.Add(inttostr(i)+"-àÿ òî÷êà: "+floattostr(y[i]));
memo1.Lines.Add("Êîëè÷åñòâî ãàðìîíèê: "+inttostr(k));
memo1.Lines.Add("Àíàëèòè÷åñ 34;îå óðàâíåíèå äëÿ àïïðîêñèìàöèè èññëåäóåìîãî ïðîöåññà ðÿäîì Ôóðüå ñ "+inttostr(k)+" ãàðìîíèêàìè:");
memo1.Lines.Add(st);
button4.Visible:=true;
end;
← →
crazy_corpse © (2006-07-16 16:53) [33]НЕ получились коментарии ну ладно если че я готов все объяснить
Последняя процедура:procedure TForm1.Button4Click(Sender: TObject);
const
dx=20;
dy=20;
lr=6;
var
//äëÿ ñîðòèðîâêè
i:integer;
min:real;
imin,s:integer;
temp_y:array [1..nmax] of real;
// ðèñîâàíèå
WI,HI:integer;
l,v:integer;
drx,dry:integer;
ky:array [1..nmax] of integer;
ymash:real;
//ãðàôèê
gx,gy:real;
px,py:longint;
y0:integer;
begin
memo1.Visible:=false;
for i:=1 to n do
temp_y[i]:=y[i];
////////////èùåì ìàêñèìóì/////////////////
for s:=1 to n-1 do begin
min:=temp_y[s];
imin:=s;
for i:=s+1 to n do
if temp_y[i]<min then begin
min:=temp_y[i];
imin:=i;
end;
temp_y[imin]:=temp_y[s];
temp_y[s]:=min;
end;
////////////îñè////////////////
wi:=image1.ClientWidth;
hi:=image1.ClientHeight;
l:=wi-2*dx;
v:=hi-2*dy;
drx:=round(l/n);
dry:=drx;
with image1.canvas do begin
MoveTo(dx,dy);
LineTo(dx,dy+v);
LineTo(dx+l,dy+v);
while drx<=l do begin
moveto(dx+drx,dy+v+lr);
lineto(dx+drx,dy+v-lr);
drx:=drx+round(l/n);
end;
while dry<=v do begin
moveto(dx-lr,dy+v-dry);
lineto(dx+lr,dy+v-dry);
dry:=dry+round(l/n);
end;
end;
////ðèñóåì ãðàôèê////////////////////////////////
drx:=2*round(l/n);
ymash:=v/temp_y[n];
for i:=1 to n do
ky[i]:=round(dy+v-ymash*y[i]);
image1.Canvas.Brush.Color:=clblack;
image1.Canvas.Brush.Style:=bssolid;
for i:=1 to n do begin
image1.Canvas.Ellipse(drx-2,ky[i]-2,drx+2,ky[i]+2);
drx:=drx+round(l/n);
end;
case k of
1:begin
image1.Canvas.MoveTo(dx+round(l/n),dx+v-round(ymash*(a0+suma[1])));
for px:=1 to l-round(l/n) do begin
gx:=px*2*pi/(l);
gy:=a0+suma[1]*cos(gx)+sumb[1]*sin(gx);
py:=round(dx+v-ymash*gy);
image1.Canvas.LineTo(px+dx+round(l/n),py);
end;
end;
2:begin
image1.Canvas.MoveTo(dx+round(l/n),dx+v-round(ymash*(a0+suma[1]+suma[2])));
for px:=1 to l-round(l/n) do begin
gx:=px*2*pi/(l);
gy:=a0+suma[1]*cos(gx)+sumb[1]*sin(gx)+suma[2]*cos(2*gx)+sumb[2]*sin(2*gx);
py:=round(dx+v-ymash*gy);
image1.Canvas.LineTo(px+dx+round(l/n),py);
end;
end;
3:begin
image1.Canvas.MoveTo(dx+round(l/n),dx+v-round(ymash*(a0+suma[1]+suma[2]+suma[3])));
for px:=1 to l-round(l/n) do begin
gx:=px*2*pi/(l);
gy:=a0+suma[1]*cos(gx)+sumb[1]*sin(gx)+suma[2]*cos(gx)+sumb[2]*sin(gx)+suma[3]*cos(3*gx)+suma[4]*sin(3*gx);
py:=round(dx+v-ymash*gy);
image1.Canvas.LineTo(px+dx+round(l/n),py);
end;
end;
4:begin
image1.Canvas.MoveTo(dx+round(l/n),dx+v-round(ymash*(a0+suma[1]+suma[2]+suma[3]+suma[4]+suma[5])) );
for px:=1 to l-round(l/n) do begin
gx:=px*2*pi/(l);
gy:=a0+suma[1]*cos(gx)+sumb[1]*sin(gx)+suma[2]*cos(2*gx)+sumb[2]*sin(2*gx)+suma[3]*cos(3*gx)+sumb[3]*sin(3*gx)+suma[4]*cos(4*gx)+sumb[4]*sin(4*gx);
py:=round(dx+v-ymash*gy);
image1.Canvas.LineTo(px+dx+round(l/n),py);
end;
end;
5:begin
image1.Canvas.MoveTo(dx+round(l/n),dx+v-round(ymash*(a0+suma[1]+suma[2]+suma[3]+suma[4]+suma[5])) );
for px:=1 to l-round(l/n) do begin
gx:=px*2*pi/(l);
gy:=a0+suma[1]*cos(gx)+sumb[1]*sin(gx)+suma[2]*cos(2*gx)+sumb[2]*sin(2*gx)+suma[3]*cos(3*gx)+sumb[3]*sin(3*gx)+suma[4]*cos(4*gx)+sumb[4]*sin(4*gx)+suma[5]*cos(5*gx)+sumb[5]*sin(5*gx);
py:=round(dx+v-ymash*gy);
image1.Canvas.LineTo(px+dx+round(l/n),py);
end;
end;
end;
button4.Visible:=false;
image1.Canvas.MoveTo(l+dx,dx+v);
image1.Canvas.LineTo(l+dx-6,dx+v-3);
image1.Canvas.MoveTo(l+dx,dx+v);
image1.Canvas.LineTo(l+dx-6,dx+v+3);
image1.Canvas.MoveTo(dx,dy);
image1.Canvas.LineTo(dx-3,dy+6);
image1.Canvas.MoveTo(dx,dy);
image1.Canvas.LineTo(dx+3,dx+6);
label3.Visible:=true;
label3.Caption:="Ãðàôèê àïïðàêñèìèðóþ&# 249;åé ôóíêöèè ñîäåðæàùèé "+inttostr(k)+" ãàðìîíèê";
end;
end.
← →
crazy_corpse © (2006-07-16 16:54) [34]Кстати может быть кто подскажет я из делфы код вынимаю ctrl-c сюда вставляю ctrl-v а коменты вон во что превращаються какой тут шрифт надод в делфе поставить чтоб так не было.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];
Память: 0.58 MB
Время: 0.011 c