PDA

View Full Version : برنامه خرد کردن پول



farhadamin
دوشنبه 12 فروردین 1387, 21:19 عصر
سلام دوستام من می خواستم یک برنامه خرد کردن پول بنویسم . می خواستم از struck و enum استفاده کنم می خواستم دوستان کسی هست به منو در مورد استفاده از enum راهنمایی کنه و توضیحاتی در موردش به من بده... در ضمن هم چنین در مورد برنامه روش حل کردن برنامه... ممنون

mohammadkhan
چهارشنبه 14 فروردین 1387, 00:11 صبح
من دارم این برنامه رو
ولی به زبون سی و بدون enum و struct

خیلی ساده و پیش پا افتاده است

farhadamin
چهارشنبه 14 فروردین 1387, 01:16 صبح
سلام این برنامه تمرین یک کتاب برای آموزش enum و struck به همین خاطر می خواستم از این دو استقاده کنم.....
باید یک struck نوشته بشود.. که تعداد سکه ها را ثبت کنه...منظورم تعداد سکه هایی است که در دستگاه مانده.....(منظور این است که اگر سکه ها کم تر از اسکناس ورودی است پول پس داده بشود).
بعد باید برای صاحب دستگاه امکان اضافه کردن به سکه ها باشه پس باید به enum نوشته بشه به عنوان ارگومان...


void addCoins (CoinType c, int tedad)

این اول است بعد باید کار های دیگه ای انحام بشه من با این ابتدا مشکل دارم... ممنون می شم دوستان کمک کنند.

emad_67
چهارشنبه 14 فروردین 1387, 09:18 صبح
کسی هست به منو در مورد استفاده از enum راهنمایی کنه و توضیحاتی در موردش به من بده.enum یک نوع داده شمارشی هست که کاربر میتونه اونو تعریف کنه. برای مثال اینو ببین:


enum direction{up,down,left,right};
در اینجا با استفاده از enum نوع داده ای به نام direction تعریف کردیم که این نوع داده فقط میتونه 4 نوع مقدرای که در اون تعریف کردی رو بگیره یعنی up, down, left, right .
به صورت اتوماتیک کامپایلر به این مقادیر از سمت چپ به راست مقدار های 0 و 1 ... میده یعنی در اینجا به این شکل میشه:
up=0
down=1
left=2
right=3
رو این حساب به این نوع داده میگن نوع داده شمارشی.
کار باهاش هم راحته، به این شکل:


direction status=up;
cout<<status;
ابتدا یه متغیر از نوع داده ای که تعریف کردی می سازی و بعد مقدار مورد نظر رو بهش میدی. در اینجا مقدار 0 در صفحه چاپ میشه چون به طور پیشفرض مقدار up توسط کامپایلر 0 قرار داده شده. در صورتی هم که بخوای مقدار دهی به جای اینکه از 0 شروع بشه، از 1 یا هر عدد دیگه ای شروع بشه به این شکل باید بنویسی:


enum direction{up=1,down,left,right};
در اینجا مقدار اولیه up رو برابر 1 قرار دادم. مقداری هم که به down,left, right داده میشه به ترتیب 2,3,4 هست.

برای CoinType هم میتونی به همین شکل مقادیر اونو تعریف کنی. به طور مثال میتونی اینجوری بنویسی:


#include<iostream.h>
enum CoinType{five,ten,fifty};
struct CoinNumber
{
int fiveNumber;
int tenNumber;
int fiftyNumber;
};
در enum نوع سکه ها که 5 و 10 و 50 تومنی هستند رو تعریف کردم و در struct هم تعداد اون سکه ها رو. بنا به کاری که میخوای انجام بدی اینا رو میتونی تغییر بدی.

emad_67
پنج شنبه 15 فروردین 1387, 10:10 صبح
دوست عزیز مشکل اصلی شما روی سینتکس هست.
شما نمیتونی هر چیزی رو در هر جای برنامه تعریف کنی.
struct رو بهتره که در بیرون از main تعریف کنی. یعنی به صورت global تا در هر جای برنامه قابل دسترسی باشه. همچنین شما اومدی بدنه تابع addCoins رو در داخل main تعریف کردی که اصلا این کار ممکن نیست یعنی باید بدنه تابع در بیرون از main به صورت جدا تعریف بشه. حتی خود تابع هم مشکل داره چون اومدی برای اون return تعریف کردی، در حالی که تابع به صورت void تعریف شده.


if(choice = ti)
{
برای مقایسه دو مقدار در یک شرط باید از == استفاده کنی نه =
و مورد آخر هم اینکه اصلا نفهمیدم که هدر struct.h رو برای چی و از کجا include کردی.
بنابراین توصیه میکنم بیشتر روی سینتکس کار کنی :)

farhadamin
پنج شنبه 15 فروردین 1387, 14:50 عصر
ببخشید برنامه درست این بود...
این هدر است


