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

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

Войти
Регистрация
Восстановить пароль
 
naa17
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 47
#1

Стек: Ошибка в объявлении getch - C++

08.05.2014, 21:48. Просмотров 376. Ответов 13
Метки нет (Все метки)

Добрый вечер!

Реализовал стек и некоторые функции.

Вопрос1: в функции doub имеется проблема - нет ограничения, судя по ошибкам, как это сделать?
Вопрос2: ошибка в объявлении getch почему-то.

Код ниже:

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
#include <iostream>
#include <conio.h>
 
using namespace std;
 
///////////////////////////////////////////////////////////
 
struct link // один элемент списка
{
    int data; // некоторые данные
    link* next; // указатель на следующую структуру
};
 
///////////////////////////////////////////////////////////
 
class stack// список
{
private:
    link* first;
public:
    stack() // конструктор без параметров
    {
        first = NULL;
    } // первого элемента пока нет
    void push(int d); // добавление элемента
    void display(); // показ данных
    void doub();
    int locate();
};
 
///////////////////////////////////////////////////////////
 
void stack:: push(int d) // добавление элемента
{
    link* newlink = new link; // выделяем память
    newlink->data = d; // запоминаем данные
    newlink->next = first; // запоминаем значение first
    first = newlink; // first теперь указывает на новый элемент
}
 
///////////////////////////////////////////////////////////
 
void stack::display()
{
    link* current = first; // начинаем с первого элемента
    while (current) // пока есть данные
    {
        cout << current->data << endl; // печатаем данные
        current = current->next; // двигаемся к следующему элементу
    }
}
 
void stack::doub()
{
    link* current = first; // начинаем с первого элемента
    link* current2 = current->next;
    while (current) // пока есть данные
    {
    while (current)
        {
            if (current == current2)
                cout << current->data << endl; // печатаем данные
            current2 = current2->next; // двигаемся к следующему элементу
        }
        current = current->next;
        current2 = current->next;
    }
}
 
int stack::locate ()
{
    int index = 0;
    link* current = first; // начинаем с первого элемента
    while (current) // пока есть данные
    {
        if ((current->data) == index)
        {
            return index;
        }
        else index++;
        current = current->next; // двигаемся к следующему элементу
    }
    cout<<"Error. Out of range"<<endl;
    return 0;
}
 
///////////////////////////////////////////////////////////
 
int main()
 
