PDA

View Full Version : مشکل در ساخت زیر برنامه



Fastdesign
پنج شنبه 03 آذر 1390, 20:26 عصر
سلام
چرا هنگام ساخت Procedure نمی تونم آرایه را به این صورت تعریف کنم:
procedure ListMaxmin(list:Array[1..5] of integer;myfirst:Integer;mylast:Integer);
اشکالش چیه؟
باید کجا بنویسم؟

Felony
پنج شنبه 03 آذر 1390, 21:51 عصر
باید ابتدا ارایتون رو به عنوان یک Data Type تعریف کنید و بعد اون Data Type رو به عنوان نوع پارامتر ورودی در نظر بگیرید :

Type
MyType = Array [1 .. 5] of integer;

procedure ListMaxmin(list: MyType;myfirst:Integer;mylast:Integer);

Fastdesign
جمعه 04 آذر 1390, 13:54 عصر
من این زیربرنامه را نوشتم . حالا می خوام یه جایی فراخوانیش کنم ولی نمی چجوری این کار را انجام بدم!!!!!
بعد اگه بخوام مقدار خروجی (Min و Max) را در دوتا Edit نمایش بدم باید کجا این کار را انجام بدم.یعنی جایی که فراخوانی میکنم یا داخل خود زیر برنامه ؟
type
Mytype=array[1..6] of Integer;

procedure ListMinMax(list:Mytype;first:Integer;last:Integer) ;
var
LMin,LMax,RMin,RMax,Min,Max:Integer;
begin
first:=1;
last:=6;
if first=last then begin
max:=list[first];
Min:=list[last];
end
else if first=last -1 then begin
if list[first]>list[last] then begin
max:=list[first];
min:=list[last];
end
else begin
min:=list[first];
max:=list[last];
end;
end
else begin
ListMinMax(list,first,(last+first) div 2);
LMin:=list[first];
lMax:=list[Last];

ListMinMax(list,(last+first) div 2+1,Last);
RMin:=list[first];
RMax:=list[last];
if lmax>RMax then
max:=lmax
else
max:=RMax;
if LMin<RMin then
Min:=LMin

else
min:=RMin;

end;

end;
این زیربرنامه مقدار کوچکترین و بزرگترین مقدار در یک آرایه را نشون میده.

MohsenB
جمعه 04 آذر 1390, 17:16 عصر
سلام

بفرمایید :


type
Mytype=array[1..6] of Integer;

procedure ListMaxMin(list :Mytype;var Min,Max :Integer);
var i: Integer;
begin
Min:= list[Low(list)]; Max:= Min;
for i := Low(list) to High(list) do
if list[i]>Max then Max:= list[i] else if list[i]<Min then Min:= list[i];
end;


procedure TForm1.btn1Click(Sender: TObject);
var mt:Mytype;
tmpa,tmpb :Integer;
begin
... //fill array
ListMaxMin(mt,tmpa, tmpb);
edt1.Text:= IntToStr(tmpa); //min
edt2.Text:= IntToStr(tmpb); //max
end;


موفق باشید

Fastdesign
جمعه 04 آذر 1390, 23:54 عصر
جناب MohsenB متشکرم از همکاریتون .
ولی این زیربرنامه که من نوشتم یک الگوریتم است و حالا می خوام پیاده سازیش کنم.
اگه میشه درباره این زیربرنامه راهنمایی کنید.
در ضمن اگه یک Data Type معرفی کنم و در دو یا سه جای برنامه با یک اسم فراخوانیش کنم (مثلا یک آرایه ) با همون مقدار که در جای اول فراخوانی شد در جاهای دیگه کار میکنه یا نه مقدار هر جا متفاوت است؟
مثلا این دیتا تایپ :
type
Mytype=array[1..6] of Integer;

حال من یک جای برنامه به این صورت فراخوانیش می کنم:
var mt:Mytype;
tmpa,tmpb ,i:Integer;
begin