h
#define GUARD_struct_h
#include <iostream>
#include <string.h>
#include<conio.h>

using namespace std;
enum coinType {ti=10,tyve=20};

class Automat{
protected:
struct indhold {int tiNumber; int tyveNumber;};

//coinSaldo {coinType C; int Antal;} typeAntal;

void addCoins(coinType c, int antal);
}


//struct coinsaldo {coinType c; int antal;};
#endif


و این تایع addcoin است.... که در .cpp
خودش قرار دارد.





#include "struct.h"
#include "allfunktion.h"

using namespace std;



void addCoins(coinType c, int antal)
{

typeAntal.C=c;
typeAntal.Antal=antal;


}








و main



#include "struct.h"


using namespace std;




int main()
{

Automat m;

m.addCoins(ti,10);

cout <<"\nantal af ti er:\t"<< typeAntal.Antal;



_getch();
return 0;
}
ممنون می شم نگاهی بهش بکنید....

emad_67
پنج شنبه 15 فروردین 1387, 17:32 عصر
دوست عزیز بازم شرمنده من درست نفمیدم که چیکار کردی.
شما در قسمت فایل .h اومدی دو قسمت رو به این شکل نوشتی:


//coinSaldo {coinType C; int Antal;} typeAntal;


//struct coinsaldo {coinType c; int antal;};
که من اصلا نفمیدم اینا رو برای چی تعریف کردی. و همچنین یه struct با اسم indhold در داخل کلاس نوشتی که اصلا در برنامه استفاده نشده.
در همون فایل متغیر typeAntal رو به صورت comment در اوردی، در حالی که در بدنه تابع addCoins از اون استفاده کردی. من خودم اونو از حالت کامنت در اوردم ولی خوب اصلا مشخص نیست که این متغیر از چه نوعی هست و برای چی تعریف شده.
شما در ابتدا گفتی که میخوای با struct و enum برنامه رو بنویسی ولی الان اومدی از کلاس استفاده کردی. در کل به نظرم تو این برنامه اصلا نیاز به استفاده از کلاس و حتی تفکیک فایل های .h و .cpp نیست.
در بدنه خود کلاس و تعریف بدنه تابع اون هم مشکلاتی وجود داره.
سعی کن برنامه رو در یک فایل به صورت ساده و فقط با همون struct و enum بنویسی و بعد بزار اینجا تا راحت تر بشه کمک کرد.

farhadamin
پنج شنبه 15 فروردین 1387, 23:39 عصر
سوال به این صورت است که وقتی من برنامه را می نویسم در حالت آخر تابع main باید به این صورت باشه.....



1. #include "Automat.h"
2.
3. int main()
4. {
5. Automat m;
6. m.print();
7. m.add_coins( TYVE, 1 );
8. m.add_coins( TI, 3 );
9. m.print();
10.
11. m.veksel(FEMTI);
12. m.print();
13. m.add_coins( TYVE, 3 );
14. m.veksel(INVALID);
15. m.veksel(FEMTI);
16. m.print();
17. m.add_coins( TYVE, 3 );
18. m.change(EN_HUND);
19. m.print();
20. }



Automat m;
یک کلاس که همه تابع ها و استراکت درون اون تغریف شده اند.


m.print(); تابع ای که با اون بشود آمار پول خردهای (10 و 20)دورن دستگاه را گرفت.


m.add_coins( TYVE, 1 ); تابع ای که در اون تعداد 20 تومانی ها وارد می شه....سعی کردم درون یک struct این اطلاعات را ذخیره کنم.... بعد وقتی برنامه استفاده میشه.... بتوانم از اون برای مقایسه و کم کردم تعداد و مقدار پول خرد ها استفاده کنم....(که مثلا اگر مقدار پول خردها از مقدار اسکناس وردی کم تر بود دستگاه ارور بده.)


m.add_coins( TI, 3 ); تابع ای که در اون تعداد 10 تومانی ها وارد می شه...مثلا الان 3 تا 10 تومانی است.



11. m.veksel(FEMTI); برای مقایسه اسکناس و پول خرد ها...... و به این صورت است

void veksel(seddelType s),
و خود seddelType یک enum است که اسکناس ها را (50و 100و 200و 500) درون اون قرار داره...



udRegn(int amount). تابعی است که برای محاسبات استفاده میشه.


البته main باید به این صورت حفظ بشه... و در ضمن ... کلاس و emum باید در یک هدر تعریف بشه....
و تابع ها در cpp خودش.....


اگر دیدی از استراک های زیاد استفاده کردم به این خاطر بود که برنامه هی ارور می داد که استراک را نمیشناسه.... (استراک توی هدر جدا بود...) یه این خاطر استراک را با مدل های مختلف استفاده کردم... اگر دیده باشی به صورت کامت در آورده بودم........ ممنون میشم همچنان راهنمایم کنید..... ممنون....:عصبانی++::خجالت:.

emad_67
جمعه 16 فروردین 1387, 00:37 صبح
بر اساس توضیحاتی که دادی فایل Automat.h رو من به این شکل تعریف کردم:


#include <iostream.h>
#include <string.h>
#include<conio.h>

enum coinType {ti=10,tyve=20};
enum seddelType {FiveH,TwoH,OneH,Fifty};
struct indhold
{
int tiNumber;
int tyveNumber;
};
class Automat
{
public:
void add_Coins(coinType,int);
void print();
void veksel(seddelType);
private:
indhold CoinNumbers;
};

void Automat::add_Coins(coinType c,int antal)
{

}
void Automat::print()
{

}

void Automat::veksel(seddelType s)
{

}
بدنه های تابع ها رو هم خالی گذاشتم تا چیزایی که میخوای بنویسی. بقیه توابع و متغیر هایی رو هم که نیاز داری در قسمت های مربوطه خودت تعریف کن.

farhadamin
جمعه 16 فروردین 1387, 18:11 عصر
سلام ممنون از کمکت

تابع addcoin را این جوری تغریف کردم


void Automat::addCoins(coinType c,int antal)
{

std::map<coinType , indhold>::iterator search;
search = indholdMap.find(c);
if(search != indholdMap.end() )
{
search->second.type = c;
temp = search->second.antal;
search->second.antal = antal + temp;
indholdMap.insert(pair<coinType, indhold>(c,saldo));
}

}
و مجبور شدم در کلاس یک استراکت و یک مپ تعریف کنم...

