الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ممكن اعرف اش الغلط عندي بهالبرنامج

مغلق
بدأه الجوري في 23 أبريل 2004 · 7 رد · 724 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هذي محاولتي بهالبرنامج أبغى أعرف ايش الغلط عندي لو سمحتوا

هذا السؤال

1. Write a program that reads a string composed of two integers with a binary operation between them (+, - * or /). Your program should call a function to separate the numbers and the operation and then call a second number to calculate the result. The result should be printed in main.

وهذا هو حلي له

#include<stdio.h>
#define len 5
int func1(char );
int result(int,char,int);
int main ()
{
	char string[len],num[len];
	int i ,x;
	printf("please enter two numbers and operation between them with space to calculate the result\n");
	gets(string);
 x=func1( string);
	printf(" The result is %d\n",x);
return 0;
}
int func1(char string[]){
    int i,m,a1,a2=0,operation;
    char num[len];
     while(!isspace(string)){
     for(i=0;i<=len;i++);
     if(isdigit(string)){
     num=string;
  a1= atoi(num);
  break;}
  switch(string){
 	 
 	 case'+':
    operation='+';
    break;
 	 case'-':
    operation='-';
    break;
 	 case'*':
    operation='*';
    break;
 	 case'/':
    operation='/';
    break;
  }
         
   if(isdigit(string)){
    num=string;
   a2=atoi(num);
   }
   i++;
     }
 m =result( a1, operation , a2);
   return m;
     }

         


int result(int a1,char operation ,int a2){
  int resulte;
  
        switch(operation){
 	 
 	 case'+':
    resulte=a1+a2;
    break;
 	 case'-':
 	 resulte=a1-a2;
    break;
 	 case'*':
 	 resulte=a1*a2;
    break;
 	 case'/':
 	 resulte=a1/a2;
 	 break;}
 return resulte;
}

طبعا الحل بلغة السي

أبي أعرف كيف اعدل الاغلاط

تم تعديل هذه المشاركة بواسطة HGB في 24 أبريل 2004 في 00:15

#2

السلام عليكم

تفكيرك صحيح ومنطقي ولكن المشكلة تكمن في الاخطأ النحوية

الان لنبداء في محاولة تصحيح الاخطاء بالتسلسل :

في البداية يجب اظافة الملف ctype.h من اجل isdigit و isspace

وكذلك الملف stdlib.h من اجل atoi

ثم ان len 5 غير كافيه اطلاقا

تعريف func1 يشير الى ان هذه الدالة تأخذ حرف واحد فقط كمدخلات وهذا غير صحيح.

الوضيفة main صحيحة مع ملاحظة عدم الحاجة لتعريف متغيرات غير مستخدمة فيها

مثل num,i

الوظيفة result صحيحة بالكامل .

كل المشكلة تكمن في الدالة func1 :

هل انتبهت الى ان المتغيرات i,m لم يتم تصفيرها قبل الاستخدام !!

ثم هل انتبهت الي الفاصلة المنقوطة في for(i=0;i<=len;i++)j

ان هذه الفاصله سوف تجعل i=len بعد تنفيذ هذا السطر !!

ويجب حذف break التي في الحلقة for !!

ولمحاولة ايجاد قيمة a2 :

كتابة num=string j لاتصلح لان num يجب ان تبداء من 0 وليس من i

وفي النهاية اليس من الافضل ان تترك الحرية للمستخدم بادخال المسافات بين الحدود ؟

نعم . يمكن ذلك بجعل البرنامج يتجاوزها بعد ادخال احد الحدود .

البرنامج المرفق قمت بكتابتة لك . واتمني ان اكون وفقت بذلك. وشكرا

-> مع العلم ان result هي نفسها بدون تغيير .

وفي النهاية لا أنسى أن اشكر المشرفين على هذا الموقع و على الأخص الاخ HGB .

تم تعديل هذه المشاركة بواسطة زيدان في 24 أبريل 2004 في 07:09

#3
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
      
#define len 100
int func1(char string[]);
int result(int,char,int);
       
void main ()
{
      char string[len];
      int x;
      printf("please enter two numbers and operation between them with space to    calculate the result\n");
      gets(string);
      x=func1(string);
      printf(" The result is %d\n",x);
}

int func1(char string[])
{
      int i=0,j=0,a1,a2;
      char operation;
      char num[len];
      while(isdigit(string))
      {
            num=string;
            i++;
      }
      num='\0';
      a1=atoi(num);
      while(isspace(string))i++;
      operation=string;
      i++;
      while(isspace(string))i++;
      while(isdigit(string))
      {
            num[j]=string;
            i++;
            j++;
      }
      num[j]='\0';
      a2=atoi(num);
      return result(a1,operation,a2);
}

