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

Очередь на основе динамического массива - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 15:16     Очередь на основе динамического массива #1
Помогите найти ошибку, по заданию надо записать в очередь данные из файла, а при записи отрицательного числа программа должна извлечь все элементы из очереди, вывести на экран и завершится, вроде всё верно написал, но выдаёт ошибку с нарушением прав доступа записи при записи.
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
class TLine
{
private:
    int n;
    int N;
    int* ptr;
public:
    TLine(){n=10;N=100;ptr=new int[100];}
    ~TLine();
     void LoadFile();
};
 
 
TLine::~TLine()
{
    delete [] ptr;
}
 
void TLine::LoadFile()
{
    char fname[]="C://file.txt";
    FILE* f;
    int value;
    f=fopen(fname,"rt");
    int i=0;
    if (f)
    {
        while (!feof(f))
        {
            if(f)
            {
                fscanf(f,"%d",ptr[i]);
                if (ptr[i]>=0)
                {
                    i++;
                }
                else
                    for (int j=0; j<i; j++)
                        cout<<ptr[j];
            }
            else
                cout<<"Not found file";
            
        }
        fclose(f);
        
    }
    else 
        cout<<"File not found";
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2013, 15:16     Очередь на основе динамического массива
Посмотрите здесь:

Стек на основе динамического массива C++
Очередь на основе массива C++
Очередь на основе STL C++
Очередь на основе массива C++
C++ Очередь на основе статического массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vorobey_93
Сообщений: n/a
03.07.2013, 15:50     Очередь на основе динамического массива #2
Кажется, так как ptr объявлен в Private, то на прямую обращаться к нему ты не можешь, т.е. нельзя выводить просто через cout<< Либо ты ptr объявляешь в Public, либо строишь функцию класса, которая просто выводить этот ptr.
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 16:05  [ТС]     Очередь на основе динамического массива #3
Private тут не при чём, он же из этого же класса
Kojt
73 / 69 / 2
Регистрация: 19.05.2010
Сообщений: 167
03.07.2013, 17:23     Очередь на основе динамического массива #4
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
class TLine
{
private:
    int n;
    int N;
    int* ptr;
public:
    TLine(){n=10;N=100;ptr=new int[100];}
    ~TLine();
     void LoadFile();
};
 
 
TLine::~TLine()
{
    delete [] ptr;
}
 
void TLine::LoadFile()
{
    char fname[]="C://file.txt";
    FILE* f;
    int value;
    f=fopen(fname,"rt");
    int i=0;
    if (f == NULL)
    {
        cout<<"File not found";
        return;
     }
        
     while (!feof(f))
     {
                fscanf(f,"%d", (ptr+i)); // Важный момент, нужно указатель передавать, а не значение
                if (ptr[i]>=0)
                {
                    i++;
                }
                else
                {
                    for (int j=0; j<i; j++)
                        cout<<ptr[j];
                    break; // На всякий случай, если дальше есть еще какие-то данные
                }            
        }
        fclose(f);
}
Добавлено через 1 минуту
Только это не очередь
Очередь предполагает последовательный доступ к элементам, а здесь тупо по индексу.
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 17:44  [ТС]     Очередь на основе динамического массива #5
Цитата Сообщение от Kojt Посмотреть сообщение
Только это не очередь
Очередь предполагает последовательный доступ к элементам, а здесь тупо по индексу.
А не могли бы пояснить что нужно сделать, чтобы была очередь?
Kojt
73 / 69 / 2
Регистрация: 19.05.2010
Сообщений: 167
03.07.2013, 17:46     Очередь на основе динамического массива #6
C++
1
2
3
4
5
struct queue
{
  int val;
  queue *next;
};
Ну и при создании сохраняется указатель на первый элемент, а потом в цикле идет перемещение по полям next пока не дойдется до NULL
Правда тогда не понятно как ее на основе массива сделать
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 17:50  [ТС]     Очередь на основе динамического массива #7
Да вот именно, на основе списка тут вроде всё ясно, а надо на основе массива. Я вот так что то пытаюсь сделать, но не получается тоже
C++
1
2
3
4
5
6
7
8
bool TLine::put(FILE* f,int* TLine)
{
    fscanf(f,"%d",*TLine);
                if (TLine>=0)
                    return true;
                else
                    return false;
}
а уже ниже будет
C++
1
2
3
if (put(f,&ptr[i]))
                    i++;
                else
и тут ещё метод get() для вывода
Kojt
73 / 69 / 2
Регистрация: 19.05.2010
Сообщений: 167
03.07.2013, 17:52     Очередь на основе динамического массива #8
т.е. в самом начале создается только один элемент и сораняется указатель на него, который не трогается в дальнейшем, иначе не достучаться до элементов будет, а потом при чтении нового числа делается
C++
1
2
3
p->next = new queue;
p = p->next;
fscanf(f, "%d", &(p->val));
а когда встречается отрицательное число идет проход по очереди
C++
1
2
for (p = pstart; p != NULL; p=p->next)
     cout << p->val;
Добавлено через 1 минуту
Можно почитать тут и тут
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 17:53  [ТС]     Очередь на основе динамического массива #9
Это на основе списка, а мне массив надо
Kojt
73 / 69 / 2
Регистрация: 19.05.2010
Сообщений: 167
03.07.2013, 17:56     Очередь на основе динамического массива #10
Ну как бы не согласуются понятия
wiki
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 18:03  [ТС]     Очередь на основе динамического массива #11
То есть указатель на первый и последний элементы будут и там и там?
Kojt
73 / 69 / 2
Регистрация: 19.05.2010
Сообщений: 167
03.07.2013, 18:12     Очередь на основе динамического массива #12
Не совсем понял вопрос
Суть очереди именно в способе доступа, тот элемент, который был первым добавлен и будет прочитан первым, и до второго как бы мимо первого не получится добраться
А массив позволяет по индексу обращаться, т.е. сразу прыгать на нужный элемент.
То что там указатели на начало и конец - это детали не особо важные, в понятии очередь и массив ключевым моментом является именно способ доступа.
По крайней мере это я так понимаю, могу и ошибаться
Сделайте оба варианта, сил не много потребуется, но будет что показать преподу.

Добавлено через 45 секунд
Кроме очереди есть еще стек, там принцип последний пришел - первый ушел
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 18:13  [ТС]     Очередь на основе динамического массива #13
Я просто не особо улавливаю разницу между очередью на основе списка и на основе массива
Kojt
73 / 69 / 2
Регистрация: 19.05.2010
Сообщений: 167
03.07.2013, 18:18     Очередь на основе динамического массива #14
В массиве динамическом, где память выделяется через new можно только заранее указанное число элементов создать
А в очереди - сколько угодно
Что делать если в файле будет не 100 чисел, а 1000? А если 10000?
Не делать же каждый раз массив который будет на 1000000 значений заранее, хотя может потребоваться только 5 элементов
В случае со списком будет заниматься только необходимая память, лишнего не будет зажираться.

Разница между очередью на основе списка и на основе массива в том, что в последнем случае это не очередь.
Это все равно что спрашивать в чем разница между системным блоком на основе процессора и на основе жесткого диска, это не совместимые понятия.
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 18:22  [ТС]     Очередь на основе динамического массива #15
То есть очереди на основе массива можно сказать не бывает?
Kojt
73 / 69 / 2
Регистрация: 19.05.2010
Сообщений: 167
03.07.2013, 18:29     Очередь на основе динамического массива #16
Из того что я знаю - нет
Иначе как это можно представить?
Просто сделать new int[100] - это будет динамический массив
А где тогда основной принцип очереди "первый пришел - первый ушел" ?
Изменить функционал массива внешними обертками? тогда это будет просто извращение и код ради кода.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2013, 18:39     Очередь на основе динамического массива
Еще ссылки по теме:

C++ Очередь на основе массива
Очередь на основе динамического массива. Изучение функций ввода/вывода в программном интерфейсе Win32 C++
C++ "Очередь" на основе динамического массива

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

Или воспользуйтесь поиском по форуму:
SKS-65
5 / 5 / 1
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 18:39  [ТС]     Очередь на основе динамического массива #17
Получается тупо ограниченная очередь
Yandex
Объявления
03.07.2013, 18:39     Очередь на основе динамического массива
Ответ Создать тему
Опции темы

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