البرمجة

تحليل وحساب العلامات: برنامج قراءة ومعالجة ملفات .dat في C++

في بداية الأمر، يجب أن تعلم أن قراءة البيانات من ملف وإجراء الحسابات ثم إخراج النتائج إلى ملف آخر هو تحدي يتطلب تصميمًا جيدًا للبرنامج. سأقدم لك النصائح والخطوات التي يمكن أن تساعدك في حل هذه المشكلة.

أولاً وقبل كل شيء، يجب عليك قراءة الملف بشكل صحيح. يمكنك استخدام مفهوم الفصل لفصل الأرقام في كل سطر. على سبيل المثال:

cpp
#include #include #include #include int main() { std::ifstream inputFile("marks.dat"); std::ofstream outputFile("yearmark.dat"); std::string line; while (std::getline(inputFile, line)) { std::istringstream iss(line); std::vector<int> marks; int studentNumber; iss >> studentNumber; int mark; while (iss >> mark) { marks.push_back(mark); } // الآن لديك رقم الطالب وجميع العلامات في vector // يمكنك القيام بالحسابات وإخراج النتائج إلى الملف } inputFile.close(); outputFile.close(); return 0; }

ثم، يمكنك الآن تنفيذ الحسابات. لحساب المتوسط والعلامة العامة، يمكنك استخدام الصيغ التالية:

cpp
double average = (marks[1] + marks[2] + marks[3]) / 3.0; double yearMark = 0.4 * average + 0.6 * std::max({marks[1], marks[2], marks[3]}); // إخراج النتائج إلى الملف وعرضها على الشاشة outputFile << studentNumber << " " << std::fixed << std::setprecision(2) << average << " " << yearMark << std::endl; std::cout << studentNumber << " " << std::fixed << std::setprecision(2) << average << " " << yearMark << std::endl;

يجب عليك تضمين لاستخدام std::max و لاستخدام std::fixed و std::setprecision.

بخصوص مشكلة ظهور الرقم بصيغة علمية، يمكنك استخدام std::fixed كما قمت بذكره أعلاه.

أما بالنسبة للتعامل مع البيانات، يمكنك استخدام vector كما فعلت في المثال أعلاه. يمكنك أيضًا استخدام هيكل بيانات ثنائي الأبعاد، لكن يجب أن تكون حجم الصفوف ثابتًا لتكون عملية القراءة والكتابة أسهل.

أتمنى أن تساعدك هذه النصائح في بناء برنامجك. إذا كنت بحاجة إلى مساعدة إضافية في أي جزء، فلا تتردد في سؤالي.

المزيد من المعلومات

بالطبع، دعنا نواصل تحسين البرنامج وإضافة المزيد من المعلومات لجعل الحل أكثر اكتمالًا.

  1. تقسيم الشيفرة إلى وظائف:
    يفضل تقسيم الشيفرة إلى وظائف لتحسين قابلية الصيانة والقراءة. يمكنك إنشاء وظائف للقراءة من الملف، حساب المتوسط والعلامة العامة، وإخراج النتائج. هذا يجعل الشيفرة أكثر تنظيمًا وواضحة.

    cpp
    // قراءة من الملف std::vectorint>> readFromFile(std::string fileName); // حساب المتوسط والعلامة العامة std::pair<double, double> calculateMarks(const std::vector<int>& marks); // إخراج النتائج إلى الملف وعرضها على الشاشة void outputToFile(std::ofstream& outputFile, int studentNumber, double average, double yearMark);
  2. التعامل مع المشكلة الرئيسية:
    بالنسبة لمشكلة ظهور الرقم بصيغة علمية، يمكنك ضمان عدم تحويل studentNumber إلى الصيغة العلمية عند الإخراج عن طريق تعيين نمط الإخراج باستخدام std::fixed.

    cpp
    // إخراج النتائج إلى الملف وعرضها على الشاشة void outputToFile(std::ofstream& outputFile, int studentNumber, double average, double yearMark) { outputFile << std::fixed << studentNumber << " " << std::fixed << std::setprecision(2) << average << " " << yearMark << std::endl; std::cout << std::fixed << studentNumber << " " << std::fixed << std::setprecision(2) << average << " " << yearMark << std::endl; }
  3. استخدام التوسيعات الحديثة للغة C++:
    يمكنك استخدام ميزات اللغة الحديثة مثل مرافقة range-based loops لجعل الشيفرة أكثر وضوحًا.

    cpp
    // قراءة من الملف std::vectorint>> readFromFile(std::string fileName) { std::ifstream inputFile(fileName); std::vectorint>> data; std::string line; while (std::getline(inputFile, line)) { std::istringstream iss(line); std::vector<int> marks{std::istream_iterator<int>(iss), std::istream_iterator<int>()}; data.push_back(marks); } inputFile.close(); return data; }

    هذا يساعد في تقليل الشيفرة وتحسين قراءتك للبيانات.

  4. تفعيل التنسيق:
    يمكنك استخدام تنسيق الشيفرة باستمرار لتحسين القراءة والفهم. ضع تعليقات لشرح الخطوات المهمة والمنطق واختر أسماء معبرة للمتغيرات.

    cpp
    // حساب المتوسط والعلامة العامة std::pair<double, double> calculateMarks(const std::vector<int>& marks) { double average = (marks[1] + marks[2] + marks[3]) / 3.0; double yearMark = 0.4 * average + 0.6 * *std::max_element(std::begin(marks) + 1, std::end(marks)); return {average, yearMark}; }

باستخدام هذه النصائح، يمكنك تحسين برنامجك وجعله أكثر قوة ووضوحا. إذا كان لديك أي أسئلة إضافية أو تحتاج إلى مساعدة في جزء معين، فلا تتردد في طرحها.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر