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

مشكلة في صياغة الكود

بدأه ماريا اسلام في 29 مايو 2009 · 14 رد · 811 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

قمت بعمل برنامج يميز بين المدخلات وهي عبارة عن معادلة .. لكن لم استطع صياغة الدالة التي تميز بين المتغيرات من a إلى z

والبرنامج كالتالي :

--------------------

#include<iostream.h>

#include<string.h>

#include<conio.h>

int state=1,index1=0;

char w[50];

int index2=0,l;

char st[10];

void putt(int);

int digits()

{

if(w[index1]>='0' && w[index1]<='9')

{

st[index2++]=w[index1++];

return 1;

}

else

return 0;

}

int sign()

{

if(w[index1]=='-');

{

st[index2++]=w[index1++];

return 1;

}

else

return 0;

}

int oper()

{

if(w[index1++]=='+' || w[index1]=='-' || w[index1]=='*' ||w[index1]=='/')

{

st[index2++]=w[index1++];

putt(2);

return 1;

}

else

return 0;

}

void err()

{

if(state==2)

cout<<"error in position :"<<index1<<"it is not number\n";

else

if(state==4)

cout<<"error in position :"<<index1<<"it is not operation or did not found number after operation\n";

index1-l+1;

}

void main()

{

cin>>w;

l=strlen(w);

w[l]='\0';

while(index1<=l)

{

switch(state)

{

case1: if(digits())

state=3;

else

state=2;

break;

case2: if(sign() && digits())

state=3;

else

err();

break;

case3: if(!(digits()))

{

putt(1);

state=4;

}

break;

case4: if(oper() && digits())

state=5;

else

err();

break;

case5: if(index1==l)

{

putt(1);

index1++;

}

else

if(!(digits()))

{

putt(1);

state=4;

}

break;

}

}

getch();

}

void putt(int a)

{

st[index2]='\0';

switch(a)

{

case1: cout<<"\n"<<st<<" \t"<<"number\n";

index2=0;

break;

case2: cout<<"\n"<<st<<" \t"<<"operation\n";

index2=0;

break;

}

}

بالإضافة إلى ان البرنامج يقول عند التنفيذ :

misplaced else

else الموجودة داخل الدالة sign

أرجو افادتي بشأن else وكذلك الدالة التي تميز بين المتغيرات .. ولكم جزيل الشكر..

تم تعديل هذه المشاركة بواسطة بن العيد في 30 مايو 2009 في 20:05

ربي هذا العهد لك ... عزم القلب الوفا

#2

السلام عليكم

البرنامج بدون أخطاء

بس لو مثال على الإدخال والإخراج عشان نفهم أكثر

#include<iostream.h>
#include<string.h>
#include<conio.h>
int state=1,index1=0;
char w[50];
int index2=0,l;
char st[10];

void putt(int);

int digits()
{
if(w[index1]>='0' && w[index1]<='9')
{
st[index2++]=w[index1++];
return 1;
}
else
return 0;
}

int sign()
{
if(w[index1]=='-')
{
st[index2++]=w[index1++];
return 1;
}
else
return 0;
}

int oper()
{
if(w[index1]=='+' || w[index1]=='-' || w[index1]=='*' ||w[index1]=='/')
{
st[index2++]=w[index1++];
putt(2);
return 1;
}
else
return 0;
}

void err()
{
if(state==2)
cout<<"error in position :"<<index1<<"it is not number\n";
else
if(state==4)
cout<<"error in position :"<<index1<<"it is not operation or did not found number after operation\n";
index1=index1-l+1;
}

void main()
{
cin>>w;
l=strlen(w);
w[l]='\0';
while(index1<l)
{
switch(state)
{
case 1:
if(digits())
state=3;
else
state=2;
break;
case 2:
if(sign() && digits())
state=3;
else
err();
break;
case 3:
if(!(digits()))
{
putt(1);
state=4;
}
break;
case 4: if(oper() && digits())
state=5;
else
err();
break;
case 5: if(index1==l)
{
putt(1);
index1++;
}
else
if(!(digits()))
{
putt(1);
state=4;
}
break;
}
}
getch();
}

void putt(int a)
{
st[index2]='\0';
switch(a)
{
case 1: cout<<"\n"<<st<<" \t"<<"number\n";
index2=0;
break;
case 2: cout<<"\n"<<st<<" \t"<<"operation\n";
index2=0;
break;
}
}

سلام

اللهم صل على سيدنا محمد وعلى آله وصحبه وسلم

#3

المثال التالي يوضح كيفية الإدخال :

12x+51xy*14/x

يكون الإخراج :

12 number

x variable

+ operation

51 number

xy variable

هنا أعتبر الإكس والواي متغير واحد

.

.

.

-------------------------

المثال الثاني :

x12+xy7*74+58/56y5

هنا الإكس 12 متغير

وكذلك الإكس واي 7 يعتبر متغيراً

x12 variable

xy7 variable

* operation

74 number

.

.

56 number

y5 variable

--------------------------

المتغير يعتبر متغيرا سواء كان واحد أو أكثر صغيراً أو كبيرأً

أيضاً هناك فرق بين قدوم الرقم قبل المتغير أو بعده

----------------------------------

بارك الله فيك ..

ربي هذا العهد لك ... عزم القلب الوفا

#4

هذه هي احد مراحل Compiler .. وتسمى مرحلة ال Token Analyzer ..

اي تقسيم الكود الداخل الى توكنات ( اجزاء صغيرة ) ومن ثم تحليل نوعها ..

----------------------------------

بالنسبه للكود اعلاه ..

جربته مع

s1 فقط ولكنه توقف العمل عندي .. من دون اضهار خطا ..

-----------------------------

صحيح هو يحتوي على خطأ بسيط يمكن انتي لم تنتبهي له وهو

int sign()
{
if(w[index1]=='-');
{
st[index2++]=w[index1++];
return 1;
}
else
return 0;
}

هذه هي الدالة التي كتبتيها ..

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

----------------------------------------------

اسمعي اختي ..

طريقة عملك معقدة جدا ..

اذا كنتي غير محددة بطريقة ما او شكل ما .. يمكنك اتباع الطريقة العلمية للحل .. وهي بالشكل التالي ..

نحتاج الى مصفوفات من نوع string .. وهي مصفوفات ذات البعدين واخرى بعد واحد .. كل مصفوفة تحتوي على كل نوع يعالجه برنامجك .. ولكن الثابثة فقط .. يعني مثلا الرموز ) او ( او , او . او ; والتي تكون نتيجتها symbol .

او مثلا ..

char op[] = {'+','-','/','*'";

والتي تكون نتيجتها operator ..

هذا شكل لتعريف هذه المصفوفات ..

بعدها تسحبين المدخل حرف حرف . ركزي على حرف حرف .. ومن ثم تقارنين هذا الحرف مع ما موجود في كافة المصفوفات لتظهر النتيجة ..

ماعدا الارقام والحروف ..

طريقة المقارنة تكون بالشكل التالي ..

if (c >='0' && c <= '9)
cout << "number";

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

لا يتطلب منك اجراء دالة ..

فعمل الدالة مباشرة سيربكك في البداية ..

لذلك برمجي الكود بداخل main مباشرة من دون دوال وهذا البرنامج لا يتطلب اكثر من عشر اسطر حسب ما اتذكر داخل الmain او اكثر بقليل ...

استخدمي هذه الملاحظات لانني ايضا واجهني هذا البرنامج هذه السنه مع مادة المترجمات وقمت بحله على هذه الخطوات التي اكتشفتها بنفسي ..

----------------------------------

انا استطيع ان ارفق الحل كاملا ( ان وجدته في حاسبتي ) ولكن قوانين المنتدى لا تسمح .. المسموح المساعدة .. وقد وصلت لكي مااستطعت توصيله ..

تحياتي العطرة للجميع ..

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#5

السلام عليكــم ورحمـة الله وبركاتــه ،،

char c='k'; // k as an example

if (c >='a' && c <= 'z')

cout << " small char";

(c >='A' && c <= 'Z')

cout << " capital char";

#6
اقتباس
اذا كنتي غير محددة بطريقة ما او شكل ما .. يمكنك اتباع الطريقة العلمية للحل .. وهي بالشكل التالي ..

نحتاج الى مصفوفات من نوع string .. وهي مصفوفات ذات البعدين واخرى بعد واحد .. كل مصفوفة تحتوي على كل نوع يعالجه برنامجك .. ولكن الثابثة فقط .. يعني مثلا الرموز ) او ( او , او . او ; والتي تكون نتيجتها symbol .

او مثلا ..

كودchar op[] = {'+','-','/','*'";

والتي تكون نتيجتها operator ..

هذا شكل لتعريف هذه المصفوفات ..

بعدها تسحبين المدخل حرف حرف . ركزي على حرف حرف .. ومن ثم تقارنين هذا الحرف مع ما موجود في كافة المصفوفات لتظهر النتيجة ..

ماعدا الارقام والحروف ..

طريقة المقارنة تكون بالشكل التالي ..

كودif (c >='0' && c <= '9)

cout << "number";

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

لا يتطلب منك اجراء دالة ..

فعمل الدالة مباشرة سيربكك في البداية ..

لذلك برمجي الكود بداخل main مباشرة من دون دوال وهذا البرنامج لا يتطلب اكثر من عشر اسطر حسب ما اتذكر داخل الmain او اكثر بقليل ...

التركيز على أن أسحب حرف حرف ومقارنتها باستخدام المصفوفة على أنها رقم أو رمز يعني عملية أمر معروف مفروغ منه .. لكن أنت لم تتحدث عما كنت أريده .. ثم إني أريد دالة لا إدراجها في main ..ومما فهمته منك أعادة كتابة البرنامج .. ربما لم تفهمني بعد أو أنني لم أصل إلى ما تريده !

شكراً لك..

تم تعديل هذه المشاركة بواسطة ماريا اسلام في 31 مايو 2009 في 09:41

ربي هذا العهد لك ... عزم القلب الوفا

#7
اقتباس
السلام عليكــم ورحمـة الله وبركاتــه ،،

char c='k'; // k as an example

if (c >='a' && c <= 'z')

cout << " small char";

(c >='A' && c <= 'Z')

cout << " capital char";

وعليكم السلام ورحمة الله..

وصلت .. ! ولكن مازالت المشكلة !!...

شكراً لك...

ربي هذا العهد لك ... عزم القلب الوفا

#8

السلام عليكم

#include<iostream.h>
 #include<string.h>
 #include<conio.h>
 int state=1,index1=0;
 char w[50];
 int index2=0,l;
 char st[10];

 void putt(int);

 int digits()
 {
 if(w[index1]>='0' && w[index1]<='9')
 {
 st[index2++]=w[index1++];
 return 1;
 }
 else
 return 0;
 }
 int var()
 {
	 if((w[index1]>='a' && w[index1]<='z') ||(w[index1]>='A' && w[index1]<='Z'))
	 {
			 st[index2++]=w[index1++];
		while(w[index1]>='0' && w[index1]<='9')
		st[index2++]=w[index1++];
			return 1;
	 }
	 else return 0;
 }
 int sign()
 {
 if(w[index1]=='-')
 {
 st[index2++]=w[index1++];
 return 1;
 }
 else
 return 0;
 }

 int oper()
 {
 if(w[index1]=='+' || w[index1]=='-' || w[index1]=='*' ||w[index1]=='/')
 {
 st[index2++]=w[index1++];
 putt(2);
 return 1;
 }
 else
 return 0;
 }

 void err()
 {
 if(state==2)
 cout<<"error in position :"<<index1<<"it is not number\n";
 else
 if(state==4)
 cout<<"error in position :"<<index1<<"it is not operation or did not found number after operation\n";
 index1=l;
 }

 void main()//12x
 {
 cin>>w;
 l=strlen(w);
 w[l]='\0';
 while(index1<l)
 {
 switch(state)
 {
 case 1:

 if(digits())
 state=3;
 else
 state=2;
 break;
 case 2:
 if(sign() && digits())
 state=3;
 else
 err();
 break;
 case 3:
 if(!(digits()))
 {
 putt(1);
 state=6;
 }
 break;
 case 6:
	 if(var())
		 state=7;
	  if(index1==l) putt(3);
	 break;
 case 7:
	 if(!var())
	 {
		 putt(3);
		 state=4;
	 }
	 if(index1==l) putt(3);
	 break;
 case 4:
 if(oper())
 {
	 if(digits())
	 {
		 state=3;
	 }
	 else if(var())
	 {
		 state=7;
	 }
 }
 else
 err();
 break;
 }
 }
 getch();
 }

 void putt(int a)
 {
 st[index2]='\0';
 switch(a)
 {
 case 1: cout<<"\n"<<st<<" \t"<<"number\n";
 index2=0;
 break;
 case 2: cout<<"\n"<<st<<" \t"<<"operation\n";
 index2=0;
 break;
 case 3: cout<<"\n"<<st<<"\t"<<" Varient\n";
	 index2=0;
	 break;
 }
 }

أرجو ان تؤدى الغرض

سلام

تم تعديل هذه المشاركة بواسطة amin_mu123 في 31 مايو 2009 في 13:17

اللهم صل على سيدنا محمد وعلى آله وصحبه وسلم

#9

وضحي اكثر ..

ممكن لم افهم .. ؟؟

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#10
اقتباس
السلام عليكم

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

البرنامج يعتبر صحيحاً في حالة واحدة فقط وذلك عندما يكون المدخل :

12x+53xy-47x-5+2 عند الإدخال 
الإخراج
12 n
x   var
+  oper
53  n
xy  var
-  oper
47  n
x   var
-  oper
5   n

أما +و 2 فغير مدرجتان ضمن الخرج

ويعلق الجهاز ولا يستطيع الرجوع للسابق ..!

أما إذا أدخلت :

x12+45-68xy*5



فإنه يطبع error مباشرة عند الموقع الصفر

أما إذا أدخلت :

12x+65-4*12

يطبع الرقم الأول فقط 12 أو إلى النصف ... والمهم في هذاكله أن الجهاز يعلق ..

البرنامج نصف صحيح !!

المفروض اعتبار

x12

متغير تماما كـ

x12

إذاً أحمد الله أن هذا السؤال لم يأتي في الإختبار !..

لقد وضع لهذا السؤال نصف درجة الإمتحان النهائي إذا نفذ كاملاً بدون أخطاء !!..

بارك الله فيك ..

ربي هذا العهد لك ... عزم القلب الوفا

#11
سنان محمد صالح كتب:
وضحي اكثر ..

ممكن لم افهم .. ؟؟

حسناً سأوضح لك مقصدي :

البرنامج مدخلاته معادلة تتكون من أرقام والعمليات الأربع المعروفة ومتغيرات كما هو معروف ..

الغرض من البرنامج هو :

أذا أدخلت معادلة يتم إخراج كل واحدة على حده .. مثلاً :

12x+25-8xy*4/2x

يكون الخرج كالتالي :

12  number
x   variable
+ operation
25  number
xy  variable
.
.
.
وهكذا ..

أيضاً 

x12+5xy5-58/4

x12  variable
+   operation
5   number
xy5  variable
-  operation
.
.
.

بالمناسبة يجب الإنتباه إلى أن

12x

12 number
x variable

أما 
x12

x12 variable

هل فهمتني يا أخي !!

بارك الله فيك..

ربي هذا العهد لك ... عزم القلب الوفا

#12

فهمتك الان كما فهمتك بالمرة الاولى ..

وساجيب عليك كما جاوبت بالمرة الاولى ..

اسمعي ..

هنالك دالة من ضمن دوال string.h .. مغزاها تقسيم الجمل الى توكنات .. وهو ما مطلوب في برنامجك .. وبعد التقسيم .. يمكن التحليل ..

هذه الدالة هي strtok ..

كما في المثال التالي ..

void main()
{
char myString[] = "Arab Team 2000";
char *p = strtok(myString, " ");
while (p) 
{
	printf ("Token: %s\n", p);
	p = strtok(NULL, " ");
}
}

هذا الكود يقوم بتقسيم الجمل الداخلة الى توكنات من حيث الفواصل .. وفي المثال الفاصل الموجود هو الـ " " اي الفراغ ..

يمكنك تجربته .. وتحويره ..

ستشاهدين ان كل كلمة من الدخل في سطر جديد .. وتمت عملية التنزيل بعد تحقق شرط وجود الفراغ بين الكلمات .. لان كل كلمة بينها فراغ ..

لكن لو اردنا ..

يمكن تغيير الفراغ الى + وضعي + في احد الاماكن .. ستشاهدين ان ما يتم تنزيله في سطر جديد هو ما بعد + فقط ..

يمكنك تحوير الشرط .. الى number و var وغيرها .. ولكن تحتاج شوية تعب ..

تحياتي العطرة ..

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#13

السلام عليكم

جربى أختى الكود التالى

#include <iostream>
  using namespace std;
  int what_kind(char a)
  {
	  if(a>='0' && a<='9') return 1;
	  else if((a>='a' && a<='z') || (a>='A' && a<='Z')) return 2;
	  else if(a=='+' || a=='-' || a=='*' || a=='/' || a=='^') return 3;
	  else
		  return 0;
  }
  char w[50],st[10];
  int index_w=0,index_s=0;

  int main()
  {
	  int size;
	  cin>>w;
  size=strlen(w);
  w[size]='\0';
 if(w[index_w]=='-') {
	 st[index_s++]='-';
	 index_w++;
 }
  while (index_w<size)
  {
	  switch(what_kind(w[index_w])) {
	  case 1:
		  {
			  st[index_s++]=w[index_w++];
			  if((what_kind(w[index_w])==2 || what_kind(w[index_w])==3) || index_w==size)
			  {
				  st[index_s]='\0';
				  cout<<st<<"  ----->  number\n";
				  index_s=0;
		  }
		  }
		  break;
	  case 2:
		  {
			  st[index_s++]=w[index_w++];
			  while (what_kind(w[index_w])==1)
			  {
				 st[index_s++]=w[index_w++]; 
			  }
				  if((what_kind(w[index_w])==1 || what_kind(w[index_w])==3) || index_w==size)
			  {
					  st[index_s]='\0';
				  cout<<st<<"  ----->  varient\n";
				  index_s=0;
			  }
		  }
		  break;
	  case 3:
		  {
			  st[index_s++]=w[index_w++];
			  if((what_kind(w[index_w])==1 || what_kind(w[index_w])==2) || index_w==size)
			  {
				  st[index_s]='\0';
				  cout<<st<<"  ----->  operator\n";
				  index_s=0;
		  }
		  }
		  break;
	  }
  }
	  return 0;
  }

هل أدى المطلوب؟؟

تم تعديل هذه المشاركة بواسطة amin_mu123 في 31 مايو 2009 في 23:12

اللهم صل على سيدنا محمد وعلى آله وصحبه وسلم

#14

وعليكــم السـلام ورحمة الله وبركاتـه..

أخي amin سواءً أدى المطلوب أم لا فأنا أشكرك جزيل الشكر على مجهودك الطيب .. بارك الله فيك

والآن إليك برنامجي الطويل..!! :blink: :blink:

 

#include<iostream.h>
#include<string.h>
#include<conio.h>
int state=1,index1=0;
char w[50];
int index2=0,l;
char st[10];

void putt(int);

int digits()
{
if(w[index1]>='0' && w[index1]<='9')
{
st[index2++]=w[index1++];
return 1;
}
else
return 0;
}

int var()
{
if((w[index1]>='A' && w[index1]<='Z') || (w[index1]>='a' && w[index1]<='z'))
{
st[index2++]=w[index1++];
return 1;
}
else
return 0;
}

int sign()
{
if(w[index1]=='-')
{
st[index2++]=w[index1++];
return 1;
}
else
return 0;
}

int oper()
{
if(w[index1]=='+' || w[index1]=='-' || w[index1]=='*' ||w[index1]=='/')
{
st[index2++]=w[index1++];
putt(2);
return 1;
}
else
return 0;
}

void err()
{
if(state==7)
cout<<"error in position :"<<index1<<"it is not number or variable\n";
else
if(state==4)
cout<<"error in position :"<<index1<<"it is not operation or did not found number or variable after operation\n";
index1=l+1;
}

void main()
{
cin>>w;
l=strlen(w);
w[l]='\0';
while(index1<=l)
{
switch(state)
{
case 1:
if(digits())
state=3;
else
state=2;
break;
case 2:
if(sign() && digits())
state=3;
else
state=10;
break;
case 3:if(index1==l)
{putt(1);index1++;}
else
if(!(digits()))
{
putt(1);
state=4;
}
break;
case 4: if(oper() && digits())
state=5;
else
{
if((oper() && var())||var())
state=9;
else
err();
}
break;
case 5:if(index1==l)
{
putt(1);
index1++;
}
else
if(!(digits()))
{
putt(1);
state=4;
}
break;
case 6:
if((var()&&digits())||(sign()&&var()&&digits()))
state=8;
else
state=7;
break;
case 7:
if((digits()&&var())||(sign()&&digits()&var()))
{
putt(1);
state=8;
}
else
err();
break;
case 8:if(index1==l){putt(3);index1++;}
else
if(!(digits()||var()))
{
putt(3);
state=4;
}
break;
case 9:if(index1==l)
{
putt(3);
index1++;
}
else
if(!(digits()||var()))
{
putt(3);
state=4;
}
break;
case 10:if(var() || (sign() && var()))
state=8;
else
state=6;
}
}
getch();

}

void putt(int a)
{
st[index2]='\0';
switch(a)
{
case 1: cout<<"\n"<<st<<" \t"<<"number\n";
index2=0;
break;
case 2: cout<<"\n"<<st<<" \t"<<"operation\n";
index2=0;
break;
case 3: cout<<"\n"<<st<<" \t"<<"variable\n";
index2=0;
break;
}
}

تم تعديل هذه المشاركة بواسطة ماريا اسلام في 2 يونيو 2009 في 19:29

ربي هذا العهد لك ... عزم القلب الوفا

#15

تسلم يدك أخت ماريا :thumb_up:

اللهم صل على سيدنا محمد وعلى آله وصحبه وسلم

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