الانتقال إلى المحتوى

مساعدة ضرورية __ معادلة


moab157

Recommended Posts

في البداية السلام عليكم ... انا بحاجة ل Function يقوم بعمل لتحليل لعملية حسابية كالآتي

الفنكشن يستقبل نص عبارة عن varchar2 كالاتي '5*2.54+4/2-1*10*2/4' ويقوم بارجاع ناتج العملية الحسابية مع الاخذ بعين الاعتبار الاولويات للقسمة والضرب اولا ثم الجمع والطرح ثانيا ايهما يبدأ من اليسار أولا .. علما بان النص لا يحتوي على الاقواس ,, اخواني من عندو فكرة عن الموضوع الرجاء اسعافي بها واكون لكم من الشاكرين وجزاكم الله خيرا.... مستعجل ....

رابط هذا التعليق
شارك

السلام عليكم

يعني هل تريد الفانكشن بضبط الاوليات كأنها تتضع أقواس مثلا


لو أخذنا مثالك السابق كيف تريده أن يكون
أقصد أريد تحليله أنت
وان شاء الله نحاول فيها معا

رابط هذا التعليق
شارك

'5*2.54+4/2-1*10*2/4'

هنا العملية الاولى هو بعث بارميتر هذه المعادلة كنص الى الفنكشن

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

1-) 4/2=2
5*2.54+4/2-1*10*2
2-)10*2=20
5*2.54+4/2-1*20
3-)20*1=20
5*2.54+4/2-20
4-) 2/4=0.5
5*2.54+0.5-20
5-)5*2.54=12.7
12.7+0.5-20
6-) 20-0.5=19.5
7-)12.7+19.5=32.2
32.2

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

وشكرا لك

رابط هذا التعليق
شارك

اعزائي وجدت الحل وهو كالتالي

PROCEDURE CALC_FORMULA(CALC VARCHAR2) IS
    source          VARCHAR2(500); 
    V_OUTPUT        NUMBER;
    source_cursor   INTEGER;
    IGNORE          INTEGER;
 BEGIN source_cursor := dbms_sql.open_cursor;
    DBMS_SQL.PARSE(source_cursor,
                   'SELECT '||CALC||' FROM DUAL', DBMS_SQL.NATIVE);
    DBMS_SQL.DEFINE_COLUMN(source_cursor, 1, V_OUTPUT);
    ignore := DBMS_SQL.EXECUTE(source_cursor);
      IF DBMS_SQL.FETCH_ROWS(source_cursor)>0 THEN
        DBMS_SQL.COLUMN_VALUE(source_cursor, 1, V_OUTPUT);
        DBMS_OUTPUT.PUT_LINE(V_OUTPUT);
      END IF;
  EXCEPTION
    WHEN OTHERS THEN
      IF DBMS_SQL.IS_OPEN(source_cursor) THEN
        DBMS_SQL.CLOSE_CURSOR(source_cursor);
      END IF;
 END;

رابط هذا التعليق
شارك

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

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

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  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.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية