PDA

View Full Version : نحوه ی ساخت تابع در پاسکال



dezchilds
چهارشنبه 09 اردیبهشت 1388, 17:12 عصر
سلام دوستان استاد ما یه سوال داده تا هفته آینده وقت داده برنامه ای بنویسید که کار توابع
delete , insert , copy,pos رو انجام بدهو از خود توابع هم در برنامه استفاده نشه هر کدوم از توابع در یک برنامه ی جداگانه -دوستان کسی اگه میتونه راهنمایی کنه ممنون میشم

vcldeveloper
چهارشنبه 09 اردیبهشت 1388, 17:33 عصر
کارهایی که کردید را شرح بدید، و توضیح بدید که دقیقا مشکلتان کجا ست. اراسل صورت سوالات دانشجویی و درخواست جواب در این سایت ممنوع هست. فقط میشه به دانشجو کمک کرد که برخی مشکلاتش را با راهنمایی کاربران حل کنه، و در نهایت خودش به جواب مسئله برسه.

dezchilds
پنج شنبه 10 اردیبهشت 1388, 18:57 عصر
سلام دوست من این استاد گفته که توابع delete,insert,copy رو در برنامه تون به کار ببرید بدون این که مستقیمآ از این توابع استفاده کنید منظورش اینه که خودتون یه تابع بسازید مثلآ من pos رو با یه if مشکلش رو حل کردم و از pos استفاده نکردم حالا گفته این سه تا رو درست کنید ولی من بلد نیستم سعی خودم رو هم میکنم ولی نمیفهمش نمیدونم تونستم منظورمو برسونم یا نه ؟

Delphi Coder
پنج شنبه 10 اردیبهشت 1388, 19:13 عصر
اینها ساده ترین مساله هایی است که میتوان به عنوان تمرین مطرح نمود. پیشنهاد میکنم به معلوماتی که تا کنون از Delphi یا Pascal دارید رجوع کنید. حلقه های For یا While و مخصوصا مفهوم string و نحوه ذخیره سازی آن. در این صورت پس از فکر کردن روی موضوع اگر مشکلی بود با جزئیات بهتری میتوانید مطرح کنید تا اینکه بدون فکر کردن روی مساله صورت مساله را مطرح کنید.

dezchilds
پنج شنبه 10 اردیبهشت 1388, 21:56 عصر
دستتون درد نکنه بابا یکم بیشتر توضیح بده من delphi کار نکردم روی این پروژه هم خیلی کار کردم ولی وقتی میبینم مثلآآ برای ساخت تابع insert باید از تابع کپی استفاده کنم اینو چیکار کنم ؟ دیگه حالم گرفته میشه و مغزم به هیچ جا خط نمیده تازه ما هنوز 3 جلسه بیشتر نیست پاسکال رو شروع کردیم نباید از من همچین انتظاری داشته باشید که با 3 جلسه بتونم تابع بنویسم حلقه های while رو هم هنوز توضیح نداده من هم خودم دوست ندارم کسی برام بنویسه و دوست دارم خودم کار خودمو انجام بدم ولی نیاز به راهنمایی دارم

1485159
پنج شنبه 10 اردیبهشت 1388, 23:26 عصر
اگه میشه pos رو که شبیه سازی کردین رو بزارین تا من هم استفاده کنم..
البته مال من پروژه نیست!!!!
ممنون.

dezchilds
جمعه 11 اردیبهشت 1388, 01:42 صبح
program pos;
var
s1,s2,s3:string;
begin
writeln('enter text to set of reference'); readln(s1);
writeln('enter text to search in reference'); readln(s2);
if s2=s1 then
begin
writeln('text found');
end
else
s3:='0';
writeln(s3);
readln;
end.

vcldeveloper
جمعه 11 اردیبهشت 1388, 09:20 صبح
این کدی که در بالا گذاشتید، شبیه سازی Pos نیست. Pos وجود یک رشته در داخل رشته دیگه رو چک میکنه، و در صورت پیدا کردن آن رشته، محل شروع رشته را برمیگردانه. کد شما فقط بررسی میکنه که آیا دو رشته داده شده یکسان هستند یا نه؛ یعنی اگر رشته ایی بصورت: ABCDEFG داشته باشیم، و در آن دنبال رشته CDEF بگردیم، کد شما هیچ نتیجه ایی را برگشت نمیده! در حالی که تابع Pos برای همچین جستجویی مقدار 3 را برگشت میده.

