PDA

View Full Version : سوال:مرتب کردن



ali_1369
دوشنبه 16 دی 1387, 16:05 عصر
سلام............
فرض کنید یه برنامه میخواد اسم و شماره چند نفر رو بگیره ولی تعدادشون معلوم نیست و ممکنه توی برهه های مختلف اطلاعاتشون وارد بشه ولی برنامه باید همیشه شماره هارو به صورت صعودی و اسم ها رو به ترتیب الفبا (لاتین) مرتب کنه در ضمن با فایلا ها هم باد بهشه به زبان c.
ممنون میشک کسی راهنمایی کنه

ace.coder
دوشنبه 16 دی 1387, 16:12 عصر
باید یک تابع بنویسی که مشخصات یک نفر را بگیره و در پایان تکمیل اونو را سیو کنه!
و بعد از هر سیو کردن اونا رو مرتب کنه!

ali_1369
دوشنبه 16 دی 1387, 22:48 عصر
میشه بیشتر توضیح بدی؟

Saeed_m_Farid
دوشنبه 16 دی 1387, 22:54 عصر
يه راه آسون ولي اشتباهش اينه كه شما يه محدوديتي واسه حداكثر تعداد ورودي درنظر بگيري و يه آرايه از ساختار اسم و شماره به اندازه حداكثر ايجاد كني. و در هر بار ورود اسامي آرايه رو مرتب كني...

راه دوم و درستترش درست كردن يه كلاس ليست پيونديه كه توابع ورودي ، مرتب سازي، جستجو و ذخيره در فايل رو توش پياده سازي كرده باشي و از اين ليست بتوني تو برنامه ات instance‌ درست كني و...

برنامه باید همیشه شماره هارو به صورت صعودی و اسم ها رو به ترتیب الفبا (لاتین) مرتب کنه در ضمن با فایلا ها هم باد بهشه به زبان c.اولا دو تا كه با هم نميشه مرتب كرد! بايد اولويت ايندكس داشته باشي؛ بعدش هم فكر كنم جمله آخري رو به زبان فارسي ننوشتي ...
اگه يه تكه از كد كه كار كردي يا راه حلتون رو بذاريد بهتر ميشه راهنمايي كرد.

ali_1369
سه شنبه 17 دی 1387, 16:30 عصر
سلام......من خودم اومدم یه تابع in_style تعریف کردم وقتی برنامه داره مشخصات میگیره یه متغیر مثلا ا گذاشتم که بعد از اسم گرفتن l رو یه دونه اضافه میکنه در ضمن l آرگومان تابع in_style هستش اینجوری :




void enter(void)
{
float grade, sum_grade = 0;
int t, unit, sum_unit = 0 ,j;
t = spare_space() ;
if(t == -1){
printf("\n sorry the list is full.....press any key to continue");
getch();
return ;
}
printf("\n\t enter name:") ;
gets(st[t].name) ;
l++;
clrscr();
printf("\n\tenter student number:") ;
scanf("%d", &st[t].student_number) ;
clrscr();

printf("\n\tenter number of course:") ;
scanf("%d", &st[t].amount_course) ;
clrscr();
for(j = 1; j <= st[t].amount_course; j++) {
printf("\n\t ");
printf("\n\tenter grade for course %d:",j);
scanf("%f", &grade) ;
printf("\n\t ");
;
printf("\n\tenter unit of course %d:", j);
scanf("%d", &unit) ;
sum_grade += grade * unit ;
sum_unit += unit ;
}
st[t].unit=sum_unit;
st[t].avrage = sum_grade / sum_unit ;
in_style(l);
}


void in_style(int l)
{
int i,j;
char name2[30];
struct student st1={0};
for(i=l-1;i>0;i--){
for(j=0;j<i;j++)
if(strcmp(st[j].name,st[++j].name)>0){
st1=st[j];
st[j]=st[++j];
st[++j]=st1;
}


}
return;
}