{
    int el, n;
    stack li; // создаем переменную-список
    cout << "input number of element";
    cin >> n;
    while (n>0)
    {
        cout << "input current element";
        cin >> el;
        li.push(el); // добавляем туда несколько чисел
        n--;
    }
 
    /* li.additem ( 25 ); // добавляем туда несколько чисел
    li.additem ( 36 );
    li.additem ( 49 );
    li.additem ( 64 ); */
 
    li.display(); // показываем список
    //li.doub();
    li.locate();
    getch();
    system("payse");
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2014, 21:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Стек: Ошибка в объявлении getch (C++):

ошибка getch() - C++
программа с функцией getch() компилируется адекватно, но пр выполнении выскакивает такое окошко

Ошибка в getch: Error C4996 - C++
Здравствуйте. Не понимаю в чём ошибка. Вроде как не первый раз использую этот код, но в первые сталкиваю с этой проблемой. ...

Ошибка в объявлении итератора - C++
Пытаюсь создать класс deque на основе класса vector. Создал итераторы для deque(все работало) vector&lt;double&gt; ::iterator begin() ...

Ошибка в объявлении массива - C++
Мне Вижуал Студия выдает список ошибок. Не пойму, чего от меня хочет. Вроде все правильно... #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

Ошибка в объявлении переменной - C++
Пишу программу, в которой нужно ввести строку символов (для дальнейшего ее шифрования), затем создать файл и в него записать эту строку. Но...

Ошибка в объявлении итератора - C++
Здравствуйте!Помогите пожалуйста! Есть класс,в private имеется vector&lt;unsigned short&gt;. При перегрузке оператора &lt;&lt; объявляю итератор ptr,...

13
deadlinishe
7 / 7 / 1
Регистрация: 03.05.2014
Сообщений: 143
08.05.2014, 22:59 #2
system("payse");


Добавлено через 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
98
99
100
101
102
103
104
105
106
107
108
109
//---------------------------------------------------------------------------
 
#include <iostream.h>
#include <conio.h>
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
 
 
 
int main(int argc, char* argv[])
{
  int * x; // стек
  int * y ; // удаляемые / добавляемые элементы
  int * z ; // результат
 
  int N , L , K ;
 
  do
  {
  cout << "N="; cin >> N;
  cout << "L="; cin >> L;
  cout << "K="; cin >> K;
  }
  while ( (L + K) > N || L < 1 || L > N ) ; // ввод пока некорректные данные
 
  // выделение памяти
  x = new int [N];
  y = new int [K];
 
  cout << "\n\nVvod steka" << endl;
 
  for (int i = 0 ; i < N ; i++)
  {
        cout << "x[" << i <<"]="; cin >> x[i];
  }
 
  cout << "\n\n1-dobavlenie" << endl;
  cout << "2-udalenie" << endl;
 
  int index;
  cin >> index;
 
  clrscr();
 
 
  // dobavlenie
  if ( index  == 1)
  {
      z = new int [K + N] ; // результат
      for (int i = 0 ; i < K ; i++)
      {
            cout << "Element[" << i <<"]="; cin >> y[i];
      }
 
    // извлекаем из стека элементы от N до L в обратном порядке
    for (int i = N - 1 ; i >= L ; i--)
      z[i + K] = x[i];
 
    // добавляемые и добавляем в результат
    for (int i = 0 ; i < K ; i++)
      z[L + i] = y[i];
 
      // добавляем оставшиеся элементы
    for (int i = L-1 ; i >= 0 ; i--)
      z[i] =x[i];
 
      cout << "\n\nResultat: " << endl;
      for (int i = 0 ; i < N + K; i++)
      cout << z[i] << " ";
  }
  else  // удаление
  {
 
      z = new int [N- K] ; // результат
      
          // извлекаем из стека элементы от N - 1 до L+K  и добавляем в результат
    for (int i = N - 1 ; i >= L + K ; i--)
      z[i - K] = x[i];
 
      // извлекаем удаляемые элементы и добавляем в массив
    for (int i = L + K -1  ; i >= L ; i--)
      y[i - L] = x[i];
 
      //   добавляем оставшиеся в результат
        for (int i = L -1  ; i >= 0 ; i--)
        z[i] = x[i];
 
        cout << "\n\nResultat: " << endl;
      for (int i = 0 ; i < N- K ; i++)
      cout << z[i] << " ";
 
      cout << "\n\nUdaleno: " << endl;
      for (int i = 0 ; i < K; i++)
      cout << y[i] << " ";
  }
 
  
   getch();
  delete [] x;
  delete [] y;
  delete [] z ; // освобождение памяти
 
 
return 0;
}
//---------------------------------------------------------------------------
0
naa17
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 47
08.05.2014, 23:26  [ТС] #3
можно реализовать разными способами.

В этой теме меня интересует только ошибки по функциям
0
uhx
60 / 60 / 6
Регистрация: 11.07.2013
Сообщений: 304
09.05.2014, 01:58 #4
61 строка. Как мы можем сравнивать 2 указателя? Как минимум там одна ошибка.
Если ее исправить, то дальше еще одна)) Зачем 2 цикла с проверкой на current?

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void stack::doub()
{
    link* current = first; // начинаем с первого элемента
    link* current2 = current->next;
    while (current) // пока есть данные
    {
    while (current2)
        {
            if (current->data == current2->data)
                cout << current->data << endl; // печатаем данные
            current2 = current2->next; // двигаемся к следующему элементу
        }
        current = current->next;
        //current2 = current->next;
    }
}
Так работает.
Видимо, ошибка в 66 строке. Вы передвигаете current на следующую пустую ячейку, а потом пытаетесь из нее вытащить next ! Одумайтесь !
Ну и условие во втором цикле было неверным, я исправил)
А вообще код немного странный.. можно как то попроще сделать. Да и работать он будет кривовато)) Зачем по стеку миллион раз проходить? Достаточно одного цикла.
0
naa17
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 47
09.05.2014, 10:01  [ТС] #5
сейчас если убрать комментарий в 14 строке то работает, но ошибка осталась, а если оставить с комментарием, то не работает
0
uhx
60 / 60 / 6
Регистрация: 11.07.2013
Сообщений: 304
09.05.2014, 14:43 #6
Цитата Сообщение от naa17 Посмотреть сообщение
сейчас если убрать комментарий в 14 строке то работает, но ошибка осталась, а если оставить с комментарием, то не работает
Вы вообще прочитали мое сообщение? Вы пытаетесь в 14 строке пытаетесь вытащить указатель на следующую структуру и запихнуть ее в current2. А когда у Вас структура current будет пустой, то Вы не сможешь этого сделать! Поэтому и ошибки.
Я вообще не понимаю предназначения данной функции. Зачем кучу раз проходиться по стеку двумя циклами? Код ужасен, а автор даже не понимает, в чем проблема... мда.

Добавлено через 6 минут
Пусть будет так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void stack::doub()
{
    link* current = first; // начинаем с первого элемента
    link* current2 = current->next;
    while (current) // пока есть данные
    {
    while (current) // ТУТ ОШИБКА!!! БЕСКОНЕЧНЫЙ ЦИКЛ!
        {
            if (current == current2) // ТУТ ОШИБКА!!!
                cout << current->data << endl; // печатаем данные
            current2 = current2->next; // двигаемся к следующему элементу
        }
        current = current->next;
        current2 = current->next; // ТУТ ОШИБКА !!!
    }
}
Исправляйте сами.
0
naa17
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 47
10.05.2014, 20:04  [ТС] #7
я понял, что ошибка. Но без этой строчки она не работает. Если Вы не знаете как её решить именно в этом коде, то подскажите как реализовать по другому.

Задача: ели в стеке имеются одинаковые элементы, то выводить их на экран
0
uhx
60 / 60 / 6
Регистрация: 11.07.2013
Сообщений: 304
10.05.2014, 20:20 #8
Цитата Сообщение от naa17 Посмотреть сообщение
я понял, что ошибка. Но без этой строчки она не работает. Если Вы не знаете как её решить именно в этом коде, то подскажите как реализовать по другому.
Задача: ели в стеке имеются одинаковые элементы, то выводить их на экран
Не обязательно, в каком порядке? Или те, которые следуют друг за другом?
0
naa17
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 47
10.05.2014, 20:22  [ТС] #9
не обязательно. Если есть повторяющиеся то вывести, но только один раз
0
uhx
60 / 60 / 6
Регистрация: 11.07.2013
Сообщений: 304
10.05.2014, 21:22 #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void stack::doub()
{
    link* current = first; // начинаем с первого элемента
    link* current2 = current->next;
    while (current) // пока есть данные
    {
    while (current2)
        {
            if (current->data == current2->data && current > current2)
                cout << current->data << endl; // печатаем данные
            current2 = current2->next; // двигаемся к следующему элементу
        }
        current = current->next;
        current2 = first;
    }
}
Добавлено через 3 минуты
Если честно, не до конца понимаю, как работает условие current > current2
Я подумал, что если адрес current будет больше (дальше в стеке), чем у current2, то значит надо не засчитывать это сходство. Иначе же он дважды выводит "схожие" числа, т.к. в конце концов у нас current оказывается на последних числах, и мы опять сравниваем их с другими.
1
uhx
60 / 60 / 6
Регистрация: 11.07.2013
Сообщений: 304
10.05.2014, 21:26 #11
Как-то так
1
Миниатюры
Стек: Ошибка в объявлении getch  
naa17
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 47
10.05.2014, 21:31  [ТС] #12
Спасибо, подскажите еще по функции Locate.

Locate (х, L). Эта функция возвращает позицию объекта x в списке L. Если в списке объект x встречается несколько раз, то возвращается позиция первого от начала списка объекта x. Если объекта x нет в списке L, то возвращается END(L).

Она правильно работает в этой программе? Не могу понять как проверить.

Если нет, то как сделать правильно?
0
uhx
60 / 60 / 6
Регистрация: 11.07.2013
Сообщений: 304
10.05.2014, 21:44 #13
Цитата Сообщение от naa17 Посмотреть сообщение
Спасибо, подскажите еще по функции Locate.
Locate (х, L). Эта функция возвращает позицию объекта x в списке L. Если в списке объект x встречается несколько раз, то возвращается позиция первого от начала списка объекта x. Если объекта x нет в списке L, то возвращается END(L).
Она правильно работает в этой программе? Не могу понять как проверить.
Если нет, то как сделать правильно?
Эм, нет. Функция явно работает неправильно.
По сути, тут код должен быть почти такой же как и в функции doub()
Только тут нужно будет оставить счетчик, и как только сработает условие (current->data == current2->data), мы возвращаем этот счетчик.
Я так понял.
1
naa17
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 47
10.05.2014, 21:57  [ТС] #14
т.е. относительно функции doub просто добавить счетчик после условия вместо печатания
0
10.05.2014, 21:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2014, 21:57
Привет! Вот еще темы с ответами:

Ошибка при объявлении структуры - C++
Ошибка при объявлении структуры # include &lt;iostream&gt; # include &lt;windows.h&gt; using namespace std; struct MyStruct { int...

Ошибка в объявлении класса (в конструкторе) - C++
Я не могу разобраться с классами и конструкторами, в строчке Progect();// {numb=0; sum=0; date=;} всегда высвечивает ошибку,...

Ошибка при объявлении массива - C++
Здраствуйте. Я кое чего не понимаю: В программе используется массив: long double myarray={3.16202e-322, 1.58101e-322}; с числами...

Ошибка при объявлении типа - C++
Как устранить ошибку? class B; class A { public: B getB() { return B(); }


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

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

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