پیاده سازی تابع اضافه کردن rear و حذف کردن front در صف به زبان سی

v.b.f1

Active Member
با سلام خدمت دوستان

من یه توضیح و برنامه ای میخوام که با زبان سی نوشته شده باشه که در مورد اضافه و حذف کردن در صف باشه


یکی از دوستان راهنمایی کردن که به زبان c++ برای اضافه کردن

به این شکل کار میکنیم

void addqueue(int x)
if (rear==n)
cout<<"is full";
else
{
rear++;
queue[rear}=x;
}
}

و برای حذف کردن

void delqueue(int x)
if (front==rear)
cout<<"is empyt";
else
{
front++;
queue[front}=x;
}
}

return x;
}
}​

اگه مممکنه برای ساخته یه برنامه کامل با زبان سی راهنمایی و کمک کنید

باتشکررررررررررررر
 
آخرین ویرایش:

the_king

مدیرکل انجمن
با سلام خدمت دوستان

من یه توضیح و برنامه ای میخوام که با زبان سی نوشته شده باشه که در مورد اضافه و حذف کردن در صف باشه
اگه مممکنه برای ساخته یه برنامه کامل با زبان سی راهنمایی و کمک کنید
باتشکررررررررررررر
تیکه کدی که نوشتید خیلی ایراد داره، شرط خالی و پر بودن صف که کلا ایراد داره و با ساختار آرایه ها در C و ++C
جور در نمیاد.

موقعی هم که از صف عنصری رو بر می دارید مشخص نمی کنید که فلان عنصر رو بردار، حق انتخاب کردن ندارید،
همیشه اولین عنصر رو از جلوی صف تحویل می گیرید. اون پارامتر تابع delqueue اضافیه.

در ضمن در شروع کار که صف خالیه rear و front ابتدای آرایه هستند. هر بار که عنصری به صف اضافه می کنید
مقدار rear اضافه میشه و در آرایه جلو میره و هر بار که عنصری رو از صف بر می دارید، front به سمت rear جلو میره.
پس موقعی که صف خالی شد دیگه rear و front هر دو افزایش پیدا کرده اند و مثل حالت آغازین ابتدای آرایه نیستند.
این باعث میشه که شرایط خالی شدن صف متفاوت از حالت اولیه باشه و rear جای کمی برای جلوتر رفتن داشته باشه.
حالا موقع خالی شدن صف یا باید front و rear رو به ابتدای آرایه برگردونید و یا آرایه رو حلقوی در نظر بگیرید وگرنه جا برای ذخیره کردن n عنصر باقی نمی مونه، در حالی که صف ظاهرا خالی است.

کد:
#include <stdio.h>
#include <iostream.h>

const int n = 100;

int queue[n];
int front = -1, rear = -1;

void addqueue(int item)
{
	if (rear == n - 1)
	{
		cout << "is full";
		return;
	}
	rear++ ;
	queue[rear] = item;
	if (front == -1)
	{
        front = 0;
	}
}
int delqueue()
{
	int item;
	if (front == -1)
	{
		cout << "is empty";
		return 0;
	}
	item = queue[front];
	if (front == rear)
	{
		front = -1;
		rear = -1;
	}
	else
	{
		front++;
	}
	return item;
}
int main()
{
    addqueue(1);
    addqueue(2);
	cout << "delete " << delqueue() << endl;
    addqueue(3);
    addqueue(4);
	cout << "delete " << delqueue() << endl;
	cout << "delete " << delqueue() << endl;
	cout << "delete " << delqueue() << endl;
	return 0;
}
 

v.b.f1

Active Member
علی جان میشه به زبان c بنویسیدش

میشه خط به خط توضیح بدید

یه سوال بیرون از این مبحث دارم
در کل ریاضیم ضعیفه به نظرت اینکه اکثر جاها به مشکل برمیخورم اشکل از ضعیف بودن ریاضیه یا نه

اخرش راه حلی هست تا من بهتر بشم
 

the_king

مدیرکل انجمن
علی جان میشه به زبان c بنویسیدش

میشه خط به خط توضیح بدید

یه سوال بیرون از این مبحث دارم
در کل ریاضیم ضعیفه به نظرت اینکه اکثر جاها به مشکل برمیخورم اشکل از ضعیف بودن ریاضیه یا نه

اخرش راه حلی هست تا من بهتر بشم

کد:
#include <stdio.h>

const int n = 100;

int queue[n];
int front = -1, rear = -1;