برنامه error نمیده ولی اسامی رو مرتب نمیکنه

ali_1369
پنج شنبه 19 دی 1387, 12:17 عصر
سلام......کسی جواب نمیده؟

MIDOSE
پنج شنبه 19 دی 1387, 20:28 عصر
فکر کنم مرتب سازی درجی را بخواهی درست می گم در موردش سرچ کن احتمالن به کارت بیاد.
یه همچین سوالی رو سر امتحان برنامه نویسی دوران هنرستان بهمون دادن راسیاتش من از دو تا ارایه استفاده کردم وقتی در ارایه ی اعداد جابه جایی صورت می گرفت همزمان در ارایه ی اسامی همون جابه جایی انجام می شد.

Saeed_m_Farid
جمعه 20 دی 1387, 12:02 عصر
سلام......کسی جواب نمیده؟
سلام
1- ميشه بفرماييد spare_space و ساختار st چي هستن؟ اينطوريكه نميشه حدس زد شايد اونجا مورد داشته باشين...
2- اگه مطمئنيد تابع ورودي مشكل نداره، لطفا بگين مرتب نميكنه يعني اينكه بعداز اعمال تابع in_style رو آرايه st دقيقا به همون صورت قبلي ميمونه يا تغييري تو ترتيبش حاصل ميشه؟
3- سعي كنيد متغيرهاتون رو به توابع پاس بدين و خروجي بگيرين نه اينكه هر تابع بياد رو يه متغير سراسري يه كاري بكنه بعد اونيكي و ... چون اينجا سي هست و يكمي بايد تو اين كارا مراقب تر باشيد.

ali_1369
جمعه 20 دی 1387, 12:21 عصر
سلام...وقتی برنامه خروچی میده اسما به همون ترتیبی که وارد شدن چاپ میشن و انگار in_style کاری نکرده
راستی ساختمان st ساختمانی که عناصرش همون اسم و...هست و ساختمان st1 یه ساختمان جدید و کمکی هستش واسه جابجا کردن اطلاعات

Saeed_m_Farid
جمعه 20 دی 1387, 14:24 عصر
سلام...وقتی برنامه خروچی میده اسما به همون ترتیبی که وارد شدن چاپ میشن و انگار in_style کاری نکرده
راستی ساختمان st ساختمانی که عناصرش همون اسم و...هست و ساختمان st1 یه ساختمان جدید و کمکی هستش واسه جابجا کردن اطلاعات
ميشد حدس زد اينطوري ميشه : روال مرتب سازي شما رو نميدونم درسته يا نه ولي كاري كه دارين با متغيراي از نوع ساختارتون ميكنين اشتباهه، متغيرهاي ساختاري رو شما نميتونين با = انتساب بدين! با اين كار شما فقط اشاره گرها رو انتساب ميدين كه اونا هم تو تابع موقتي هستن. شما بايد يه copy واسه ساختارتون بنويسين كه يه instance از متغير ورودي بده، و بعد با اون هركاري خواستين بكنيد.

ضمنا ميدونستم كه st‌ يه struct هست پرسيدم شايد تو ساختارتون مشكلي باشه (شما سوال اصلي رو كه نوع struct بود جواب ندادين) و ضمنا st1 يه ساختمان جديد نيست ؛ يه instance از ساختارتونه كه تو تابع ايجاد ميشه و همونجا هم ازبين ميره با انتساب پوينتر متغير لوكال شما در واقع انگار هيچ كاري انجام ندادين چون همونطوريكه ميدونين بيرون تابع in_style خبري از اين st1 نيست.
پيشنهادم رو دوباره تكرار ميكنم :