vcldeveloper
جمعه 11 اردیبهشت 1388, 10:31 صبح
من یک نمونه کد ساده برای شبیه سازی Pos براتون میزارم. البته همانطور که در کد می بینید، برای پیاده سازی آن نیاز به پیاده سازی تابع Copy دارید، که باید آن را خودتان بنویسید.


function MyPos(const SubStr, Str: string): integer;
var
SubStrLength: Integer;
Index : integer;
begin
Result := 0;
SubStrLength := Length(SubStr);

if SubStrLength > Length(Str) then
Exit;

for Index := 1 to Length(Str) do
begin
if SubStr = Copy(Str,Index,SubStrLength) then
begin
Result := Index;
Break;
end;
end;
end;

dezchilds
جمعه 11 اردیبهشت 1388, 18:34 عصر
سلام من مشکلم سر تابع copy هست اگه بید تابع کپی رو چطوری باید بنویسم مشکل حل میشه و قول میدم بقیه اش رو خودم حل کنم راستی بابت تابع pos هم دستتون درد نکنه آقای کشاورز لطفآ یه توضیحی در مورد این خط اول (function ) بدید چون همچین چیزی به ما درس نداده

vcldeveloper
جمعه 11 اردیبهشت 1388, 22:45 عصر
من مشکلم سر تابع copy هست اگه بید تابع کپی رو چطوری باید بنویسم مشکل حل میشه
خب، کارهایی که تا بحال در این مورد انجام دادید را توضیح بدید، و کدهایی که برای Copy نوشتید را اینجا قرار بدید، و دقیقا مشخص کنید که مشکلتان در چه قسمت هایی از نوشتن تابع Copy هست.


لطفآ یه توضیحی در مورد این خط اول (function ) بدید چون همچین چیزی به ما درس نداده
توی پاسکال شما دو نوع تابع دارید؛ procedure که مقدار برگشتی نداره، و function که مقدار برگشتی داره. در مثال بالا، تابع MyPos یک عدد صحیح برگشت میده که نشان دهنده محل شروع SubStr در رشته Str هست. در function ها مقدار برگشتی را یا با نام تابع مشخص می کنند، یا با متغیر Result که بطور خودکار توسط کامپایلر برای شما ایجاد می شود. برای همین هم در انتهای تابع مقدار I به متغیر Result اختصاص داده شد. می توانستیم بجای Result از نام تابع هم استفاده کنیم، یعنی:
MyPos := I

dezchilds
شنبه 12 اردیبهشت 1388, 09:58 صبح
سلام آقای کشاورز توی کد زیر شما سه متغیر const,SubStr, Str: string رو در تابع تعریف mypos کردید درسته ؟؟ خوب نمیشد این ها رو بعد از var تعریف کنیم ؟ چرا توی تابع گذاشتید ؟ و یه سوال دیگه اون integer که شما گذاشتید برای چی هست ؟ مگه ما این سه تا متغیر رو رشته تعریف نکردیم ؟ پس چرا دوباره به عدد تبدیل شدند ؟
function MyPos(const,SubStr, Str: string): integer;



program copy;
var
a1,a2,a3,a4:integer;
b1,b2,b3,b4:string;
begin
writeln('lotfan yek neweshte vared konid'); readln(b1);
writeln('tedade horof baraye joda kardan ra entekhab konid'); readln(a1);
for a2:=length(b1) downto a1 do
begin
writeln(a2);
حالا باید چیکار کنم ؟ این تابع چی کم داره ؟
end;
readln;
end.

vcldeveloper
شنبه 12 اردیبهشت 1388, 11:28 صبح
توی کد زیر شما سه متغیر const,SubStr, Str: string رو در تابع تعریف mypos کردید درسته ؟؟ خوب نمیشد این ها رو بعد از var تعریف کنیم ؟ چرا توی تابع گذاشتید ؟اینها پارامترهای ورودی تابع هستند که هر کس که بخواد این تابع را فراخوانی کنه، باید به اینها مقدار بده. متغیرهایی که در بخش var تابع نوشته شدند، متغیرهای محلی تابع هستند، و فقط توسط تابع استفاده میشند، و خارج از تابع بکار نمیرند.


