Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2017, 12:38   #1
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию Очередь

Здравствуйте!
Есть задача, организовать схему "очередь", как устройство хранения данных похожее на стек.
Написал я вот такой код. Вроде работает по схеме. Первый вошел - первый вышел. Но терзают смутные сомнения, что что-то всё-таки не так.
Потому что в задании упоминается про какой-то круговой буфер где начало и конец очереди циркулируют по нему вместе с данными.
При этом всё должно быть в рамках использования массива.
Код:
#include<iostream>
#include<conio.h>
using namespace std;
class ocher
{
private:
	int och[10];
	int ind;
public:
	ocher(): ind(0)
	{}
	void cikl()
	{
		for(int j=0; j<10; j++)
			och[j]=0;
	}
	void vvod()
	{
		int a;
		char ch='a';
		while(ind<10)
		{
			cout<<"Введите значение для помещения в очередь: ";
			cin>>a;
			och[ind++]=a;
			cout<<"Если желаете прервать ввод, нажмите n.\n"
				<<"Если желаете продолжить, нажмите любую клавишу.\n";
			cin>>ch;
			if(ch=='n')
			break;
		}
	}
	void vyvod()
	{
		cout<<"Вывод значений очереди в столбик.\n";
		for(int j=0; j<10; j++)
		{
			cout<<och[j]<<endl;
		}
	}
};
int main()
{
	setlocale(LC_ALL,"rus");
	ocher o1;
	o1.cikl();
	o1.vvod();
	o1.vyvod();
	getch();
	return 0;
}
Вот и прошу у знающих мнения, очередь правильно работает, или должна работать как-то иначе. По какому-то другому принципу.
KAMLS вне форума Ответить с цитированием
Старый 09.05.2017, 12:43   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Это бред написан. Очередь это контейнер и хочется видеть что-то типа:
Код:
for(uint32_t i = 0; i < 10; ++t)
{
  std::cin >> t;
  queue.push(t);
}
Если завтра вам надо будет вводить все из файла, вы контейнер будете переписывать?

И где же у вас кольцевой буфер?
p51x вне форума Ответить с цитированием
Старый 09.05.2017, 12:48   #3
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Ну контейнеры я положим еще не изучал.
Вот пример реализации стека, на основе пройденного материала учебника. Причем это пример предложенный автором учебника. Именно на его основе предлагается реализовать прием "очередь".
Код:
#include<iostream>
#include<conio.h>
using namespace std;
class Stack
{
private:
	enum {MAX=10};
	int st[MAX];
	int top;
public:
	Stack()
	{top=0;}
	void push(int var)
	{st[++top]=var;}
	int pop()
	{return st[top--];}
};
int main()
{
	Stack s1;
	s1.push(11);
	s1.push(22);
	cout<<"1: "<<s1.pop()<<endl;
	cout<<"2: "<<s1.pop()<<endl;
	s1.push(33);
	s1.push(44);
	s1.push(55);
	s1.push(66);
	cout<<"3: "<<s1.pop()<<endl;
	cout<<"4: "<<s1.pop()<<endl;
	cout<<"5: "<<s1.pop()<<endl;
	cout<<"6: "<<s1.pop()<<endl;
	getch();
	return 0;
}
Так что бред не бред, а какие знания есть на данный момент, те и применены.
Кроме того, именно круговой буфер меня и натолкнул на мысль, что есть другой вариант решения задачи. Ибо у себя я никаких кругов не наблюдаю.
KAMLS вне форума Ответить с цитированием
Старый 09.05.2017, 13:51   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так и почему вы не реализовали на его основе?)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 09.05.2017, 14:37   #5
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Да я просто и представления не имел что это такое)))
Сейчас вот полазил по интернету и представление получил. Начал кумекать как это реализовать и заглянул сюда на форум, вот и пишу))))
Я не учусь в университете, я самоучка, у меня нет преподавателей, спросить не у кого, только вот тут на форуме. Ни фига не знаю короче)))
Но этот код я напишу, там ничего сложного нет, понять просто схему надо было.
KAMLS вне форума Ответить с цитированием
Старый 09.05.2017, 14:47   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Дык причем тут это, я о том, что код очереди что-то совсем не похож на код стека, который вы вроде как брали за основу )
Откуда-то в ней появились функции со странными имена и консольным вводом/выводом и пропали нормальные функции для работы с ней (добавление/удаление элемента).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 09.05.2017 в 14:53.
Alex11223 вне форума Ответить с цитированием
Старый 09.05.2017, 15:07   #7
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Да это по учебнику Р.Лафоре предложено взять за основу пример со стеком, где принцип последний вошел, первый вышел. Я и взял. Сделал по принципу первый вошел первый вышел. Но чую что-то не то. Какой-то круговой буфер... Вот и решил написать на форум. Как оказалось не зря.
KAMLS вне форума Ответить с цитированием
Старый 09.05.2017, 15:13   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Кольцевой буфер это просто добавление снова в начало когда дошли до конца.
https://ru.wikipedia.org/wiki/%D0%9A...84%D0%B5%D1%80

