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

Отладка - C++

Восстановить пароль Регистрация
 
Triathlet
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 67
25.11.2012, 14:41     Отладка #1
Нужно добавлять элемент в массив array[i] (вводится с клавиатуры), если его не существует.
Функция Add:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void Set::add() 
{ 
    int a[100];  
    int i;  
    int element;
    for ( i = 0; i < size; i++) 
        a[i] = array[i]; 
      
 
    cout << "Введите новый элемент " << endl; 
    cin >> element; 
    
    //a[i] = element; 
 
    if (check1(element)==true) a[size++] = element;
    delete [] array;
    array = new int[size]; 
    for ( i = 0; i < size; i++) 
        array[i] = a[i]; 
}
Функция Check1:
C++
1
2
3
4
5
6
7
bool Set::check1(int x)
{
    bool b=false;
    for (int i = 0; i < size; i++) 
        if( array[i] != x) b=true; 
    return b;
}
Проблема в том,что при добавлении элемента, например - 3, выводится: array[i]={ 1 2 3 3 }
Но при добавлении 4: array[i] = {1 2 3 4}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2012, 14:41     Отладка
Посмотрите здесь:

Отладка C++
C++ Отладка :)
Отладка C++
деббагинг и отладка c++ C++
C++ Ms visual C++ отладка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
25.11.2012, 17:14     Отладка #2
вот реализация самого простого (лобового) алгоритма:
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
typedef unsigned int uint;
 
int main() {
  // размер массива
  uint array_size = 10;
 
  // динамическое выделение памяти
  int *arr = new int[array_size];
 
  // временный счетчик
  uint counter = 0;
 
  // цикл ввода данных в массив
  // проверка на выход за границы массива
  while(counter < array_size){
    // вводим элемент
    cout << "Enter element [" << counter << "]: ";
    cin >> arr[counter];
    // проверяем, если это первый введенный элемент
    // то просто увеличиваем счетчик
    if(counter == 0)
      ++counter;
 
    // если не первый элемент в массиве
    else {
      // переменная для проверки на существующий элемент в массиве
      bool bCheck = false;
 
      // проверяем данные, на совпадение в массиве (перебор всех введенных элементов)
      for(uint i = 0; i < counter; ++i){
        // сравниваем значения элементов с текущим (counter),
        // начиная с первого (0) элемента (i) в массиве
        if(arr[i] == arr[counter]){
          // если такие данные уже были введены в массив, 
          // устанавливаем флаг проверки на истину и прерываем проверку
          bCheck = true;
          break;
        }
      }
      // если проверочное условие ложное, значит введенные данные
      // не встречаются в массиве, увеличиваем счетчик на 1
      // и продолжаем вводить данные
      if(!bCheck) {
        ++counter;
      }
      // если же введенные данные уже были в массиве (bCheck == true)
      // то вводим данных в тот же самый элемент массива
    }
  }
 
  
  // вывод всех элеметов
  for(uint i = 0; i < array_size; ++i){
    cout << arr[i] << endl;
  }
  
  delete [] arr;
 
    return 0;
}
если что не понятно - спрашивайте. Разобравшись в коде, адаптировать этот пример для метода Add вашего класса, я думаю у вас не составит труда.

Добавлено через 16 минут
вообще, то что у вас написано в методах Add и check - какой-то непонятный бред, напишите лучше задание или что за класс хоть, что он должен делать...
Triathlet
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 67
25.11.2012, 18:20  [ТС]     Отладка #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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
//Set.cpp
#include <iostream>
#include "Set.h"
using namespace std;
 
ostream& operator << (ostream& stream, Set &c)
{
    c.Show();
    return stream;
}
 
istream& operator >> (istream& stream, Set &c)
{
    c.Enter();
    return stream;
}
 
void Set::Enter() 
{ 
    
    cout << "Введите размер множества (натуральное число, size > 0): "; 
    cin >> size;  
    array = new int[size];
    for (int i = 0; i < size; i++) 
    { 
        cout << "Ввод элемента [" << i + 1 << "] : "; 
        cin >> array[i];
    }
    
} 
 
void Set::Show() 
{ 
    for ( int i = 0; i < size; i++) 
        cout << array[i] << " ";
}  
 
void Set::Union(Set a, Set b) 
{ 
    this->size = a.size + b.size;  
    this->array = new int[size];
    int i, j, count = 0; 
    int n = a.size; 
    
    for ( i = 0; i < a.size; i++) 
        array[i] = a.array[i]; 
 
    for ( i = 0; i < b.size; i++) 
    { 
        for ( j = 0; j < a.size; j++) 
            if(b.array[i] == a.array[j]) 
                continue;//пропускаем равные элементы 
            else 
                count++;
        if(count == a.size) 
            array[n++] = b.array[i];  
        count = 0;
    } 
    size = n;
} 
 
void Set::intersection(Set a, Set b) 
{  
    size = a.size + b.size; 
    array = new int[size]; 
    int i, j, n = 0; 
 
    for ( i = 0; i < a.size; i++) 
        for ( j = 0; j < b.size; j++) 
        { 
            if(a.array[i] == b.array[j]) 
            {
                array[n++] = a.array[i]; 
                continue;
            } 
        } 
        size = n;
} 
 
void Set::add() 
{ 
    int a[100];  
    int i;  
    int element;
    for ( i = 0; i < size; i++) 
        a[i] = array[i]; 
      
 
    cout << "Введите новый элемент " << endl; 
    cin >> element; 
    
    //a[i] = element; 
 
    if (check1(element)==true) a[size++] = element;
    delete [] array;
    array = new int[size]; 
    for ( i = 0; i < size; i++) 
        array[i] = a[i]; 
} 
 
void Set::extract() 
{ 
    int number, n, i, j; 
    n = size;
    cout << "Введите номер элемента от 1 до " << size << endl; 
    cin >> number;
    number--;
 
    if( number < 0 || number > size) 
        cout << "Ошибка " << endl; 
    else 
    { 
        for ( i = 0; i < n; i++) 
        { 
            if( i == number) 
            { 
                for ( j = i; j < n - 1; j++) 
                    array[j] = array[j+1];  
                n--;
            } 
             
        } 
        size--; 
    }  
} 
 
void Set::check() 
{  
    int element; 
    cout << "Введите элемент для проверки " << endl; 
    cin >> element; 
    int i, count = 0;
    for ( i = 0; i < size; i++) 
        if( array[i] == element) 
            cout << "Да такой элемент найден " << endl; 
        else  
            count++; 
    if(count == size) 
        cout << "Элемент не найден " << endl;
}
 
bool Set::check1(int x)
{
    bool b=false;
    for (int i = 0; i < size; i++) 
        if( array[i] != x) b=true; 
    return b;
}
 
void Set::operator = (Set a) 
{ 
    int i;
    this->size = a.size; 
    delete[] this->array;
    this->array = new int[size]; 
    for ( i = 0; i < size; i++) 
        array[i] = a.array[i];
 
} 
 
int Set::operator[](int i) 
{ 
    return array[i];
}
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
//Set.h
#include <iostream>
using namespace std;
 
class Set 
{ 
    friend istream& operator>>(istream & stream, Set & с);
    friend ostream& operator<<(ostream & stream, Set & с);
private: 
    int size; 
    int* array;
    int cnt;
public: 
    Set() { cnt = 0; size = 0; array = new int[size]; } // конструктор
 
    Set(int s) {  size = s; array = new int[size]; // конструктор с аргументами
                  for (int i = 0; i < size; i++) 
                      array[i] = 0;  }
                 
    Set(const Set &ob) // конструктор копии
    {   size = ob.size;  
        array = new  int[size]; 
        for ( int i = 0; i < size; i++) 
              array[i] = ob.array[i]; } 
 
    ~Set() { delete [] array; }  // деструктор
    void Enter(); // ввод
    void Show(); // вывод
    void Union(Set, Set); // объединение
    void intersection(Set, Set); // пересечение
    void add(); // добавка элемента
    void extract(); // извлечение
    void check(); // проверка
    void operator = (Set); // перегрузки
    int operator [] (int i); 
    bool check1(int x);
    Set *Set :: operator -> ()
    { return this; }
    Set Set :: operator()(int a, int b, int c)
    {
        if (a < 0 || a > size) //проверка на выход за границы диапозона
        {
            cout << "Ошибка! "<< a << " выходит за границы диапозона!" << endl;
            return *this;
        }
        if (b < 0 || b > size) //проверка на выход за границы диапозона
        {
            cout << "Ошибка! "<< b << " выходит за границы диапозона!" << endl;
            return *this;
        }
        if ( a > b)
        {
            cout<< "Вы ввели нелогичные данные: а > b!!! "<< endl;
            return *this;
        }
        for (int i = a-1; i < b;i++)
            array[i] = c;
        return *this;
    }
    };
Добавлено через 2 минуты
Я понял, спасибо.

Добавлено через 4 минуты
А почему вы делаете префиксное увеличение счетчика counter, а не постфиксное?
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
25.11.2012, 19:24     Отладка #4
А почему вы делаете префиксное увеличение счетчика counter, а не постфиксное?
в данном случае разницы особой нет, а может и вовсе нет
позже подробно опишу почему

https://www.google.com.ua/search?q=%...BD%D1%82%D0%B0
Triathlet
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 67
26.11.2012, 00:11  [ТС]     Отладка #5
тогда можно везде заменить на постфиксное увеличение?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
26.11.2012, 00:17     Отладка #6
Цитата Сообщение от Triathlet Посмотреть сообщение
тогда можно везде заменить на постфиксное увеличение?
Как мне кажется, компилятор сам замет постфиксный оператор на префиксный, если операция находится вне выражения.
А вообще использование того или иного оператора - сугубо Ваше дело и зависит от того, чего Вы хотите добиться этой операцией.
Triathlet
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 67
26.11.2012, 01:03  [ТС]     Отладка #7
просто как-то непривычно,всегда использовал постфиксный.
заменил,все работает,спасибо еще раз.
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
26.11.2012, 16:24     Отладка #8
Цитата Сообщение от ps10n1ck Посмотреть сообщение
в данном случае разницы особой нет, а может и вовсе нет
позже подробно опишу почему
Как уже писалось выше, компиляторы с возможностью оптимизации кода, могут заменять подобные постфиксные операции на префиксные если данная операция не находится в выражении (к примеру такие замены выполняются в простых приращениях счетчиков).

Чем отличается постфиксная операция от префиксной:
- в префиксной операции, сперва происходит увеличение/уменьшение на 1, а потом выполняется действие(операция), в постфиксной - сперва действие, а потом увеличение/уменьшение на 1
к примеру:
C++
1
2
3
4
5
6
int a = 5;
int b = 5;
int c = 0;
 
c = ++a; // тут с = 6
c = b++; //тут с = 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
#include <iostream>
 
using std::cout;
using std::cin;
using std::endl;
 
class Integer {
  int a;
 
public:
  Integer(int data);
  ~Integer();
  void ShowData();
 
  int operator++(); // префиксная операция
  int operator++(int tmp); // постфиксная операция
};
 
// Конструктор
Integer::Integer(int data){
  a = data;
}
 
// Деструктор
Integer::~Integer(){
}
 
// префиксная операция
int Integer::operator++(){
    a += 1;
  return a;
}
 
// постфиксная операция
int Integer::operator++(int tmp){
  tmp = a; // сперва копируем значение во временную переменную
  a += 1;  // потом увеличиваем на еденицу
  return tmp; // возвращаем значение временной переменной
}
 
// вывод значения A
void Integer::ShowData(){
  cout << "Element A = " << a << endl;
}
 
int main(){
  
  Integer IntDataA(5);
  Integer IntDataB(5);
  cout << "IntDataA: ";
  IntDataA.ShowData();
  cout << "IntDataB: ";
  IntDataB.ShowData();
 
  int a_test = ++IntDataA; // префиксная операция
  int b_test = IntDataB++; // постфиксная операция
 
  cout << "a_test: " << a_test << endl; // результат префиксной операции
  cout << "b_test: " << b_test << endl; // результат постфиксной операция
 
  cout << "IntDataA: ";
  IntDataA.ShowData();
  cout << "IntDataB: ";
  IntDataB.ShowData();
 
  return 0;
}
результат программы:
[img]http://s45.***********/i107/1211/b3/23cb15eed58ft.jpg[/img]
Triathlet
0 / 0 / 0
Регистрация: 17.09.2012
Сообщений: 67
26.11.2012, 18:33  [ТС]     Отладка #9
Я это понимаю. Непривычно было видеть в циклах префиксное вместо постфиксного увеличение, но раз компилятор сам заменяет. И все таки: почему вы не воспользовались постфиксным увеличением в ситуациях без операторов?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2012, 19:30     Отладка
Еще ссылки по теме:

Отладка C++
C++ Отладка
C++ Отладка

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

Или воспользуйтесь поиском по форуму:
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
26.11.2012, 19:30     Отладка #10
Цитата Сообщение от Triathlet Посмотреть сообщение
Я это понимаю. Непривычно было видеть в циклах префиксное вместо постфиксного увеличение, но раз компилятор сам заменяет. И все таки: почему вы не воспользовались постфиксным увеличением в ситуациях без операторов?
- дело привычки
- есть вариант, что не все компиляторы могут оптимизировать подобные выражения, а тогда смотрите пост выше, пункт 2 (про выделение доп. переменной)
Yandex
Объявления
26.11.2012, 19:30     Отладка
Ответ Создать тему
Опции темы

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