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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
#1

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

05.03.2011, 15:13. Просмотров 1086. Ответов 5
Метки нет (Все метки)

Добрый день! Есть вопросы в решении задачи из книги Лафоре: массив - очередь, помещаем человека в конец очереди, выход человека из очереди по принципу 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;
}
Не понимаю, почему не происходит проверки и, почему программа работает, но выдает ошибку по завершении, что стек вокруг переменной был испорчен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2011, 15:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверка границ массива (C++):

Указание границ массива C++ - C++
В паскале при объявлении массива можно воспользоваться таким нехитрым кодом var arr: array of integer; чтобы, например, в качестве...

Нарушение границ массива - C++
Насколько мне известно в C++ нет проверки границ массива. Почему в следующем коде выскакивает ошибка? void main(){ char str; ...

Класс массив. Задания произвольных границ индексов массива - C++
Составить класс для определения одномерных массивов целых чисел . Предусмотреть возможность обращения к отдельному элементу массива с...

Написать класс для динамического массива с проверкой границ (что подразумевают под инициализацией?) - C++
Привет, народ, есть такое задание: 2. написать класс для динамического массива с проверкой границ( аналог std::vector ) +должны...

Создайте класс динамического массива, в котором реализована проверка выхода за границы массива - C++
Создайте класс динамического массива, в котором реализована проверка выхода за границы массива. Перегрузите операторы: , =, +, -,++ ...

Создайте класс динамического массива, в котором реализована проверка выхода за границы массива - C++
Создайте класс динамического массива, в котором реализована проверка выхода за границы массива. Перегрузите операторы: , =, +, -,++...

5
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;
  }
}
вроде так...
1
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++];
        }
};
1
zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
05.03.2011, 21:47  [ТС] #4
Оба исправления работают не верно.
0
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
1
zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
06.03.2011, 14:26  [ТС] #6
Цитата Сообщение от dimon1984 Посмотреть сообщение
Точно. Первый пример был LIFO
Наоборот, у Вас сейчас LIFO, под тот код, что Вы написали
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2011, 14:26
Привет! Вот еще темы с ответами:

Создайте класс динамического массива, в котором реализована проверка выхода за границы массива - C++
Народ подскажите такую вещь я написал программку для вставки элементов в массив при этом осуществляется проверка границ массива ! ...

Проверка массива - C++
Ребята, суть в том, что есть массивчик чисел и есть заданное число F. Нам надо получить число F , путём сложения нескольких(более одного)...

Проверка содержимого массива - C++
Допустим если есть массив char array = { '_' '_' '_' '_' '_' '_' '_' '_' '_' '_' '_'} // и тд.. Как проверить если 1==2==3 элемент...

Проверка строкового массива - C++
Добрый день, помогите, пожалуйста, разораться с проверкой условия: Имеем текстовый файл, содержащий следующие данные: &quot;Right 3 1 ...


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

Или воспользуйтесь поиском по форуму:
6
Yandex
Объявления
06.03.2011, 14:26
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru