Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
ЧакЭ одобряЭ
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
1

Зацикливание программы. В чем проблема?

26.09.2010, 21:35. Показов 1141. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
дек через массив реализация.
работает все кроме функции pop_front.на ней происходит зацикливание программы. в чем проблема?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#define maxn 1000
 
using namespace std;
 
typedef struct
{
    int dh,dt;
    int val[maxn];
} deque;
 
void push_front(deque *d, int x)
{
if (d->dh<1) d->dh +=maxn; //chtob ukazateli ne bili menshe null
 d->val[(--d->dh)%maxn]=x;
}
 
void push_back(deque *d,int x)
{
    d->val[(d->dt++)%maxn]=x;
}
 
int pop_front(deque *d)
{
    return d->val[(d->dh++)%maxn]; //зацикливается в этой функции.
}
 
int pop_back(deque *d)
{
    if (d->dt<1) d->dt +=maxn;
    return d->val[(--d->dt)%maxn];
}
int main()
{
    deque a;
    int dlen;
    if (a.dt>a.dh) dlen=(a.dt-a.dh)%maxn;
    else dlen=maxn-(a.dh-a.dt)%maxn;
    a.dt=0;
    a.dh=0;
    push_back(&a,10);
    push_back(&a,15);
    push_back(&a,56);
    push_back(&a,34);
    push_back(&a,30);
    push_back(&a,23);
    push_back(&a,40);
    //push_front(&a,15); 
    while (a.dh !=a.dt-3) //proverki
    {
        std::cout<<pop_front(&a)<<endl;
    }
    std::cout<<"etap 2"<<endl;
    if (a.dh==a.dt) std::cout<<"finita"<<endl; 
    else                            //nebolshaia proverka raboti
    {
    while (a.dh !=a.dt)
    {
        std::cout<<pop_front(&a)<<std::endl;
    }
    }
    if (a.dh==a.dt) std::cout<<"finita"<<endl;
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.09.2010, 21:35
Ответы с готовыми решениями:

Зацикливание программы
В функции int search(struct infor_zoo *x, int number_of_animals); происходит зацикливание в цикле...

Зацикливание программы
Здравствуйте! Написала программу: #include&lt;stdio.h&gt; #include&lt;conio.h&gt; int main() { int...

Зацикливание программы
#include&lt;stdio.h&gt; #include&lt;conio.h&gt; #include&lt;string.h&gt; #include&lt;locale.h&gt; #define PET 50 int...

Разложение чисел на простые множители (зацикливание программы)
Помогите решить проблему зацикливания программы. Заранее спасибо В задаче требуется разложить...

10
15 / 15 / 2
Регистрация: 24.08.2010
Сообщений: 94
26.09.2010, 23:43 2
Цитата Сообщение от Artishok Посмотреть сообщение
(--d->dh)
Вот в етом выражении сначала будет сделан декремент, а потом доступ к полю переменной d. Если нужно сделать декремент dh, то нужно добавить скобки
1
ЧакЭ одобряЭ
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
26.09.2010, 23:46  [ТС] 3
куда?

все равно зацикливается.
ну функция эта.я в коде коммент не там написал
0
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
26.09.2010, 23:48 4
C++
1
((--d)->dh)
0
ЧакЭ одобряЭ
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
26.09.2010, 23:51  [ТС] 5
все равно зацикливается
0
15 / 15 / 2
Регистрация: 24.08.2010
Сообщений: 94
27.09.2010, 00:29 6
Какой компилятор стоит? У меня на ВизуалСтудио 2008 здесь:
C++
1
2
3
4
if (a.dt>a.dh) dlen=(a.dt-a.dh)%maxn;
        else dlen=maxn-(a.dh-a.dt)%maxn;
        a.dt=0;
        a.dh=0;
ошыбка времени выполнения (использование неинициал. данных). Поменял вот так, все в пошаговом сделал до ретурн 0, нет зацыкливания:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#define maxn 1000
 
using namespace std;
 
typedef struct
{
        int dh,dt;
        int val[maxn];
} deque;
 
void push_front(deque *d, int x)
{
if (d->dh<1) d->dh +=maxn; //chtob ukazateli ne bili menshe null
 d->val[(--d->dh)%maxn]=x;
}
 
void push_back(deque *d,int x)
{
        d->val[(d->dt++)%maxn]=x;
}
 
int pop_front(deque *d)
{
        return d->val[(d->dh++)%maxn]; //зацикливается в этой функции.
}
 
int pop_back(deque *d)
{
        if (d->dt<1) d->dt +=maxn;
        return d->val[(--d->dt)%maxn];
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    deque a;
        int dlen;
        a.dt=0;
        a.dh=0;
        if (a.dt>a.dh) dlen=(a.dt-a.dh)%maxn;
        else dlen=maxn-(a.dh-a.dt)%maxn;
        push_back(&a,10);
        push_back(&a,15);
        push_back(&a,56);
        push_back(&a,34);
        push_back(&a,30);
        push_back(&a,23);
        push_back(&a,40);
        //push_front(&a,15); 
        while (a.dh !=a.dt-3) //proverki
        {
                std::cout<<pop_front(&a)<<endl;
        }
        std::cout<<"etap 2"<<endl;
        if (a.dh==a.dt) std::cout<<"finita"<<endl; 
        else                            //nebolshaia proverka raboti
        {
        while (a.dh !=a.dt)
        {
                std::cout<<pop_front(&a)<<std::endl;
        }
        }
        if (a.dh==a.dt) std::cout<<"finita"<<endl;
        return 0;
}
Но если нужно реализовать двустороннюю очередь, то лучше з оператором NEW и указателями, а то сейчас есть массив к которому применяються непонятные функции
0
ЧакЭ одобряЭ
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
27.09.2010, 00:32  [ТС] 7
C++
1
push_front(&a,15);
вот здесь зацикливание.просто оно комментарием выделено
Цитата Сообщение от Chainyk Посмотреть сообщение
Какой компилятор стоит?
c-free
0
15 / 15 / 2
Регистрация: 24.08.2010
Сообщений: 94
27.09.2010, 01:01 8
Вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
#define maxn 1000
 
using namespace std;
 
typedef struct
{
        int dh,dt;
        int val[maxn];
} deque;
 
void push_front(deque *d, int x)
{
if (d->dh<1) d->dh +=maxn; //chtob ukazateli ne bili menshe null
 d->val[(--d->dh)%maxn]=x;
}
 
void push_back(deque *d,int x)
{
        d->val[(d->dt++)%maxn]=x;
}
 
int pop_front(deque *d) 
{
    int temp = d->dh++;
    if (d->dh==1000)
        d->dh=0;
        return d->val[temp%maxn]; //зацикливается в этой функции.
}
 
int pop_back(deque *d)
{
        if (d->dt<1) d->dt +=maxn;
        return d->val[(--d->dt)%maxn];
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    deque a;
        int dlen;
        a.dt=0;
        a.dh=0;
        if (a.dt>a.dh) dlen=(a.dt-a.dh)%maxn;
        else dlen=maxn-(a.dh-a.dt)%maxn;
        push_back(&a,10);
        push_back(&a,15);
        push_back(&a,56);
        push_back(&a,34);
        push_back(&a,30);
        push_back(&a,23);
        push_back(&a,40);
        push_front(&a,15); 
        while (a.dh !=a.dt-3) //proverki
        {
                std::cout<<pop_front(&a)<<endl;
        }
        std::cout<<"etap 2"<<endl;
        if (a.dh==a.dt) std::cout<<"finita"<<endl; 
        else                            //nebolshaia proverka raboti
        {
        while (a.dh !=a.dt)
        {
                std::cout<<pop_front(&a)<<std::endl;
        }
        }
        if (a.dh==a.dt) std::cout<<"finita"<<endl;
        return 0;
}
У Вас указатель на голову очереди уходил 1001,1002. Двунаправленную очередь лучше реализовывать с динамическим выделением памяти и указателями
1
ЧакЭ одобряЭ
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
27.09.2010, 01:07  [ТС] 9
Цитата Сообщение от Chainyk Посмотреть сообщение
динамическим выделением памяти и указателями
это и так ясно.но задание было именно с массивами
да все работает.
значит все-таки в pop_front было зацикливание....
0
15 / 15 / 2
Регистрация: 24.08.2010
Сообщений: 94
27.09.2010, 01:19 10
Я имею ввиду вот что:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
typedef struct deque
{
        int data;
        deque *prev;
        deque *next;
        deque *head;
        deque *tail;
};
 
typedef deque DQ;
 
deque* Init (int n)
{
    DQ *temp = new DQ;
    temp->data = n;
    temp->prev=temp->next=NULL;
    temp->head=temp->tail=temp;
    return temp;
}
 
deque* push_back (int n, deque *rhs)
{
    DQ *tmp = new DQ;
    tmp->data=n;
    tmp->prev=rhs;
    tmp->next=NULL;
    tmp->tail=tmp;
    tmp->head=rhs->head;
    return tmp;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    DQ *dq;
    dq = Init(3);
    dq = push_back(4,dq->tail);
    return 0;
}
Здесь не все функции (нужно для обоих концов push и pop и проверку на пустоту), ето пример. Хотя и ето не очень, я на 2-ом курсе как то иначе делал... Если делать с массивами, тогда зачем структура? Можно и попроще
0
ЧакЭ одобряЭ
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
27.09.2010, 01:27  [ТС] 11
вообще-то надо было это сделать на паскале но я хотел тренировать си
можно конечно обойтись и без структуры но в таком случае это будет больше похоже на обычный массив где элементы не имеют полей
0
27.09.2010, 01:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.09.2010, 01:27
Помогаю со студенческими работами здесь

в чем проблема?
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;stdbool.h&gt; struct Point { int x; int y; };...

В чем проблема?
Есть задание: Определить седловые точки матрицы М (9х10). Седловая точка – элемент, являющийся...

Работаю со строками, в чем проблема?
Ничего не выводится, в консоле просто черный экран. Что не так? #include &lt;stdio.h&gt; #include...

Написал прогу, не выводит в чем проблема?
Не выводит таблицу, из-за этого не могу выровнять, ибо ниче не вижу, помогите плз. =-* #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru