PDA

View Full Version : راهنمایی در استفاده از ساختمان در کلاسها



rasool1110
چهارشنبه 18 دی 1387, 23:11 عصر
با سلام به دوستان
من یه برنامه دارم می نویسم که اطلاعات اون به این صورته :
یک استراکت با چهار متغیر از نوع رشته که توسط تابعی مقادیر رو میگیره و خروجیش هم از نوع استراکت است
یک کلاس شامل یک اینتیجر دو رشته و یک متغیر از نوع استراکت بالا که توسط توابعی مقادیر اینتیجر و دو رشته دیگر را گرفته
و سپس سازنده ای که مقادیر گرفته شده از تابع استراکت و تابعهای کلاس را در مقادیر کلاس میریزد
یک آرایه از نوع کلاس بالا که آرایه پویا بوده و طول آن از تابعی که اطلاعات را از فایلی می خواند و تعداد سطرها را میشمارد بدست می آید سپس مقادیر فایل در آرایه کپی شده و برنامه شروع می شود
حالا اطلاعات روی ram سیستم قرار دارد و کاربر می تواند این اطلاعات را ادیت یا به آن اضافه یا از آن کم کند
حالا سوال من اینه که :
1. چطور میتونم از استراکت در کلاس استفاده کنم و توسط سازنده به مقادیر کلاس که شامل استراکت هم هست مقدار دهی کنم
2. چطور آرایه ای از کلاس پیاده سازی کنم
3. چطور تعداد سطرهای فایل رو بشمارم
ممنون میشم اگه منو راهنمایی کنید

ميثم طاهري
چهارشنبه 18 دی 1387, 23:23 عصر
كدوتونو تا اونجا كه نوشتيد بذاريد تا دوستان بهتر بتونن راهنماييتون كنن

rasool1110
چهارشنبه 18 دی 1387, 23:43 عصر
كدوتونو تا اونجا كه نوشتيد بذاريد تا دوستان بهتر بتونن راهنماييتون كنن