void addqueue(int item)
{
	if (rear == n - 1)
	{
		printf("is full");
		return;
	}
	rear++ ;
	queue[rear] = item;
	if (front == -1)
	{
        front = 0;
	}
}
int delqueue()
{
	int item;
	if (front == -1)
	{
		printf("is empty");
		return 0;
	}
	item = queue[front];
	if (front == rear)
	{
		front = -1;
		rear = -1;
	}
	else
	{
		front++;
	}
	return item;
}
int main()
{
    addqueue(1);
    addqueue(2);
	printf("delete %d \n", delqueue());
    addqueue(3);
    addqueue(4);
    printf("delete %d \n", delqueue());
    printf("delete %d \n", delqueue());
    printf("delete %d \n", delqueue());
	return 0;
}

ربطی به ریاضیات نداره، انتگرال و دیفرانسیل که نیست، محاسبات ریاضی شون در حد جمع و تفریقه.
برای درک کردن روال کد برنامه لازمه که بدانید قراره چه کاری انجام بشه، تا زمانی که شیوه پیاده سازی
صف با آرایه رو درک نکنید از کد برنامه هم سر نمی آورید.
 

v.b.f1

Active Member
اروررررررر نداد ولی اجرا نکرد نمیدونم چرا
اینم بهش اضاف کردم #include <conio.h> ولی باز اجرا نداد

بازم سوال دارم البته معذرت بابت این سوال های مکرررررررررررم

جزوه ای در مورد ساختمان داده ها در ارتباط با زبان برنامه نویسی c نیست

میشه یکم بیشتر توضیح بدید در موردشششششش
 
آخرین ویرایش:

the_king

مدیرکل انجمن
اروررررررر نداد ولی اجرا نکرد نمیدونم چرا
اینم بهش اضاف کردم #include <conio.h> ولی باز اجرا نداد

قبلا از سطر ;return 0 یک سطر ;()getch اضافه کنید تا بعد از نشون دادن خروجی مکث کنه :

کد:
#include <stdio.h>
#include <conio.h>
.
.
.
	getch();
	return 0;
}

بازم سوال دارم البته معذرت بابت این سوال های مکرررررررررررم

جزوه ای در مورد ساختمان داده ها در ارتباط با زبان برنامه نویسی c نیست
کتاب ساختمان داده ها در ++C با ترجمه ابراهیم زاده قلزم رو مطالعه فرمایید، چندان فرقی با C نداره.

میشه یکم بیشتر توضیح بدید در موردشششششش

یک آرایه با n خانه داریم به نام queue، از خانه اندیس 0 الی خانه اندیس n - 1 که قراره صف در اون خانه ها
پیاده سازی بشه. دقت کنید که خانه ای با اندیس n نداریم، اندیس ها از 0 الی n - 1 هستند.

rear ته صف رو نشون میده، یعنی اندیس خونه ای رو مشخص می کنه که آخرین عنصر در صف قرار گرفته.
فرضا اگه 6 باشه، یعنی آخرین عنصر صف در خانه 6 آرایه قرار گرفته.
موقع شروع برنامه rear برابر 1- است، چون صف خالیه.

front جلوی صف رو نشون میده، یعنی اندیس خونه ای رو مشخص می کنه که اولین عنصر در صف قرار گرفته.
فرضا اگه 2 باشه، یعنی اولین عنصر صف در خانه 2 آرایه قرار گرفته.
موقع شروع برنامه front برابر 1- است، چون صف خالیه.

اضافه شدن یک عنصر به ته صف (addqueue)
هر بار که عنصری به ته صف اضافه میشه، اول بررسی می کنیم که rear از محدوده n - 1 کوچکتره باشه، چون
اگه برابر n - 1 باشه یعنی آخرین اندیس آرایه هم پر شده، پس آرایه تا خرخره پره و جا برای ذخیره کردن
عنصر دیگه ای نیست. اگر هنوز در آرایه جا بود، rear یک واحد افزایش پیدا می کنه و عنصر جدید در خانه ای
که اندیس اش rear است ذخیره میشه. اگه قبل از این صف خالی بوده باشه، rear از 1- به 0 افزایش پیدا کرده،
اما front همچنان برابر 1- است. چون الان دیگه صف خالی نیست، باید از 1- به 0 تغییرش بدهیم تا به شروع
صف اشاره کنه.

