PDA

View Full Version : سوالی در مورد پاسکال



jafar2007
جمعه 23 آذر 1386, 19:16 عصر
سلام
من یک برنامه می خواستم بنویسم یک کمی احتیاج به کمک دارم زیرا مسلط به پاسکال نیستم
برنامه به صورت زیر مثلا اگر 3 را وارد کنی خروجی به صورت زیر باشد

1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1

اگر 4 را وارد کردی
1 1 1 1 1 1 1
1 2 2 2 2 2 1
1 2 3 3 3 2 1
1 2 3 4 3 2 1
1 2 3 3 3 2 1
1 2 2 2 2 2 1
1 1 1 1 1 1 1
و همین طور ...
با تشکر

sasan_vm
جمعه 23 آذر 1386, 19:46 عصر
سلام
بخش مربوط به پاسکال:
http://barnamenevis.org/forum/forumdisplay.php?f=19

404_3140
جمعه 23 آذر 1386, 21:30 عصر
خب اگر دقت کنید کافیه برای پر کردن هر خونه از آرایه ی جواب بین تفاضل x ش با خونه وسطی و y ش با همون خونه وسطی max بگیریم... مقدار a[i][j] هم می شه n-max ...
خب تبدیل c++ به پاسکال هم که فکر نمی کنم کار چندانی داشته باشه براتون ... این اون قسمتی از کد که آرایه اصلی رو پر می کنه


cin>>n;
m=2*n-1;
for(int i=0;i<m;i++)
for(int j=0;j<m;j++)
a[i][j]=n-max(abs(i-(n-1)),abs(j-(n-1)));

jafar2007
جمعه 23 آذر 1386, 22:39 عصر
سلام
اگه میشه به پاسکال یک کمی بیشتر توضیح بده
من هنوز تازه کارم
با تشکر

404_3140
شنبه 24 آذر 1386, 13:02 عصر
من به زبون خاصی توضیح ندادم. فقط یه تیکه کد به سی نوشتم. تبدیلش به پاسکال که گذاشتن := جای = و مثلا readln جای cin هست یا a[i,j] جای a[i][j] توابع max و abs هم توی پاسکال فکر می کنم که باشند، زیاد یادم نیست...abs قدر مطلق ه و max هم که معلومه چیه!اما اگه مشکلی با الگوریتمش ندارید پیاده سازی اش کاری جز نوشتن ۲ تا فور نداره..
کافیه به اون خونه وسطی نگاه کنیم... اگه دقت کنیم برای پر کردن خونه های دیگه ی جدول باید ببینیم که مولفه های اون خونه چقدر با مولفه های خونه وسطی فرق دارن.(یعنی که شماره سطر این خونه رو با وسطی مقایسه کنیم و ببینیم چقدر فرق داره (توجه داشته باشید که جواب مقایسه یه عدد مثبته. یعنی قدر مطلق شماره سطر این خونه منهای شماره سطر خونه وسطی جدول.)همین کار رو برای شماره ستونش هم انجام می دیم. حالا باید بین این دو تا عدد ببینیم کدوم بزگ تره. عدد حاصل نشون می ده که مقدار a[i,j] باید چقدر با مقدار خونه وسطی فرق داشته باشه. ازونجایی که می دونیم خونه وسطی مقدارش n هست یعنی همون ورودی، باید مقدار خونه ی سطر i و ستون j بشه n منهای این عدد که حاصل ماکسیمم گرفتن بود.
حداکثر سعیم رو کردم که خوب توضیح بدم، بهتر از این نمی شد :لبخند:

shadi shiton bala
یک شنبه 25 آذر 1386, 15:29 عصر
از دوتا for تودرتو هم می توانی استفاده کنی

jafar2007
یک شنبه 25 آذر 1386, 23:04 عصر
میشه در مورد دو تا حلقه for بیشتر توضیح بدی

404_3140
دوشنبه 26 آذر 1386, 21:46 عصر
پیشنهاد می کنم قبل از اینکه بخواید برنامه ای بنویسید این کارا رو روی کاغذ دستی انجام بدید:

فرض کن که ورودی شما n باشه. حالا یه جدول به ضلع 2*n-1 بکش. و سطر ها و ستون هاش رو شماره گذاری کن. حالا برای هر خونه دستی این ۲ تا عدد رو بنویس:
تفاوت شماره سطر با n
تفاوت شماره ستون با n

احتمالا اگه این کارو بکنید متوجه اون چیزایی که گفتم می شید...

اگر نشدید:
بین اون ۲ عددی که بدست اومده برای هر خونه max بگیرید. حالا دیگه باید متوجه منظورم بشید

حالا که فهمیدید نوشتن ۲ تا فور کاری نداره.
اگر هم داشت می تونید همون تیکه کدی به c رو که نوشتم تغییرات کوچیکی بدید تا بشه پاسکال
....

404_3140
چهارشنبه 28 آذر 1386, 18:57 عصر
من ۲ سال ه پاسکال ننوشتم! سعی کردم کدتون رو ویرایش کنم براتون اما اینجا کامپایلر پاسکال ندارم. اگه مشکلی بود ..:متفکر: می شینیم حل می کنیم:لبخند:

program a123;
var
m,n,i,j:integer;

function max(a,b:integer):integer;
var m:integer;
begin
if a>b then m=a
else m=b;
max=m;
end;
begin
readln(n);
m:=2*n-1;
for i:=1 to m do
begin
for j:=1 to m do
write(n-max(abs(n-i),abs(n-j)));
writeln();
end;
end.

jafar2007
پنج شنبه 29 آذر 1386, 16:19 عصر
program a123;
var
m,n,i,j:integer;

function max(a,b:integer):integer;
var m:integer;
begin
if a>b then m:=a
else m:=b;
max:=m;
end;
begin
writeln('please enter number:');
readln(n);
m:=2*n-1;
for i:=1 to m do
begin
for j:=1 to m do
write(n-max(abs(n-i),abs(n-j)));
writeln;
end;
readln;
readln;
end
ممنون