6 / 6 / 4
Регистрация: 18.10.2011
Сообщений: 187
1

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

03.07.2013, 15:16. Показов 4648. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите найти ошибку, по заданию надо записать в очередь данные из файла, а при записи отрицательного числа программа должна извлечь все элементы из очереди, вывести на экран и завершится, вроде всё верно написал, но выдаёт ошибку с нарушением прав доступа записи при записи.
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";
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.07.2013, 15:16
Ответы с готовыми решениями:

Очередь на основе динамического (статического) массива
Задание следующее: Абстрактный класс (интерфейс) - это у меня очередь Дочерние/производные классы...

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

"Очередь" на основе динамического массива
Как можно переделать чтобы не было ошибки &quot;Предел памяти&quot;? Задача: реализация &quot;очередь&quot; на основе...

Очередь на основе массива
Очередью (англ. queue) называется хранилище данных, в котором можно работать только с одним...

16
vorobey_93
03.07.2013, 15:50 2
Кажется, так как ptr объявлен в Private, то на прямую обращаться к нему ты не можешь, т.е. нельзя выводить просто через cout<< Либо ты ptr объявляешь в Public, либо строишь функцию класса, которая просто выводить этот ptr.
6 / 6 / 4
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 16:05  [ТС] 3
Private тут не при чём, он же из этого же класса
0
73 / 69 / 1
Регистрация: 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 минуту
Только это не очередь
Очередь предполагает последовательный доступ к элементам, а здесь тупо по индексу.
0
6 / 6 / 4
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 17:44  [ТС] 5
Цитата Сообщение от Kojt Посмотреть сообщение
Только это не очередь
Очередь предполагает последовательный доступ к элементам, а здесь тупо по индексу.
А не могли бы пояснить что нужно сделать, чтобы была очередь?
0
73 / 69 / 1
Регистрация: 19.05.2010
Сообщений: 167
03.07.2013, 17:46 6
C++
1
2
3
4
5
struct queue
{
  int val;
  queue *next;
};
Ну и при создании сохраняется указатель на первый элемент, а потом в цикле идет перемещение по полям next пока не дойдется до NULL
Правда тогда не понятно как ее на основе массива сделать
0
6 / 6 / 4
Регистрация: 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() для вывода
0
73 / 69 / 1
Регистрация: 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 минуту
Можно почитать тут и тут
1
6 / 6 / 4
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 17:53  [ТС] 9
Это на основе списка, а мне массив надо
0
73 / 69 / 1
Регистрация: 19.05.2010
Сообщений: 167
03.07.2013, 17:56 10
Ну как бы не согласуются понятия
wiki
0
6 / 6 / 4
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 18:03  [ТС] 11
То есть указатель на первый и последний элементы будут и там и там?
0
73 / 69 / 1
Регистрация: 19.05.2010
Сообщений: 167
03.07.2013, 18:12 12
Не совсем понял вопрос
Суть очереди именно в способе доступа, тот элемент, который был первым добавлен и будет прочитан первым, и до второго как бы мимо первого не получится добраться
А массив позволяет по индексу обращаться, т.е. сразу прыгать на нужный элемент.
То что там указатели на начало и конец - это детали не особо важные, в понятии очередь и массив ключевым моментом является именно способ доступа.
По крайней мере это я так понимаю, могу и ошибаться
Сделайте оба варианта, сил не много потребуется, но будет что показать преподу.

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

Разница между очередью на основе списка и на основе массива в том, что в последнем случае это не очередь.
Это все равно что спрашивать в чем разница между системным блоком на основе процессора и на основе жесткого диска, это не совместимые понятия.
0
6 / 6 / 4
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 18:22  [ТС] 15
То есть очереди на основе массива можно сказать не бывает?
0
73 / 69 / 1
Регистрация: 19.05.2010
Сообщений: 167
03.07.2013, 18:29 16
Из того что я знаю - нет
Иначе как это можно представить?
Просто сделать new int[100] - это будет динамический массив
А где тогда основной принцип очереди "первый пришел - первый ушел" ?
Изменить функционал массива внешними обертками? тогда это будет просто извращение и код ради кода.
0
6 / 6 / 4
Регистрация: 18.10.2011
Сообщений: 187
03.07.2013, 18:39  [ТС] 17
Получается тупо ограниченная очередь
0
03.07.2013, 18:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.07.2013, 18:39
Помогаю со студенческими работами здесь

Очередь на основе массива
Сделал программу, которая создает очередь с помощью массива. Но работает она криво.Например, если...

Очередь на основе массива
когда создаю пустую очередь размерностью 2 в main() вот так BoundQueue &lt;int&gt; a(2); выводится...

Стек на основе динамического массива
Надо написать стек на основе динамического массива. Как выделить память под новый элемент? ...

Очередь на основе статического массива
в очередь с экрана вводятся строки,когда вводится строка end,элементы извлекаются из очереди и...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

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