for I := 1 to 6 do begin
mt[i]:=strtoint(inputbox('ورود اعداد','لطفا عدد مورد نظر را وارد نمایید','1'));
end;
حالا در جای دیگه (روی باتن دیگه) به این صورت می خوام نمایشش بدم ولی نمی دونم ...:
procedure TForm1.Button3Click(Sender: TObject);
var
mt:mytype;
begin
Edit1.Text:=IntToStr(mt[4]);
end;
مشکل : مقداری که تو آرایه وارد کردم نشون نمیده.
یعنی باید برای هر قسمت جداگانه تعریف کنم.
اکه بخوام جای همون آرایه پرشده جای دیگه فراخوانیش کنم باید چکار کنم؟

Felony
شنبه 05 آذر 1390, 05:33 صبح
مشکل : مقداری که تو آرایه وارد کردم نشون نمیده.
یعنی باید برای هر قسمت جداگانه تعریف کنم.
اسمش روش هست ( Data Type ) !
اون یک نوع داده ای هست ، باید یک متغییر به صورت سرارسری بسازید که از نوع اون Data Type باشه و بعد به اون متغییر سراسری مقدار بدید و در قسمت های دیگه میتونید همون متغییر سراسری بخونید .

SAASTN
شنبه 05 آذر 1390, 09:20 صبح
ولی این زیربرنامه که من نوشتم یک الگوریتم است و حالا می خوام پیاده سازیش کنم.
تفاوتی نداره، توی الگوریتم شما مقادیر مینیموم و ماکسیموم توی متغیرهای Min و Max نگهداری می شن. شما باید این مقادیر رو بجای متغیر های محلی، داخل پارامترهایی که بصورت فراخوانی با آدرس تعریف شدن نگه دارید؛ مثل کدی که MohsenB قرار داده. فقط شما علاوه بر تعریف Min و Max باید همون First و Last رو هم بصورت فراخوانی با مقدار تعریف کنی، چون الگوریتمت بهش وابستس.
البته پیاده سازی خود الگوریتم ایرادای خیلی زیادی داره! من سعی کردم اصلاحش کنم، ولی زیاد تستش نکردم، خودت بیشتر تست کن:
type
TIntegerList = array of Integer;

procedure ListMinMax(List: TIntegerList; First, Last: Integer; var Min, Max: Integer);
var
LMin, LMax, RMin, RMax: Integer;
begin
if First = Last then
begin
Max := List[First];
Min := List[Last];
end
else if First = Last - 1 then
begin
if List[First] > List[Last] then
begin
Max := List[First];
Min := List[Last];
end
else
begin
Min := List[First];
Max := List[Last];
end;
end
else
begin
ListMinMax(List, First, (Last + First) div 2, LMin, LMax);
ListMinMax(List, (Last + First) div 2 + 1, Last, RMin, RMax);

if LMax > RMax then
Max := LMax
else
Max := RMax;

if LMin < RMin then
Min := LMin
else
Min := RMin;
end;

end;

procedure TForm1.Button1Click(Sender: TObject);
const
ListLength = 6;
var
MyList: TIntegerList;
I, ListMin, ListMax: Integer;
begin
SetLength(MyList, ListLength);

for I := 0 to ListLength - 1 do
begin
MyList[I] := StrToInt(InputBox('ورود اعداد','لطفا عدد مورد نظر را وارد نمایید','1'));
end;

ListMinMax(MyList, 0, ListLength - 1, ListMin, ListMax);

ShowMessage(Format('Min: %d, Max: %d', [ListMin, ListMax]));
end;

البته من توی این روال خود لیست رو بصورت آرایه داینامیک در نظر گرفتم تا همیشه محدود به یه لیست مثلا 6 عضوی نباشیم. شما می تونید خود ListLength رو هم بصورت متغیر تعریف کنید و مقدارش رو قبل از اون SetLength توسط یه InputBox از خود کاربر بگیرید.

