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

Вывести содержимое очереди на экран двумя столбцами - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
27.11.2011, 11: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
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <stdlib.h>
#include <iomanip>
 
using namespace std;
 
struct CH
{
  int k;
  CH *ptr;
};
 
void aadd_och( CH **, CH **);
void del_och ( CH **, CH **);
 
void main()
{
  CH *pbeg=NULL, *pend=NULL;
  char c;
  while(1)
  {
    setlocale(LC_ALL,"Rus"); // вывод русских букв
    cout << "\n\n1. Добавление элемента в очередь\n";
    cout << "2. Выборка элемента из очереди\n";
    cout << "3. Выход из программы\n";
    cout << "Ваш выбор:";
    cin >> c;
    switch(c)
    {
      case '1':
    aadd_och(&pbeg, &pend);
    break;
      case '2':
    del_och(&pbeg, &pend);
    break;
      case '3':
    return;
     }
   }
}
 
void aadd_och ( CH **pn, CH **pk)
{
  CH *r;
  int m;
  cout << "Введите целое число=";
  cin >> m;
  // выделяем динамическую память
  r = new (CH);
  if ( r == NULL)
  {
    cerr << "Ошибка выделения динамической памяти\n";
    exit(1);
  }
  // заносим в дин. память введенное число
  // и нулевое значение адреса
  r->k = m;
  r->ptr = NULL;
 
  // определяем существуют ли очереди элементы
 
  if (*pn == NULL)
  {
    // очередь пустая
    // значит созданный элемент становится первым и последним
    *pn = r;
    *pk = r;
  }
  else
  {
    // в очереди есть элементы
    // добавляем элемент в конец
 
    (*pk)->ptr = r;
       // в адресное поле элемента, который был
       // последним занесл адрес вновь созданного эл-та
 
    *pk = r;  // вновь созданный элемент стал последним
         // в очереди
   }
}
 
void del_och ( CH **pn, CH **pk)
{
  CH *p;
  if (pn == NULL)
    cout << "Очередь пуста. Выбирать нечего.\n";
  else
  {
    p = *pn;
    cout << "Из очереди выбран эл-т = " << p->k << endl;
    *pn = p->ptr; // 2-ой элемент в очереди стал 1-ым
    delete p;      // удалили первый элемент из очереди
  }
}
Задание - Дан массив a[5][5]. Требуется ввести данные в массив. Все элементы массива записать в очередь, вывести содержимое очереди на экран двумя столбцами.

Допустим,
добавляем в программу ввод массива
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define I 5
#define J 5
void inputmas( float [I][J], char);
void inputmas(float m[I][J], char im)
{
  int i,j;
  cout << "\nВводим массив " << im << "\n";
  for (i=0; i<I; i++)
    for ( j=0; j < J; j++)
    {
      cout << im << " [" << i << " ][ " << j << " ] = ";
      cin >> m[i][j];
    }
}
а куда добавлять ввод массива. Если честно я не понимаю, что значит очередь. После ввода массива, если используется очередь, то что она делает с массивом??
и как вывести в два столбца, если массив 5*5?

Добавлено через 8 часов 38 минут
?????????????

Добавлено через 11 часов 11 минут
Потихоньку сама, итак массив в программе мы вводим следующим образом:
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <stdlib.h>
#include <iomanip>
#define I 5
#define J 5
 
using namespace std;
 
struct CH
{
  int k;
  CH *ptr;
};
 
void inputmas( float [I][J], char);
void printmas(float [I][J], char);
void aadd_och( CH **, CH **);
void del_och ( CH **, CH **);
 
void main()
{
  float a[5][5];
  inputmas( a, 'a');
  printmas( a, 'a');
  CH *pbeg=NULL, *pend=NULL;
  char c;
  while(1)
  {
    setlocale(LC_ALL,"Rus"); // вывод русских букв
    cout << "\n\n1. Добавление элемента в очередь\n";
    cout << "2. Выборка элемента из очереди\n";
    cout << "3. Выход из программы\n";
    cout << "Ваш выбор:";
    cin >> c;
    switch(c)
    {
      case '1':
    aadd_och(&pbeg, &pend);
    break;
      case '2':
    del_och(&pbeg, &pend);
    break;
      case '3':
    return;
     }
   }
}
 
// функция ввода массива
void inputmas(float m[I][J], char im)
{
  int i,j;
  setlocale(LC_ALL,"Rus");
  cout << "\nВводим массив " << im << "\n";
  for (i=0; i<I; i++)
    for ( j=0; j < J; j++)
    {
      cout << im << " [" << i << " ][ " << j << " ] = ";
      cin >> m[i][j];
    }
}
 
void printmas(float m[I][J], char immas)
{
  int i,j;
  cout.setf( ios::showpoint | ios::fixed);
  setlocale(LC_ALL,"Rus");
  cout << "\nМассив " << immas ;
  for (i=0; i<I; i++)
    {
      cout << "\n";
      for(j=0; j<J; j++)
       {
        cout.width(8);     // минимальное кол-во позиций
        cout.precision(2); // 2 знака после запятой
        cout << m[i][j];
      }
    }  
}
 
void aadd_och ( CH **pn, CH **pk)
{
  CH *r;
  int m;
  cout << "Введите целое число=";
  cin >> m;
  // выделяем динамическую память
  r = new (CH);
  if ( r == NULL)
  {
    cerr << "Ошибка выделения динамической памяти\n";
    exit(1);
  }
  // заносим в дин. память введенное число
  // и нулевое значение адреса
  r->k = m;
  r->ptr = NULL;
 
  // определяем существуют ли очереди элементы
 
  if (*pn == NULL)
  {
    // очередь пустая
    // значит созданный элемент становится первым и последним
    *pn = r;
    *pk = r;
  }
  else
  {
    // в очереди есть элементы
    // добавляем элемент в конец
 
    (*pk)->ptr = r;
       // в адресное поле элемента, который был
       // последним занесл адрес вновь созданного эл-та
 
    *pk = r;  // вновь созданный элемент стал последним
         // в очереди
   }
}
 
void del_och ( CH **pn, CH **pk)
{
  CH *p;
  if (pn == NULL)
    cout << "Очередь пуста. Выбирать нечего.\n";
  else
  {
    p = *pn;
    cout << "Из очереди выбран эл-т = " << p->k << endl;
    *pn = p->ptr; // 2-ой элемент в очереди стал 1-ым
    delete p;      // удалили первый элемент из очереди
  }
}
Добавлено через 10 минут
теперь данные массива попробую записать в очередь.
например,данный массив выглядит так
1.00 2.00 3.00 4.00 5.00
6.00 7.00 9.00 10.00 11.00
.....................................
.....................................
21.00 22.00 23.00 24.00 25.00

то очередь должна выглядить 1 2 3 4 5 6 7 8 9 10 .......... так?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
greshnikk
 Аватар для greshnikk
30 / 30 / 0
Регистрация: 05.11.2008
Сообщений: 162
27.11.2011, 11:24     Вывести содержимое очереди на экран двумя столбцами #2
Цитата Сообщение от irina3456 Посмотреть сообщение
очередь должна выглядить 1 2 3 4 5 6 7 8 9 10 .......... так?
Именно так, Ваши рассуждения правильны. Если у Вас есть сомнения по поводу вопроса "Что такое очередь?", можете ознакомиться с этой статьей.

Цитата Сообщение от irina3456 Посмотреть сообщение
как вывести в два столбца, если массив 5*5?
Предлагаю выводить поочередно. Первый элемент в первый столбик, второй в второй, третий опять в первый, затем опять во второй и так далее.

Цитата Сообщение от irina3456 Посмотреть сообщение
После ввода массива, если используется очередь, то что она делает с массивом?
Необходимо преобразовать массив в структуру данных "Очередь".

Обобщая все выше сказанное - у вас есть исходный код, который позволяет использовать очередь. Вам необходимо:
1. Модифицировать код таким образом, чтобы параметры добавления элемента в очередь передавались в функцию, а не запрашивались у пользователя с терминала.
2. Добавить функцию, реализующую вывод очереди на экран.
3. Созданный Вами массив по одному элементу заносить в очередь, используя п.1, а после занесения всех элементов, вывести очередь на терминал, используя п.2
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
27.11.2011, 12:36  [ТС]     Вывести содержимое очереди на экран двумя столбцами #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
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <stdlib.h>
#include <iomanip>
 
using namespace std;
 
struct CH
{
  int k;
  CH *ptr;
};
 
void aadd_och( CH **, CH **);
void del_och ( CH **, CH **);
 
void main()
{
  CH *pbeg=NULL, *pend=NULL;
  char c;
  while(1)
  {
    setlocale(LC_ALL,"Rus"); // вывод русских букв
    cout << "\n\n1. Добавление элемента в очередь\n";
    cout << "2. Выборка элемента из очереди\n";
    cout << "3. Выход из программы\n";
    cout << "Ваш выбор:";
    cin >> c;
    switch(c)
    {
      case '1':
    aadd_och(&pbeg, &pend);
    break;
      case '2':
    del_och(&pbeg, &pend);
    break;
      case '3':
    return;
     }
   }
}
 
void aadd_och ( CH **pn, CH **pk)
{
  CH *r;
  int a[5][5];
  setlocale(LC_ALL,"Rus");
  cout<<"Ввод массива a:" << endl;
        for(int i=0;i<5;i++)
        {
          for(int j=0;j<5;j++)
            {
               setlocale(LC_ALL,"Rus");
               cout<<"Введите элемент массива a["<<i<<"]["<<j<<"]=";
               cin>>a[i][j];
            }
        }
  setlocale(LC_ALL,"Rus");
  cout<<"Исходный массив a:" << endl;
        for(int i=0;i<5;i++)
        {
                for(int j=0;j<5;j++)
                {
                        cout<<setw(5)<<a[i][j];
                }
                cout<<endl;
        } 
  
  // выделяем динамическую память
  r = new (CH);
  if ( r == NULL)
  {
    cerr << "Ошибка выделения динамической памяти\n";
    exit(1);
  }
  // заносим в дин. память введенное число
  // и нулевое значение адреса
  r->k = a[5][5];
  r->ptr = NULL;
 
  // определяем существуют ли очереди элементы
 
  if (*pn == NULL)
  {
    // очередь пустая
    // значит созданный элемент становится первым и последним
    *pn = r;
    *pk = r;
  }
  else
  {
    // в очереди есть элементы
    // добавляем элемент в конец
 
    (*pk)->ptr = r;
       // в адресное поле элемента, который был
       // последним занесл адрес вновь созданного эл-та
 
    *pk = r;  // вновь созданный элемент стал последним
         // в очереди
   }
}
 
void del_och ( CH **pn, CH **pk)
{
  CH *p;
  if (pn == NULL)
    cout << "Очередь пуста. Выбирать нечего.\n";
  else
  {
    p = *pn;
    cout << "Из очереди выбран эл-т = " << p->k << endl;
    *pn = p->ptr; // 2-ой элемент в очереди стал 1-ым
    delete p;      // удалили первый элемент из очереди
  }
}
только очередь уж очень странная получается

Добавлено через 15 минут
C++
1
2
3
4
5
struct CH
{
  int k;
  CH *ptr;
};
по порядку, это объявили класс CH, где к-место, куда помещается вводимое число, а что такое - CH *ptr; ???
greshnikk
 Аватар для greshnikk