سعي كنيد متغيرهاتون رو به توابع پاس بدين و خروجي بگيرين نه اينكه هر تابع بياد رو يه متغير سراسري يه كاري بكنه بعد اونيكي و ...ولي اگه نميتونين روال كلي كار رو عوض كنين و ضمنا دارين insertionsort انجام ميدين روال معروف انجام اين كار اينطوريه (البته نميگم كد شما اشتباهه چون بعلت ناقص بودن كدها امتحان نكردم!)
copyStd رو يه تابع فرضي گرفتم كه يه instance از ساختارتون رو ميگيره و با انتساب دونه به دونه كپي اش ميكنه، مثلا با يه همچين كاري بايد بكنيد:


#define MAX_STUDENTS 64
#define MAX_LENGTH 64
typedef struct tagSTUDENT
{
char name[MAX_LENGTH];
int grade;
// other ...
}student, *Pstudent;

student st[ MAX_STUDENTS ];

bool copyStd(const student _src, student &_dest);

/*
.
.
.
*/

void insertionsort(int n)
{
int i, j, t;
student st1={0};
for (i=1; i<n; i++)
{
j=i;
copyStd(st[j], st1);
while ( (j>0) && (strcmp(st[j-1].name, st1.name)>0))
{
copyStd(st[j-1], st[j]);
j--;
}
copyStd(st1, st[j]);
}
} // end

Saeed_m_Farid
جمعه 20 دی 1387, 14:42 عصر
bool copyStd(const student _src, student &_dest)
اينو يادم رفت توضيح بدم : تو اين تابع اولين متغير چيزيه كه قراره كپي بشه كه واضحه؛ ولي دومين ورودي از نوع ارجاعي (Call by reference) هست كه شما با تغيير مقاديرش در روال فراخواننده هم تغيير ميكنه، يعني واقعا مقدارش عوض ميشه نه فقط تو تابع كه بعد از خروج بي تاثير بشه.

ali_1369
جمعه 20 دی 1387, 17:43 عصر
سلام .................ممنون از راهنمایی تون ...........تو کتاب جعفر نﮋاد صفحه ی 180 عناصر ساختمان رو همین جوری انتساب داده....:
"در گونه های اولیه c انتساب ساختمان به یکدیگر امکان پذیر نبود ولی در گونه های جدید c انتساب متغیر های ساختمان که از یک نوع باشند امکان پذیر است به عنوان مثال اگر st1 و st2 متغیرهای از ساختمان student باشند دستور زیر تمام عناصر st1 را به st2 نسبت میدهد.
St2=st1;"

Saeed_m_Farid
جمعه 20 دی 1387, 18:33 عصر
سلام .................ممنون از راهنمایی تون ...........تو کتاب جعفر نﮋاد صفحه ی 180 عناصر ساختمان رو همین جوری انتساب داده....:
"در گونه های اولیه c انتساب ساختمان به یکدیگر امکان پذیر نبود ولی در گونه های جدید c انتساب متغیر های ساختمان که از یک نوع باشند امکان پذیر است به عنوان مثال اگر st1 و st2 متغیرهای از ساختمان student باشند دستور زیر تمام عناصر st1 را به st2 نسبت میدهد.
St2=st1;"
من كتاب ايشون رو نخوندم چون اعتماد نداشتم (احترامشون به جا ولي چون تو تموم زمينه ها كتاب دارن و در همه زمينه ها هم كتاب مرجع مينويسن! امكان اشتباه زياد ميشه) و ضمنا نميدونستم C گونه هاي جديد و قديم داره! در مورد استانداردهاي C و ++C تو همين فروم زياد بحث شده و اونطوري كه من ميدونم آخرين استاندارد هم مربوط به 1998 (ISOIEC14882-1998) بوده كه سال 2003 با اندكي تغييرات تاييد شده.
حتي اگه همچين چيزي هم باشه و نحوه انتساب شما درست باشه شما تو محدوده instance هاتون مشكل دارين و مقاديري كه دارين به متغيراتون ميدين نامعتبر ميشه پس بهتره اصولي عمل كنين تا برنامه تون با تمام گونه ها و همنژادهاي C كار كنه...

با تشكر.