PDA

View Full Version : مرتب سازی بانک داده



اصغر (پآچ)
دوشنبه 27 اردیبهشت 1389, 18:47 عصر
سلام دوستان

من یه فایل جهت ذخیره سازی اطلاعات دارم که شامل فیلدهای سریال، فرستنده، گیرنده و تاریخ می باشد. حال می خوام یه قسمت به برنامه اضافه کنم که با انتخاب کاربر، نمایش اطلاعات فایل بر حسب فیلد انتخابی کاربر مرتب سازی بشه. چطور می تونم اطلاعات رو Sort کنم؟ برنامه من توسط زبان C نوشته شده است.

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

موفق و موید باشید

tdkhakpur
دوشنبه 27 اردیبهشت 1389, 18:59 عصر
حال می خوام یه قسمت به برنامه اضافه کنم که با انتخاب کاربر، نمایش اطلاعات فایل بر حسب فیلد انتخابی کاربر مرتب سازی بشه. چطور می تونم اطلاعات رو Sort کنم؟ برنامه من توسط زبان C نوشته شده است.
شما میتوانید مانند سایر بانکهای اطلاعاتی ایندکس فایلی برای نحوه قرار گرفتن داده ها ایجاد کنید به این صورت که همزمان با وارد کردن داده داخل فایل اطلاعاتی- محل قرار گرفتن رکورد را داخل فایل دوم که معموالا فایل ایندکسها گفته میشود قرار بدید.
و به همین ترتیب با وارد کردن رکورد جدید داخل فایلتان - محل قرار گرفتن رکورد جدید را داخل ایندکش فایل قرار بدید ولی اگر باید رکورد جدید قبل از رکورد قبلی قرار گیرید فقط کافیست کد محل رکوردها را که داخل ایندکس فایل با هم تعویض کنید.
در اخر شما یک فایلی خواهید داشته که محل رکوردها را بصورت عدد در خود جایی داده که ترتیب مرتب شده داده ها را به شما نشان میدهد.

اصغر (پآچ)
چهارشنبه 29 اردیبهشت 1389, 18:23 عصر
سلام دوست عزیز:

ممنون از راهنماییت اما یه سئوال من چطور باید تشخیص بدم که کدوم رکورد محل قرار گیریش کجاست؟
آخه مثلا کاربر فیلد فرستنده رو انتخاب کنه برحسب حروفه مرتبش کنم هر رکورد یه ایندکس میگیره اگه بر حسب فرستنده یه ایندکس میگیره و بر حسب سریال یا تاریخ یه ایندکس دیگه!

حالا چطور ایندکس های رکورد ها رو با توجه به انتخاب کاربر تشخیص بدم ممنون میشم اگه راهنمایی کنی!

موفق و موید باشی

tdkhakpur
چهارشنبه 29 اردیبهشت 1389, 21:28 عصر
اما یه سئوال من چطور باید تشخیص بدم که کدوم رکورد محل قرار گیریش کجاست؟

خب شما یک فایل ایندکس دارید که داخلش اعداد 4 رقمی یا همان long را دارد که محل رکورد در فایل را نشان میدهد. و شما برای مرتب کردن فقط این فایل ایندکش را مرتی میکنید یعنی جای اعداد 4 رقمی را با یک الگوریتم مرتب سازی مرتب میکنید به شکل زیر.

1- رکورد جدید را از کاربر میگیرید.
2- فایل ایندکس را باز کرده اگر قبلا ایندکسی داخل این فایل بود رکورد جدید را با رکوردهای دیگر که از طریق عددهای 4 رقمی که محل رکوردهای قبلیست قابل دسترسی هست مقایسه میکنید و محل جدید رکورد را به این شکل بدست می آورید یعنی خواهید دانست که محل رکورد جدید باید بعد از کدام ایندکس قرار گیرید.
3 - گر ایندکس رکورد جدید باید مابین رکورهدی قبلی قرار گیرد شما باید ایندکسهای بعدی را یک واحد به طرف راست انتقال بدید


آخه مثلا کاربر فیلد فرستنده رو انتخاب کنه برحسب حروفه مرتبش کنم هر رکورد یه ایندکس میگیره اگه بر حسب فرستنده یه ایندکس میگیره و بر حسب سریال یا تاریخ یه ایندکس دیگه!

خب فرقی نداره شما الگوریتم فوق را با توجه به خواسته کاربر دوباره اجرا میکنید با این تفاوت که دیگر کاربر رکورد را وارد نمیکند بلکه شما این رکوردها را از فایل اصلی که قبلا داده ها در آن ریخته شده است بدست بیارید.



حالا چطور ایندکس های رکورد ها رو با توجه به انتخاب کاربر تشخیص بدم ممنون میشم اگه راهنمایی کنی

خب شما باید یک پلت فرمی تدارک ببینید که برای هر یک از تقاضا ها یک کد داشته باشد یعنی کد 0 نشان دهد که شما قصد استفاده از ایندکس 1 و کد 1 ایندکس 2 و .....

اصغر (پآچ)
جمعه 21 خرداد 1389, 17:18 عصر
سلام دوستان

من بانکم رو هنوزم نتونستم مرتب سازی کنم من از کد زیر برای ساخت یک آرایه پویا استفاده کردم که بیام فیلد مورد نظر کاربر رو به آرایه انتقال بدم و بعد اعضای آرایه رو مرتب کنم و با استفاده از سرچ اعضای مرتب شده در فایلم، در نهایت فایل خودم رو مرتب کنم.

اشکال کد در کجاست؟



char *list;
int Item, iList, i, j, cmp;
ifstream input;
ofstream output;
input.open("Database.dat", ios::in);
output.open("Database.$$$", ios::out);
Item = size(); //تابع سایز تعداد خطوط فایلم رو بر می گردونه.
switch(param) //این خط رو برای انتخاب فیلد ها توسط کاربر تعریف کردم. درحال حاضر فقط براساس سریال مرتب می کنه.
{
case 1:
char *temp, ns;
list = (char *) malloc((Item)* sizeof(char[10]));
for( iList = 0; iList < Item; iList++)
{
input >> serial >> sender >> reciver >> date >> deleted;
strcpy((list + iList), serial);
}
for (i = 0; i < Item - 1; i++)
for (j = i; j < Item; j++)
{
cmp = strcmp((list + i), (list + j));
if (cmp > 0)
{
strcpy(temp, (list + i));
strcpy((list + i),(list + j));
strcpy((list + j), temp);
}
}
for (i = 0; i < Item - 2; i++)
cout << *(list + i);
ns = getch();
break;
}