تعریف استراکت// struct cinfo {
char tel[8];
char email[40];
char mobile[12];
char address[51];
تعریف استراکت//}
تعریف کلاس//class person
{
int id;
char fname[25];
char lname[25];
struct cinfo contactinfo;
public:
person();
person(int,char,char,struct cinfo);
تابعی که به استراکت مقدار میدهد و مقادیر از کاربر گرفته می شود setinfo(char,char,char,char);
تابع گرفتن مقدار اینتیجر از کاربر برای کلاس int getid();
تابع گرفتن مقدار رشته از کاربر برای کلاس char getfname();
تابع گرفتن مقدار رشته از کاربر برای کلاس char getlname();
تابع گرفتن مقدار استراکت از کاربر برای کلاس cinfo getcontactinfo();
};
enum sorttype
{
id,
fn,
ln,
tel
//از اینجا به بعد رو مشکل دارم که چطور آرایه رو پیاده سازی کنم}
class personlist{
person list;
int count;
char filename;
public:
تابع لود فایل در آرایه و شمارش رکوردها از فایلی که برای برنامه در نظر گرفته شده load();
تابعی که در منو از کاربر میپرسه که قبل از خروج اطلاعات ذخیره بشه یا نه save();
تابع مرتب کردن مقادیر خروجی براساس یکی از مقادیر sort(sorttype);
تابعی برای حذف یک رکورد از آرایه bool Delete(int id);
تابعی برای جستجوی یک رکورد خاص pesronfind(int id);
personfind(char firstn);
personfind(char lastn);
personfind(char fn,char ln);
تابعی برای اضافه کردن یک رکورد به آرایه bool add(person);
};
دوست عزیز من کلا با کلاسها و فایلها در سی ++ زیاد آشنایی ندارم اگه ممکنه راهنماییم کنید آخه تا 24 دیماه بیشتر وقت ندارم

rasool1110
پنج شنبه 19 دی 1387, 00:16 صبح
خدایاااااااااااااااا چقد جواب تا حالا ندیده بودم توعمرم اینقد فداکاری رو

Saeed_m_Farid
پنج شنبه 19 دی 1387, 01:57 صبح
خدایاااااااااااااااا چقد جواب تا حالا ندیده بودم توعمرم اینقد فداکاری رو
دوست عزيز چرا اينقدر عجله دارين:
چندتا نكته:
0- كدت رو تو تگ كد بذار كه بشه خوندش و ضمنا نيازي به اونهمه توضيح فارسي نبود. اگه اسامي توابع و اعضا رو درست بدين كد مفهوم ميشه.

1- اگه اول تعريف ساختار typedef‌ بذاري ميتوني يه نوع تعريف كني كه اولا نياز نباشه همه جا يه عبارت طولاي واسه ساختارت بياري و ثانيا بتوني نوع اشاره گرش رو هم تعريف كني واسه استفاده هاي بعدي.
2- نيازي به تعريف دو تا كلاس نداري، همون يكي واسه آرايه كلاست كافيه.
3- واسه Delete كه تو كلاس ميخواي بذاري كارت يكم سخت ميشه و بايد تمام عناصر بعدي رو (اگه عنصري تو آرايه باشه) يه دونه شيفت بدي عقب.
4- نوع fname, lname ها رو كه char[...] تعريف كردي همه جا بايد همينطوري استفاده كني نه char خالي! و ضمنا سعي كن ساختار و نوع شمارشي و كلاسهات رو باحروف بزرگ بنويسي كه با اسامي C قاطي نشن.
5- اگه property__ واست مشكل ايجاد كرد : مستقيم از خود اعضاء خصوصي استفاده كن يعني بيارشون تو public.
پيشنهاد من استفاده از Queue يا ليست پيوندي كه كارت رو خيلي راحت تر ميكنه مخصوصا تو حذف و اضافه كردن و خيلي هم مديريتش آسونتره.

ميدوني كه كامل نميشه همه چي رو تو يه پست توضيح داد ولي اين اشكالات رو فعلا برطرف كن تا بعد اگه به مشكل خوردي ادامه بديم...




#define MAX_PERSONS 100

typedef struct _CSTDINFO{
char tel[8];
char email[40];
char mobile[12];
char address[51];
}CSTDINFO, *PSTDINFO;

enum TOKENTYPE
{
TT_UNKNOWN,
TT_ID,
TT_FNAME,
TT_LNAME,
TT_TEL,
TT_EMAIL,
TT_MOBILE,
TT_ADDRESS
};

class TPERSONLIST
{
private :
int Fid;
char Ffname[25];
char Flname[25];
CSTDINFO Fcontactinfo[ MAX_PERSONS ];

int getId();
bool setId(int id);
char* getFname();
bool setFname(char* fName);
char* getLname();
bool setLname(char* fName);

public:
int count;
person();
person(int id, char *fn, char *ln, PSTDINFO stPtr);
setinfo(char *tel,char *email,char *mobile,char *address);
PSTDINFO getcontactinfo(int id);
PSTDINFO getcontactinfo(char *token, TOKENTYPE tt);
bool addInfo(PSTDINFO stdi);
CSTDINFO load(int id);
bool sort(int id);
bool sort(char* token, TOKENTYPE tt);
bool Delete(int id);

protected:
__property int id = {read=getId, write=setId};
__property char* firstName = {read=getFname, write=setFname};
// So on for all ...
};
با تشكر.

Saeed_m_Farid
پنج شنبه 19 دی 1387, 02:55 صبح
1. چطور میتونم از استراکت در کلاس استفاده کنم و توسط سازنده به مقادیر کلاس که شامل استراکت هم هست مقدار دهی کنم
2. چطور آرایه ای از کلاس پیاده سازی کنم
3. چطور تعداد سطرهای فایل رو بشمارم 1- ورودي سازنده رو ميتوني از نوع ساختار بذاري و بعد از پياده سازي اينطوري ازش استفاده كني :


typedef TPERSONLIST* PPERSONLIST;
int main()
{
PSTDINFO psi = new CSTDINFO;
strcpy(psi->tel, "12346578");
strcpy(psi->email, "12346578");
strcpy(psi->mobile, "12346578");
strcpy(psi->address, "12346578");
PPERSONLIST pl = new TPERSONLIST(psi);
//...
return 0;
}
ولي اگه بخواي يكي يكي اعضاء ساختار رو بذاري تو سازنده بايد از داخل سازنده ساختارت رو مقداردهي كني كه اونوقت خيلي ورودي سازنده كلاست طولاني ميشه؛ مگه اينكه بخواي مقدار پيشفرض بدي كه زياد طولاني به نظر نرسه (هر كدوم رو مقداردهي نكني رشته خالي جايگزين ميشه!) :

TPERSONLIST(int id,
char *tel = "",
char *email = "",
char *mobile = "",
char *address = "",
char *fName = "",
char *lName = ""
);
2- پياده سازي نميخواد ولي اگه كلاست مدل كد من نميخواي باشه يه آرايه از كلاست تعريف بايد بكني ولي ديگه اونوقت بايد يه نوع ديگه تعريف كني كه مديريت اون كلاسها با اون باشه؛ اگه ميخواي اينكار رو بكني نحوه پياده سازي درست كلاست رو بذار تا راهنمايي كنم.
3- شما تو كدت اصلا چيزي در مورد فايل نداري ولي واسه شمردن تعداد سطرهاي فايل متني فايل رو كه باز كردي واسه خوندن تا آخرش ميري و يه شمارشگر ميذاري تا تعداد سطرها بدست بياد، يه چيزي مثل كد زير كه البته شايد راههاي خلاصه تري هم باشه ولي چون من دچار Insomnia شدم اين به ذهنم خطور نمود شايد صبحها يه روش بهتري داشته باشه!


int FileLinesCount(char *fname)
{
FILE *in;
int iCnt = 0;
if ((in = fopen(fname, "rt"))
== NULL)
{
fprintf(stderr, "Cannot open input file.\n");
return -1;
}
else
{
int c;
do {
c = fgetc (in);
if (c == '$')
iCnt++;
}
while (c != EOF);
fclose (in);
}
return iCnt;
}

پ.ن. : حالا ديدي اينقد فداكاري رو؟

rasool1110
پنج شنبه 19 دی 1387, 15:04 عصر
با سپاس از تمام شما دوستان که اینقد کمک کردین واقعا فداکارین الانم کم کم اشک شوقم جاری شد . . . ولی خارج از شوخی من معمولا به سایت گاه گداری که به مشکل برمیخورم مراجعه کردم و هر دفعه هم با کمک دوستان و ایده هایی که دادن تونستم مشکلاتمو حل کنم " کاش برای همه مشکلات راهی مثل سایت برنامه نویس بود . . . "

rasool1110
شنبه 21 دی 1387, 08:39 صبح
سلام دوستان برنامه رو باید اینجور اصلاح کنم که من میخام یه دفترچه ثبت تماس با استفاده از فایل داشته باشم که این خصوصیات رو داشته باشه :


struct info
{
char *tel;
char * email;
char *mobile;
char *address;
}
enum sorttype
{
ID,
FN,
LN,
Tel
};
class personal
{
int ID;
char *Fname;
char *Lname;
struct info contact;
public:
person();
person(int,char ,char,struct info);
int GetID();
char *GetFname();
char * GetLname();
info Getcontactinfo();
//اینجا دیگه استادمون گفته یه آرایه از کلاس تعریف شده ایجاد کنید که با اجرای برنامه یه کپی از اطلاعات رو در این آرایه قراربده که کاربر برای حذف اضافه یا ویرایش به فایل کاری نداشته باشه و با آرایه کار کنه ودر نهایت اگه خواست از برنامه خارج بشه با سوال از کاربر این آرایه رو مجددا در فایل ذخیره و یا بدون ذخیره همون فایل قبلی باقی میمونه
راستش نمیدونم برای پیاده سازی ؟آرایه به اینصورت باید عمل کرد یا نه ؟ حالا دیگه کار شما دوستان مهندس شروع میشه
class personal _list
{
person *list;
int count;
char *filename;
public:
load();
save();
sort(sorttype);
bool Delete(ID);
persobnfind(ID);
personfind(char* FN,char *LN);
bool Add(personal);


این کل پروژه بود حالا سوالات من:
1. چطور باید از استراکت در کلاس استفاده کرد ؟
2. چطور میشه استرکت رو مقداردهی کرد (با تابع لود)
3. چطور کلاس رو مقداردهی کرد؟
4. توابع گرفتن اطلاعاتبای درج رکورد ، حذف رکورد و ... رو پیاده سازی کرد ؟
5. چطور آرایه رو پیاده سازی کنم آخه آرایه باید پویا باشه و با خواندن فایل خودش طولش رو پیدا کنه ؟
6. توابع کلاس آرایه رو چطور پیاده سازی کنم ؟
7. نحوه استفاده از متغیرشمارشی در تابع مرتب کردن چجوریه ؟
8. توابع جستجو رو چطور پیاده سازی کنم ؟
خلاصه هر توضیحی که میدونید کمکم کنه رواگه بگید ممنونتون میشم آخه تا سه شنبه بیشتر وقت ندارم و مشکلم اینه که زیاد با سی ++ آشنایی ندارم و بعد از حدود یک سال و نیم که اصلا دور برنامه نویسی نبودم باید این برنامه رو تحویل استاد بدم
ممنون از هرکسی که کمکم کنه