كنترل پنل             جستجو               پرسشهای متداول            .:: آخرین پست‌های انجمن ::.            لیست اعضا            مدیران سایت             درجات        ورود
فهرست انجمن‌ها -> عمومي برنامه‌نويسي
پاسخ دادن به این موضوع
خرد كردن سكه ها با پاسكال
پست تاریخ: یکشنبه 20 بهمن 1387 - 19:59    
sahar2000
خوب داره پيش مي‌ره
خوب داره پيش مي‌ره


پست: 52
عضو شده در: 4 آذر 1384

iran.gif


امتياز: 481

عنوان: خرد كردن سكه ها با پاسكال خواندن مشخصات فردی ارسال پیام شخصی

مسئله :سكه هاي رايج كشور كه عبارتند از : 1،2،5،10،20،50،100،250ريالي را در نظر بگيريد.
برنامه اي بنويسيد كه يك سكه nريالي را از ورودي گرفته ،با توجه به سكه هاي رايج ،آن را با حداقل تعداد سكه ها خرد كند.
من اين مسئله رو به زبان پاسكال به صورت زير نوشتم:
کد:

var
s1,s2,s3,s4,s5,s6,s7,s8:integer;
a:longint;
begin
read(a);
 while a<>0 do
begin
 if a>=250 then
  begin
  s1:=a div 250;
  a:=a mod 250;
  end
 else
 if a>=100 then
  begin
  s2:=a div 100;
  a:=a mod 100;
  end
 else
 if a>=50 then
  begin
  s3:=a div 50;
  a:=a mod 50;
  end
 else
 if a>=20 then
  begin
  s4:=a div 20;
  a:=a mod 20;
  end
 else
 if a>=10 then
  begin
  s5:=a div 10;
  a:=a mod 10;
  end
 else
 if a>=5 then
  begin
  s6:=a div 5;
  a:=a mod 5;
  end
 else
 if a>=2 then
  begin
  s7:=a div 2;
  a:=a mod 2;
  end
 else
 if a>=1 then
  begin
  s8:=a div 1;
  a:=a mod 1;
  end;
  end;
 write(s1,' :250 ',s2,' :100 ',s3,' :50 ',s4,' :20 ',s5,' :10 ',s6,':5 ',s7,':2 ',s8,' :1');
 read(s1)
end.

كه درست هم كار ميكنه.
اما به نظر ميرسه راه حل بهتري براي مسئله باشه .
در واقع با پيدا كردن يه ارتباط منطقي بين سكه هاشايد بشه مسئله رو خيلي كوتاهتر حل كرد.اما من هنوز نتونستم اون رو پيدا كنم .
اگه كسي مي تونه راه حل بهتري براي مسئله داشته باشه كمكم كنه.
مرسي Sad

[ وضعيت كاربر: ]

تشکر کردن از پست  پاسخگویی به این موضوع بهمراه نقل قول 
تشکرها از این پست:

پست تاریخ: دوشنبه 21 بهمن 1387 - 02:02    
Hamid
مدیريت كل سایت
مدیريت كل سایت


پست: 5504
عضو شده در: 31 اردیبهشت 1384
محل سکونت: -::ساوه::-
iran.gif


امتياز: 47846

عنوان: خواندن مشخصات فردی ارسال پیام شخصی

سلام؛
sahar2000, جان، فکر می‌کنم الگوریتم شما درسته، فقط می‌تونستید از طریق آرایه، در چند خط خلاصه کنید.
البته من با قواعد دقیق پاسکال آشنا نیستم. بنابراین با ++C می‌نویسم، شما به پاسکال تبدیلش کنید:
کد:

long int x;
int a[250,100,50,10,5,2,1];
cin >> x;
for ( i=0 ; i<7 & x>0 ; i++ )
  if (x>a[i]){
    cout << x/a[i] << " * " << a[i] << "\n";
    x=x%a[i];
  }

اگر مثلاً در این برنامه، مقدار x وارد بشه 611
خروجی اینطور خواهد بود:
کد:

2 * 250
1 * 100
1 * 10
1 * 1


نمی‌دونم متوجه برنامه می‌شید یا نه Embarassed

مقدار عدد رو در x ریختم. مقادیر پول‌ها رو در یک آرایه.
یکی یکی مقدار پولمون رو نسبت به اعضای آرایه چک کردم.
مثل الگوریتم شما، اگر پولمون بیشتر از عضو بود (مثلاً اگر بیشتر از 250 بود) پولمون رو تقسیم بر 250 می‌کنه و تعدادش رو همراه با مقدار واحد به خروجی می‌فرسته.
بعد، مقدار x رو مساوی با باقیمانده قرار می‌ده و همینطور ادامه می‌ده تا همه‌ی اعضای آرایه چک بشن.
فقط برای اینکه برنامه‌مون بهینه بشه، گفتم اگر مقدار باقیمانده صفر شد، دیگه نیاز نیست اعضای دیگه‌ی آرایه رو هم چک کنی...
دستور cin برای خواندن و cout برای فرستادن به خروجی است.

یادش بخیر. توی درس طراحی الگوریتم، یادمه از این نوع مسائل، خیلی سخت‌ترش رو داشتیم Embarassed در مورد وزنه‌ها هم این مسأله هست...

[ وضعيت كاربر: ]

تشکر کردن از پست  پاسخگویی به این موضوع بهمراه نقل قول 
تشکرها از این پست:

پست تاریخ: دوشنبه 21 بهمن 1387 - 14:30    
sahar2000
خوب داره پيش مي‌ره
خوب داره پيش مي‌ره


پست: 52
عضو شده در: 4 آذر 1384

iran.gif


امتياز: 481

عنوان: خواندن مشخصات فردی ارسال پیام شخصی

ممنون Hamid جان ؛
من متوجه برنامه شدم.
بله در حقيقت نكته اين برنامه در استفاده از آرايه اي است كه مقاديرش در ابتداي برنامه تعيين شده اند و چون ما بيشتر با آرايه هايي كار كرديم كه در طول برنامه پر ميشدند اصلا به استفاده از آرايه ها فكر نكردم. البته در كتاب هم اين تمرين قبل از فصل آرايه هاست .
برنامه با استفاده از آرايه ها:
کد:

const
a:array[1..8]of integer=(250,100,50,25,10,5,2,1);
var
x:longint;
i,r:integer;
begin
 read(x);
  while x>0 do
  Begin
  for i:=1to 8 do
   begin
   r:=x div a[i];
   x:=x mod a[i];
   writeln(r,'*',a[i]);
   end;
  end;
  read(i)
end.

[ وضعيت كاربر: ]

تشکر کردن از پست  پاسخگویی به این موضوع بهمراه نقل قول 
تشکرها از این پست:


نمایش پستها:                 مشاهده موضوع قبلی :: مشاهده موضوع بعدی  
پاسخ دادن به این موضوع
 

صفحه 1 از 1

تمام زمانها بر حسب GMT + 3.5 Hours می‌باشند
 Related Topics 


 information 

 

پرش به:  
شما نمی توانید در این بخش موضوع جدید پست کنید
شما نمی توانید در این بخش به موضوعها پاسخ دهید
شما نمی توانید موضوع های خودتان را در این بخش ویرایش کنید
شما نمی توانید موضوع های خودتان را در این بخش حذف کنید
شما نمی توانید در این بخش رای دهید


Copyright 2004-2024. All rights reserved.
© by Aftabgardan Cultural Center : Aftab.cc