السلام عليكم
بحثت في النت وفي منتداكم عن اجابة لسؤالي وكثرة القراءة زادت حيرتي!
لدي ملف نصي بحجم كبير، بهذا الشكل: مجرد نموذج صغير
1 0.5 2 0.3 3 0.5 4 0.9 2 0.73 0.4
بحيث أن كل رقم مرتبط ب احتمال
فملا الرقم 1 مرتبط بالاحتمال الذي يليه : 0.5
والرقم 2 مرتبط بالاحتمال الذي يليه 0.3
وهكذا
مع ملاحظة عدم تكرار الرقم في الصف الواحد
وكم ان الرقم ممكن أن يكون لديه أكثر من احتمال. فمثلا احتمال الرقم 2 في الصف الأول = 0.3، و احتماله في الصف الثاني = 0.7
ولأن علوماتي قديمة في البرمجة، بقمت بإنشاء Global array of struct
بهذا الشكل:
struct DatF1
{
int id
float prob;
DatF1 *next;
};
#define IDno 20000
DatF1 *DF1[IDno ]وقمت بتعئبة هذه المصفوفة بهذا الشكل:
DatF1 *NewItem, *FollowingItem; int i; NewItem = new DatF1; FollowingItem = new DatF1; for (int a = 0; a <= IDno - 1; a++) DF1[a] = NULL; ifstream inFile; inFile.open(dataFile); int a = 0; float b = 0; if (inFile.fail()) cout << "\n not found \n "; else { string line; cout << "\n found!\n "; // Read the file until EOF i = 0; while (!inFile.eof()) { FollowingItem = NULL; getline(inFile, line); std::stringstream Sline(line); while (Sline >> a >> b) { NewItem = new DatF1; NewItem->Item = a; // = 1 at the 1st iteration NewItem->prob = b; // = 0.5 at the 1st iteration NewItem->next = NULL; // input the array of linked list if (DF1 == NULL) // if it is a new line DF1 = FollowingItem = NewItem; // insert the data at the first else { // // if it is not a new line FollowingItem->next = NewItem; // insert the data in the linked list FollowingItem = NewItem; } } i++; // this iteration represents the number of line/row } } inFile.close();وقمت بالتعامل مع هذه المصفوفة في برنامجي ولا يوجد لدي خطأ برمجي، وإنما مجرد تغير بسيط في النتائج
مثلا: عندما أقوم بضرب احتمالين لرقمين، فالنتائج لا تبدو دقيقة: مثال:
float prob = it->prob * it1->prob;
وعندما قمت بعمل trace للبرنامج وجدت أن السبب راجع لتعبئة المصفوفة، تحديدا عند السطر:
NewItem->prob = b;
فمثلا لو كانت قيمة الاحتمال :
b=0.919
فأنه يخزنها باختلف بسيط:
NewItem->prob =0.918999970
بحثت في النت عن حلول:
-وجدت دالة التقريب، ( لا أريد تقريب القيم)
وجدت الدالة precision: وحسب فهمي للدالة، فهي تقوم بطباعة عدد من digits نقوم بتحديده/ وليس تخزين بعدد من digits
سؤالي بالنسبة للقراءة من ملف:
أنا غير متأكدة من عملية Initialization للمصفوفة
جربت طرق اخري مثل:
for (int a = 0; a <= IDno - 1; a++)
DF1[a] = new DatF1;كما أني بحثت في النت عن طريقه Destroy للمصفوفة، ولكن لم أجد مصفوفة تشبة مصفوفتي
وأريد معرفة كيف أقوم بعملية الهدم في نهاية البرنامج!
قرأت هنا وتعرفت على STL من خلال موضوع الأستاذ الكريم SandHawk مشكورا
وكيف أن الحاوية map
أفضل في تخزين الداتا كونها تحتوي على smart pointer
لكني لم أوفق في ايجاد طريقة تقوم بقراءة ملف وتخزين بياناته على شكل هياكل البيانات في المثال أعلاه، بالطريقة map
وشكرا لتعاونكم