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

مساعدة في برنامج للمكدسات !

بدأه iDream في 22 فبراير 2012 · 3 رد · 2,141 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

عندي بروجكت عن المكدسات ..

والواجب عبارة عن عمل برنامج ، المستخدم يدخل فيه عدد من الألوان : احمر - اصفر - ازرق .... الى حد 15 لون

بعد كدا يختار لون من دي الألوان عشان يشيلها من المكدسه ،

وارجع المكدسه زي ماكانت بس من غير اللون اللي اختار المستخدم انه يحذفه !!

مثال :

Suppose you place ccolors in this order: R R Y B G R B Y B G Y R B B G

Then the stack would look like this:

R

R

Y

B

G

R

B

Y

B

G

Y

R

B

B

G (top of stack)

If you asked to remove all green the resulting stack would be:

R

R

Y

B

R

B

Y

B

Y

R

B

B(top of stack)

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

أنا عملت كود ، لكن مو راضي يزبط معايا أبداً للأسف ، وماني عارفة اللي عملته صح او خطأ !!

فهل في أحد يفيدني فين خطأي وايش ممكن أقدر أعمل ؟؟

#include <iostream>

#include <fstream>

#include <cstdlib>

//#include <string>

//#include <stack>

using namespace std;

const char maxstack = 15;

class stack_type // declaration of class//

{

public:

void clear_stack(); //member functions//

bool empty_stack(); // of class stack_type//

bool full_stack();

void push(char color);

void pop(char& color);

// int stack[maxstack];

int top,size;

};

//---------------------------------------------------------------------

int main()

{

stack_type s1,s2;

int i;

char candy,rcolor;

s1.clear_stack();

s2.clear_stack();

//stack<string> instack, outstack;

int n;

//string a, b;

//cin>>n;

cout << " Enter some coolor : \n";

cin>>candy;

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

{

s1.push(candy);

}

cout<<" what Color do you wish to remove? = \n";

cin>>rcolor;

while (s1.size())

{

if (s1.top!=rcolor)

{

s2.push(s1.top);

s1.pop(candy);

}

}

while (s2.size())

{

cout<<s2.top<<endl;

s2.pop(candy);

}

system ("pause");

return 0;

}

//----------------------------------------------------------------------

void stack_type::clear_stack()

{

top = 0;

}

//----------------------------------------------------------------------

bool stack_type::empty_stack()

{

if (top==0)

return true;

else

return false;

}

//----------------------------------------------------------------------

bool stack_type::full_stack()

{

if (top==maxstack-1)

return true;

else

return false;

}

//----------------------------------------------------------------------

void stack_type::push(char color)

{

top = top + 1;

stack[top]=color;

}

//----------------------------------------------------------------------

void stack_type::pop(char& color)

{

color = stack[top];

top = top - 1;

}

#2

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

أخى الكريم لن أستطيع تعديل الكود لأنه مكتوب بلغة السي ++

ولكن كتبت لك نفس البرنامج بلغة السي ولك أن تحوله للغة السي ++

لقد إستخدمة المؤشرات والحجز الديناميكى للذاكرة وبالتالى سعة المكدسة مفتوحة أى أن ليس لها حد أقصى لإمتلائها إلا إذا إستخدمة كل الذاكرة الموجودة بجهازك :D

أى أنك لست بحاجه للدالة :

bool full_stack();

ويمكنك أيضاً عمل المكدسة بإستخدام المصفوفات ولكن أنا أفضل المؤشرات لتتحكم ببرنامج كيف ما تريد

وضعت شرح مبسط أثناء كتابة الكود

إليك كود البرنامج بلغة السي وقم بتحويلة للغة السي ++ إن أردت ذلك :

// برنامج المكدسة بلغة السي
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// تعريف التركيب للمكدسة
// تم إستخدام المؤشرات للمكدسة وبالتالى ليس هناك حد أقصى لقيم المكدسة إلى إنتهاء الذاكرة
struct stack
{
	char Color;
	struct stack *pnext;
};
typedef struct stack stk;

