. . .
while (currentNode->next != NULL)
{
currentNode = currentNode->next;
listSize++;
}
lastNode = currentNode;
return lastNode;
Очередь на С++ через классы.
нужно реализовать очередь.делаю через классы.
программа не работает на моменте добавления в конец и взятия и удаления элемента из начала очереди.
собственно мой код:
# include <stdio.h>
# include <conio.h>
# include "File1.h"
void main()
{ hotdog x;
int c;
while (1)
{ printf("\n1.nachat' rabotu\n");
printf("2.sdelat' ochered' pustoj\n");
printf("3.ochered' pusta/ne pusta?\n");
printf("4.dobavit' element v konec ocheredi\n");
printf("5.vzyat' element iz nachala ocheredi\n");
printf("6.nachalo ocheredi\n");
printf("7.udalit nachalo ocheredi\n");
printf("6.zakonchit' raboty\n");
printf("VUBERITE PUNKT\n");
scanf("%d",&c);
switch (c)
{ case (1): { int a=0;
a=a+1;
continue;
}
case (2):
x.pustoch(); break;
case (3):
x.pustnepust(); break;
case (4):
x.dobelvkonec(); break;
case (5):
x.vzyatpokazudaliznach(); break;
case (6):
x.vzyatpokazudaliznach(); break;
case (7):
x.vzyatpokazudaliznach(); break;
case (8):
x.konec(); break;
}
}
}
и КЛАСС:
class hotdog
{ int a[100];
public:
void pustoch();--сделать пустой
void pustnepust();-пуста или не пуста
void dobelvkonec();--добавление в конец
void vzyatpokazudaliznach();----взять,показать,удалить эл. из начала.
void konec();--конец.пока не доработан.
};
void hotdog :: pustoch ()
{ int i;
for(i=1;i<=99;i++)
a=0;
}
void hotdog::pustnepust()
{int i,t,k;
t=0;
k=0;
for (i=1;i<=99;i++)
{ t=a;
if(t==0)
k=k+1;
}
if(k==99)
printf("ochered' pusta\n");
else
printf("ochered' ne pusta\n");
}
void hotdog:: dobelvkonec()
{int i,N;
printf("vvedite razmer ocheredi\n");
scanf("%d",&N);
printf("vvedite elementy\n");
for(i=N;i<0;i--)
scanf("%d",&a);
}
void hotdog:: vzyatpokazudaliznach()
{int i,N,k;
scanf("%d",&k);
for(i=1;i<=k;i++)
{printf("%d\n",k);
for(i=k+1;i<=N;i++)
printf( "%d\n",a); }
}
void hotdog:: konec()
{ int l;
l=0;
printf("esli xotite zakonchit' raboty nagmite 1\n");
getch();
}
буду очень благодарна,если подскажете в чем ошибка и как ее устранить)
Цитата:
[QUOTE][QUOTE]
[/QUOTE][/QUOTE]
Что такое "a"? А что такое "N"?
Для сравнения:
Код:
N---это мой массив,размер которому я дала опредленно(в пределах а[100])
вам по делу сказали, оформи нормально код. смайлы отключи, для оформления кода используй теги. подробности в правилах раздела.
код должен быть удобочитаемым. приводить лучше отрывок кода в котором проблемы, при этом надо комментировать где, что и зачем. а то и вправду зачастую лень разбираться в чужих абра кадабра. вышеприведенные поправки не гарантируют, что вам помогут, но, увеличивают ваши шансы.
Цитата: prostoli
a---это мой массив вообще.(...) я дала ему размерность 100.
N---это мой массив,размер которому я дала опредленно(в пределах а[100])
N---это мой массив,размер которому я дала опредленно(в пределах а[100])
По стене ползет кирпич, деревяный как стекло, ну и пусь себе плывет, муха тоже человек.
Код:
void hotdog:: vzyatpokazudaliznach()
{
int i,N,k;
scanf("%d",&k);
for (i=1;i<=k;i++)
{
printf("%d\n",k);
for (i=k+1;i<=N;i++)
printf( "%d\n",a);
}
}
{
int i,N,k;
scanf("%d",&k);
for (i=1;i<=k;i++)
{
printf("%d\n",k);
for (i=k+1;i<=N;i++)
printf( "%d\n",a);
}
}
Ну и чему тут равно N?
Я уж не говорю о странных "комментариях" в объявлении класса hotdog.
Но самое страшное не это. Боюсь, что задание понятно не правильно. Хорошо бы посмотреть на текст этого задания.
Зато видно, что человек делал(а) задание сам(а). Это дает кое-какие надежды.
Общее замечание по поводу реализации очереди. Полагаю, нужно задать в классе переменную, которая будет определять текущее количество элементов, находящихся в очереди:
Код:
// ...
и КЛАСС:
class hotdog
{
int a[100];
int N;
// ...
и КЛАСС:
class hotdog
{
int a[100];
int N;
// ...
При инициализации (в конструкторе класса) объекта класса hotdog переменную N нужно выставлять в 0, и затем при каждом добавлении / удалении элементов очереди пересчитывать N. Эту же переменную N использовать при обращении к концу очереди (концом очереди будет, если N > 0, элемент a[N-1]).
Сейчас такой переменной нет, хотя возможно локальная переменная N, использующаяся в некоторых функциях - и есть попытка задания такой переменной - размера очереди.
Цитата: prostoli
программа не работает на моменте добавления в конец
Код:
void hotdog:: dobelvkonec()
{
int i,N;
printf("vvedite razmer ocheredi\n");
scanf("%d",&N);
printf("vvedite elementy\n");
for(i=N;i<0;i--)
scanf("%d",&a);
}
{
int i,N;
printf("vvedite razmer ocheredi\n");
scanf("%d",&N);
printf("vvedite elementy\n");
for(i=N;i<0;i--)
scanf("%d",&a);
}
Здесь проблема - то что при каждом повторном вызове этой функции dobelvkonec вводимые пользователем значения элементов будут затирать все или часть введенных ранее элементов, в то время как нужно добавить новые, сохранив введенные ранее. Если сделать так как я сказал выше - задать размер очереди, то можно было бы, запросив от пользователя количество N1 новых элементов, переместить существующие на N1 и затем записать в массив новые. Например так:
Код:
void hotdog:: dobelvkonec()
{
int i,N1;
printf("vvedite razmer ocheredi\n");
scanf("%d",&N1);
// проверка - можно ли записать N1 элементов:
if(N + N1 > 100)
{
// здесь выдать сообщение что столько элементов не поместится
return;
}
// перемещение существующих элементов:
for(i = N - 1; i >= 0; --i)
a[N1 + i] = a;
// ввод новых элементов
printf("vvedite elementy\n");
for(i = N1 - 1; i >= 0; i--)
scanf("%d",&a);
N += N1; // после ввода элементов N нужно обновить
}
{
int i,N1;
printf("vvedite razmer ocheredi\n");
scanf("%d",&N1);
// проверка - можно ли записать N1 элементов:
if(N + N1 > 100)
{
// здесь выдать сообщение что столько элементов не поместится
return;
}
// перемещение существующих элементов:
for(i = N - 1; i >= 0; --i)
a[N1 + i] = a;
// ввод новых элементов
printf("vvedite elementy\n");
for(i = N1 - 1; i >= 0; i--)
scanf("%d",&a);
N += N1; // после ввода элементов N нужно обновить
}
Цитата: prostoli
и взятия и удаления элемента из начала очереди.
В операторе switch:
Код:
// ...
printf("5.vzyat' element iz nachala ocheredi\n");
printf("6.nachalo ocheredi\n");
printf("7.udalit nachalo ocheredi\n");
// ...
case (5):
x.vzyatpokazudaliznach(); break;
case (6):
x.vzyatpokazudaliznach(); break;
case (7):
x.vzyatpokazudaliznach(); break;
//...
printf("5.vzyat' element iz nachala ocheredi\n");
printf("6.nachalo ocheredi\n");
printf("7.udalit nachalo ocheredi\n");
// ...
case (5):
x.vzyatpokazudaliznach(); break;
case (6):
x.vzyatpokazudaliznach(); break;
case (7):
x.vzyatpokazudaliznach(); break;
//...
Во всех трёх кейсах вызывается одна и та же функция vzyatpokazudaliznach. Не лучше ли будет написать три разных функции - по одной для каждого из этих случаев?
А по поводу самой этой функции:
Код:
void hotdog:: vzyatpokazudaliznach()
{
int i, N, k;
scanf("%d",&k);
for(i=1;i<=k;i++)
{
printf("%d\n",k);
for(i=k+1;i<=N;i++)
printf( "%d\n",a);
}
}
{
int i, N, k;
scanf("%d",&k);
for(i=1;i<=k;i++)
{
printf("%d\n",k);
for(i=k+1;i<=N;i++)
printf( "%d\n",a);
}
}
Замысел того, что делается в этой функции, мне как-то непонятен. Если исходить из опций, предлагаемых пользователю перед выбором кейсов оператора switch, на основе которых производится вызов функции, то похоже что автором планировалось, что будет взято последнее значение, выведено на экран и удалено. Тогда, если использовать переменную - размер очереди, можно так сделать:
Код:
void hotdog:: vzyatpokazudaliznach()
{
if(N == 0)
{
// здесь выдать сообщение что в очереди ничего нет
return;
}
printf("%d\n", a[N - 1]);
--N; // достаточно уменьшить значение переменной N
}
{
if(N == 0)
{
// здесь выдать сообщение что в очереди ничего нет
return;
}
printf("%d\n", a[N - 1]);
--N; // достаточно уменьшить значение переменной N
}
Но, как я уже сказал, вместо этой функции, по логике, надо сделать три разных функции.