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

Проверка границ массива - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
zabuka
 Аватар для zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
05.03.2011, 15:13     Проверка границ массива #1
Добрый день! Есть вопросы в решении задачи из книги Лафоре: массив - очередь, помещаем человека в конец очереди, выход человека из очереди по принципу FIFO. Также необходимо условие на проверку выхода за границы массива. Написал код:
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 "stdafx.h"
#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////////////////////////////////////////////
class queue
{
private:
    static const int MAX = 10;
    int st [MAX];
    int head;                                            // начало очереди
    int tail;                                               // конец очереди
public:
    queue()                         // конструктор
    { head =0; tail = 0; }
    void put(int var)
    {
        if (tail == MAX - 1)
        {
            tail = -1;
        }
        st [tail--] = var;
    }
    int get()
    {
        if (head == MAX - 1)
        {
            head = -1;
        }
        return st [head--];
    }
};
////////////////////////////////////////////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    queue q1;
    q1.put(1);
    q1.put(2);
    cout << "1: " << q1.get() << endl;
    cout << "2: " << q1.get() << endl;
    q1.put(4);
    q1.put(5);
    q1.put(6);
    q1.put(3);
    cout << "3: " << q1.get() << endl;
    cout << "4: " << q1.get() << endl;
    cout << "5: " << q1.get() << endl;
    cout << "6: " << q1.get() << endl;
    q1.put(4);
    q1.put(5);
    q1.put(6);
    q1.put(3);
    cout << "7: " << q1.get() << endl;
    cout << "8: " << q1.get() << endl;
    cout << "9: " << q1.get() << endl;
    cout << "10: " << q1.get() << endl;
    q1.put(11);
    cout << "11: " << q1.get() << endl;
    system("PAUSE");
    return 0;
}
Не понимаю, почему не происходит проверки и, почему программа работает, но выдает ошибку по завершении, что стек вокруг переменной был испорчен.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Fliter
2 / 2 / 0
Регистрация: 02.03.2011
Сообщений: 6
05.03.2011, 17:58     Проверка границ массива #2
Если я всё правильно понял, ты пытаешься занести в несушествующий елемент масива
Цитата Сообщение от zabuka Посмотреть сообщение
q1.put(11);
и еще перепиши функцию "put"
ну где-то так:
C++
1
2
3
4
5
6
7
8
void put(int var)
{
  if(tail!=Max)
  {
    tail++;
    st[tail]=var;
  }
}
вроде так...
dimon1984
40 / 38 / 0
Регистрация: 22.01.2011
Сообщений: 670
05.03.2011, 20:08     Проверка границ массива #3
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
const int MAX = 10;
class queue
{
private:
        int st [MAX];
        int head;                                            // начало очереди
        int tail;                                               // конец очереди
public:
        queue()                                                 // конструктор
        { head =0; tail = 0; }
        void put(int var)
        {
                if (tail == MAX-1)
                {
                        cout<<"Error"<<endl;  
                }
         else
                    { st [tail++] = var; }
        }
        int get()
        {
            if (head == MAX-1)
            {
                  cout<<"Error"<<endl;
                 return st[head-1];
                }
        else if(head == tail && tail>0)   //если вывели все элементы
        {
        int t=head;
        head=0; tail=0;   // то обнуляется очередь
        return st[t-1];
        }
        else if(head==tail) { return -1; }   //попытка обращения к несуществующему элементу
           return st [head++];
        }
};
zabuka
 Аватар для zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
05.03.2011, 21:47  [ТС]     Проверка границ массива #4
Оба исправления работают не верно.
dimon1984
40 / 38 / 0
Регистрация: 22.01.2011
Сообщений: 670
05.03.2011, 22:07     Проверка границ массива #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
...
#include <process.h>      // для exit ( )
 
class Stack
{
  private:             
    enum { MAX = 10 };     // размер стека
    int st[ MAX ];        // данные, хранящиеся в стеке
    int top;              // индекс последнего элемента в стеке
  public:
    Stack ( )            // конструктор
      { top = -1; }
    void push ( int var ) // помещение числа в стек
    {
        if(top>=MAX-1) 
          { cout << "\nОшибка: стек полон"; exit ( 1 ); }
       st[ ++top ] = var;
    }
    int pop ( )           // извлечение числа из стека
    { 
        if ( top < 0 )         // если стек пуст, то ошибка
          { cout << "\nОшибка: стек пуст\n"; exit ( 1 ); }
      return st[ top-- ]; 
    }
};
Точно. Первый пример был LIFO
zabuka
 Аватар для zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
06.03.2011, 14:26  [ТС]     Проверка границ массива #6
Цитата Сообщение от dimon1984 Посмотреть сообщение
Точно. Первый пример был LIFO
Наоборот, у Вас сейчас LIFO, под тот код, что Вы написали
Yandex
Объявления
06.03.2011, 14:26     Проверка границ массива
Ответ Создать тему
Опции темы

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