Но тут не его обсуждали, а то, что вы как-то странно взяли за основу пример со стеком убрав из него весь нормальный интерфейс работы со структурой данных (push, pop, ...).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 09.05.2017, 15:30   #9
Haric_110
Форумчанин
 
Регистрация: 03.03.2013
Сообщений: 102
По умолчанию

Если делать с кольцевым буфером, нужно два указателя — на начало очереди и на конец. Добавляются элементы в конец, удаляются из начала. В пустой очереди индекс начала равен индексу конца. При добавлении элемента в очередь индекс конца увеличивается, при удалении элемента из очереди увеличивается индекс начала. Если какой-нибудь индекс становится равным максимальному размеру очереди, он обнуляется (в этом и есть "закольцовывание"), а заполненность очереди определяет условие (индекс_начала < индекс_конца)
Ну и функции для добавления элемента и удаления писать нужно как в примере со стёком, только с учётом вышесказанного)
Ps: вернее, не меньше индекс начала должен быть, а "не равен" индексу конца при добавлении элемента (может быть равен только при удалении последнего элемента из очереди)

Последний раз редактировалось Haric_110; 09.05.2017 в 15:42.
Haric_110 вне форума Ответить с цитированием
Старый 09.05.2017, 17:21   #10
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Спасибо друзья!
Я уже написал, что понял смысл задачи и принялся за её решение. Стандартными средствами (push, pop, ...) пользоваться нельзя. Надо делать врукопашную. В этом смысл обучения этого Лафоре))
Сейчас слегка подзастрял на распределении именно момента стыковки догонялки одного индикатора другим. Думаю как сделать сохранение вывода с одновременным разделением индикаторов.
Короче в сыром виде пока так:
[CODE#include<iostream>
#include<conio.h>
using namespace std;
class ochered
{
private:
static const int MAX=10;
int och[MAX];
int ind1, ind2;
public:
ochered(): ind1(0), ind2(1)
{}
void cikl()
{
for(int j=0; j<10; j++)
och[j]=33;
}
void vvod()
{
int a;
char ch='a';
while(ind2<=MAX)
{
cout<<"Введите значение для помещения в очередь: ";
cin>>a;
if(ind2==MAX)
ind2=0;
if(ind2==ind1)
{
cout<<"Массив заполнен! \n"
<<"Если желаете заменить значение существующее сейчас в массиве на вводимое,\n"
<<"нажмите d.\n"
<<"Если желаете сначала вывести значение, нажмите v.\n";
cin>>ch;
while(ch!='v' && ch!='d')
{
cout<<"Надо ввести v или d.";
cin>>ch;
}
}
if(ch=='v')
{
ind2=9;
ch='a';
break;
}
och[ind2++]=a;
if(ch=='d')
ind1++;
ch='a';
cout<<"Если желаете прервать ввод, нажмите n.\n"
<<"Если желаете продолжить, нажмите любую клавишу.\n";
cin>>ch;
if(ch=='n')
break;
}
}
void vyvod()
{
char ch='a';
cout<<"Вывод значений очереди.\n";
while(ind1<=MAX)
{
if(ind1==MAX)
ind1=0;
if(ind1==ind2)
{
cout<<"Очередь пуста!\n";
break;
}
cout<<"Выводимое значение равно: "<<och[ind1]<<endl;
och[ind1]=0;
ind1++;
cout<<"Если желаете прервать вывод, нажмите n.\n"
<<"Если желаете продолжить, нажмите любую клавишу.\n";
cin>>ch;
if(ch=='n')
break;
}
}
};
int main()
{
setlocale(LC_ALL,"rus");
char ch='a';
ochered o1;
o1.cikl();
cout<<"Программа имитирующая приём \"Очередь\".\n"
<<"В данном случае очередь равна 10 ячейкам.\n";
do
{
cout<<"Вы желаете внести в очередь или вынести из очереди? \n"
<<"Если внести, то нажмите +, если вынести, то нажмите -.\n";
cin>>ch;
switch(ch)
{
case '+': o1.vvod();
break;
case '-': o1.vyvod();
break;
}
cout<<"Желаете продолжить? Если да, нажмите любую клавишу. \n"
<<"Если нет, нажмите n.\n";
cin>>ch;
}
while(ch!='n');
getch();
return 0;
}
][/CODE]
Доделаю, покажу как сделал)))
KAMLS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вводим 15 элементов в очередь, затем выводим на экран эту очередь и добавил в очередь еще один элемент. Потом удаляем любой элемен Xumera C++ Builder 2 07.12.2013 13:56
Очередь sys*.12 Паскаль, Turbo Pascal, PascalABC.NET 1 05.12.2012 04:43
Очередь fenix0093 Помощь студентам 1 30.11.2012 16:15
Очередь Си svetikzo Помощь студентам 0 23.01.2010 10:03
Очередь C++ svetikzo Помощь студентам 2 23.01.2010 09:53