stk *topOfStack=NULL;   // إسناد المؤشر الفارغ لأول قيمة فى المكدسة
// تعريف الدوال المستخدمة
void clear_stack(void); // تفريغ المكدسة نهائياً
bool empty_stack(void); // لإخبار المكدسة أهى فارغة أم لا
void push(void); // دالة إدخال اللون للمكدسة
void popAndDelt(void);
void display(void);
int main(void)
{
     int choice=0; // هذا المتغير لتخزين إختيار المستخدم
     printf(" press 1 to push an Color");
     printf("\n press 2 to pop and delet an Color from stack and display it");
     printf("\n press 3 to display the Colors in stack");
     printf("\n press 4 to clear the stack");
     printf("\n press 5 to exit");
do
{ 
     printf("\n enter your choice:");
     scanf("%d",&choice);
switch(choice)
{
     case 1:
         push();
         display();
     break;
     case 2: 
         popAndDelt();
         printf("\n stack after pop and delet");
         display();
     break;
     case 3: display();
     break;
     case 4:
         clear_stack();
     break;
     case 5:
     break;
     default: printf("\nwrong choice enter between 1 & 5 only");
}
}while(choice!=5);
return 0;
}



void push(void)
{ 
     stk *ptemp;                       // لحفظ القيمة المدخلة من المستخد نعرف مؤشر من النوع مكدسة
     ptemp=(stk*)malloc(sizeof(stk));  // الحجز الديناميكى لعناصر المكدسة
     printf(" enter Color charcter to be pushed on to stack:");
     scanf("%s",&ptemp->Color);
     ptemp->pnext=topOfStack;          // إسناد قيمة للمؤشر فى التركيب ليشير للعنصر التالى
     topOfStack=ptemp;                 // جعلها القيمة الأولى فى المكدسة
}

bool empty_stack(void){           // لإختبار المكدسة أهى فارغة أم لا
     if(topOfStack==NULL)
     return true;
     else
     return false;
}

void popAndDelt(void) // هذه الدالة لسحب وحذف أعلى عنصر فى المكدسة
{ 
     // تعريف مؤشر مؤقت لحفظ القيمة المراد حذفها
     stk *ptemp = topOfStack;
     // إختبار هل المكدسة فارغة أم لا
     if (empty_stack() == true)
    { 
         printf(" stack is empty\n");
    }
    else
    { 
         topOfStack=topOfStack->pnext; // نقل المؤشر لأعلى قيمة فى المكدسة
         free(ptemp); // حذف القيمة أعلى لون فى المكدسة
    }
}



void display(void) // دالة عرض القيم داخل المكدسة
{ 
     stk *ptemp = topOfStack; // مؤشر مؤقت من نوع المكدسة
     printf(" Colors in Stack are :\n");
    if (empty_stack() == true) // شرط أن الكدسة فارغة
         printf(" stack is empty\n");
    else
    { 
         while (ptemp!=NULL)       // دوران حتى نهاية المكدسة
        { 
             printf(" %c\n",ptemp->Color); // طباعة الألوان فى المكدسة
             ptemp=ptemp->pnext;       // نقل المؤشر
        } 
    }
}

void clear_stack(void)     // دالة تفريغ المكدسة
{ 
     stk *ptemp = topOfStack;   // مؤشر مؤقت من نوع المكدسة
     printf("\n Colors in Stack are :\n");
    if (empty_stack() == true) // شرط أن الكدسة فارغة
    printf("\n stack is empty");
    else
    { 
        while (ptemp)        // دوران حتى نهاية المكدسة
        {
             topOfStack = ptemp->pnext;  // نقل المؤشر لأعلى قيمة فى المكدسة
             free(ptemp);                // حذف القيمة أعلى لون فى المكدسة
             ptemp=topOfStack;           // جعل القيمة التالية هى أعلى المكدسة لحذفها فى المرة القادمة
    }
    printf(" stack has been cleaned !!!"); 
}
}

تم تعديل هذه المشاركة بواسطة ahmedsaoud31 في 22 فبراير 2012 في 19:29

1

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#3
اقتباس
ويمكنك أيضاً عمل المكدسة بإستخدام المفصوفات ولكن أنا أفضل المؤشرات لتتحكم ببرنامج كيف ما تريد

... :wacko: :blink: ممكن حضرتك تشرح معنى "المفصوصات" ! :D لأنني لم أسمع عنها مُسبقا ! :lol:

بارك الله فيك أخي أحمد, فعلا مشاركة قيمة. :)

+1

تم تعديل هذه المشاركة بواسطة khaled_prg في 22 فبراير 2012 في 18:48

#4
اقتباس
... :wacko: :blink: ممكن حضرتك تشرح معنى "المفصوصات" ! :D لأنني لم أسمع عنها مُسبقا ! :lol:

تم التعديل ... الواحد عايز يدرس لغة عربية من جديد لغات البرمجة نستنا لغتنا :D

اقتباس
بارك الله فيك أخي أحمد, فعلا مشاركة قيمة. :)

+1

ده مجرد تطبيق عملى على المؤشرات بعد تمرين المؤشرات الخاص بك الذى أنعش ذاكرتنا من جديد أستاذ خالد

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

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