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

السؤال

نشر
#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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...