اذهب إلى المحتوى
  • 0

مشكلة في عملية باقي القسمة في c++

بلال قدور

السؤال

#include <iostream>
using namespace std;
int main()
{
    float Seconds;
    float remender;
    cout << "Enter Number Seconds: \n";
    cin >> Seconds;
    int secperD = 24 * 60 * 60;
    int secperH = 60 * 6;
    int secperM = 60;
    int NumOfD = floor(Seconds / secperD);
    remender = Seconds % secperD;
    int NumOfH = floor(remender / secperH);
    remender = Seconds % secperH;
    int NumOfM = floor(remender / secperM);
    remender = Seconds % secperM;
    int NumOfS = remender;
}

   ما الخطأ هنا في عملية (%) لأنه يظهر خطأ في البرنامج فيها 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

الخطأ في عملية القسمة بالباقي (%) يكمن في الطريقة التي تقوم فيها بتحديث الباقي (remainder) في كل مرة، لهذا يجب استخدام الباقي من العملية السابقة بدلا من قيمة الثواني الأصلية (Seconds).

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

#include <iostream>
#include <cmath> // لاستخدام floor
using namespace std;

int main()
{
    float Seconds;
    float remender;
    cout << "Enter Number Seconds: \n";
    cin >> Seconds;
    int secperD = 24 * 60 * 60;
    int secperH = 60 * 60;
    int secperM = 60;
    int NumOfD = floor(Seconds / secperD);
    remender = fmod(Seconds, secperD);
    int NumOfH = floor(remender / secperH);
    remender = fmod(remender, secperH);
    int NumOfM = floor(remender / secperM);
    remender = fmod(remender, secperM);
    int NumOfS = remender;

    cout << "Days: " << NumOfD << endl;
    cout << "Hours: " << NumOfH << endl;
    cout << "Minutes: " << NumOfM << endl;
    cout << "Seconds: " << NumOfS << endl;

    return 0;
}

هنا قمت باستخدام دالة `fmod` بدلاً من عامل `%` للقسمة بالباقي، إن لم تتضح يمكنني التفصيل أكثر في شرح المثال.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

ان ال remainder  او باقى القسمة لا يمكن ان يتم على متغير من نوع float او double بل يجب ان يكون المتغيران من نوع int لانه يسمى باقى القسمة فليس له اى معنى لقسمة متغيرات من نوع float او double. 

وايضا يجب جعل المتغير Seconds من نوع int حيث لا توجد ثوانى بكسور اى لا يمكن مثلا ان يدخل المستخدم 60.5 .

فيمكنك تغير نوع المتغير او عمل TYPECASTING للمتغير هكذا 

#include <iostream>
#include <cmath>

using namespace std;
int main()
{
    float Seconds;
    float remender;
    cout << "Enter Number Seconds: \n";
    cin >> Seconds;
    int secperD = 24 * 60 * 60;
    int secperH = 60 * 6;
    int secperM = 60;
    int NumOfD = floor(Seconds / secperD);
    remender = (int) Seconds % secperD;

    int NumOfH = floor(remender / secperH);
    remender = (int) Seconds % secperH;

    int NumOfM = floor(remender / secperM);
    remender = (int) Seconds % secperM;

    int NumOfS = remender;
}

وايضا يوجد خطأ لديك حيث لم تقم بعمل include لمكتبة cmath وهى ضرورية لاستخدام الدالة floor

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

أولاً الدالة floor غير موجودة في مكتبة C++ الأساسية وعليك تعريفها بواسطة <cmath>.

أيضًا أنت تستخدم عامل modulo (%) مع نوع float على الجانب الأيسر وأنواع int على الجانب الأيمن، وذلك غير صحيح لأن عامل modulo يتطلب أن يكون كلا الجانبين من نوع integer، أي تحويل المتغير Seconds إلى int قبل العملية.

ويوجد قوس مغلق (}) ناقص في نهاية دالة main.

لذا الكود الصحيح هو:

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    float Seconds;
    float remender;
    cout << "Enter Number Seconds: \n";
    cin >> Seconds;

    int secperD = 24 * 60 * 60;
    int secperH = 60 * 60;
    int secperM = 60;

    int NumOfD = floor(Seconds / secperD);
    remender = static_cast<int>(Seconds) % secperD;
    int NumOfH = floor(static_cast<int>(remender) / secperH);
    remender = static_cast<int>(remender) % secperH;
    int NumOfM = floor(static_cast<int>(remender) / secperM);
    remender = static_cast<int>(remender) % secperM;
    int NumOfS = remender;

    cout << "Number of Days: " << NumOfD << endl;
    cout << "Number of Hours: " << NumOfH << endl;
    cout << "Number of Minutes: " << NumOfM << endl;
    cout << "Number of Seconds: " << NumOfS << endl;

    return 0;
}

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...