Assignment_2.pdf

‫برنامه سازی پیشرفته‬
‫نیمسال دوم ‪25-29‬‬
‫دانشکده مهندسی کامپیوتر‬
‫تمرین دوم‬
‫پیمان دودانگه‬
‫زمان تحویل‪ 99:‬فروردین‬
‫پ‬
‫‪ .1‬موعد ارسال تمرین ساعت ‪ 95:32‬روز جمعه مورخ ‪ 1525/1/99‬است‪.‬‬
‫‪ .9‬تمرین باید به صورت حضوری تحویل داده شود و استفاده از کامنت‪ ،‬و ساختار کد نمره خواهد داشت‪ .‬بنابراین‬
‫نمره کامل از سیستم داوری به معنای نمره کامل نبوده و فقط بخشی از نمره شما خواهد بود‪.‬‬
‫‪ .5‬در این سوال نیازی به پیاده سازی تابع‬
‫ها و‬
‫غیر از توابع خواسته شده و‬
‫نیست و تنها کالس ها و توابع خواسته شده را باید پیادهسازی کنید‪ .‬به‬
‫باشند‪.‬‬
‫ها بقیه توابعی که استفاده میکنید باید‬
‫‪ .4‬در صورت داشتن هرگونه مشکل‪ ،‬سوال خود را با تگ مناسب در‬
‫‪ .5‬با هر گونه تقلب برخورد جدی خواهد شد‪.‬‬
‫مطرح کنید‪.‬‬
‫سوال ‪ 1‬اعداد بزرگ (‪ 9۰‬نمره)‬
‫پس از تحویل کامپایلر به کمیته فنی جاواچلنج این کمیته با یک مشکل جدید مواجه شد که حتی طراحان اصلی‬
‫جاوا هم فکری برای حل آن نکرده بودند‪ .‬مشکل این بود که امکان ذخیره اعداد خیلی بزرگ در آنها وجود نداشت‪.‬‬
‫این کمیته باز به دلیل اتکا به نیروی داخل دانشکده تصمیم گرفت وظیفه نوشتن کالسی از اعداد صحیح (بدون‬
‫محدودیت بازه اعداد) با قابلیت های زیر را به شما بسپارد‪:‬‬
‫کالس‬
‫‪public class BigNumber‬‬
‫توابع کالس‬
‫‪:‬‬
‫این دو تابع‬
‫یک‬
‫به شکل‬
‫;)‪public BigNumber(int number‬‬
‫و یکی با گرقتن عدد‬
‫های این کالس هستند که یکی با گرفتن عدد به شکل‬
‫با مقدار داده شده تولید میکند‪.‬‬
‫;)‪public BigNumber(String number‬‬
‫این تابع‪ ،‬یک‬
‫;)‪public void add(BigNumber number‬‬
‫که این تابع روی آن صدا زده شده اضافه میکند‪.‬‬
‫میگیرد و به آن‬
‫‪public static BigNumber add(BigNumber first, BigNumber‬‬
‫;)‪second‬‬
‫جدید خروجی‬
‫میگیرد و حاصل جمع آنها را به عنوان یک‬
‫این تابع‪ ،‬دو‬
‫میدهد‪(.‬اعداد ورودی هیچ تغییری نمیکنند)‬
‫را به شکل یک‬
‫این تابع‬
‫دقیقا چسبیده به عدد میآید‪.‬‬
‫;)(‪public String toString‬‬
‫(خود عدد) برمیگرداند‪ .‬در صورتی که عدد منفی بود عالمت ‘‪‘-‬‬
‫‪public static int compare(BigNumber first, BigNumber‬‬
‫;)‪second‬‬
‫میگیرد و این دو را با هم مقایسه میکند‪ .‬اگر عدد اول کوچکتر بود ‪ ،-1‬اگر دو عدد‬
‫این تابع‪ ،‬دو‬
‫مساوی بودند ‪ ،۰‬وگرنه ‪ 1‬برمیگرداند‪.‬‬
‫سوال ‪ 9‬آهنگ منیجر( ‪ 4۰‬نمره )‬
‫پس از حل تمرینهای چند جمله ای توسط شما‪ ،‬مهیار نمره امتیازی زیادی از دبیر ریاضی گرفت‪ .‬به همین خاطر‬
‫تصمیم گرفت از این به بعد کل کالسهای ریاضی را آهنگ گوش کند تا دبیر دوباره به اوگیر بدهد و از او تمرین‬
‫های اضافه بخواهد و او هم این تمرین های اضافه را به شما بدهد تا برای او حل کنید‪( .‬منتظر تمرین ‪ 5‬و صورت پروژه‬
‫باشید)‬
‫به همین خاطر مهیار تصمیم گرفته آهنگهای موبایلش را مرتب کند و‬
‫یا‬
‫بگیرد‪ .‬مثال دیگر اسم خواننده یه آهنگ‬
‫های موبایلش را درست کند‪.‬‬
‫به کمک شما نیازدارد تا‬
‫های مناسبی برای هر آهنگ در نظر‬
‫نباشد! برای این کار مهیار‬
‫به این منظور مهیار به یک سری کالس جاوا نیاز دارد که هر کدام توابعی مخصوص برای کارهای خود دارند‪.‬‬
‫است‪.‬‬
‫اولین کالس‬
‫‪public class Playlist‬‬
‫توابع کالس‬
‫‪:‬‬
‫;)‪public Playlist(String name‬‬
‫با گرفتن نام ‪ ،‬کالس را میسازد‪.‬‬
‫این کانستراکتور ‪ ،‬اولین باری که صدا زده میشود یک‬
‫این عدد را یکی یکی زیاد میکند‪ .‬به طور مثال نام پنجمین‬
‫خواهد بود‪.‬‬
‫این تابع یک آهنگ میگیرد و آن را به‬
‫;)(‪public Playlist‬‬
‫میسازد و در دفعات بعدی‬
‫با نام‬
‫که با این کانستراکتور ساخته میش‬
‫;)‪public void addSong(Song song‬‬
‫اضافه میکند‪.‬‬
‫;)‪public void addAlbum(Album album‬‬
‫اضافه میکند‪.‬‬
‫این تابع یک آلبوم میگیرد و آهنگ های آن را به همان ترتیبی که در آلبوم هستند به‬
‫;)‪public boolean removeSong(Song song‬‬
‫حذف میکند‪.‬‬
‫این تابع یک آهنگ میگیرد و آن را از‬
‫;)(‪public Song getCurrentSong‬‬
‫صدا زده نشده‪ ،‬یا‬
‫این تابع آهنگی که در حال پخش است را برمیگرداند‪ .‬در ابتدای کار وقتی که هنوز تابع‬
‫برمیگرداند‪.‬‬
‫صدا زده شده‪،‬‬
‫وقتی تابع‬
‫;)(‪public void goNext‬‬
‫این تابع آهنگ در حال اجرا را یکی به جلو میبرد‪ .‬اگر آهنگ بعدی وجود نداشته باشد (آهنگ آخر باشیم) تابع‬
‫صدا زده میشود‪.‬‬
‫;)(‪public void goPrevious‬‬
‫این تابع آهنگ در حال اجرا را یکی به عقب میبرد‪ .‬اگر آهنگ قبلی وجود نداشته باشد (آهنگ اول باشیم) تابع‬
‫صدا زده میشود‪.‬‬
‫;)(‪public void play‬‬
‫باشیم‪ ،‬خواه در حال‬
‫این تابع همیشه اولین آهنگ را به عنوان آهنگ در حال اجرا قرار میدهد‪ .‬خواه در حالت‬
‫اجرا‪.‬‬
‫;)(‪public void stop‬‬
‫آهنگ در حال اجرا را‬
‫میکند‪.‬‬
‫کالس‬
‫‪class Album‬‬
‫توابع کالس‬
‫‪:‬‬
‫;)‪public Album(String name, Artist artist, String genre‬‬
‫با گرفتن نام آلبوم و خواننده و نام سبک‪ ،‬آلبوم را میسازد و در ابتدا هیچ آهنگی در آن نیست‪.‬‬
‫این تابع هر بار که صدا می شود باید یک‬
‫هستند‪.‬‬
‫و سبک آن‬
‫;)(‪public static Album getSingle‬‬
‫است و خواننده‬
‫یکسان را برگرداند که آن آلبوم‪ ،‬نامش‬
‫;)(‪public Artist getArtist‬‬
‫خواننده آلبوم را برمیگرداند‪.‬‬
‫;)(‪public String getGenre‬‬
‫سبک آلبوم را برمیگرداند‪.‬‬
‫;)(‪public String getName‬‬
‫نام آلبوم را برمیگرداند‪.‬‬
‫;)‪public Boolean addSong(Song song‬‬
‫یک آهنگ میگیرد و در صورتی که خواننده آن با خواننده آلبوم یکی بود آن را به آلبوم اضافه میکند و‬
‫برمیگرداند‪.‬‬
‫برمیگرداند‪ .‬در غیر این صورت‬
‫;)‪public void removeSong(Song song‬‬
‫یک آهنگ میگیرد و در صورت وجود آن در آلبوم‪ ،‬آن را حذف میکند‪.‬‬
‫;)(‪public Song[] getSongs‬‬
‫آهنگ های آلبوم را برمیگرداند‪.‬‬
‫;)(‪public String toString‬‬
‫نام آلبوم‪ ،‬نام خواننده‪ ،‬سبک آلبوم‪ ،‬و نام آهنگ های آلبوم را یکی یکی و هرکدام را با یک فاصله از قبلی‬
‫برمیگرداند‪.‬‬
‫کالس‬
‫‪class Song‬‬
‫توابع کالس‬
‫‪:‬‬
‫;)‪public Song(String name, Artist artist‬‬
‫با گرفتن نام آهنگ و خواننده آن‪ ،‬کالس را میسازد‪.‬‬
‫;)(‪public String getName‬‬
‫نام آهنگ را برمیگرداند‪.‬‬
‫;)(‪public Artist getArtist‬‬
‫خواننده آهنگ را برمیگرداند‪.‬‬
‫;)(‪public Album getAlbum‬‬
‫آلبوم آهنگ را برمیگرداند‪ .‬اگر این آهنگ در هیچ آلبومی نباشد‪ ،‬یعنی به آلبومی اضافه نشده باشد و یا از آلبومش‬
‫برگردانده می شود‪.‬‬
‫حذف شده باشد‪،‬‬
‫;)(‪public String toString‬‬
‫نام آهنگ و نام خواننده و نام آلبوم را با یک فاصله از هم برمیگرداند‪.‬‬
‫کالس‬
‫‪class Artist‬‬
‫توابع کالس‬
‫‪:‬‬
‫;)‪public Artist(String name‬‬
‫با گرفتن نام خواننده‪ ،‬کالس را می سازد‪.‬‬
‫;)(‪public String getName‬‬
‫نام خواننده را برمیگرداند‪.‬‬
‫;)(‪public Song[] getSongs‬‬
‫آهنگ هایی که توسط این خواننده خواندهشدهاند را در یک آرایه برمیگرداند‪.‬‬
‫;)(‪public Album[] getAlbums‬‬
‫آلبوم هایی که توسط این خواننده خواندهشدهاند را در یک آرایه برمیگرداند‪.‬‬
‫;)(‪public String toString‬‬
‫نام خواننده و نام همه ی آلبوم هایی که خوانده است را به ترتیب و با یک فاصله برمیگرداند‪.‬‬
‫سوال ‪ 5‬بانک (‪ 4۰‬نمره ‪9۰ +‬نمره امتیازی)‬
‫در این تمرین باید یک بانک را پیاده سازی کنید‪ .‬کالس ها و توابع مربوط به این بانک به شرح زیر است‪:‬‬
‫کالس‬
‫‪public class Bank‬‬
‫توابع کالس‬
‫‪:‬‬
‫;)‪public Bank(String name‬‬
‫کالس را با گرفتن نام بانک میسازد‪.‬‬
‫;)(‪public Bank‬‬
‫کالس را میسازد و نام آن را به صورت پیشفرض ”‬
‫“ قرار میدهد‪.‬‬
‫;)(‪public String getName‬‬
‫نام بانک را بر میگرداند‪.‬‬
‫;)(‪public Branch[] getBranches‬‬
‫شعبههای یک بانک را در یک آرایه برمیگرداند‪.‬‬
‫;)(‪public Customers[] getCustomers‬‬
‫مشتریان یک بانک را در یک آرایه برمیگرداند‪.‬‬
‫;)‪public void addBranch(Branch branch‬‬
‫یک شعبه میگیرد و آن را به شعبه های بانک اضافه میکند‪.‬‬
‫;)‪public void addCustomer(Customer customer‬‬
‫یک مشتری میگیرد و آن را به مشتریان بانک اضافه میکند‪.‬‬
‫کالس‬
‫‪public class Branch‬‬
‫توابع کالس‬
‫‪:‬‬
‫;)‪public Branch(String name, Bank bank‬‬
‫کالس را با گرفتن نام شعبه و یک بانک میسازد‪.‬‬
‫;)(‪public String getName‬‬
‫نام شعبه را برمیگرداند‪.‬‬
‫;)(‪public Employee[] getStaff‬‬
‫کارکنان یک شعبه را در یک آرایه برمیگرداند‪.‬‬
‫;)(‪public Employee getManager‬‬
‫مدیر شعبه بانک را برمیگرداند‪.‬‬
‫;)‪public void setManager(Employee manager‬‬
‫یک کارمند میگیرد و او را به عنوان مدیر شعبه قرار میدهد‪.‬‬
‫;)‪public void addEmployee(Employee employee‬‬
‫یک کارمند میگیرد و او را به کارمندان شعبه بانک اضافه میکند‪.‬‬
‫یک کارمند تنها میتواند در یک شعبه مشغول به کار باشد و در صورت کار در جای دیگر به کارمندان آن شعبه‬
‫اضافه نمیشود‪.‬‬
‫;)‪public void fireEmployee(Employee employee‬‬
‫یک کارمند میگیرد و او را از کارمندان شعبه بانک حذف میکند‪.‬‬
‫کالس‬
‫‪class Employee‬‬
‫توابع کالس‬
‫‪:‬‬
‫;)‪public Employee(String name, Branch branch‬‬
‫کالس را با گرفتن نام کارمند و یک شعبه میسازد‪.‬‬
‫;)(‪public String getName‬‬
‫نام کارمند را برمیگرداند‪.‬‬
‫کالس‬
‫‪class Customer‬‬
‫توابع کالس‬
‫‪:‬‬
‫;)‪public Customer(String name, int id‬‬
‫کالس را با گرفتن نام مشتری و شماره شناسه مشتری میسازد‪.‬‬
‫;)(‪public String getName‬‬
‫نام یک مشتری را برمیگرداند‪.‬‬
‫;)(‪public int getID‬‬
‫شماره شناسه یک مشتری را برمیگرداند‪.‬‬
‫;)(‪public Account[] getAccounts‬‬
‫حساب های یک مشتری را در یک آرایه برمیگرداند‪.‬‬
‫;)‪public void addAccount(Account account‬‬
‫یک حساب را به حسابهای مشتری اضافه میکند‪.‬‬
‫‪public boolean withdraw(Account account, double amount,‬‬
‫;)‪BankDate date‬‬
‫برمیگرداند‬
‫با گرفتن حساب و میزان برداشت آن مقدار را در صورت امکان از موجودی حساب کسر میکند و‬
‫برمیگرداند‪.‬‬
‫و در غیر این صورت‬
‫شرایطی که در آن برداشت از حساب ممکن نیست عبارت است از‪:‬‬
‫‪ ‬حساب متعلق به مشتری نباشد‪.‬‬
‫‪ ‬موجودی حساب از میزان درخواست شده کمتر باشد‪.‬‬
‫باشد‪.‬‬
‫‪ ‬حساب از نوع بلند مدت‬
‫‪public boolean deposit(Account account, double amount,‬‬
‫;)‪BankDate date‬‬
‫برمیگرداند‬
‫با گرفتن حساب و میزان واریز‪ ،‬آن مقدار را در صورت امکان به موجودی حساب اضافه میکند و‬
‫برمیگرداند‪( .‬حساب میتواند متعلق به این مشتری نباشد‪).‬‬
‫و در صورتی که حساب از نوع بلند مدت باشد‬
‫‪public boolean transfer(Account source, Account dest,‬‬
‫;)‪double amount, BankDate date‬‬
‫با گرفتن حساب های مبدا و مقصد و وجه انتقال‪ ،‬در صورت امکان مقدار وجه را از حساب مبدا به مقصد منتقل‬
‫برمیگرداند‪.‬‬
‫برمیگرداند و در غیر این صورت‬
‫مینماید و‬
‫شرایطی که در آن انتقال ممکن نیست عبارت است از‪:‬‬
‫‪ ‬حساب مبدا متعلق به مشتری نباشد‪.‬‬
‫‪ ‬یکی از حساب های مبدا یا مقصد از نوع بلند مدت باشند‪.‬‬
‫‪ ‬موجودی حساب مبدا از وجه انتقال کم تر باشد‪.‬‬
‫;)‪public double getBalance(Account account, BankDate date‬‬
‫با گرفتن یک حساب مقدار موجودی را بر میگرداند‪ .‬اگر این مشتری صاحب حساب نباشد مقدار ‪ -1‬برگردانده‬
‫میشود‪.‬‬
‫‪public boolean closeAccount(Account account, BankDate‬‬
‫;)‪date‬‬
‫با گرفتن یک حساب آن را میبندد و از لیست حسابهای مشتری حذف میکند و با موجودی آن حساب کاری‬
‫نمیکند‪.‬‬
‫‪public boolean closeAccount(Account closeAccount, Account‬‬
‫;)‪account, BankDate date‬‬
‫با گرفتن دو حساب و یک تاریخ‪ ،‬حساب اول را میبندد و از لیست حساب های مشتری حذف میکند‪ .‬موجودی‬
‫این حساب به حساب دوم منتقل میشود که متعلق به همین مشتری است و باید از نوع کوتاه مدت یا جاری باشد‪.‬‬
‫برمیگرداند‪.‬‬
‫و در غیر این صورت‬
‫در صورت امکان‬
‫بر میگرداند‪:‬‬
‫شرایطی که در آن‬
‫‪ ‬یکی از حساب ها متعلق به مشتری نباشد‪.‬‬
‫‪ ‬حساب دوم از نوع بلند مدت باشد‪.‬‬
‫;)(‪public String toString‬‬
‫اطالعات مربوط به مشتری را در یک رشته برمیگرداند‪.‬‬
‫قالب این رشته به این صورت است که در خط اول شماره شناسه مشتری‪ ،‬در خط بعدی نام مشتری میآید‪.‬‬
‫کالس‬
‫‪class Account‬‬
‫توابع کالس‬
‫‪:‬‬
‫‪public Account(String type, int number, Customer owner,‬‬
‫;)‪double initialAmount, Account support, BankDate date‬‬
‫کالس را با گرفتن نوع حساب‪ ،‬شماره حساب‪ ،‬صاحب حساب‪ ،‬موجودی اولیه‪ ،‬یک حساب ثانویه و تاریخ افتتاح‬
‫حساب میسازد‪ .‬حساب دوم برای این است که اگر نوع حساب از نوع بلند مدت بود‪ ،‬سود مربوط به آن در آن‬
‫حساب قرار گیرد‪ .‬اگر نوع حساب از نوع بلند مدت نبود‪ ،‬مهم نیست که حساب دوم چه باشد‪ ،‬اما در صورت بلند‬
‫مدت بودن حساب باید حساب دوم متعلق به همین مشتری باشد و از نوع کوتاه مدت یا جاری باشد‪ .‬در صورت‬
‫مغایرت ورودی ها با هر یک از موارد باال‪ ،‬حساب ساخته شده به هیج مشتری ای نسبت داده نمیشود‪.‬‬
‫است‪.‬‬
‫و‬
‫‪،‬‬
‫نوع حساب یکی از حالت های‬
‫سود حساب های کوتاه مدت ‪ %1۰‬و به صورت روزانه محاسبه میشود وحساب های بلند مدت به صورت ‪ 3‬ساله و با‬
‫سود ‪ %9۰‬به طور ساالنه هستند ‪.‬حساب های جاری نیز سودی ندارند‪.‬‬
‫;)‪public double getBalance(BankDate date‬‬
‫با گرفتن یک تاریخ موجودی حساب را در آن تاریخ بر میگرداند‪.‬‬
‫;)(‪public BankDate getLastOperationDate‬‬
‫تاریخ آخرین عملیات انجام شده روی این حساب را برمیگرداند‪.‬‬
‫عملیات شامل توابعی است که مشتری میتواند صدا بزند‪( .‬توابعی که در آرگمان های آنها تاریخ دریافت میشود‪).‬‬
‫;)(‪public int getNumber‬‬
‫شماره یک حساب را برمیگرداند‪.‬‬
‫;)(‪public String getType‬‬
‫نوع یک حساب را در قالب یک رشته برمیگرداند‪.‬‬
‫این رشته میتواند تنها یکی از حالت های”‬
‫صاحب حساب را برمیگرداند‪.‬‬
‫“ ‪”،‬‬
‫“‪”،‬‬
‫“ باشد‪.‬‬
‫;)(‪public Customer getOwner‬‬
‫;)‪public void withdraw(double amount, BankDate date‬‬
‫با گرفتن یک تاریخ و میزان برداشت‪ ،‬آن را از موجودی حساب کم میکند‪.‬‬
‫;)‪public void deposit(double amount, BankDate date‬‬
‫با گرفتن یک تاریخ و میزان واریز آن را به موجودی حساب اضافه میکند‪.‬‬
‫;)(‪public String toString‬‬
‫اطالعات مربوط به یک حساب را در قالب یک رشته برمیگرداند‪.‬‬
‫قالب این رشته به این صورت است که در خط اول شماره حساب‪ ،‬در خط بعدی نام مالک حساب‪ ،‬خط بعدی نوع‬
‫حساب و در خط آخر موجودی حساب آورده میشود‪.‬‬
‫کالس‬
‫‪class BankDate‬‬
‫توابع کالس‬
‫;)‪public BankDate(int day, int month, int year‬‬
‫از این کالس برای وارد کردن تاریخ عملیات بانکی و محاسبه سود حساب ها استفاده میشود‪.‬‬
‫;)(‪public int getDay‬‬
‫روز این تازیخ را برمیگرداند‪.‬‬
‫;)(‪public int getMonth‬‬
‫ماه این تاریخ را بر میگرداند‪.‬‬
‫;)(‪public int getYear‬‬
‫سال این تاریخ را برگرداند‪.‬‬
‫توضیحات‪:‬‬
‫بود اجازه بسته شدن ندارد‪.‬‬
‫اگر حساب‬
‫سود حساب های کوتاه مدت در هر روز و بلند مدت در هر سال به ترتیب از فرمول های زیر بدست می آید‪:‬‬
‫* (‪)۰.1 / 56۰‬‬
‫* (‪)۰.9‬‬
‫ها‪ ،‬توابعی که در کالس‬
‫ها و‬
‫در تمرین میتوانید توابع خود را پیاده سازی کنید‪ .‬اما به جز‬
‫باشند‪.‬‬
‫پیاده سازی میکنید و توابعی که در صورت سوال آمده باقی توابع باید‬
‫ای که برای تست این تمرین قرار میگیرد‪ .‬تاریخ ها به صورت صعودی استفاده میشوند‪ .‬به طور‬
‫در تابع‬
‫مثال‪ ،‬اگر یک مشتری میزان وجهی را به حساب خود واریز کند و بعد از آن در تاریخ دیگری درخواست صورت‬
‫حساب بدهد‪ ،‬تاریخ این عملیات به ترتیب صدا زدن توابع است‪.‬‬
‫بخش امتیازی‪:‬‬
‫پیادهسازی های مربوط به حساب های بلند مدت مربوط به بخش امتیازی میباشد‪.‬‬
‫توضیحات مربوط به حساب های بلند مدت‪:‬‬
‫ریخته میشود‪.‬‬
‫‪ ‬پس از افتتاح حساب‪ ،‬سود آن به صورت ‪ %9۰‬ساالنه به حساب‬
‫‪ ‬موقعی که یک حساب بلند مدت پیش از اتمام ‪ 3‬سال بسته میشود‪ ،‬سودی که در این مدت هر سال به یک حساب‬
‫خاص ریخته میشده از حساب مورد نظر کسر میشود‪ .‬اما با سود آن سود کاری نداریم‪.‬‬
‫‪ ‬اگر مشتری حساب بلند مدت خود را قبل از ‪ 3‬سال ببندد‪ ،‬سودی به حساب تعلق نمیگیرد و سودهایی که‬
‫ریخته شده باید از آن برداشتهشود‪.‬‬
‫تا تاریخ بسته شدن حساب به حساب‬
‫‪ ‬یک حساب بلند مدت پس از اتمام ‪ 3‬سال وارد یک ‪ 3‬سال جدید میشود‪.‬‬