Форум программистов, компьютерный форум CyberForum.ru

проверьте кто-нибудь - C++

Восстановить пароль Регистрация
 
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
11.11.2010, 18:31     проверьте кто-нибудь #1
я давно как-то создавал тему дек через массив.там в конце я написал что вроде прога рабоатет.
через несколько дней я запустил её - вроде все нормально если вставлять несколько чисел сразу.
но когда по одному числу вставлять - что-то не так.
push_back--работает show_back и show_front
push_front--работfет show_back но не show_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
#include <iostream.h>
#define maxn 1000
 
typedef struct 
{
    int a[maxn];//Г¬Г*Г±Г±ГЁГў Г§Г*Г*Г·ГҐГ*ГЁГ©
    int dt,dh; //ГіГЄГ*Г§Г*òåëè Г*Г* ãîëîâó ГЁ Г*Г* õâîñò
}deque;
 
int kt=0; //äëÿ Г*åèçâëå÷åГ*ГЁГї
int kh=0; //äëÿ Г*åèçâëå÷åГ*ГЁГї
 
void push_front(int x,deque *d)
{
    if (d->dh<1) d->dh+=maxn;//åñëè ãîëîâГ* ìåГ*ГјГёГҐ åäèГ*èöû
    d->a[(--d->dh)%maxn]=x;//Г§Г*ГЇГЁГёГҐГ¬ Г*Г* ГЅГІГ® ìåñòî ýëåìåГ*ГІ
    
}
 
void push_back(int x,deque *d)
{
    d->a[(d->dt++)%maxn]=x;//ГіГЄГ*çûâГ*ГҐГІ Г*Г* 0.ГІГіГ¤Г* ГЁ Г§Г*ГЇГЁГёГҐГ¬
}
 
void show_back(deque *d)
{
    kt=0;
    kt=d->dt;//÷òîáû õâîñò Г*ГҐ ñìåùГ*ëñÿ
    while (kt!=d->dh)
    {//ïîêГ* ïîëÿ Г*ГҐ Г±Г°Г*ГўГ*ГїГѕГІГ±Гї
    if (kt<1) kt+=maxn;//Г*Г*Г*ëîãè÷Г*Г® Г·ГІГ® äëÿ push_front
    cout<<d->a[(--kt)%maxn]<<" ";//ïðåäâГ*ðèòåëüГ*îå óìåГ*ГјГёГҐГ*ГЁГҐ ГЁ âûâîä
    }//ГІ.ГЄ. ïðè äîáГ*âëåГ*ГЁГЁ Г*Г*Г§Г*Г¤ áûë ïîñòèГ*êðåìåГ*ГІ
}
 
void show_front(deque *d)
{
    kh=0;
    kh=d->dh;//÷òîáû ãîëîâГ* Г*ГҐ èçìåГ*ГїГ«Г*Г±Гј
    while(kh!=d->dt)//ïîêГ* ïîëÿ Г*ГҐ Г°Г*ГўГ*Г»
    {
        if (kh>maxn) kh=0;
     cout<<d->a[(kh++)%maxn]<<" ";//Гў ãîëîâå áûëî ïðåääåêðåìåГ*ГІ
    } //Г§Г*Г*Г·ГЁГІ ñåé÷Г*Г± Г*Г*äî ïîñòèГ*êðåìåГ*ГІ
}
 