اون integer که شما گذاشتید برای چی هست ؟ مگه ما این سه تا متغیر رو رشته تعریف نکردیم ؟ پس چرا دوباره به عدد تبدیل شدند ؟اون integer یعنی این تابع یک عدد صحیح را برگشت میده. این مقدار برگشتی تابع ربطی به اون پارامترهای ورودی نداره. تابع یک سری پارامتر ورودی دریافت میکنه، روی آنها پردازش انجام میده، و یک خروجی تولید میکنه. این خروجی میتونه از هر نوعی باشه.
در اون کد، Str رشته اصلی هست. SubStr رشته ایی هست که باید در Str به دنبالش بگردیم، و ببینیم آیا در Str وجود داره یا نه. Integer هم خروجی تابع هست. اگر SubStr در Str پیدا نشه، خروجی تابع صفر خواهد بود. اگر SubStr در Str پیدا بشه، خروجی تابع محل شروع SubStr در Str خواهد بود. برای مثال اگر:
Str مساوی This is a Test باشه. و SubStr ما هم is باشه، در صورتی که ما تابع را به این صورت فراخوانی کنیم:


var
a : integer;
begin
a := MyPos('is','This is a Test');
end;

رشته is از ششمین کارکتر This is a Test شروع میشه، پس تابع MyPos مقدار 6 را برمیگردانه، و آن را در متغیر a ذخیره میکنه.

من متوجه نمیشم، اگر هنوز مفاهیمی مثل function، porcedure، پارامترهای تابع، چگونگی فراخوانی توابع، متغیرهای عمومی و محلی، و امثالهم به شما یاد داده نشده، چطور از شما خواسته شده که تابع Copy و Pos و Insert بنویسید؟!!

dezchilds
شنبه 12 اردیبهشت 1388, 11:45 صبح
والا خودم هم نمیدونم تازه این سه شنبه که میاد باید امتحان میان ترم بدیم (متاسفانه این وضعیت دانشگاه های ما هست)
این طور که دستگریم شد از کد بالا که شما نوشتید میشه توی تابع copy یه جورهایی استفاده کرد درسته ؟

vcldeveloper
شنبه 12 اردیبهشت 1388, 12:07 عصر
حالا باید چیکار کنم ؟ این تابع چی کم داره ؟
این کد اصلا تابع نیست!

function MyCopy(const Str: string; Index, Count: integer): string;
var
I: Integer;
begin
if (Index + Count) > Length(Str) then
Count := Length(Str) - Index;

while (Count > 0) do
begin
Result := Result + Str[Index];
Inc(Index);
Dec(Count);
end;
end;

نحوه استفاده:


var
Index, Count : integer;
Str, NewStr : string;
begin
Write('Enter string: ');
ReadLn(Str);
Write('Enter index: ');
Readln(Index);
Write('Enter character count: ');
ReadLn(Count);
NewStr := MyCopy(Str,Index,Count);
Writeln('New string = ', NewStr);
Readln;
end.

dezchilds
شنبه 12 اردیبهشت 1388, 12:28 عصر
سلام آقای کشاورز نمیشه این تابع رو به صورت ساده تری بنویسیم ؟ با توجه به سوالی که داده گفته برنامه ای بنویسید که کار توابع pos,delete,insert,copy رو انجام بده (البته برنامه ها به صورت جداگانه) و با توجه به این که تاحالا function رو به ما درس نداده من میگم شاید منظورش نوشتن دقیق خود تابع نبوده به نظر شما چی ؟ راستی اون کد copy که گذاشتید ارور میده
unkown identefier میده

dezchilds
شنبه 12 اردیبهشت 1388, 19:43 عصر
سلام دوست من باید 3شنبه تحویلش بدم کمک کنید

vcldeveloper
یک شنبه 13 اردیبهشت 1388, 00:08 صبح
راستی اون کد copy که گذاشتید ارور میده
unkown identefier میده

روی کدوم خط؟ من تستش کردم، مشکلی نداشت. البته متغیر I در تابع Copy استفاده ایی نداره، و من یادم رفت که آن را حذف کنم. در هر حال، بود و نبودش تاثیری بر برنامه شما نداره.


نمیشه این تابع رو به صورت ساده تری بنویسیم ؟ با توجه به سوالی که داده گفته برنامه ای بنویسید که کار توابع pos,delete,insert,copy رو انجام بده (البته برنامه ها به صورت جداگانه) و با توجه به این که تاحالا function رو به ما درس نداده من میگم شاید منظورش نوشتن دقیق خود تابع نبوده
خب، شما کد نوشته شده در داخل تابع را بر دارید، در برنامه بدون تعریف تابع استفاده کنید؛ یعنی در کد بالا، آنجایی که تابع MyCopy فراخوانی شده، کد تابع Copy را Paste کنید.
دیگه این کارهاش رو باید خودتون انجام بدید، چون در غیر اینصورت، دیگه بهش نمیشه گفت تمرین دانشجویی!

dezchilds
یک شنبه 13 اردیبهشت 1388, 00:35 صبح
سلام دوست من منظور من اینه که بدون استفاده از function بنویسیمش میشه ؟ این طوری درکش برای من هم راحت تر میشه

vcldeveloper
یک شنبه 13 اردیبهشت 1388, 01:08 صبح
من منظور من اینه که بدون استفاده از function بنویسیمش میشه ؟
بله، در پست قبلی توضیح دادم که می توانید آن را بدون استفاده از function هم بنویسید.

dezchilds
یک شنبه 13 اردیبهشت 1388, 01:23 صبح
خوب دوست من مشکل همین جا هست که گفته اصلآ از خود توابع استفاده نکنید منظورم اگه هم بالفرض این function که شما گفتید بزارم اونوقت میفهمه که از تو اینترنت در آوردمش واسه همین میگم ساده تر چون میخوام یکم حضمش واسه استاد و خودم راحت تر بشه

vcldeveloper
یک شنبه 13 اردیبهشت 1388, 03:16 صبح
واسه همین میگم ساده تر چون میخوام یکم حضمش واسه استاد و خودم راحت تر بشه
دیگه از این ساده تر؟! این که همش یک if هست، و یک حلقه while، و دو تا جمع و تفریق. کجاش غیرقابل هضم هست؟

dezchilds
یک شنبه 13 اردیبهشت 1388, 19:19 عصر
نه آقای کشاورز شما دارید میگید که از خود تابع copy استفاده کنید درسته ؟ یا من منظورتونو نفهمیدم ؟ ولی استاد گفته از توابع در داخل برنامه تون استفاده نکنید

vcldeveloper
یک شنبه 13 اردیبهشت 1388, 22:34 عصر
نه آقای کشاورز شما دارید میگید که از خود تابع copy استفاده کنید درسته ؟ یا من منظورتونو نفهمیدم ؟
نه دوست عزیز. برای شما یک نمونه از تابعی که کار Pos را شبیه سازی کند، قرار دادم، و در آن از تابع Copy استفاده شد. گفتید نباید از تابع Copy استفاده شود، و باید خودتان آن را بنویسید، یک نمونه تابع با نام MyCopy هم برایتان گذاشتم که کار Copy را شبیه سازی می کرد، و می توانستید هر جا به Copy نیازی بود، از MyCopy بجای آن استفاده کنید.


ولی استاد گفته از توابع در داخل برنامه تون استفاده نکنید
یعنی چی؟ یعنی گفته خودتون هم تابع ننویسید، یا گفته که از توابع استاندارد Copy, Pos, Insert استفاده نکنید؟
اگر گفته از توابع استاندارد استفاده نکنید، و خودتون توابع مورد نیازتان را بنویسید، که دو نمونه برایتان نوشته شد.
اگر گفته اصلا تابع ننویسید (!!) این هم در پست شماره 18 توضیح داده شد که چطور می توانید از آن کدها خارج از توابع نوشته شده استفاده کنید.

dezchilds
دوشنبه 14 اردیبهشت 1388, 10:15 صبح
سلام گفته از توابع copy,pos,insert استفاده نکنید
من میخوام بدون function بنویسمش به هر حال دستتون درد نکنه اگه مشکلی بود مینویسم