30 / 30 / 0
Регистрация: 05.11.2008
Сообщений: 162
27.11.2011, 12:36     Вывести содержимое очереди на экран двумя столбцами #4
Ваше решение очень грубое, к тому же ошибочное. Ошибка состоит в том, что Вам необходимо выделить память под каждый элемент массива. То есть делается это в цикле. Вы же выделили память только под один элемент.
Я предложил Вам очень практичный вариант. Каждая сущность должна отвечать только за свою часть работы. Метод добавления элемента в очередь должен заботиться только о добавлении элемента в очередь. Вы же нагружаете его работой, которая ему не свойственна. Вы говорите что он должен еще и заботится о создании массива и еще о добавлении всего массива в очередь. Это очень не красивый способ программирования. Если Вам интересно, прочитайте по этому поводу эту коротенькую статью.
Я вам составил наиболее приемлемый алгоритм действий. Если Вы все-таки хотите написать по-своему, тогда ошибку я Вам уже разъяснил. Выделять память надо под каждый элемент массива, а не под один.

Цитата Сообщение от irina3456 Посмотреть сообщение
по порядку, это объявили класс CH, где к-место, куда помещается вводимое число, а что такое - CH *ptr; ???
Если после прочтения, рекомендованной мною статьи, Вы не до конца поняли идею очереди, я постараюсь объяснить. Очередь состоит из элементов, кусочков памяти, в данном случае структур. Каждый такой кусочек памяти имеет данные, которые он хранит. Возникает вопрос, а как тогда узнать, в каком участке ОЗУ хранится тот или иной кусочек ? Они ведь разбросаны по всей памяти. Выход следующий - каждая структура будет хранить не только данные, но и указатель, где расположен следующий кусочек. И тогда получается, что зная адрес хвостика, мы сможем добраться до любой структуры, перемещаясь по указателю. То есть мы идем по адресу, который хранится в хвостике (это и есть наш CH* ptr) и приходим на предпоследний элемент. Если в нем пойти по адресу, придем на пред пред последний элемент и так далее.
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
27.11.2011, 13:36  [ТС]     Вывести содержимое очереди на экран двумя столбцами #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
74
75
76
77
78
79
80
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <stdlib.h>
#include <iomanip>
#define I 5
#define J 5
 
using namespace std;
 
struct CH
{
  int k;
  CH *ptr;
};
 
 
void inputmas( int [I][J], char);
void aadd_och( CH **, CH **);
void printochered( int [i][j], char);
 
void main()
{
  int a[5][5];
  
  CH *pbeg=NULL, *pend=NULL;
  char c;
  while(1)
  {
    setlocale(LC_ALL,"Rus"); // вывод русских букв
    cout << "\n\n1. Создание массива \n";
    cout << "2. Запись элементов массива в очередь\n";
    cout << "3. Вывод очереди на экран\n";  
    cout << "4. Выход из программы\n";
    cout << "Ваш выбор:";
    cin >> c;
    switch(c)
    {
      case '1':
    inputmas( a, 'a');
    break;
      case '2':
    aadd_och(&pbeg, &pend);
    break;
      case '3':
    printochered( b, 'b');
        break;
      case '4':
    return;
     }
   }
}
 
 
void inputmas(int m[I][J], char im)
{
int *p;
if (p = new int[i][j])
{
   setlocale(LC_ALL,"Rus");
   cout<<"\nВведите значения элементов массива";
   for (i=0; i<I; i++)
    for ( j=0; j < J; j++)
    {
      cout<<im<<"\n p[" << i << " ][ " << j << " ]=";
      cin>>*(p+i*|+j);
    }
   cout<<"\nВывод значений элементов массива";
   for (i=0; i<I; i++)
    for ( j=0; j < J; j++)
    {
      cout<<im<<" p["<<i<<"]["<<j<<"]="<<*(p+i*|+j);
    }
   else
   cout<<"\nПамять не выделена";
}
 
 
 
void aadd_och ( CH **pn, CH **pk)
а как мне добавлять элементы массива в очередь?
greshnikk
 Аватар для greshnikk
30 / 30 / 0
Регистрация: 05.11.2008
Сообщений: 162
27.11.2011, 13:42     Вывести содержимое очереди на экран двумя столбцами #6
Цитата Сообщение от irina3456 Посмотреть сообщение
а как мне добавлять элементы массива в очередь?
Цитата Сообщение от greshnikk Посмотреть сообщение
1. Модифицировать код таким образом, чтобы параметры добавления элемента в очередь передавались в функцию, а не запрашивались у пользователя с терминала.
Когда Вы вызываете функцию aadd_och, она запрашивает у Вас, данные для хранения. Вам необходимо изменить функцию так, чтобы эти данные передавались параметром. К примеру вот так:
C++
1
void aadd_och ( CH **pn, CH **pk, int numberToStore)
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
27.11.2011, 13:52  [ТС]     Вывести содержимое очереди на экран двумя столбцами #7
вы меня заставляете думать))))
спасибо

Добавлено через 2 минуты
допустим я объявлю параметр int numberToMas, тогда какое значение мне ему присваивать??
greshnikk
 Аватар для greshnikk
30 / 30 / 0
Регистрация: 05.11.2008
Сообщений: 162
27.11.2011, 13:54     Вывести содержимое очереди на экран двумя столбцами #8
Цитата Сообщение от irina3456 Посмотреть сообщение
вы меня заставляете думать))))
Я надеюсь, что Вам необходимо понять программу и написать ее самой. В противном случае, если Вам нужен только код и все, я Вам ничем не могу помочь.

Цитата Сообщение от irina3456 Посмотреть сообщение
допустим я объявлю параметр int numberToMas, тогда какое значение мне ему присваивать??
Попробую объяснить на примере. Допустим у Вам нужно сохранить число 3 в очереди. Тогда Вы должны вызвать Ваш измененный метод добавления данных в очередь:
C++
1
aadd_och (..., ..., 3)
Теперь пример посложнее, Вам необходимо добавить в очередь массив. Тогда в цикле проходимся по всем элементам массива:
C++
1
2
for (int i = 0; ....)
  aadd_och(..., ..., array[i]);
irina3456
1 / 1 / 0
Регистрация: 23.05.2011
Сообщений: 91
27.11.2011, 13:57  [ТС]     Вывести содержимое очереди на экран двумя столбцами #9
может быть numberToMas=*p, но в этой функции ничего не известно о *p.....
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2011, 14:24     Вывести содержимое очереди на экран двумя столбцами
Еще ссылки по теме:

C++ Вывести содержимое файла на экран
Вывести на экран содержимое файла C++
C++ Запросить ввод 30 цифр и вывести на экран по очереди все отрицательные числа

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

Или воспользуйтесь поиском по форуму:
greshnikk
 Аватар для greshnikk
30 / 30 / 0
Регистрация: 05.11.2008
Сообщений: 162
27.11.2011, 14:24     Вывести содержимое очереди на экран двумя столбцами #10
Вы читали мое предыдущее сообщение ?
Если все же Вам не понятно, что нужно сделать, постараюсь еще подробнее описать. Для начала опишите для себя на бумаге что такое очередь. Без анализа, написание и отладка кода занимают на порядок больше времени, поверьте мне. Я не один лист бумаги исписываю во время разработки приложений. После того, как Вы четко представите, что такое очередь, словесно опишите (опять таки на бумаге), как бы Вы реализовали этот алгоритм. Не нужно никакого кода. Абстрагируйтесь от языка программирования и опишите только лишь метод в общих чертах. После этого, с пониманием того, для чего нужна очередь и как с ней работать, возьмите изначальный код, который был у Вас в момент создания данной темы. Проанализируйте его. Разберитесь что в нем происходит. Без этого понимания, дальше идти пока что нет смысла.
Yandex
Объявления
27.11.2011, 14:24     Вывести содержимое очереди на экран двумя столбцами
Ответ Создать тему
Опции темы

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