class Automat
{
public:
struct indhold {coinType type; int antal;} saldo;
map <coinType, indhold> indholdMap;
void addCoins(coinType,int antal);
کمپایلر از کد ایراد نمی گیره... اما وقتی پرینت می گیرم.... استراکت همیشه خالیه.......
تابع main همین جوریه که گفتم.... یعنی توش این را دارم...


m.add_coins( TYVE, 1 );
m.add_coins( TI, 3 );
ممنون می شم راهنماییم کنید....

emad_67
شنبه 17 فروردین 1387, 13:53 عصر
سلام
والا من با کلاس map کار نکردم تا حالا.
نفمیدم درست چیکار کردی.
امید وارم یکی از دوستان جواب بده.

farhadamin
شنبه 17 فروردین 1387, 14:24 عصر
نمی دونم بدون مپ چه چوری می شه نوشت......

Nima_NF
شنبه 17 فروردین 1387, 18:07 عصر
struct را خارج از کلاس تعریف کنید و داخل کلاس فقط یک نمونه از آن بسازید.

شما در داخل addCoins خود struct را مقدار دهی نکردید بلکه saldo خالی را به map اضافه کردید.
بهتر بود مسئله را ساده تر و بدون map حل می کردید

موفق باشید

farhadamin
شنبه 17 فروردین 1387, 18:24 عصر
راستشو بحواهید بدون مپ نمی دونم چه چوری حل کنم....
اگه می شه یک راهنمایی کنید..بعد نمی دونم چه چوری باید نمونه استراکت رو داخل کلاس بسازم....ممنون می شم راهنمایی کنید...

farhadamin
شنبه 17 فروردین 1387, 18:35 عصر
گفتم شاید بهتر باشه کد را کامل بگذارم....

البته هنوز بعضی از تابع ها تعریف نشده اند و ناقص است...



#ifndef GUARD_struct_h
#define GUARD_struct_h
#include <iostream>
#include <string>
#include<conio.h>
#include <map>
using namespace std;


enum coinType {ti=10,tyve=20};
enum seddelType {FiveH,TwoH,OneH,Fifty};



struct indhold
{
int tiNumber;
int tyveNumber;
};


int temp, temp1;
class Automat
{
public:
struct indhold {coinType type; int antal;} saldo;
map <coinType, indhold> indholdMap;
void addCoins(coinType,int antal);
void print();
void veksel(seddelType);

private:
indhold CoinNumbers;
};

void Automat::addCoins(coinType c,int antal)
{

std::map<coinType , indhold>::iterator search;
search = indholdMap.find(c);
if(search != indholdMap.end() )
{
search->second.type = c;
temp = search->second.antal;
search->second.antal = antal + temp;
indholdMap.insert(pair<coinType, indhold>(c,saldo));
}

}
void Automat::print()
{
map<coinType, indhold>::iterator print;
print = indholdMap.begin();
if (print == indholdMap.end())
{
std::cout << "Der er ingen mQnter i automaten!" << std::endl;
}
else
{
int ialt=0;
cout<< " STATUS FOR AUTOMATEN " << endl;
cout<< "*****************************************" << endl;
cout<<"* Antal:\t\tMønttype:\t*"<<endl;
while(print != indholdMap.end())
{
cout << "* " << print-> second.antal << " stk.\t\t";
int antal= print-> second.antal;
cout << print-> second.type << " kr.\t\t*" <<endl;
int type=print-> second.type;
ialt=ialt+(antal*type);
print++;
}
cout << "* ----------------------------------- *" << endl;
cout << "* Total saldo:\t\t" << ialt << " kr.\t\t*" << endl;
cout<< "*****************************************" << endl;
cout<<"\t Vekselautomat Malik'n Farhad A/S" << endl;
}
cout << endl << endl;
}

void Automat::veksel(seddelType s)
{

}

#endif

Nima_NF
شنبه 17 فروردین 1387, 21:00 عصر
همانند indhold در خارج از کلاس قالب struct را تعریف کنید:




struct indhold
{
int tiNumber;
int tyveNumber;
};

struct indhold_2
{
coinType type;
int antal;
};

class Automat
{
public:

void addCoins(coinType,int antal);
void print();
void veksel(seddelType);

private:

map <coinType, indhold> indholdMap;

indhold_2 saldo;

indhold CoinNumbers;
};


ضمنا شما در هیج کجای برنامه به saldo مقدار نداده اید در حالی که در map آن را insert کرده اید.

farhadamin
یک شنبه 18 فروردین 1387, 04:04 صبح
ممنون نیما جان از جوابت این رو که شما می بینید هدر برنامه من است.... من توی فایل cpp توی مین این رو دارم...

int main()
{

Automat m;


m.addCoins(tyve,12);

m.addCoins(ti,58);
m.print();




اما مشکل را پیدا کردم ممنون.... در ادامه اگه اشکال داشتم .... بازم سوال می کنم و امیدوارم کمکم کنید... ممنون..

farhadamin
یک شنبه 18 فروردین 1387, 19:11 عصر
سلام می خواستم توی برنامه یک تابع بنویسم که اگر مقدار پول خرد ها برای خرد کردن اسکناس کافی بود مقدار درست را بر گرداند... و اگر نبود مقدار نادرست را... نمی دونم از چه تابغی باید استفاده کنم...
البته یک مقدار توی نت در مورد تابع exception خواندم... اما نتونستم درست ازش استفاده کنم.... که این کار ار با استفاده از یک استراکت انحام بده... ممنون....

farhadamin
چهارشنبه 21 فروردین 1387, 23:23 عصر
سلام دوستان من برنامه را می گذارم تا هم دوستان اگر لطف کنند و چک کنند... البته من مشکلی پیدا نکردم.... البته به این خاطر این جوری فرستادم که مشکل کمپایلر های مختلف را نداشته باشه.....ممنون

تابع main


#include "Automat.h"

int main()
{
Automat m;
m.print();
m.addCoins(TYVE,1);
m.addCoins(TI,3);
m.print();

m.veksel(FEMTI);
m.print();
m.addCoins(TYVE,3);
m.veksel(INVALID);
m.veksel(FEMTI);
m.print();
m.addCoins(TYVE,3);
m.veksel(EN_HUND);
m.print();

_getch();
return 0;
}

هدر automat.h



#ifndef GUARD_Automat_h
#define GUARD_Automat_h
#include <iostream>
#include <string>
#include<conio.h>
#include <map>
using namespace std;

int ialt;
enum coinType {TI=10,TYVE=20};
enum seddelType {FEMTI=50,EN_HUND=100,TO_HUND=200,TRE_HUND=300,FEM _HUND=500, INVALID};

int temp, temp1;
int antalTi, antalTyve;



struct indhold {coinType type; int antal;};


class Automat
{
public:

void addCoins(coinType c,int antal);
void print();
void veksel(seddelType s);


private:

struct notEnoughMoney{};
notEnoughMoney not;
indhold saldo;
map <coinType, indhold> indholdMap;
void opdaterSaldo();
void udRegn(int amount);
};

void Automat::udRegn(int amount)
{
ialt=0;
opdaterSaldo();

map<coinType, indhold>::iterator searchTyve;

searchTyve=indholdMap.find(TYVE);
antalTyve=searchTyve->second.antal;


map<coinType, indhold>::iterator searchTi;
searchTi=indholdMap.find(TI);
antalTi=searchTi->second.antal;
ialt;



if (amount>ialt)
{
cout<< endl << "Der er ikke nok mønter i vekselautomat." << endl;
}


else
{
if (amount != FEMTI) //dvs der ønskes veksles en 100, 200 eller 500 kroneseddel.
{
try
{
if ((amount/TYVE)<=antalTyve)
{
cout << endl << amount << "-kroneseddelen er vekslet til " << (amount/TYVE) << "stk. 20-kronemønter." << endl;
searchTyve->second.antal = (antalTyve - (amount/TYVE)); //FEJLEN VAR HER!!!!! searchTyve->second.antal = (antalTyve - (amount/TYVE));
}
else if ((amount/TYVE)-antalTyve<=(2*antalTi) && antalTyve !=0)
{
temp = antalTyve;
temp1 = (amount-(antalTyve*TYVE))/TI;
cout << endl << amount << "-kroneseddelen er vekslet til " << temp << "stk. 20-kronemønter og" << endl;
cout << temp1 << "stk. 10-kronemønter" << endl;
searchTyve->second.antal= 0;
searchTi->second.antal= antalTi-temp1;
}
else if (antalTyve==0 && (amount/antalTi)<=(amount/TI))
{
temp = amount/TI;
cout << endl << amount << "-kroneseddelen er vekslet til " << temp << "stk. 10-kronemønter" << endl;
searchTi->second.antal = antalTi-TI;
}
else
{
throw not;
}
}

catch (struct notEnoughMoney)
{
cout<< endl << "mslik mslik mslik mslik mslik." << endl;//cout << endl << "test test test"; //skal kastes notEnoughMoney?
}


}

else //dvs der ønsked veksles en 50 kroneseddel.
{
try
{
if (antalTi==0)
{
throw not;

}
else if (antalTyve==0)
{
temp1 = 5;
cout << endl << amount <<"-kroneseddelsen er vekslet til " << temp1 << "stk. 10-kronemønster." << endl;
searchTi->second.antal=(antalTi-5);
}
else if(antalTyve==1)
{
temp = 1;
temp1 = 3;
cout << endl << amount << "-kroneseddelen er vekslet til " << temp << "stk. 20-kronemønster og" << endl;
cout << temp1 << "stk. 10-kronemønter" << endl;
searchTyve->second.antal=0;
searchTi->second.antal=antalTi-temp1;
}
else
{
temp = 2;
temp1 = 1;
cout << endl << amount << "-kroneseddelen er vekslet til " << temp << "stk. 20-kronemønster og" << endl;
cout << temp1 << "stk. 10-kronemønter" << endl;
searchTyve->second.antal=(antalTyve-2);
searchTi->second.antal=antalTi-temp1;
}
}

catch (struct notEnoughMoney)
{

cout << endl << "Kroneseddelen kan ikke vekslet, vekselautomat mangler tier\n";//dvs vekselautomat skal have mindst en tier.
}

}

}



}

void Automat::opdaterSaldo()
{
map<coinType, indhold>::iterator saldo;
saldo = indholdMap.begin();
while(saldo != indholdMap.end())
{
int antal= saldo-> second.antal;
int type= saldo-> second.type;
ialt=ialt+(antal*type);
saldo++;
}

}

void Automat::addCoins(coinType c,int antal)
{

std::map<coinType, indhold>::iterator search;
search = indholdMap.find(c);
if(search != indholdMap.end() )
{
search->second.type = c;
temp = search->second.antal;
search->second.antal = antal + temp;
indholdMap.insert(pair<coinType, indhold>(c,saldo));
}
else
{
saldo.type = c;
saldo.antal = antal;
indholdMap.insert(pair<coinType, indhold>(c,saldo));
}

}
void Automat::print()
{
system("color ED");
map<coinType, indhold>::iterator print;
print = indholdMap.begin();
if (print == indholdMap.end())
{
std::cout<<std::endl;
std::cout << "Der er ingen mQnter i automaten!" << std::endl;
}
else
{
ialt=0;

std::cout<<std::endl;
cout<< " STATUS FOR AUTOMATEN " << endl;
cout<< "*****************************************" << endl;
cout<<"* Antal:\t\tMønttype:\t*"<<endl;
while(print != indholdMap.end())
{
cout << "* " << print-> second.antal << " stk.\t\t";
int antal= print-> second.antal;
cout << print-> second.type << " kr.\t\t*" <<endl;
int type=print-> second.type;

ialt=ialt+(antal*type);
print++;
}
cout << "* ----------------------------------- *" << endl;
cout << "* Total saldo:\t\t" << ialt << " kr.\t\t*" << endl;
cout<< "*****************************************" << endl;
cout<<"\t Vekselautomat Malik'n Farhad A/S" << endl;
}
// << endl << endl;
}

void Automat::veksel(seddelType s)
{

if (s==INVALID)
{
cout << endl << "Seddel ej gyldig." << endl;
}
else
{
udRegn(s);
}
}





#endif

farhadamin
جمعه 23 فروردین 1387, 00:18 صبح
سلام من یک مشکلی داشتم باید تمام تابع هایی که در کلاس تعریف کردم... توی یک cpp فایل مخصوص خودش قرار بدم.... اما وقتی این کارو می کنم نمی تونم به تابع هایی که توی قسمت خصوصی تابع تغریف شده اند دسترسی داشته باشم... که مجبورم همه را در قسمت عمومی قرار بدم... تا تازه بازم هم پیغامی در یافت می کنم که برخی از الکمنت ها که در هدر هست جند بار معرفی شده اند... که راه حل این مشکل را نمی دونم....البته اینکلود هدر را در cpp تابع ها دارم.. .. منظورم تمام تابغ های است که در زیر کلاس به کار بردم... ممنون

Nima_NF
جمعه 23 فروردین 1387, 00:47 صبح
شما فقط باید قالب کلاس را در فایل .h تعریف کنید و سپس تمامی تعاریف متد های کلاس را (توابع کلاس را) خارج از فایل هدر و در داخل فایل .cpp دیگری تعریف کنید (هدر نیز include شود)
در حالی که در برنامه اخر شما همه را در یک فایل هدر تعریف کرده اید.

ضمنا توابع private فقط توسط سایر متدهای خود کلاس قابل دسترسی هستند، پس برای اینکه بتوانید از متد ها در کل برنامه و در هرجایی خارج از کلاس استفاده کنید باید آن ها را به صورت public تعریف کنید (همراه متغیر ها را private تعریف کنید)

توجه کنید که در برنامه نویسی شئی گرا برای کپسوله سازی درست تاجای ممکن نباید از متغیرهایی که خارج از کلاس تعریف شده اند استفاده کنید؛ در حالی که برخی از آنها از جمله temp را در خارج کلاس تعریف کرده اید اما از آنها داخل کلاس استفاده کرده اید.

farhadamin
جمعه 23 فروردین 1387, 19:28 عصر
ممنون نیما جان مشکل رفع شده .. اما منظورت را از این که temp را در کلاس استفاده کرده ام نفهمیدن... منظورت هر دوی temp , temp1 بود. می شه یک مقدار توضیح بدی کجای کد را منظورت هست...ممنون

Nima_NF
شنبه 24 فروردین 1387, 00:10 صبح
بله منظور کل متغیر های خارج کلاس هست:



int ialt;
enum coinType {TI=10,TYVE=20};
enum seddelType {FEMTI=50,EN_HUND=100,TO_HUND=200,TRE_HUND=300,FEM _HUND=500, INVALID};

int temp, temp1;
int antalTi, antalTyve;

از آنجایی که این مقادیر در کلاس استفاده و مقداردهی می شوند بهتر هست در خود کلاس به صورت private تعریف شوند و هرگاه خواستید از ان ها در سایر کلاس ها و یا در خارج کلاس از آن ها استفاده کنید و یا آن ها نمایش دهید فقط کافیست که یک متد public در کلاس تعریف کنید که مقدار متغیر مورد نظر را برگرداند و یا هر روش دیگر، مثلا یک struct حاوی چندین متغیر را برگرداند و این یعنی کپسوله سازی درست ، برای مثال:



// temp1 is private

int Automat::GetData( )
{
return temp1 ;
}

تا جای ممکن از متغیر های عمومی استفاده نکنید

farhadamin
شنبه 24 فروردین 1387, 19:36 عصر
هدر


#ifndef GUARD_Automat_h
#define GUARD_Automat_h
#include <iostream>
#include <string>
#include <conio.h>
#include <map>


enum coinType {TI=10,TYVE=20};
enum seddelType {FEMTI=50,EN_HUND=100,TO_HUND=200,TRE_HUND=300,FEM _HUND=500, INVALID};


using namespace std;
struct indhold {coinType type; int antal;};
struct notEnoughMoney{};

class Automat
{
public:

void addCoins(coinType c,int antal);
void print();
void veksel(seddelType s);

private:
int temp, temp1;
int antalTi, antalTyve;
int ialt;

indhold saldo;
map <coinType, indhold> indholdMap;

void opdaterSaldo();
void udRegn(int amount);
void printVeksel();
void printAddCoins();
void reset();
};
#endif


cpp ها


#include "Automat.h"

int main()
{
system("color ED");

Automat m;
m.print();
m.addCoins( TYVE, 1 );
m.addCoins( TI, 3 );
m.print();

m.veksel(FEMTI);
m.print();
m.addCoins( TYVE, 3 );
m.veksel(INVALID);
m.veksel(FEMTI);
m.print();
m.addCoins( TYVE, 3 );
m.veksel(EN_HUND);
m.print();

_getch();
return 0;
}
و cpp توابع


#include "Automat.h"


void Automat::reset()
{
addCoins(TYVE,0);
addCoins(TI,0);
ialt=0;
}



void Automat::veksel(seddelType s)
{
int i=0;
if (s==INVALID)
{

cout << endl;
cout << "\n\n\n******************************************** *****" << endl;
cout << "*\t\t\tFEJL:\t\t\t*" << endl;
cout << "* --------------------------------------------- *" << endl;
cout << "*\t\t!Seddel ej gyldig!\t\t*" << endl;
cout << "*************************************************" << endl;
cout << "\t\t";
system("DATE/t");
cout << "\t\t";
system("TIME/t");
cout << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;


}
else
{
try {
udRegn(s);
}
catch (notEnoughMoney)
{
cout << endl << "\n\n\n******************************************** *****" << endl;
cout << "*\t\t\tFEJL:\t\t\t*" << endl;
cout << "* --------------------------------------------- *" << endl;
cout << "*\t!Der er ikke det rette antal mQnter!\t*" << endl;
cout << "*************************************************" << endl;//dvs vekselautomat skal have mindst en tier. cout << "\n";
cout << "\t\t";
system("DATE/t");
cout << "\t\t";
system("TIME/t");
cout << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
}
}


}


void Automat::udRegn(int amount)
{
reset();
opdaterSaldo();

map<coinType, indhold>::iterator searchTyve;
searchTyve=indholdMap.find(TYVE);
antalTyve=searchTyve->second.antal;

map<coinType, indhold>::iterator searchTi;
searchTi=indholdMap.find(TI);
antalTi=searchTi->second.antal;

if (amount>ialt)
{
throw notEnoughMoney();
}

else
{
if (amount != FEMTI) //dvs der ønskes veksles en 100, 200 eller 500 kroneseddel.
{
if ((amount/TYVE)<=antalTyve)
{
temp=amount/TYVE;
cout << endl << "*************************************************" << endl;
cout << "*\t" << amount << "-kroneseddelen er vekslet til:\t*" << endl;
cout << "* --------------------------------------------- *" << endl;
cout << "*\t\t\t\t\t\t*" << endl;
cout << "*\t" << temp << "stk.\t\t20-kronemQnter\t\t*" << endl;
cout << "*\t\t\t\t\t\t*" << endl;
cout << "*************************************************" << endl;
cout<<"\t\t Vekselautomat Malik'n Farhad A/S" << endl << endl << endl << endl;
searchTyve->second.antal = (antalTyve - temp);
}
else if ((amount/TYVE)-antalTyve<=(2*antalTi) && antalTyve !=0)
{
temp = antalTyve;
temp1 = (amount-(antalTyve*TYVE))/TI;
cout << endl << "*************************************************" << endl;
cout << "*\t" << amount << "-kroneseddelen er vekslet til:\t*" << endl;
cout << "* --------------------------------------------- *" << endl;
cout << "*\t\t\t\t\t\t*" << endl;
cout << "*\t" << temp << "stk.\t\t20-kronemQnter\t\t*" << endl;
cout << "*\t" << temp1 << "stk.\t\t10-kronemQnter\t\t*" << endl;
cout << "*\t\t\t\t\t\t*" << endl;
cout << "*************************************************" << endl;
cout<<"\t\t Vekselautomat Malik'n Farhad A/S" << endl << endl << endl << endl;
searchTyve->second.antal= 0;
searchTi->second.antal= antalTi-temp1;
}

else //if (antalTyve==0 && (amount/antalTi)<=(amount/TI))
{
temp = amount/TI;
cout << endl << "*************************************************" << endl;
cout << "*\t" << amount << "-kroneseddelen er vekslet til:\t*" << endl;
cout << "* --------------------------------------------- *" << endl;
cout << "*\t\t\t\t\t\t*" << endl;
cout << "*\t" << temp << "stk.\t\t10-kronemQnter\t\t*" << endl;
cout << "*\t\t\t\t\t\t*" << endl;
cout << "*************************************************" << endl;
cout<<"\t\t Vekselautomat Malik'n Farhad A/S" << endl << endl << endl << endl;
searchTi->second.antal = antalTi-temp;
}
}
else //dvs der ønsked veksles en 50 kroneseddel.
{

if (antalTi==0)
{
throw notEnoughMoney();

}
else if (antalTyve==0)
{
temp1 = 5;
cout << endl << "*************************************************" << endl;
cout << "*\t" << amount << "-kroneseddelen er vekslet til:\t*" << endl;
cout << "* --------------------------------------------- *" << endl;
cout << "*\t\t\t\t\t\t*" << endl;
cout << "*\t" << temp1 << "stk.\t\t10-kronemQnter\t\t*" << endl;
cout << "*\t\t\t\t\t\t*" << endl;
cout << "*************************************************" << endl;
cout<<"\t\t Vekselautomat Malik'n Farhad A/S" << endl << endl << endl << endl;
searchTi->second.antal=(antalTi-5);
}
else if(antalTyve==1)
{
temp = 1;
temp1 = 3;
cout << endl << "*************************************************" << endl;
cout << "*\t" << amount << "-kroneseddelen er vekslet til:\t*" << endl;
cout << "* --------------------------------------------- *" << endl;
cout << "*\t\t\t\t\t\t*" << endl;
cout << "*\t" << temp << "stk.\t\t20-kronemQnter\t\t*" << endl;
cout << "*\t" << temp1 << "stk.\t\t10-kronemQnter\t\t*" << endl;
cout << "*\t\t\t\t\t\t*" << endl;
cout << "*************************************************" << endl;
cout<<"\t\t Vekselautomat Malik'n Farhad A/S" << endl << endl << endl << endl;
searchTyve->second.antal=0;
searchTi->second.antal=antalTi-temp1;
}
else
{
temp = 2;
temp1 = 1;
cout << endl << "*************************************************" << endl;
cout << "*\t" << amount << "-kroneseddelen er vekslet til:\t*" << endl;
cout << "* --------------------------------------------- *" << endl;
cout << "*\t\t\t\t\t\t*" << endl;
cout << "*\t" << temp << "stk.\t\t20-kronemQnter\t\t*" << endl;
cout << "*\t" << temp1 << "stk.\t\t10-kronemQnter\t\t*" << endl;
cout << "*\t\t\t\t\t\t*" << endl;
cout << "*************************************************" << endl;
cout<<"\t\t Vekselautomat Malik'n Farhad A/S" << endl << endl << endl << endl;
searchTyve->second.antal=(antalTyve-2);
searchTi->second.antal=antalTi-temp1;
}


}

}



}

void Automat::opdaterSaldo()
{
map<coinType, indhold>::iterator saldo;
saldo = indholdMap.begin();

while(saldo != indholdMap.end())
{
int antal= saldo-> second.antal;
int type= saldo-> second.type;
ialt=ialt+(antal*type);
saldo++;
}

}


void Automat::addCoins(coinType c,int antal)
{
std::map<coinType, indhold>::iterator search;
search = indholdMap.find(c);

if(search != indholdMap.end() )
{
search->second.type = c;
temp = search->second.antal;
search->second.antal = antal + temp;
indholdMap.insert(pair<coinType, indhold>(c,saldo));
if (antal == 0)
{
}
else
{
cout <<"\n\n********************************************** ***" << endl;
cout << "*\t\tDer er tilføjet:\t\t*" << endl;
cout << "* --------------------------------------------- *" << endl;
cout << "*\t\t\t\t\t\t*" << endl;
cout << "*\t\t" << antal << "stk.\t" << c << "-kronemQnter\t\t*" << endl;
cout << "*\t\t\t\t\t\t*" << endl;
cout << "*************************************************" << endl;
cout<<"\t\t Vekselautomat Malik'n Farhad A/S" << endl << endl << endl;
}
}
else
{
saldo.type = c;
saldo.antal = antal;
indholdMap.insert(pair<coinType, indhold>(c,saldo));
if (antal == 0)
{
}
else
{
cout <<"\n\n********************************************** ***" << endl;
cout << "*\t\tDer er tilføjet:\t\t*" << endl;
cout << "* --------------------------------------------- *" << endl;
cout << "*\t\t\t\t\t\t*" << endl;
cout << "*\t\t" << antal << "stk.\t" << c << "-kronemQnter\t\t*" << endl;
cout << "*\t\t\t\t\t\t*" << endl;
cout << "*************************************************" << endl;
cout<<"\t\t Vekselautomat Malik'n Farhad A/S" << endl << endl << endl;
}
}
}


void Automat::print()
{

int i=0;
map<coinType, indhold>::iterator print;
print = indholdMap.begin();

if (print == indholdMap.end())
{

cout << "\n\n********************************************** ***" << endl;
cout << "*\t\tOBSERVATION:\t\t\t*" << endl;
cout << "* --------------------------------------------- *" << endl;
cout << "*\t\tAutomaten er tom!\t\t*" << endl;
cout << "*************************************************" << endl;// << endl << endl << endl;

}
else
{
ialt=0;
std::cout<<std::endl;
cout<< "\n\n********************************************** ***" << endl;
cout<< "*\t\tSTATUS FOR AUTOMATEN\t\t*" << endl;
cout << "* --------------------------------------------- *" << endl;
cout << "*\t\t\t\t\t\t*" << endl;
cout<<"*\tAntal:\t\t\tMønttype:\t*"<<endl;
while(print != indholdMap.end())
{
cout << "*\t" << print-> second.antal << " stk.\t\t\t";
int antal= print-> second.antal;
cout << print-> second.type << " kr.\t\t*" <<endl;
int type=print-> second.type;

ialt=ialt+(antal*type);
print++;
}
cout << "* --------------------------------------------- *" << endl;
cout << "*\tTotal saldo:\t\t" << ialt << " kr.\t\t*" << endl;
cout << "*\t\t\t\t\t\t*" << endl;
cout << "*************************************************" << endl;
cout<<"\t\t Vekselautomat Malik'n Farhad A/S" << endl << endl << endl;
}
}



ممنون می شم اگر اشکالی دیدید بهم بگید.... ممنون