int main()
{
    deque k;
    k.dt=0;
    k.dh=0;
    push_front(100,&k);
/*  for(int i=0;i<10;i++)
    if (i%2==0)
     push_front(i,&k);
     else
     push_back(i,&k);*/
    show_front(&k);
    cout<<endl;
    show_back(&k);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
11.11.2010, 18:56     проверьте кто-нибудь #2
Нафига внутри ф-ций kh=0 перед другим присваиванием.

C++
1
2
if (kt<1) kt+=maxn;//аналогично что для push_front
        cout<<d->a[(--kt)%maxn]<<" ";//предварительное уменьшение и вывод
Это тоже непонятно и скорей всего неправильно

3. Как я понимаю, ф-ции show удаляют элемент, что не соотвествует их названию.
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
12.11.2010, 19:45  [ТС]     проверьте кто-нибудь #3
Цитата Сообщение от Andrew_Lvov Посмотреть сообщение
show удаляют элемент, что не соотвествует их названию
нет.если бы это было извлечение я бы не создавал дополнительной переменной и не сохраненял значения головы

Добавлено через 1 минуту
show_back работает.что-то не то с добавлением либо с show_front

Добавлено через 3 минуты
Цитата Сообщение от Andrew_Lvov Посмотреть сообщение
непонятно
так в push_back я вставляю элемент а затем увеличиваю указатель то при выводе надо начинать с элемента т.е предварительно уменьшить указатель

Добавлено через 23 часа 22 минуты
sergjo
2 / 2 / 0
Регистрация: 27.10.2010
Сообщений: 6
12.11.2010, 21:20     проверьте кто-нибудь #4
void show_front(deque *d)
{....
здесь в твоём цикле никогда не выполнится условие цикла while...
}

А вообще то: меню - debug - f10 и трассируй пошагово, смотри между прочим значения переменных
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
13.11.2010, 02:05  [ТС]     проверьте кто-нибудь #5
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
70
71
72
73
#include <stdio.h>
#define maxn 1000
 
typedef struct 
{
    int a[maxn];//массив значений
    int dt,dh; //указатели на голову и на хвост
}deque;
 
int kt=0; //для неизвлечения
int kh=0; //для неизвлечения
int chep=0;
int ch=0;
 
void push_front(int x,deque *d)
{
    if (d->dh<1) d->dh+=maxn;//если голова меньше единицы
    d->a[(d->dh--)%maxn]=x;//запишем на это место элемент
    
}
 
void push_back(int x,deque *d)
{
    d->a[(d->dt++)%maxn]=x;//указывает на 0.туда и запишем
}
 
void show_back(deque *d)
{
    kt=0;
    kt=d->dt;//чтобы хвост не смещался
  ch=d->dh;//так как сейчас на несуществующий элемент указывает
    while (kt!=ch)
    {//пока поля не сравняются
    //аналогично что для push_front
   if (kt<0) kt+=maxn;
    printf("%d ",d->a[(kt)%maxn]);//предварительное уменьшение и вывод
        kt--;
    }//т.к. при добавлении назад был постинкремент
}
 
void show_front(deque *d)
{
    kh=0;
    kh=d->dh;//чтобы голова не изменялась
  chep=d->dt--;//было предварительное уменьшение
    while(kh!=chep)//пока поля не равны
    {
if (kh>maxn) kh=1;
     printf("%d ",d->a[(kh)%maxn]);//в голове было преддекремент
        kh++;
    } //значит сейчас надо постинкремент
}
 
int main()
{
    deque k;
    k.dt=0;
    k.dh=0;
//  for(int i=0;i<10;i++)
/*  if (i%2==0)
     push_front(i,&k);
     else
     push_back(i,&k);*/
   //show_back(&k);
    //printf("\n");
    push_back(100,&k);
    //show_front(&k);
    //cout<<endl;
  show_back(&k);
  printf("\n");
    show_front(&k);
  return 0;
}
Погонял дебаггером.вроде все норм а выводит неверно.но кое-что стало лучше
почему то 0 оказывается впереди всегда.
а для одного элемента show_front выводит верно а show_back выводит 0

Добавлено через 2 часа 58 минут
sergjo
2 / 2 / 0
Регистрация: 27.10.2010
Сообщений: 6
13.11.2010, 12:43     проверьте кто-нибудь #6
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
70
71
72
73
74
75
#include <stdio.h>
#define maxn 10
 
typedef struct 
{
        int a[maxn];//массив значений
        int dt,dh; //указатели на голову и на хвост
}deque;
 
int kt=0; //для неизвлечения
int kh=0; //для неизвлечения
int chep=0;
int ch=0;
 
void push_front(int x,deque *d)
{
     d->a[(d->dh++)%maxn]=x;//запишем на это место элемент
     //1. - но теперь d->dh указывает на следующий не заполненный элемент
}
 
void push_back(int x,deque *d)
{
     d->a[(d->dt--)%maxn]=x; //запишем на это место элемент
     //2. - но теперь d->dt указывает на следующий не заполненный элемент
}
 
void show_back(deque *d)
{
        kt=d->dt;//чтобы хвост не смещался
    kt++;  //см. пункт 2.
    while (kt <= maxn -1)
        {
           printf("%d ",d->a[(kt)%maxn]);
           kt++;
        }
}
 
void show_front(deque *d)
{            
        kh=d->dh;//чтобы голова не изменялась
    if(kh)  kh--;  //см. пункт 1.
    while(kh >= 0)
        {   
            printf("%d ",d->a[(kh)%maxn]);
            kh--;
        } 
}
 
int main()
{
        deque k;
        k.dt=maxn-1;
        k.dh=0;
    memset( k.a, 0, sizeof(k.a));
 
         for(int i=0;i<maxn;i++)
      if (i%2==0)
         push_front(i,&k);
         else
         push_back(i,&k);
 
   show_back(&k);
 
   printf("\n");
   // push_back(100,&k);    //загнали 100 на последнее место
   show_front(&k);
        //cout<<endl;
  //show_back(&k); //увидели сотку на последнем месте
  //printf("\n");
        //show_front(&k);// увидели 0  на первом месте
 
   system("pause");
 
  return 0;
}
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
13.11.2010, 15:18  [ТС]     проверьте кто-нибудь #7
Цитата Сообщение от sergjo Посмотреть сообщение
memset( k.a, 0, sizeof(k.a));
то есть она все элементы обнуляет?

Добавлено через 49 минут
но как-то не связаны между собой элементы получаются
show_back не выводит элементы которые добавлялись в начало.а show_front не выводи элементы в конце
sergjo
2 / 2 / 0
Регистрация: 27.10.2010
Сообщений: 6
13.11.2010, 17:12     проверьте кто-нибудь #8
Я же не знаю для каких целей функцию ты задумывал. Задай другие условия: от первого элемента до последнего, а там от последнего до первого. Сейчас показывает какие элементы были введены пушами сначала, а какие с конца.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2010, 17:15     проверьте кто-нибудь
Еще ссылки по теме:

C++ Кто-нибудь реализовывал класс множество?
C++ Проверьте кто-то программу!
C++ Кто нибудь, когда нибудь встречал Шрёдинбаг?

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

Или воспользуйтесь поиском по форуму:
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
13.11.2010, 17:15  [ТС]     проверьте кто-нибудь #9
это же дек.
то есть от начала до конца просмотр всех элементов.и от конца до начала.

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
70
71
72
73
74
75
76
77
78
79
80
81
#include <stdio.h>
#include <string.h>
#define maxn 100
 
typedef struct 
{
        int a[maxn];//Г¬Г*Г±Г±ГЁГў Г§Г*Г*Г·ГҐГ*ГЁГ©
        int dt,dh; //ГіГЄГ*Г§Г*òåëè Г*Г* ãîëîâó ГЁ Г*Г* õâîñò
}deque;
 
int kt=0; //äëÿ Г*åèçâëå÷åГ*ГЁГї
int kh=0; //äëÿ Г*åèçâëå÷åГ*ГЁГї
int chep=0;
int ch=0;
 
void push_front(int x,deque *d)
{
     d->a[(d->dh--)%maxn]=x;//Г§Г*ГЇГЁГёГҐГ¬ Г*Г* ГЅГІГ® ìåñòî ýëåìåГ*ГІ
     //Г*Г® òåïåðü ýëåìåГ*ГІ ГіГЄГ*çûâГ*ГҐГІ Г*Г* ïîçèöèþ ãäå Г*ГҐГІ ýëåìåГ*ГІГ*
}
 
void push_back(int x,deque *d)
{
     d->a[(d->dt++)%maxn]=x; //Г§Г*ГЇГЁГёГҐГ¬ Г*Г* ГЅГІГ® ìåñòî ýëåìåГ*ГІ
         //òåïåðü Г*Г* ñëåäóþùèé Г*ГҐ Г±ГіГ№ГҐГ±ГІГўГіГѕГ№ГЁГ© ýëåìåГ*ГІ
}
 
void show_back(deque *d)
{
        kt=d->dt;//÷òîáû õâîñò Г*ГҐ ñìåùГ*ëñÿ
        kt--;  //óìåГ*ГјГёГҐГ*ГЁГҐ ГЁГ§ Г§Г* òîãî Г·ГІГ® Г*Г* ýëåìåГ*ГІ Г*ГҐ ГіГЄГ*çûâГ*ГҐГІ
        int ch=d->dh;
        while (kt !=ch)
        {
           if (kt<0) kt=(maxn-1);//Г*ГҐ maxn ГІ.ГЄ. Г*îìåðГ*öèÿ Г± 0
           printf("%d ",d->a[(kt)%maxn]);
           kt--;//óìåГ*ГјГёГҐГ*ГЁГҐ ïîçèöèé
        }
}
 
void show_front(deque *d)
{                
        kh=d->dh;//÷òîáû ãîëîâГ* Г*ГҐ èçìåГ*ГїГ«Г*Г±Гј
        if(kh)  kh++;  //åñëè 0 ГІГ® óâåëè÷èì ГІ.ГЄ. ýëåìåГ*ГІГ* Г*Г* ïîçèöèè Г*ГҐГІ
        int chep=d->dt--;
        while(kh !=chep )
        {       
            if (kh==maxn) kh=0;//åñëè Г±ГІГ*Г«Г* maxn(Г* ýòîãî ýëåìåГ*ГІГ* Г*ГҐГІ) ГІГ® Г*Г* ïîçèöèþ 0
            printf("%d ",d->a[(kh)%maxn]);
            kh++;
        } 
}
 
int main()
{
        deque k;
        k.dt=0;
        k.dh=maxn-1;//áóäåì ГіГ¬Г*ГјГёГ*ГІГј
        memset( k.a, 0, sizeof(k.a));
 
       for(int i=0;i<10;i++)
      if (i%2==0)
         push_front(i,&k);
         else
         push_back(i,&k);
 
   push_back(100,&k);
   show_back(&k);
 
   printf("\n");
   // push_back(100,&k);        //Г§Г*ГЈГ*Г*ëè 100 Г*Г* ïîñëåäГ*ГҐГҐ ìåñòî
   show_front(&k);
        //cout<<endl;
  //show_back(&k); //óâèäåëè ñîòêó Г*Г* ïîñëåäГ*ГҐГ¬ ìåñòå
  //printf("\n");
        //show_front(&k);//     óâèäåëè 0  Г*Г* ïåðâîì ìåñòå
 
 //  system("pause");
 
  return 0;
}
я её немного изменил но столкнулся с той же проблемой что и пару недель назад - есть вставлять один элемент происходит зацикливание при выводе

Добавлено через 29 секунд
вставка с переди означает что вставлятся будет перед элементом
Yandex
Объявления
13.11.2010, 17:15     проверьте кто-нибудь
Ответ Создать тему
Опции темы

Текущее время: 12:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru