PDA

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



suraty
پنج شنبه 19 آبان 1390, 01:35 صبح
سلام
برنامه ای بنویسید که دارای بخش های زیر باشد.
الف) تابع اول شی از کلاس را برگرداند که توسط آن شماره دانشجویی را در آرایه 10 عنصری کلاس جستجو کند.
ب) اعضای داده ای اختصاصی کلاس 10 دانشجو به همراه کد دانشجویی و معدل آنها را نگهدارد.
ج) سازنده ای که اعضای داده ای کلاس را مقدار دهی کند.
د) تابع 10 دانشجو را به ترتیب معدل به صورت صعودی مرتب نماید.(با استفاده از انتساب اشیا)
ه) تابع سوم بتواند عملیات انتساب اشیا را انجام دهد.(فرض کنید این تابع بخواهد max معدل ها را محاسبه نماید.)
من این برنامه رو به شکل زیر نوشتم که کار می کرد، اما برنامه ام اصلا بهینه نیست. مثلا در قسمت جستجو و محاسبه ماکزیمم معدل عملیات انتساب اشیا بی جهت استفاده شده.
می خواستم اگه می تونید کمکم کنید که بتونم برنامه رو بهینه تر بنویسم.





#include"iostream.h"

#include"conio.h"

class class1{

int c[10];

float ave[10];

public:

class1(){

for(int i=0;i<10;i++){

c[i]=0;

ave[i]=0;}

}

void input(){

for(int i=0;i<10;i++)

cin>>c[i]>>ave[i];

}

void show(){

for(int i=0;i<10;i++)

cout<<"code="<<c[i]<<" ave="<<ave[i]<<"\n";

}

friend class1 fun1(int a,class1 ob);

friend class1 fun2(class1 ob);

friend class1 fun3(class1 ob);

};

class1 fun1(int a,class1 ob){

for(int i=0;i<10;i++)

if(ob.c[i]==a)

cout<<"find\n";

else

cout<"not find\n";

return ob; }

class1 fun2(class1 ob){

int a;

float b;

for(int i=0;i<9;i++)

for(int j=0;j<9;j++)

if(ob.ave[j]>ob.ave[j+1]){

b=ob.ave[j];

a=ob.c[j];

ob.ave[j]=ob.ave[j+1];

ob.c[j]=ob.c[j+1];

ob.ave[j+1]=b;

ob.c[j+1]=a;

}

return ob;

}

class1 fun3(class1 ob){

float max=0;

for(int i=0;i<10;i++){

if(ob.ave[i]>max)

max=ob.ave[i];}

cout<<max;

return ob; }

int main(){

class1 ob1,ob2;

ob1.input();

int n;

cin>>n;

ob2=fun1(n,ob1);

ob2=fun2(ob1);

ob2.show();

ob2=fun3(ob1);

return 0;

}

suraty
پنج شنبه 19 آبان 1390, 16:01 عصر
سلام
چون کدهای برنامه بالا تو یه خط نوشته شده سوال و کدها رو دوباره می نویسم.
برنامه ای بنویسید که دارای بخش های زیر باشد.
الف) تابع اول شی از کلاس را برگرداند که توسط آن شماره دانشجویی را در آرایه 10 عنصری کلاس جستجو کند.
ب) اعضای داده ای اختصاصی کلاس 10 دانشجو به همراه کد دانشجویی و معدل آنها را نگهدارد.
ج) سازنده ای که اعضای داده ای کلاس را مقدار دهی کند.
د) تابع 10 دانشجو را به ترتیب معدل به صورت صعودی مرتب نماید.(با استفاده از انتساب اشیا)
ه) تابع سوم بتواند عملیات انتساب اشیا را انجام دهد.(فرض کنید این تابع بخواهد max معدل ها را محاسبه نماید.)
من این برنامه رو به شکل زیر نوشتم که کار می کرد، اما برنامه ام اصلا بهینه نیست. مثلا در قسمت جستجو و محاسبه ماکزیمم معدل عملیات انتساب اشیا بی جهت استفاده شده.
می خواستم اگه می تونید کمکم کنید که بتونم برنامه رو بهینه تر بنویسم.



#include"iostream.h"

#include"conio.h"

class class1{

int c[10];

float ave[10];

public:

class1(){

for(int i=0;i<10;i++){

c[i]=0;

ave[i]=0;}

}

void input(){

for(int i=0;i<10;i++)

cin>>c[i]>>ave[i];

}

void show(){

for(int i=0;i<10;i++)

cout<<"code="<<c[i]<<" ave="<<ave[i]<<"\n";

}

friend class1 fun1(int a,class1 ob);

friend class1 fun2(class1 ob);

friend class1 fun3(class1 ob);

};

class1 fun1(int a,class1 ob){

for(int i=0;i<10;i++)

if(ob.c[i]==a)

cout<<"find\n";

else

cout<"not find\n";

return ob; }

class1 fun2(class1 ob){

int a;

float b;

for(int i=0;i<9;i++)

for(int j=0;j<9;j++)

if(ob.ave[j]>ob.ave[j+1]){

b=ob.ave[j];

a=ob.c[j];

ob.ave[j]=ob.ave[j+1];

ob.c[j]=ob.c[j+1];

ob.ave[j+1]=b;

ob.c[j+1]=a;

}

return ob;

}

class1 fun3(class1 ob){

float max=0;

for(int i=0;i<10;i++){

if(ob.ave[i]>max)

max=ob.ave[i];}

cout<<max;

return ob; }

int main(){

class1 ob1,ob2;

ob1.input();

int n;

cin>>n;

ob2=fun1(n,ob1);

ob2=fun2(ob1);

ob2.show();

ob2=fun3(ob1);

return 0;

}

Farzandekurosh
پنج شنبه 19 آبان 1390, 21:32 عصر
#include "iostream.h"
#include "conio.h"

class class1
{
int code;
float avg;
public:

class1() { code=0; avg=0; } //constructure
}
//------------------------------
void input() { cin>>c>>avg; }
//------------------------------
void show()
{
cout<<"code="<<code<<" ave="<<avg<<"\n";
}
//-------------------------------
friend int search1(int key,class1 ob[]); //search key
friend void sort1(class1 ob); //sort ob by linear sorting
friend class1 findmax(class1 ob[]); //find max avg
};

int search1(int key,class1 ob[])
{
for(int i=0;i<10;i++)
if(ob[i].code==key)
return i;
return -1;
}

void sort1(class1 ob[])
{
class1 temp;

for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
if(ob[j].avg > ob[j+1].avg])
{
temp = ob[j] ;
ob[j] = ob[j+1];
ob[j+1] = temp ;
}
}

class1 findmax(class1 ob[])
{

int max=0;
for(int i=1;i<10;i++)
{
if(ob[max].avg > ob[i])
max = i;
}
return ob[max];
}
//--------------------------------------------------------------
int main()
{
class1 ob1[10],ob2[10];

ob1.input();

for (int i=0;i<10;i++)
cin>>ob1[i].code>>ob1[i].avg;

sort1(ob1);
ob2 = ob1; //entesab
int n;
cin>>n;

if ( i = search1(n,ob1) != -1)
cout <<"item was found index : "<<i;
else
cout <<"item was not found"<<i;

ob2.show();

class1 max = findmax(ob2);
return 0;

}


تغییرات :

- تو کدنویسی باید ایندنت یا همون تورفتگی رو رعایت کنی اینطوری کد خوانا میشه .
- استفاده از آرایه ای از اشیا به جای استفاده از یک شی که عناصر رو توش آرایه گرفته بودی.
فرض کن یه پلاستیک سیب داری و میخوای پوست سیب ها رو بکنی .
میتونی چاقو برداری و دست بکنی توپلاستیک و پوستشون رو بکنی .
میتونی سیب ها رو یکی یکی بیرون بیاری و پوست بکنی .
هر دو تا راه جواب میده ولی به نظر خودت کدوم بهتره ؟

- تابع search ی که نوشته بودی فقط وجود یا عدم وجود کلید مورد جستجو رو گزارش میده و خروجی بی معنیی داشت .
چون یه شی فرستادی به تابع و توش جستجو انجام دادی (بدون هیچ تغییری) و دوباره return ش کردی معمولا خروجی توابع
جستجو اندیس یا مکان کلید جستجو در لیست مورد نظر است که اگر پیدا نشد 1- رو برمیگردونه و این موضوع باید جایی که
میخوای ازش استفاده کنی چک بشه (اینجا main) .

- ورودی توابعت آرایه ای از اشیاست

یه سوال چرا تگ ++c برای من نشون داده نمیشه مشکل از مرورگر منه یا کلا از کار افتاده ؟؟؟