Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Очередь на С++ через классы.

53K
28 октября 2009 года
prostoli
2 / / 28.10.2009
доброго времени суток,товарищи программисты
нужно реализовать очередь.делаю через классы.
программа не работает на моменте добавления в конец и взятия и удаления элемента из начала очереди.
собственно мой код:
# 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]

602
28 октября 2009 года
KPI Student
265 / / 16.12.2006
Будет намного больше желающих покопаться в вашем коде, если вы нормально оформите его.

Что такое "a"? А что такое "N"?

Для сравнения:
 
Код:
. . .
while (currentNode->next != NULL)
{
    currentNode = currentNode->next;
    listSize++;
}

lastNode = currentNode;

return lastNode;
53K
28 октября 2009 года
prostoli
2 / / 28.10.2009
a---это мой массив вообще.ведь очередь-тот же одномерный массив,только заполняется в одном направлении.я дала ему размерность 100.
N---это мой массив,размер которому я дала опредленно(в пределах а[100])
242
29 октября 2009 года
Оlga
2.2K / / 04.02.2006
prostoli
вам по делу сказали, оформи нормально код. смайлы отключи, для оформления кода используй теги. подробности в правилах раздела.
код должен быть удобочитаемым. приводить лучше отрывок кода в котором проблемы, при этом надо комментировать где, что и зачем. а то и вправду зачастую лень разбираться в чужих абра кадабра. вышеприведенные поправки не гарантируют, что вам помогут, но, увеличивают ваши шансы.
602
29 октября 2009 года
KPI Student
265 / / 16.12.2006
Цитата: prostoli
a---это мой массив вообще.(...) я дала ему размерность 100.
N---это мой массив,размер которому я дала опредленно(в пределах а[100])

По стене ползет кирпич, деревяный как стекло, ну и пусь себе плывет, муха тоже человек.

87
29 октября 2009 года
Kogrom
2.7K / / 02.02.2008
Есть в коде много неочевидных мест, например:
Код:
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);
    }
}

Ну и чему тут равно N?

Я уж не говорю о странных "комментариях" в объявлении класса hotdog.

Но самое страшное не это. Боюсь, что задание понятно не правильно. Хорошо бы посмотреть на текст этого задания.

Зато видно, что человек делал(а) задание сам(а). Это дает кое-какие надежды.
12K
31 октября 2009 года
Ghox
297 / / 26.07.2009
Хоть автор и не хочет код форматировать, всё же рискну покопаться в коде и дать советы. :)
Общее замечание по поводу реализации очереди. Полагаю, нужно задать в классе переменную, которая будет определять текущее количество элементов, находящихся в очереди:
 
Код:
// ...
и КЛАСС:

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);
}

Здесь проблема - то что при каждом повторном вызове этой функции 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 нужно обновить
}

Цитата: 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;
//...

Во всех трёх кейсах вызывается одна и та же функция 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);
    }
}

Замысел того, что делается в этой функции, мне как-то непонятен. Если исходить из опций, предлагаемых пользователю перед выбором кейсов оператора switch, на основе которых производится вызов функции, то похоже что автором планировалось, что будет взято последнее значение, выведено на экран и удалено. Тогда, если использовать переменную - размер очереди, можно так сделать:
 
Код:
void hotdog:: vzyatpokazudaliznach()
{
    if(N == 0)
    {
        // здесь выдать сообщение что в очереди ничего нет
        return;
    }
    printf("%d\n", a[N - 1]);
    --N; // достаточно уменьшить значение переменной N
}

Но, как я уже сказал, вместо этой функции, по логике, надо сделать три разных функции.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог