الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مساعدة في التعامل مع الملفات(البحث الثنائي)

مغلق
بدأه العواجي في 26 نوفمبر 2007 · 7 رد · 981 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته....

أخواني طلب منا مشروع تطبيق خوارزمية البحث الثنائي على الملفات

سويت البرنامج بس بافي فيه بعض المشاكل عجزت عن حلها

أرجوا أن أجد لديكم حلا لهذه المشاكل

هذا هو البرنامج


#include <iostream.h>
#include <fstream.h>
#include <string.h>

struct Student
{
public:

char ID[9];

char name[15];

float GPA;

};
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

class stdent{
public:

Student a;

fstream file;

int n;

int lo;

int hi;




stdent(){
file.open("Student.DAT", ios::app | ios::out | ios::in | ios::binary );

n=Get_Size();

int lo=0;

int hi= (n-1) * sizeof(Student);


}//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

int Get_Size(){


int size;

fstream file("Student.DAT", ios::app | ios::out | ios::in | ios::binary );



file.seekg(0,ios::end);

size=file.tellg();

n = (size/sizeof(Student) ) -2;

return n;

}//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa



void disbly(void){

file.seekg( 0 , ios::beg);

for(int i=1; i<=n; i++ ){

file.read( (char*) &a , sizeof(Student) );

cout << a.ID << "\t"<< a.name << "\t"<< a.GPA << endl;
}



}//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa


void disbly(int n){

currency(n);

file.read( (char*) &a , sizeof(Student) );

cout << n <<"\t"<< a.ID << "\t"<< a.name << "\t"<< a.GPA << endl;




}//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

void disbly(char key[9]){


file.seekg( 0 , ios::beg);

for(int i=1; i<=n; i++ ){

file.read( (char*) &a , sizeof(Student) );

if( strcmp( key, a.ID )== 0 )
cout << a.ID << "\t"<< a.name << "\t"<< a.GPA << endl;
}




}//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

int Binary_Serch (int lo, int hi , char key[]){

int md;

while( lo <= hi ){

md = (lo + hi )/2;

currency(md); //äÞá ÇáãÄÔÑ Åáì ÇáÓÌá ÇáÍÇáí

if( strcmp(key , a.ID ) == 0 ) return md;

else if( strcmp(key , a.ID ) > 0 ) lo = md+1;

else if( strcmp(key , a.ID ) < 0 )hi= md-1;
}
return -1;

}//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa


void currency(int n){

int byte;

byte = ( n-1 ) * sizeof(Student);

file.seekg( byte , ios::beg);

}//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
};

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



void main(){

stdent x;
char key[9];

cout<<"The number Recoured is : "<< x.n <<"\n\n";

cout<<"\n\n"; x.disbly();

cout<<"\n\n"; x.disbly(5);

cout<<"\n\n"; x.disbly("42400075");

cout<<"\n\nBinary Serch \n Enter ID :"; cin>> key;

int f= x.Binary_Serch( x.lo , x.hi , key );

if ( f != -1 )

x.disbly(f);

else cout<< "Not found ";


for(;;);


}
/*************************************************************/

دمتم في رعاية الله،،،

موقع كلية الحاسب الآلي ونظم المعلومات.

WWW.UQUCS.COM

#2

السلام عليكم ,,

هل يمكن توضيح المشكلة لديك حتى نتمكن من المساعدة دون المرور على البرنامج سطر سطر!!

تحياتي ,,

#3

السلام عليكم ورحمة الله وبركاته...

أخي Khaled.Alshaya اشكر لك تفاعلك

المشكلة عندي في دالة البحث الثنائي

أنا ابحث باستخدام الـ ID

السجلات في الملف مرتبة تصاعدياً حسب الـ ID

اثناء التنفيذ اعطيه أحد الأرقام الموجوده في القاعده ويقول لي السجل غير موجود!

المعذره نسيت أن ارفق الملفات

وهذه هي

مشكور مرة أخرى على تفاعلك...

دمتم في رعاية الله ، ، ،

06_Binary_sech.zip

موقع كلية الحاسب الآلي ونظم المعلومات.

WWW.UQUCS.COM

#4

السلام عليكم ورحمة الله وبركاته....

أخواني

ووينكم الله يخليكم ولا يحرمكم الأجر

أتمنى أنكم تشرحون لي المشكلة في هذا البرنامج

الله يحفظكم ويرعاكم، ، ،

موقع كلية الحاسب الآلي ونظم المعلومات.

WWW.UQUCS.COM

#5

في التابع stdent هناك خطأ

int lo=0;
int hi= (n-1) * sizeof(Student);

لماذا تعرف هذين المتغيرين هنا؟! احذف int

قيمة hi ضعها n-1 فقط دون الحاجة لضرب القيمة بحجم الـ struct. سيصبح الكود كالآتي

int lo=0;
int hi= (n-1);

في النقطة السابقة عليك إسنتتاج السبب وراء هذا التغيير

في التابع Binary_Serch بعد إستدعاء التابع currency عليك قراءة المعلومات وذلك بإضافة السطر الآتي

file.read( (char*) &a , sizeof(Student) );

حينها سيعمل الكود بشكل صحيح وإلا فانك تقوم بالمقارنة مع آخر قيم تم إسنادها لـ a !!!

كان عليك الإنتباه لهذه النقطة خصوصاً وأن ذلك موجود في التابع void disbly(int n)

لماذا تستعمل هذا السطر !! أتمنى ألا يكون السبب الذي أتوقعه!

for(;;);

حظ موفق!

1

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#6

السلام عليكم ورحمة الله وبركاته.....

مشكور أخوي cipher

الله يجزاك كل خير ....

أقول لك من فين جت هذه المشاكل

أنا لم أتعامل كثيراً مع الملفات

لأجل ذلك انشأت برنامج بسيط ثم بديت أعدل عله تدريجياً

هذه المشكلة حدثت لأني اعدل في مكان دون آخر

اقتباس
لماذا تستعمل هذا السطر !! أتمنى ألا يكون السبب الذي أتوقعه!

بس عشان يوقف الشاشه

من طريقة سؤالك أعتقد أنه يسبب ضرراً في الذاكره

الله يجزاك كل خير ويوفقك في الدارين....

فكيت أزمه كبيره عندي....

ربي يحفظك ويتم نعمته عليك....

دمت في رعاية الله،،،

موقع كلية الحاسب الآلي ونظم المعلومات.

WWW.UQUCS.COM

#7

نسيت ذكر نقطة وهي أن الـ ID الذي تستعمله يتكرر مع أكثر من إسم ؟! في العادة يفضل أن تجعله unique ...

شئ أخر لماذا الـ ID عبارة عن char array وليس number ؟

اقتباس
بس عشان يوقف الشاشه

:hmm:

إستعمل طرق أخرى ذكرت بكثرة في المواضيع القديمة ...

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#8

السلام عليكم ورحمة الله وبركاته...

أولا المعذره على التأخير

أخوي مشكور على الأهتمام والمتابعة

اقتباس
نسيت ذكر نقطة وهي أن الـ ID الذي تستعمله يتكرر مع أكثر من إسم ؟! في العادة يفضل أن تجعله unique ...

لكني هنا جعلته يمثل "الرقم الجامعي" 8خانات

وهو رقم وحيد - لايمكن أن يتكرر - ويلزم وجوده

اقتباس
شئ أخر لماذا الـ ID عبارة عن char array وليس number ؟

بالنسبة لـ ID جعلته على شكل نص لأننا لن نجري أي عملية حسابيه عليه

أعرف أن هذا سيأخذ حيز أكبر من الذاكرهـ

لكن الدكتور قال لنا ما دام أنه لن تكون هناك عمليات عليه فيسحن أن تعرفه على شكل نص

ربي يحفظك ويوفقك في الدارين...

دمت في رعاية الله، ، ،

موقع كلية الحاسب الآلي ونظم المعلومات.

WWW.UQUCS.COM

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…