تم تعديل هذه المشاركة بواسطة زيدان في 24 أبريل 2004 في 07:07

#4

مشكور اخوي

بس ايش المشكله ببرنامجي ؟

يعني عشاني كررت السويتش ؟

#5

هلابك

كنت بصحح بعض الاخطاء اختي الجوري

لكن زيدان ماشاء الله أكل الجو

انا اخذت برنامج زيدان

لكن واجتني مشكلتين

الاولى : مافهمت وش فايدة aoti

الثانية

رغم ان البرنامج مافيه اخطاء

الا انه

لاينفذ يقول لي ...فيه خطأ باللنك ؟؟؟؟

رغم عدة تجارب ومحاولات يقول نفس الكلام:(

ياريت ان امكن توضحون الخطأ

تقبلوا تحياتي

الجوري وزيدان

اختكم

مذهله @ عيونه

#6
char str[];
int i;
cout <<"Please enter 2 numbers and specify operation in between";
cin>>str;
while !(str=='\0') {
i++;
}
//لا اعرف اذا كان هناك دالة Len لانه انا لست مبرمج C++ لكن ساحاول
if (i == 3){
if(( isdigit(str[0]) && (isdigit(str[2])){
Calculate(str[0],str[2],str[1]);
}
}

int function Calculate(int Number1, int Number2, char operation)
{
int result;
switch operation
case '+'
result = Number1 + Number2;
case '-'
result = Number1  - Number2;
case '*'
result = Number1 * Number2;
case '/'
if !(Number2 == 0)}
result = Number1 / Number2;
}
return result;
}

المشكلة في الكود الذي كتبته هو ان الارقام المدخلة يجب ان تكون من 1-9

اسف لعدم الكمال لكن اعتقد ان عليك اضافة القليل من الكود لجعله يعمل على ارقام اكبر

تم تعديل هذه المشاركة بواسطة Maverick في 25 أبريل 2004 في 23:20

راكان الحنيطي

Be Open Source

opensource-550x4752.gif

#7

السلام عليكم .

انا أسف على التأخير !!

بالنسبة للاخت الجوري . انا قلت ان البرنامج صحيح ماعدا الدالة func1 .

داخل func1 :

تكرار السويتش ليس هو الخطأ .

ولكن هل انتبهت الى أن i لم يتم تصفيرها !! ممكن ان تكون أي قيمة مثلا 4321

ثم ياتي السطر :

while(!isspace(string))

هل لاحظت ان i إذا لم يتم تصفيرها سوف تخرج عن نطاق string الذي هو 5 بموجب تعريفك لـ len

ثم هل لاحظت ان تعريف operation هو int

ثم قمت بارساله الى الداله result التي تم تعريف operation فيها على انه char .

ثم السطر :

 for(i=0;i<=len;i++);

هل انتبهت الى الفاصلة المنقوطة في أخر السطر . هذا يعني ان for لن تفعل شىء

فقط هي سوف تزيد i الى ان تصبح قيمتها مساويه لقيمة len

اذا اردتي ان تجعلي هذه الحلقة تفعل شياً عليك وضعه قبل الفاصلة المنقوطة .

انا اسف فقد حاولت ان اصحح هذه الاخطاء البسيطة . ولكن البرنامج سوف يدخل في

حلقات لامتناهية !!

انا متأكد انك لو حاولت تجميع افكارك سوف تكتبين الدالة func1 من جديد بشكل صحيح .

_________________________________________________________________

بالنسبه للاخت (مذهله @ عيونه) :

أولا: atoi هي لتحويل سلسة حروف ( مصفوفة ) من نوع char الى عدد ( رقم ) من النوع int

ثانياً: ينتج الخطأ في اللنك لانك كتبت برنامجي -الذي هو برنامج الجوري في الواقع - بدون ان تضيفي الداله result من برنامج الاخت الجوري .

لان الداله result تم الاعلان عنها في برنامجي بدون كتابتها ( فانا لم اعيد كتابتها لانها لم تتغير عما هو مكتوب في البرنامج السابق ) .

انا تأكدت من صحة البرنامج وقمت بتنفيذه ..

_________________________________________________________________

ولكنني اريد ان انبهكم هنا الى ان هذا البرنامج هو نوع بسيط من المترجمات compiler

وهذا النوع لهه قواعد يمكن اتباعها لحل جميع المسائل التي من هذا النوع.

ولكن اذا كان هذا السؤال هو سؤال عابر في البرمجة فيمكن الاكتفاء بهذا الحل البسيط .

وفي النهايه لكم مني كل الشكر .

تم تعديل هذه المشاركة بواسطة زيدان في 26 أبريل 2004 في 05:20

#8

مشكووورين عالمساعده

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…