الذي يحسب ويعيد القيمة sin(x) تقريبًا بواسطة الصيغة


Write function with prototype:
double mySin(double x, double epsi); 
which calculates and return the value sin(x)  approximately by the formula:
sin(x)  =  -   +   -... +(-1)n  
here n is the first integer for which   |  |   epsi  is satisfied. 

ما حاولت:

   double q3() {
       int x;
       int n = 1;
       double p = 0;
       int dau = -1;
       int tongquat2 = 1.0 / (2 * n + 1);
       while (tongquat2 >= 1e-10) {
           tongquat2 = 1.0 / (2 * n + 1);
           p += -1 * dau * pow(-1, n) * pow(x, 2 * n + 1) / (giaithua(2 * n + 1));
           dau *= -1;
           n++;
       }
       return p;
   }
int main(){
   int x;
   scanf("%d", &x);
   printf("sin(%d)= %.6lf", x, q3());
}

لماذا الرمز غير صحيح؟ ساعدني في الأخطاء.

الحل 1

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

ج
#include <stdio.h>
#include <math.h>

وقم أيضًا بإضافة “تعريف وهمي” لـ giaithua وظيفة للحصول على تجميع نظيف للتعليمات البرمجية التي تعرضها.
حتى تحصل على تجميع نظيف، لن تنتج ملف EXE، ولن يمكن تشغيل تطبيقك.
2) أخطاء وقت التشغيل: تمنع هذه الأخطاء تطبيقك من الاستمرار بسبب حدوث شيء لا يستطيع النظام التعامل معه – ربما خطأ “القسمة على صفر”، أو محاولة قراءة ملف غير موجود على سبيل المثال. =يعرض النظام لك رسالة خطأ، ويغلق تطبيقك على الفور.
لا يمكننا مساعدتك في إصلاح ذلك دون معرفة طبيعة الرسالة ومكان حدوثها والبيانات التي أدخلتها للحصول عليها.
3) الأخطاء المنطقية: تعني أنك تحصل على نتائج غير متوقعة ولكن تطبيقك لا يتعطل. على سبيل المثال، إذا كنت تتوقع أن يعطي تطبيقك نتيجة 42 ولكنه يعطيك 666 بدلاً من ذلك.
لا يمكننا مساعدتك في إصلاح ذلك دون معرفة القيمة، وما كنت تتوقع الحصول عليه، ومتى حصلت عليه، وما هي البيانات التي أدخلتها للحصول عليها.

سأفترض أنها واحدة من الأخيرتين، وعملية العثور على المشكلة تحتاج إلى تشغيل التعليمات البرمجية الخاصة بك مع بياناتك – ولا يتوفر لدينا أي منهما. التجميع لا يعني أن الكود الخاص بك صحيح! :يضحك:

لذلك سيكون الأمر متروكًا لك، لكنك لست وحدك.
فكر في عملية التطوير ككتابة بريد إلكتروني: التجميع الناجح يعني أنك كتبت البريد الإلكتروني باللغة الصحيحة – الإنجليزية، بدلاً من الألمانية على سبيل المثال – وليس أن البريد الإلكتروني يحتوي على الرسالة التي تريد إرسالها.

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

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

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16

إذن فمن الواضح إلى حد ما أن المشكلة تكمن في الشيء الذي يضاعفه – فهو لا يضيف نفسه إلى نفسه، أو يضربه في 2، بل يضربه في نفسه ويعيد مربع الإدخال.
وبذلك، يمكنك إلقاء نظرة على الكود ومن الواضح أنه موجود في مكان ما هنا:

ج#
private int Double(int value)
   {
   return value * value;
   }

بمجرد أن تكون لديك فكرة عما قد يحدث من خطأ، ابدأ في استخدام مصحح الأخطاء لمعرفة السبب. ضع نقطة توقف في السطر الأول من الطريقة، وقم بتشغيل التطبيق الخاص بك. عندما يصل إلى نقطة التوقف، سيتوقف مصحح الأخطاء ويسلم التحكم إليك. يمكنك الآن تشغيل التعليمات البرمجية الخاصة بك سطرًا تلو الآخر (يُسمى “الخطوة الفردية”) وإلقاء نظرة على (أو حتى تغيير) المحتويات المتغيرة حسب الضرورة (يمكنك حتى تغيير التعليمات البرمجية والمحاولة مرة أخرى إذا كنت بحاجة إلى ذلك).
فكر في ما يجب أن يفعله كل سطر في الكود قبل تنفيذه، وقارن ذلك بما فعله بالفعل عندما تستخدم زر “التخطي” لتنفيذ كل سطر بدوره. هل فعلت ما كنت تتوقعه؟ إذا كان الأمر كذلك، انتقل إلى السطر التالي.
إذا لم يكن الأمر كذلك، لماذا لا؟ كيف تختلف؟
نأمل أن يساعدك ذلك في تحديد أي جزء من هذا الرمز به مشكلة وما هي المشكلة.
هذه مهارة تستحق التطوير لأنها تساعدك في العالم الحقيقي وفي التطوير أيضًا. ومثل جميع المهارات، فهي تتحسن فقط بالاستخدام!

コメント

タイトルとURLをコピーしました