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

stack function

بدأه no yes في 18 يونيو 2011 · 18 رد · 828 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

لدي برنامج وقد قمت بحله ,, ولكن لدي اخطاء بسيطه لا ادري ان كانت في (الفنكشن) ام جهازي لايعمل جيدا

i want write a program that will read integer number anf then print whether this number digits are palindrome or not>

# include <iostream>
#include <assert.h>
using namespace std;


template <class Type>
class stackType
{
private:
	Type *list;
	int stackTop;
	int maxSize;

public:
	stackType(int);
	int isEmpty();
	int isFull();
	void push(Type& item);
	void pop();
	Type Top();
	void palindrome(stackType<Type>&s);

};

template <class Type>
stackType<Type>::stackType(int size=100)
{
	if(size<=100)
		maxSize=100;
	else
		maxSize=size;
	stackTop=0;
	list=new Type[maxSize];
	assert(list !=NULL);
}

template <class Type>
int stackType<Type>::isEmpty()
  {
	 bool found=true;
	if(stackTop=0)
	    return  true;
	else
		return false;
	}

template <class Type>
int stackType<Type>::isFull()
{
	bool found=true;
	if(stackTop=maxSize)
	  return true;
	else
		return false;

}

template <class Type>
void stackType<Type>::push(Type& item)
{
	if(isFull())
		cout<<"full stack>>";
	else
	{
		list[stackTop]=item;
		stackTop++;
	}
}


template <class Type>
void stackType<Type>::pop()
{
	if(isEmpty())
		cout<<"is Empty>>";
	else
		stackTop--;
}

template <class Type>
Type stackType<Type>::Top()
{
	assert(stackTop !=0);
	return list [stackTop-1];
}


template <class Type>
void stackType<Type>::palindrome(stackType<Type>&s)
{
	int digte;
    cout<<"please enter your number";
		cout<< endl;
		cin>>digte;
	int d=digte;
	stackType <Type>s1;                                //	stackType <Type>s2;

	while(!s.isFull())                                //(s!=0)
{
	int y=digte;
	int x=digte%10;
	s.push(x);
    s1.push(x);
	digte=digte/10;
}

//while(!s1.isEmpty())
//{
//  s2.push(s1.Top());
//s1.pop();
//}

while(!s.isEmpty())
{
if(s.Top()==s1.Top())
{
s.pop();
s1.pop();
}
else
{
break;                                                   
   cout<<d<<"is not palindrome";
}
cout<<d<<"is palindrome";
}
}


int main()
{
	int length;
	cin>>length;

	stackType<int>Q(length);
	stackType<int>b(length);
	Q.palindrome(b);


	return 0;
}
#2

اولا انت استخدمت assert وهذه العملية سوف توقف البرنامج تماما اذا لم يتحقق الشرط،

لماذا قمت بعمل ستاك و عملته template مادام انك داري انك راح تفحص ارقام؟

يعني انت زي اللي بيستخدم دبابة علشان يحارب فأر :) مالم يطلب السؤال ذلك فليس هناك داعي لك التعقيد الذي قمت به

كل اللي عملته ما كانش له اي داعي كان ممكن تحل السؤال باستخدام كود طبيعي من داله واحده او من دالتين ()main () + isPlaindrome

كل اللي انتا محتاجه هو تفكيك الرقم الى اجزاء وبس

تم تعديل هذه المشاركة بواسطة mental-driller في 18 يونيو 2011 في 11:36

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#3
void stackType::palindrome(stackType &s) 
{ 
        int digte; 
    cout<<"please enter your number"; 
                cout<< endl; 
                cin>>digte; 
        int d=digte; 
        stackType s1;  
		//   stackType <Type>s2; 

        while(!s.isFull())                                //(s!=0) 
{ 
        int y=digte; 
        int x=digte%10; 
        s.push(x); 
    s1.push(x); 
        digte=digte/10; 
} 

while(!s.isEmpty()) 
{ 
if(s.Top()==s1.Top()) 
{ 
s.pop(); 
s1.pop(); 
} 

else 

break;                                                    
 cout<<"is  not palindrome"<<endl; 
} //enf while
} //end fun