حذف شدن یک عنصر از جلوی صف (delqueue)
هر بار که قراره عنصری از جلوی صف حذف بشه، اول بررسی می کنیم که صف خالی نباشه، یعنی front برابر
1- نباشه. اگر صف خالی نبود front اندیس عنصر مورد نظر رو که سر صف قرار داره نشون میده. بعد از اینکه
عنصر رو بدست آوردیم باید front یک واحد افزایش پیدا کنه تا به عنصر بعدی اشاره کنه که الان سر صف قرار داره.
بعد از افزایش یافتن front نشانه خالی شدن صف اینه که front و rear بهم برسند یعنی با هم برابر شوند.
در این حالت خاص که الان صف خالی شده باید مقدار front و rear رو به 1- تغییر دهیم تا مثل وضعیت اولیه باشند.

اگر اینکار رو انجام ندهیم، صف خالی است اما برای استفاده بعدی از همه ظرفیت آرایه استفاده نخواهد شد.
یعنی الان که صف خالی است مقدار rear بزرگتر از 1- است، مثلا 7 است و اگر عنصر جدیدی به صف خالی
اضافه کنیم در خانه 8 قرار می گیرد و خانه های 0 الی 7 بلا استفاده رها می شود. در نتیجه قبل از اینکه n عنصر
در آرایه قرار بگیرد مقدار rear به n - 1 می رسد و در ظاهر صف پر می شود.
 

v.b.f1

Active Member
باز مزاحم شدیم

دوست عزیز میشه یه کاری کرد یه عملیاتی رو روش انجام دادن که پیغام پر بودن خالی بودنم نشون بده یا اضافه کردن و حذف کردنو
 

the_king

مدیرکل انجمن
باز مزاحم شدیم

دوست عزیز میشه یه کاری کرد یه عملیاتی رو روش انجام دادن که پیغام پر بودن خالی بودنم نشون بده یا اضافه کردن و حذف کردنو

پیغام پر بودن و خالی بودن رو که الان هم نشون میده (اگه بیش از ظرفیت صف ()addqueue یا ()delqueue رو اجرا کنید)

