PDA

View Full Version : سوال: راهنمایی برای نوشتن پروژه



mohammaddx
سه شنبه 06 مرداد 1394, 19:42 عصر
با سلام به همه ی برنامه نویسان عزیز.برای پروژه برنامه سازی پیشرفته نیاز به راهنمایی شما دارم و وقت زیادی هم ندارم.لطفا کمکم کنید.
سیستم مدیریت محصولات کارخانه اتومبیل‌سازی
هدف از این پروژه طراحی یک سیستم ذخیره‌سازی شی‌گرا جهت نگهداری مشخصات محصولهای تولیدی یک کارخانه تولید خودرو می‌باشد. سیستم تولیدی مشخصات محصولات را در یک ساختار درختی سلسله مراتبی در داخل حافظه نگهداری می‌نماید و سپس براساس نوع پرس و جوهای ارسالی به آن در داخل حافظه جستجو نموده و جواب مورد نیاز را باز می‌گرداند.
تمامی آنچه که در حافظه ذخیره گردیده است باید در انتهای کار برنامه به داخل یک فایل خروجی که نام آنرا کاربر مشخص می‌نماید منتقل گردد. در زمان شروع بکار مجدد برنامه، کاربر می تواند نام یکی از فایلهای خروجی که قبلا ایجاد شده‌اند را وارد نماید تا فایل مورد نظر خوانده شده و در داخل حافظه بارگذاری گردد. در صورتیکه کاربر نام هیچ فایلی را مشخص ننماید، اطلاعات محصولات وارد شده توسط کاربر در حافظه ذخیره می‌گردد تا آنکه در انتهای برنامه در فایل دلخواه ذخیره گردد.
خودروهای تولیدی توسط کارخانه دارای ساختار سلسله مراتبی همانند شکل 1 می‌باشند. در رده‌های سواری، سواری وانت، کامیون و تریلر می‌باشند. از هر محصول انواع گوناگونی تولید می‌شود که مشخصات آنها با یکدیگر متفاوت می‌باشد و مثلا سواری وانتهای تولید شده توسط کارخانه می‌توانند تک دیفرانسیل و یا دو دیفرانسیل باشند. این تنوع برای تمامی انواع خودرو باید لحاظ گردد. آنگونه که در نمودار سلسله مراتبی خودروها سطح سومی نیز جهت محصولات متنوع تولیدی لحاظ می‌گردد.
133664
****************
ایا باید برای هر کدوم از اخرین زیر کلاس ها مثل استیشن ,چهار درب,تک دیفرانسیل و ... باید ارایه ای از اشیا درست کرد و اطلاعات را از طریق ان ها به فایل وارد کرد و برای دریافت از فایل ها باید روال مشابه ای را برعکس انجام بدم؟به نظر طولاتی و خسته کنندست.راه ساده تری وجود نداره؟

amirtork
سه شنبه 06 مرداد 1394, 23:05 عصر
سلام.
با توجه به اینکه ممکن هست کاربر تا انتهای برنامه نامی رو برای فایل مورد نظر انتخاب نکنه، بنابراین عملا امکان ذخیره سازی به طور مستقیم وجود نداره، و باید برنامه یک بافری داشته باشه که بتونه این اطلاعات رو تا زمان وارد شدن اسم فایل در خودش ذخیره کنه.
برای این که راحت تر بتونید این کار رو انجام بدید پیشنهاد میکنم وکتوری رو از جنس کلاس والد خودرو تعریف کنید تا قابلیت ذخیره سازی هر نوع خودرو ای رو داشته باشید بدون نیاز به استفاده از متغیر های دیگه ای. سپس بعد از ساخته شدن هر عضو، اون رو وارد وکتور کنید.
برای چاپش در فایل هم فکر میکنم با 3 خط میشه انجامش داد! خواندن از فایل هم همینطور. اگر از ورژن جدید Cpp استفاده کنید به صورت
for( ClassName name&& : VectorName) میشه این کار رو انجام داد فکر کنم. اگر هم نه که با while میتونید این کار رو انجام بدید.

mohammaddx
چهارشنبه 07 مرداد 1394, 11:08 صبح
سلام.
با توجه به اینکه ممکن هست کاربر تا انتهای برنامه نامی رو برای فایل مورد نظر انتخاب نکنه، بنابراین عملا امکان ذخیره سازی به طور مستقیم وجود نداره، و باید برنامه یک بافری داشته باشه که بتونه این اطلاعات رو تا زمان وارد شدن اسم فایل در خودش ذخیره کنه.
برای این که راحت تر بتونید این کار رو انجام بدید پیشنهاد میکنم وکتوری رو از جنس کلاس والد خودرو تعریف کنید تا قابلیت ذخیره سازی هر نوع خودرو ای رو داشته باشید بدون نیاز به استفاده از متغیر های دیگه ای. سپس بعد از ساخته شدن هر عضو، اون رو وارد وکتور کنید.
برای چاپش در فایل هم فکر میکنم با 3 خط میشه انجامش داد! خواندن از فایل هم همینطور. اگر از ورژن جدید Cpp استفاده کنید به صورت
for( ClassName name&& : VectorName) میشه این کار رو انجام داد فکر کنم. اگر هم نه که با while میتونید این کار رو انجام بدید.

اگه منظور شما را درست متوجه شدم:من باید هر کدوم از کلاس های اخرین فرزند یک شی بسازم و پس از پر کردن هر شی ان را در یک وکتور والد ذخیره کنم؟آیا ذخیره کردن اشیای فرزند در وکتور والد باعث از بین رفتن اطلاعات اختصاصی موجود در فرزند نمیشه؟

amirtork
چهارشنبه 07 مرداد 1394, 16:43 عصر
سلام مجدد
بله درست متوجه شدید، اگر خودرو ها همگی فرزندان کلاس Car باشن، بنابراین میتونید همه ی اونها رو در وکتوری از جنس Car ذخیره کنید، و در مورد از دست رفتن اطلاعات، خیر این اتفاق نمیوفته، البته به شرطی که این ذخیره سازی رو به درستی انجام بدید! وگرنه دچار Object Slicing (https://en.wikipedia.org/wiki/Object_slicing) میشید.
برای مثال کد زیر رو مطالعه کنید.
#include <iostream>
#include <vector>
using namespace std;

class Parent
{
public:
Parent();
virtual int getAge() {return age;}
private:
int age;
};
Parent::Parent()
{
age = 1;
}
class Child : public Parent
{
public:
Child();
int getAge() {return myage;}
private:
int myage;
};
Child::Child()
{
myage = 0;
}



int main()
{
vector<Parent*> v1;
Parent p1;
Child c1;
v1.push_back(&c1);
v1.push_back(&p1);
cout<<v1[0]->getAge()<<endl;
cout<<v1[1]->getAge()<<endl;
return 0;

}

mohammaddx
چهارشنبه 07 مرداد 1394, 17:58 عصر
سلام مجدد
بله درست متوجه شدید، اگر خودرو ها همگی فرزندان کلاس Car باشن، بنابراین میتونید همه ی اونها رو در وکتوری از جنس Car ذخیره کنید، و در مورد از دست رفتن اطلاعات، خیر این اتفاق نمیوفته، البته به شرطی که این ذخیره سازی رو به درستی انجام بدید! وگرنه دچار Object Slicing (https://en.wikipedia.org/wiki/Object_slicing) میشید.
برای مثال کد زیر رو مطالعه کنید.
#include <iostream>
#include <vector>
using namespace std;

class Parent
{
public:
Parent();
virtual int getAge() {return age;}
private:
int age;
};
Parent::Parent()
{
age = 1;
}
class Child : public Parent
{
public:
Child();
int getAge() {return myage;}
private:
int myage;
};
Child::Child()
{
myage = 0;
}



int main()
{
vector<Parent*> v1;
Parent p1;
Child c1;
v1.push_back(&c1);
v1.push_back(&p1);
cout<<v1[0]->getAge()<<endl;
cout<<v1[1]->getAge()<<endl;
return 0;

}


ممنون از لطفی که کردید.
به نتیجه ی زیر رسیدم.
اگر اشاره گر شی ای از والد به ادرس شی ای از فرزند اشاره کند در این صورت می توان:
با استفاده از خواص پلی مورفیسم (منظورم استفاده از تابع ای است که در فرزند override شده) میتوان به سایر متغییر های فرزند از طریق اشاره گر شی پدر دسترسی پیدا کرد.
آیا درسته؟

amirtork
چهارشنبه 07 مرداد 1394, 18:44 عصر
تا اونجایی که من میدونم، بله درست هست.

mohammaddx
پنج شنبه 08 مرداد 1394, 15:36 عصر
تا اونجایی که من میدونم، بله درست هست.
همان طور که شما فرمودید من همه ی اشیای فرزند را در وکتوری از جنس والد ذخیره کردم و برای نوشتن در فایل از دستور


myfile.write(reinterpret_cast<char*>(vec_mashin[count]),sizeof(؟؟؟؟؟));

استفاده کردم.اما مشکلی که وجود داره اینه که من برای ذخیره هر کدوم از خانه های وکتور باید یه سایزی را در فایل در نظر بگیرم؟ با سایر دلخواه چند بایتی این کار را انجام دادم اما هنگامی که فایل را میخونم عناصر کلاس فرزند وکتور کلاس والد جایگذاری نمیشه و برنامه ارور میده.لطفا کمک کنید/

amirtork
جمعه 09 مرداد 1394, 19:59 عصر
سلام.
در مورد سوالتون، من متوجه سوالتون شدم، اما دلیل استفاده از روشی که در بالا اشاره کردید رو متوجه نشدم! و همینطور روشتتون رو! (علتش احتمالا خستگی بیش از حد الانم هست، حدودا یک ساعت خوابیدم از دیروز!) به همین علت من روشی رو که معمولا دیدم که استفاده میشه و خودم هم از اون استفاده کردم رو توضیح میدم، انشالله که مشکلتون رفع بشه.
از اونجایی که در پروژه های مختلف ما نوع داده های جدیدی رو تعریف میکنیم، پس بهتر هست که با توجه به همین نوع داده ها، شیوه های ذخیره سازی درست اونها رو هم تعریف کنیم. برای مثال، در مثالی که من در پست قبلی استفاده کرده بودم که در مورد سن بود، با فرض اینکه موارد نام و نام خانوادگی و کد ملی رو هم به مثال اضافه کرده باشیم و قصد ذخیره سازی اون نوع داده رو در فایل داشته باشیم، مثلا من نمیخوام که کد های ملی در فایل ذخیره بشن، پس یک متود برای کلاس contacts تعریف میکنم با نام فرضی print، و در مواقعی که میخوام شی از این کلاس رو ذخیره سازی کنم، از این متود استفاده میکنم، به مثال زیر دقت کنید:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

class Parent
{
public:
Parent() {age = 0;}
Parent(int _age) {age = _age;}
virtual void print() {ofstream tmp; tmp.open("tmp.txt"); tmp<<age; tmp.close();}
virtual int getAge() {return age;}
private:
int age;
};

class Child : public Parent
{
public:
Child() {myAge = 0; firstName = ""; lastName = ""; ID = "";}
Child(int _MyAge) {myAge = _MyAge;firstName = ""; lastName = ""; ID = "";}
void print() {ofstream tmp; tmp.open("tmp.txt"); tmp<<myAge; tmp.close();}
int getAge() {return myAge;}
private:
int myAge;
string firstName;
string lastName;
string ID;
};

int main()
{
Child c1;
Child c2(2);
Child c3;
Child c4;

vector<Parent*> v1;

v1.push_back(&c1);
v1.push_back(&c2);
v1.push_back(&c3);
v1.push_back(&c4);

v1[0]->print();
v1[1]->print();
return 0;
}


در مثال بالا، در کلاس Child من اعضایی مثل نام، نام خانوادگی، آی دی و سن رو داشتم، اما در هنگام ذخیره سازی، تنها سن رو ذخیره سازی میکردم و بقیه ی اعضا رو به دلایلی ذخیره نمیکردم، همچنین در این روش مقدار موجود مقدار خود شی بود، نه شی والد.
در مورد این سوال هم که احتمالا برای شما پیش خواهد اومد در مورد ذخیره سازی در فایل ها به این روش، به طوری که اطلاعات قبلی ذخیره شده پاک نشوند، فکر میکنم با یک جست و جوی ساده بتونید به جواب برسید. در عیر این صورت اعلام بفرمایید تا من یا دوستان دیگر راهنمایی کنیم.
شب خوش.

mohammaddx
شنبه 10 مرداد 1394, 19:14 عصر
سلام.
در مورد سوالتون، من متوجه سوالتون شدم، اما دلیل استفاده از روشی که در بالا اشاره کردید رو متوجه نشدم! و همینطور روشتتون رو! (علتش احتمالا خستگی بیش از حد الانم هست، حدودا یک ساعت خوابیدم از دیروز!) به همین علت من روشی رو که معمولا دیدم که استفاده میشه و خودم هم از اون استفاده کردم رو توضیح میدم، انشالله که مشکلتون رفع بشه.
از اونجایی که در پروژه های مختلف ما نوع داده های جدیدی رو تعریف میکنیم، پس بهتر هست که با توجه به همین نوع داده ها، شیوه های ذخیره سازی درست اونها رو هم تعریف کنیم. برای مثال، در مثالی که من در پست قبلی استفاده کرده بودم که در مورد سن بود، با فرض اینکه موارد نام و نام خانوادگی و کد ملی رو هم به مثال اضافه کرده باشیم و قصد ذخیره سازی اون نوع داده رو در فایل داشته باشیم، مثلا من نمیخوام که کد های ملی در فایل ذخیره بشن، پس یک متود برای کلاس contacts تعریف میکنم با نام فرضی print، و در مواقعی که میخوام شی از این کلاس رو ذخیره سازی کنم، از این متود استفاده میکنم، به مثال زیر دقت کنید:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

class Parent
{
public:
Parent() {age = 0;}
Parent(int _age) {age = _age;}
virtual void print() {ofstream tmp; tmp.open("tmp.txt"); tmp<<age; tmp.close();}
virtual int getAge() {return age;}
private:
int age;
};

class Child : public Parent
{
public:
Child() {myAge = 0; firstName = ""; lastName = ""; ID = "";}
Child(int _MyAge) {myAge = _MyAge;firstName = ""; lastName = ""; ID = "";}
void print() {ofstream tmp; tmp.open("tmp.txt"); tmp<<myAge; tmp.close();}
int getAge() {return myAge;}
private:
int myAge;
string firstName;
string lastName;
string ID;
};

int main()
{
Child c1;
Child c2(2);
Child c3;
Child c4;

vector<Parent*> v1;

v1.push_back(&c1);
v1.push_back(&c2);
v1.push_back(&c3);
v1.push_back(&c4);

v1[0]->print();
v1[1]->print();
return 0;
}


در مثال بالا، در کلاس Child من اعضایی مثل نام، نام خانوادگی، آی دی و سن رو داشتم، اما در هنگام ذخیره سازی، تنها سن رو ذخیره سازی میکردم و بقیه ی اعضا رو به دلایلی ذخیره نمیکردم، همچنین در این روش مقدار موجود مقدار خود شی بود، نه شی والد.
در مورد این سوال هم که احتمالا برای شما پیش خواهد اومد در مورد ذخیره سازی در فایل ها به این روش، به طوری که اطلاعات قبلی ذخیره شده پاک نشوند، فکر میکنم با یک جست و جوی ساده بتونید به جواب برسید. در عیر این صورت اعلام بفرمایید تا من یا دوستان دیگر راهنمایی کنیم.
شب خوش.

بسیار ممنون بابت وقتی که گذاشتید.واقعا برای من ارزش داشت.نیو فور اندروید (http://www.new4android.ir/) سایته منه.اگه کاری دستم برمیومد خوشحال میشم کمک کنم.
خودم هم دیگه از روی ناچار همین راه پیش روی خودم میدیدم اما از اون جایی که یه ادم تنبل تو برنامه نویسی هم تنبله!دنبال کوتاه ترین راه بودم که این راه تو ذخیره سازی کلی یک شی میدیدم و واقعا هم برای ذخیره سازی یک شی از یک کلاس بسیار عالی عمل میکنه و کل شی را در یک خط ذخیره میکنه ولی تو این یک مورد خاص که باید عناصر شی فرزند را هم ذخیره میکرد نشد که نشد!البته محتویات فایل را نگاه میکنم عناصر شی فرزند را میبینم ولی در بازخوانی برای مشکل میخوره!

amirtork
یک شنبه 11 مرداد 1394, 16:45 عصر
سلام مجدد.
خواهش میکنم، خوشحال هستم که تونستم کمکی کنم.
اگر کمک دیگری هم از دستم بر میاد، بفرمایید. در حد توان کمک میکنم.
در مورد مشکل در بازخوانی، اگر یک مقدار توضیح بیشتر بدید شاید مشکل رو بشه رفع کرد، البته اگر تا به حال این بخش از پروژه رو به اتمام نرسونده باشید.