لم اتمكن من كتابه الكود بشكل صحيح هناك خلل

فانا اريده يطبع لي ان كان صح ام لا

وهو في كلتا الحالتين يطبع لي بان الرقم خطأ

#4

اولا قم بازالة الassert وسيعمل البرنامج

لتصحيح الخطأ المنطقي:

الخطأ هنا

     int y=digte; 
        int x=digte%10; 
        s.push(x); 
    s1.push(x); 
        digte=digte/10;

لاحظ انك تقوم بعمل push لنفس القيمة في الحالتين ، باقي قسمة العدد على عشرة يعطيك الرقم الذي في اقصى اليمين

للحصول على الرقم الذي في اقصى الشمال يجب ان تقسم على divisor الذي يمثل طول العدد مثلا اذا كان العدد 132231 يكون الرقم الذي تقسم عليه 100000 او (pow (10, length-1

عندما تغير قيمة digit يجب ان تقسم على 10 ثم تاخذ باقي القسمة على divisor لانك هنا تاخذ عددين لذا في حلقة التكرار التالية يصبح العدد 3223 لاحظ ان طول العدد تغير من 6 الى 4

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#5

البرنامج صحيح ,, فقط اريد حل المشكلة هذه ,, بالخط المكبر

اريد ان يطبع لي البرنامج عندما ادخل الرقم ان كان صحيا ام لا

لانني عندما اضع اي رقم ,, يظهر لي في كلتا الحالتين بان الرقم خطأ

فأرجوكم مساعدتي في ترتيب خطوات ( الفنكشن بالخط الكبير)

# include <iostream>

using namespace std; //#include <assert.h>

class stackType

{

private:

int *list;

int stackTop;

int maxSize;

public:

stackType(int);

int isEmpty();

int isFull();

void push(int & item);

void pop();

int Top();

void palindrome(stackType &s);

};

stackType::stackType(int size=100)

{

if(size<=100)

maxSize=100;

else

maxSize=size;

stackTop=0;

list=new int[maxSize];

}

//if(list !=NULL)

//cout<<" is not null";

//assert(list !=NULL);

int stackType::isEmpty()

{

bool found=true;

if(stackTop=0)

return true;

else

return false;

}

int stackType::isFull()

{

bool found=true;

if(stackTop=maxSize)

return true;

else

return false;

}

void stackType::push(int& item)

{

if(isFull())

cout<<"full stack>>";

else

{

list[stackTop]=item;

stackTop++;

}

}

void stackType::pop()

{

if(isEmpty())

cout<<"is Empty";

else

stackTop--;

}

int stackType::Top()

{

if(stackTop !=0)

return list [stackTop-1];

else

return -1;

}

void stackType::palindrome(stackType &s)

{

int digte;

cout<<"please enter your number";

cout<< endl;

cin>>digte;

int d=digte;

stackType s1;

// stackType <Type>s2;

while(!s.isFull()) //(s!=0)

{

int y=digte;

int x=digte%10;

s.push(x);

s1.push(x);

digte=digte/10;

}

while(!s.isEmpty())

{

if(s.Top()==s1.Top())

s.pop();

s1.pop();

else

cout<<"is not palindrome";

break;

}

cout<<"is palindrome";

}

int main()

{

int length;

cin>>length;

stackType Q(length);

stackType b(length);

Q.palindrome(b);

return 0;

}

تم تعديل هذه المشاركة بواسطة no yes في 18 يونيو 2011 في 21:31

#6

يا عزيزي الخطأ عندك هنا

while(!s.isFull()) //(s!=0)
{
int y=digte;
int x=digte%10;
s.push(x);
s1.push(x);
digte=digte/10;
}

انت معاك اثنين ستاك ، وعاوز تخزن نص الرقم في واحد والنص الباقي في الثاني، تمام؟

شكلك ما قريتش ردي السابق

ربنا يكون في عونك

1

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#7

اعتذر منك اخي

انا قرأت ردك السابق لكن لم انتبه,فقد كتبت مسبقا الحل الصحيح لكنني امحيته بالخطأ

وهذا تصحيح ماقلته لي

void stackType::palindrome(stackType &s) 
{ 
        int digte; 
    cout<<"please enter your number"; 
                cout<< endl; 
                cin>>digte; 
        int d=digte; 
        stackType s1;  
	 stackType s2; 

         while(!s.isFull())                                //(s!=0) 
{ 
        int y=digte; 
        int x=digte%10; 
        s.push(x); 
        s1.push(x); 
        digte=digte/10; 
} 
		while(!s1.isEmpty())
		{
			s2.push( s1.Top());
			s1.pop();
		}

while(!s.isEmpty())
            {
             if(s.Top()==s2.Top())

              s.pop();
              s2.pop();

          else
                cout<<"is not palindrome";
                break;                                                   


           }
cout<<"is palindrome";
}

الجزء العلوي وضعته كما قلت لي,,

وقد قمت بالمقارنه في الستاك الاصلي والستاك الثاني s s2

لكن يقوم بطباعه "is not palindrome" في كلتا الحالتين

لم احسن في ترتيب الجزء الاخير من الفنكشن

#8

اول حاجة الpush انت بتعمل push ل x في الاستاكين يعني نفس العدد بينخزن داخل الاستاكين

شوف التعديلات اللي انا عاملها على كودك

# include <iostream>
#include <assert.h>
#include <cstdlib>
#include <math.h>
using namespace std;



class stackType
{
private:
        int *list;
        int stackTop;
        int maxSize;

public:
        stackType(int);
        bool isEmpty();
        bool isFull();
        void push(int item);
        int pop();
        int Top();
        bool palindrome(stackType& s);
        int getSize(){return maxSize;}

};


stackType::stackType(int size=100)
{

        maxSize=size;
        stackTop=0;
        list=new int[maxSize];
        // assert(list !=NULL);
}


bool stackType::isEmpty()
  {
     return stackTop == 0 ;
  }


bool stackType ::isFull()
{
        return stackTop == maxSize - 1 ;

}


void stackType::push(int item)
{
        if(isFull())
                cout<<"full stack>>";
        else
        {
                list[stackTop++]=item;
        }
}



int stackType ::pop()
{
        if(isEmpty())
                cout<<"is Empty>>";
        else
                return list[--stackTop];
}


int stackType ::Top()
{
        //assert(stackTop !=0);
        return list [stackTop-1];
}



bool stackType::palindrome(stackType& s)
{
    int div = ceil(pow(10, s.getSize()-1));
    cout << div << endl;
    int digte;
    cout<<"please enter your number"<<endl;
    cin>>digte;
    int d=digte;
    stackType  s1 (s.getSize());                                //   stackType <Type>s2;

    while(digte != 0)                                //(s!=0)
    {
         int y=digte/div;
         int x=digte%10;
         s.push(y);
         s1.push(x);
         cout << y << " " << x << " " <<div << endl;
         digte=digte%div;
         digte=digte/10;
         div /= 100;
    }
   while(!s.isEmpty())
   {
         if(s.Top()!=s1.Top())
         {
           return false;
         }
         else
         {                                                     
           s.pop();
           s1.pop();         
         }
    }
    return true;
}


int main()
{
        cout <<"enter the length"<< endl;
        int length;
        cin>>length;
        stackType Q = stackType (length);
        stackType b = stackType (length);
        if(Q.palindrome(b))
                           cout << "it is a plaindrome"<<endl;
        else
            cout << "it is not a plaindrome"<<endl;
        system("pause");
        return 0;
}

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#9

اشكرك كثيرا :)

ٍسوف اعمل عليه

#10

السموحه على طول الغيبه

while(!s.isFull()) //(s!=0) 
{ 
int y=digte; 
int x=digte%10; 
s.push(x); 
s1.push(x); 
digte=digte/10; 
}

اخي هذا الكود صحيح جدا

ساضع لك مااريد

اريد ان اجزء الرقم الى ارقام وذلك عن طريق الموديلاس % والقسمه /

ثم اضع كل رقم في الستاك الاصلية والستاك رقم واحد,, كانه كوبي ستاك

ثم اريد ان احول الارقام من الستاك رقم واحد الى ستاك جديد رقم 2 لكي تصبح الارقام بالمقلوب

الان ستاك رقم واحد فاضي

ساقوم الان بعمل مقارنه مابين ستاك الاصلية وستاك رقم 2

للتاكد من انها بلندريوم

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

اقصد انه في كلتا الحالنين ان ادخلت رقم صحيح ام خاطئ سيظهر لي في الشاشه بأنه بلندريوم

#include <iostream>
using namespace std; //#include <assert.h>

class stackType
{
private:
int *list;
int stackTop;
int maxSize;
public:
stackType(int);
int isEmpty();
int isFull();
void push(int item);
void pop();
int Top();


};

stackType::stackType(int size=100)
{
if(size<=100)
maxSize=100;
else
maxSize=size;
stackTop=0;
list=new int[maxSize];
}

int stackType::isEmpty()
{
bool found=true;
if(stackTop=0)
return 1;
else
return -1;
}

int stackType::isFull()
{
bool found=true;
if(stackTop=maxSize)
return 1;
else
return -1;
}

void stackType::push(int item)
{
if(isFull())
cout<<"full stack>>";
else
{
list[stackTop]=item;
stackTop++;
}
}

void stackType::pop()
{
if(isEmpty())
cout<<"is Empty";
else
stackTop--;
}
int stackType::Top()
{
if(stackTop !=0)
return list [stackTop-1];
else
return -1;
}

bool palindrome(int digite) 
{ 
int d=digite; 
stackType s;
stackType s1; 
stackType s2; 

while(digite!=0) 
{ 
int x=digite%10; 
s.push(x); 
s1.push(x); 
digite=digite/10; 
} 

while(!s1.isEmpty())
{
s2.push( s1.Top());
s1.pop();
}


while(!s.isEmpty()) 
{

if(s.Top()!=s2.Top()) 
return false; 

else 
{ 
s.pop(); 
s2.pop(); 

} 

}// end while loop
 return true;
} //end function






void main()
{
int digite,length;

cout<<"your number size="<<endl;
cin>>length;

cout<<"please enter your number "<<endl;
cin>>digite;

//stackType Q(length);
//stackType b(100);
if(palindrome(digite))
cout << "it is a plaindrome"<<endl; 
else 
cout << "it is not a plaindrome"<<endl; 



}
#11

يا عزيزي الطريقة

while(!s.isFull()) //(s!=0) 
{ 
int y=digte; 
int x=digte%10; 
s.push(x); 
s1.push(x); 
digte=digte/10; 
}

خاطئة

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

while(digte != 0)                                //(s!=0)
    {
         int y=digte/div;
         int x=digte%10;
         s.push(y);
         s1.push(x);
         cout << y << " " << x << " " <<div << endl;
         digte=digte%div;
         digte=digte/10;
         div /= 100;
    }

لماذا لا تجرب علي اي رقم تريد خذ قلم وورقه وطبق عليه خوارزميتي وخوارزميتك وانظر ايهما اصح ، دع زملائك ايضا يجربون الحل

لاحظ ان البرنامج الذي قمت انا بكتابتة يعمل بشكل صحيح، فاذا كانت الخوارزمية المعطاه من قبلك صحيحه كما قال لك الدكتور فلماذا لم تعمل

s.push(x); 
s1.push(x);

الاستاكين يحتويان على نفس القيمة x اذا سوف يمتلكان نفس القيمة دائما ، ولكن لقد حاولت ان اوضح لك من بداية الموضوع وانت تصر على ان هذا الحل صحيح!

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#12

هههه

أشكرك اخي على صبرك معي

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

بمعنى اخر اننا نستخدم هذا الكود دائما لتجزئه رقم كبير الى ارقام اصغر ,, وهذا ماتعودنا على فعله

ربما انه لم يعمل بسبب خلل اخر في وضعي رتيرن فلس او ريتيرن ترو بشكل خاطئ او الاوقواس غير صحيحه في الكود

while(!s.isFull()) //(s!=0)  
{  
int y=digte;  
int x=digte%10;  
s.push(x);  
s1.push(x);  
digte=digte/10;  
}

لنفترض بانني ادخلت هذا الرقم( 234) واريد تجزئته بهذه الصوه 4 3 2

digte%10 ادخلت هذا الرقم 234 وقسمته على عشره والباقي سيكون 4 هنا اضيف انا 4 في الستاك الاصليه

اريد الان ان احذف رقما واحد ففقط من الرقم الكبير وذلك عن طريق قسمته على 10 فسيصبح الناتج 23

اكرر العملية

digte%10 هذا الرقم 23 وقسمته على عشره والباقي سيكون 3 هنا اضيف انا 3 في الستاك الاصليه

اريد الان ان احذف رقما واحد ففقط من الرقم الكبير وذلك عن طريق قسمته على 10 فسيصبح الناتج 2

مره اخيره

سيقى الرقم2 اقسمه على عشره واخذ الباقي وهو الرقم 2 واضيفه في الستاك الاصلية

اقسم 2 على عشرة والناتج صفر,, ستتوقف العملية هنا

الان في الستاك سيصبح بهذه الطريقه

2

3

4

وبما انني وضعن هذا الكود

s.push(x);

s1.push(x);

فسيكون الناتج في كلا الستاكين متشابه .. مالغرض من هذه الخطوة؟؟

هو انني عندما اقوم بنقل الارقام من ستاك 1 الى الستاك الجديد رقم2

سيكون محتوى ستاك 2 بهذه الطريقة

4

3

2

اي عكس الستاك السابق

الان اقوم بالمقارنه بين ستاك 2 وستاك 1,, لكن ستاك 1 اصبح فارغا

اذن اقوم بالمقارنه بين ستاك 2 وستاك الاصليه لانها نسخه من ستاك 1

مارايك اخي العزيز؟؟

تم تعديل هذه المشاركة بواسطة no yes في 2 يوليو 2011 في 14:30

#13

هممممممم، اعتذاري يا عزيزي الان فهمت قصدك ، سامحني ولكني نوعا ما كسول

بالرغم من الكود الذي قمت بكتابتة يعتبر سيئ من ناحية استخدام عدد كبير من المتغيرات المؤقتة سانظر فيه واقول لك وين المشكلة إن شاء الله

1

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#14

انظر هنا يا عزيزي

int stackType::isEmpty()
{
bool found=true;
if(stackTop=0)
return 1;
else
return -1;
}

لاحظ استخدام = بدلا من ==

ايضا لاحظ ارجاعك ل -1 بدلا من صفر

من المعروف ان دالة تعتبر اي قيمة غير الصفر true

تصحيح

int stackType::isEmpty()
{
bool found=true;
if(stackTop==0)
return 1;
else
return 0;
}

تم تعديل هذه المشاركة بواسطة mental-driller في 2 يوليو 2011 في 15:31

2

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#15

لكن الى الان ولم يعمل

لاتوجد في اي اخطاء عندما اضغط على زر كومبايل كنترول+اف7

لكن عندما اضع هذا الرقم 232 او هذا 123 ففي كلتا الحالتين يخبرني البرناممج بأنه بلندريوم

:(

تعبت حقا من المحاولات

#16

نفس المشكلة في الدالة isFull

اعمل نفس التعديل السابق وشوف

تم تعديل هذه المشاركة بواسطة mental-driller في 2 يوليو 2011 في 19:38

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#17

اشكرك حقا اخي العزيز :)

ربما جهازي به خلل

تم تعديل هذه المشاركة بواسطة no yes في 2 يوليو 2011 في 19:37

#18

UP UP ^^

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#19

عملت ذلك

شكرا :)

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