برای پیغام اضافه کردن بعد از سطر ;++rear یک سطر ;("printf("new item added اضافه کنید :
کد:
	rear++ ;
	printf("new item added");

برای پیغام حذف کردن قبل از سطر ;return item یک سطر ;("printf("item deleted اضافه کنید :
کد:
	printf("item deleted");
	return item;
 

sahar24

New Member
با سلام خسته نباشید من قطعه کد شمارو برای درج و حذف از صف نوشتم ولی ارور داره میشه راهنماری کنیداز کلمات cout و مورد #include <iostream.h> ارور میگیره





#include <iostream>
#include <stdio.h>
#include <iostream.h>


const int n = 100;
int queue[n];
int front = -1, rear = -1;

void addqueue(int item)
{
if (rear == n - 1)
{
cout << "is full";
return;
}
rear++;
printf("new item added");
queue[rear] = item;
if (front == -1)
{
front = 0;
}
}
int delqueue()
{
int item;
if (front == -1)
{
cout << "is empty";
return 0;
}
item = queue[front];
if (front == rear)
{
front = -1;
rear = -1;
}
else
{
front++;
}
printf("item deleted");
return item;
}
int main()
{
addqueue(1);
addqueue(2);
cout << "delete " << delqueue() << endl;
addqueue(3);
addqueue(4);
cout << "delete " << delqueue() << endl;
cout << "delete " << delqueue() << endl;
cout << "delete " << delqueue() << endl;
getch();
return 0;

}
 

sahar24

New Member
ممنون میشم اگر بنده رو راهنمایی کنید
 
آخرین ویرایش:

the_king

مدیرکل انجمن
با سلام خسته نباشید من قطعه کد شمارو برای درج و حذف از صف نوشتم ولی ارور داره میشه راهنماری کنیداز کلمات cout و مورد #include <iostream.h> ارور میگیره





#include <iostream>
#include <stdio.h>
#include <iostream.h>


const int n = 100;
int queue[n];
int front = -1, rear = -1;

void addqueue(int item)
{
if (rear == n - 1)
{
cout << "is full";
return;
}
rear++;
printf("new item added");
queue[rear] = item;
if (front == -1)
{
front = 0;
}
}
int delqueue()
{
int item;
if (front == -1)
{
cout << "is empty";
return 0;
}
item = queue[front];
if (front == rear)
{
front = -1;
rear = -1;
}
else
{
front++;
}
printf("item deleted");
return item;
}
int main()
{
addqueue(1);
addqueue(2);
cout << "delete " << delqueue() << endl;
addqueue(3);
addqueue(4);
cout << "delete " << delqueue() << endl;
cout << "delete " << delqueue() << endl;
cout << "delete " << delqueue() << endl;
getch();
return 0;

}
اگه <iostream> رو include کردید دیگه <iostream.h> رو نباید include کنید.
یک سطر ;using namespace std رو بعد از include ها اضافه کنید، چون برخی کامپایلر ها بصورت پیشفرض از فضای نام std استفاده نمی کنند و به همون دلیل std::cout رو با cout خالی شناسایی نمی کنند. اضافه کردن ;using namespace std مشکلش رو حل می کنه.
اگر احیانا در کامپایلری به ()getch ایراد گرفت، میتونه دلیلش این باشه که ()getch تابع استانداردی نیست و الزاما در همه پیاده سازی های زبان ++C وجود نداره.
بجای ()getch میشه از موارد متعددی مثل ()cin.get استفاده کرد.
C++:
#include <iostream>
#include <stdio.h>

using namespace std;

const int n = 100;
int queue[n];
int front = -1, rear = -1;

void addqueue(int item)
{
    if (rear == n - 1)
    {
        std::cout << "is full";
        return;
    }
    rear++;
    printf("new item added");
    queue[rear] = item;
    if (front == -1)
    {
        front = 0;
    }
}
int delqueue()
{
    int item;
    if (front == -1)
    {
        cout << "is empty";
        return 0;
    }
    item = queue[front];
    if (front == rear)
    {
        front = -1;
        rear = -1;
    }
    else
    {
        front++;
    }
    printf("item deleted");
    return item;
}
int main()
{
    addqueue(1);
    addqueue(2);
    cout << "delete " << delqueue() << endl;
    addqueue(3);
    addqueue(4);
    cout << "delete " << delqueue() << endl;
    cout << "delete " << delqueue() << endl;
    cout << "delete " << delqueue() << endl;
    /* getch(); */
    cin.get();
    return 0;
}
 

sahar24

New Member
اگه <iostream> رو include کردید دیگه <iostream.h> رو نباید include کنید.
یک سطر ;using namespace std رو بعد از include ها اضافه کنید، چون برخی کامپایلر ها بصورت پیشفرض از فضای نام std استفاده نمی کنند و به همون دلیل std::cout رو با cout خالی شناسایی نمی کنند. اضافه کردن ;using namespace std مشکلش رو حل می کنه.
اگر احیانا در کامپایلری به ()getch ایراد گرفت، میتونه دلیلش این باشه که ()getch تابع استانداردی نیست و الزاما در همه پیاده سازی های زبان ++C وجود نداره.
بجای ()getch میشه از موارد متعددی مثل ()cin.get استفاده کرد.
C++:
#include <iostream>
#include <stdio.h>

using namespace std;

const int n = 100;
int queue[n];
int front = -1, rear = -1;

void addqueue(int item)
{
    if (rear == n - 1)
    {
        std::cout << "is full";
        return;
    }
    rear++;
    printf("new item added");
    queue[rear] = item;
    if (front == -1)
    {
        front = 0;
    }
}
int delqueue()
{
    int item;
    if (front == -1)
    {
        cout << "is empty";
        return 0;
    }
    item = queue[front];
    if (front == rear)
    {
        front = -1;
        rear = -1;
    }
    else
    {
        front++;
    }
    printf("item deleted");
    return item;
}
int main()
{
    addqueue(1);
    addqueue(2);
    cout << "delete " << delqueue() << endl;
    addqueue(3);
    addqueue(4);
    cout << "delete " << delqueue() << endl;
    cout << "delete " << delqueue() << endl;
    cout << "delete " << delqueue() << endl;
    /* getch(); */
    cin.get();
    return 0;
}
سلام خسته نباشید میخواستم سوالی در همین زمینه بپرسم اگر من بخوام همین روندو برای لیست پیوند انجام بدم کد ها خیل فرق میکنه

- درج در لیست

- حذف از لیست

- نمایش لیست
ممنون میشم راهنمای کنید در این زمینه هم
 

the_king

مدیرکل انجمن
سلام خسته نباشید میخواستم سوالی در همین زمینه بپرسم اگر من بخوام همین روندو برای لیست پیوند انجام بدم کد ها خیل فرق میکنه

- درج در لیست

- حذف از لیست

- نمایش لیست
ممنون میشم راهنمای کنید در این زمینه هم
بله چون دو ساختار متفاوت دارند.
رجوع شود به :
 

sahar24

New Member
بله چون دو ساختار متفاوت دارند.
رجوع شود به :
ممنونم برای راهنمایی
 

جدیدترین ارسال ها

بالا