در ضمن اگه یک Data Type معرفی کنم و در دو یا سه جای برنامه با یک اسم فراخوانیش کنم (مثلا یک آرایه ) با همون مقدار که در جای اول فراخوانی شد در جاهای دیگه کار میکنه یا نه مقدار هر جا متفاوت است؟
برای اینکه دوتا روال مختلف بتونن به یک داده مشترک دسترسی داشته باشن، یا باید اون مقدار توی Scope یا بازه تعریف هر دو روال باشه (مثل همون متغیرهای سراسری که آقای تاجیک گفتن)، یا اینکه اون مقدار رو باید از طریق پارامترهای روال پاس بدیم. مثل کاری که توی کد بالا انجام شده. توی کدی که قرار دادید mt ها هردو بصورت محلی تعریف شدن و هر کدوم داخل روال خودشون معنی دار هستند و صرف همنامی دو متغیر هم به این معنی نیست که هر دو به یه آدرس حافظه ارجاع می کنن.

Off Topic:
در ضمن یه سری نکات رو هم باید در حین کد نویسی رعایت کنید، من نمی دونم شما قصد ادامه برنامه نویسی با دلفی رو دارید یا نه، ولی اگه همچین قصدی رو دارید بهتره از همین حالا خودتون رو به رعایت اصول کد نویسی که بین دلفی کارا رایجه عادت بدین. البته یه سری مسائل مثل استفاده از اسامی معنی دار و حفظ فاصله گذاری که در تمام زبان ها باید رعایت بشه. من لیست وار چندتا نکته رو می گم:
- حفظ فاصله گذاری، مثلا بعد از همه علائم مثل : , ) یا قبل و بعد > < >= := و ... باید یه فاصله قرار بگیره.
- استفاده از اسامی معنی دار، مخفف نویسی رو کنار بگذارید، تو کدهای بزرگتر اذیت می کنه، سعی کنید برای هر شناسه جدید (مثل متغیرها، پارامترها، نام متدها و کلاس ها و ...) حتما یه نام معنی دار انگلیسی انتخاب کنید.
- رعایت حروف بزرگ و کوچیک؛ دلفی Case Sensitive نیست، ولی این مسئله نباید به بی نظمی توی کد منجر بشه، تمام شناسه ها در دلفی با حروف بزرگ شروع میشن و با حروف کوچک ادامه پیدا می کنن، تمام کلمات کلیدی هم (اونایی که بولد میشن و سرمه ای نوشته می شن) هم تماما با حروف کوچک نوشته میشن.
- هر زیر بلاک نسبت به بلاک بالا تر فقط (و حتما) به اندازه دو فاصله جلوتر میره، پس کدهای داخل یک begin-end تنها دو فاصله جلوتر از خود begin-end میرن.
- هیچ وقت begin یا end رو با دستورات دیگه توی یک سطر ننویسید، بطور کلی تر مشه گفت که معمولا کلمات کلیدی تنها با یک فاصله در ادامه هم نوشته نمی شن، از موارد استثنا else if یا end else if هست که سخت گیر ترها حتی این کلمات رو هم در سطر های جداگانه می نویسن.
- قبل از این که مجبور بشید خودتون رو عادت بدید که لیست ها و آرایه ها رو بجای 1 تا n از 0 تا n-1 تعریف کنید، توی دیجیتال همه چیز از صفر شروع میشه.
- اون T که در ابتدای TIntegerList اومده به معنی Type هست و بین دلفی کارا عرفه که در ابتدای همه انواع داده ای یه T قرار می دن.

خیلی جفنگ گفتم!
موفق باشی

Fastdesign
شنبه 05 آذر 1390, 11:53 صبح
متشکرم از راهنمایی تون جناب SAASTN خیلی عالی بود . من اصلا از این قواعد ها تو برنامه نویسی رعایت نمی کنم از این به بعد دیگه با این اصول پایبند میشم.