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

Найти минимальное число, встречающееся в заданном векторе более одного раза - C++

Восстановить пароль Регистрация
 
RavilSHai
0 / 0 / 0
Регистрация: 26.10.2012
Сообщений: 82
05.05.2013, 22:29     Найти минимальное число, встречающееся в заданном векторе более одного раза #1
Кто знает где можно прочитать может быть литературу или подобный пример посмотреть этой задачи
Найти минимальное число, встречающееся в заданном векторе более одного раза.
Решение задачи оформить в виде класса, снабженного соответствующими методами.
Массив размещать в динамической памяти.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.05.2013, 22:29     Найти минимальное число, встречающееся в заданном векторе более одного раза
Посмотрите здесь:

найти максим знаение, встречающееся более одного раза C++
Найти максимальное число, встречающееся в заданном массиве только два раза C++
Задан одномерный массив, содержащий n элементов. Найти максимальное из чисел, встречающееся в массиве более одного раза C++
Разработать функцию, определяющую максимальное число, встречающееся в массиве больше одного раза C++
C++ найти максимальное из чисел, встречающееся в заданном целочисленном массиве более одного раза
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
05.05.2013, 22:36     Найти минимальное число, встречающееся в заданном векторе более одного раза #2
это вам много читать))) хотя зависит от уровня подготовки, в вашей задаче смущает вот что...
вы пишите
встречающееся в заданном векторе
т.е. используем контейнер std::vector ? или делаем свой аналог std::vector?, но в первом случае фраза
Массив размещать в динамической памяти.
не имеет никакого смысла
а во втором - не понятно что имеется в виду под "вектор", ну если конечно не подразумевается std::allacator

так то задача элементарная
если говорить о vector<int> - обходим вектор итератором, например, можно индексом, не принципиально тут - и дальше два развития пришло на ум, либо считаем в ассоциативный контейнер map<число, кол-во вхождений> и потом выдаём первое из чисел, в котором количество вхождений >=2 либо юзаем std::sort над vector<int> и находим первое вхождение случая, когда два соседних числа равны и выдаём это число
RavilSHai
0 / 0 / 0
Регистрация: 26.10.2012
Сообщений: 82
05.05.2013, 22:59  [ТС]     Найти минимальное число, встречающееся в заданном векторе более одного раза #3
Цитата Сообщение от abit Посмотреть сообщение
это вам много читать))) хотя зависит от уровня подготовки, в вашей задаче смущает вот что...
вы пишите

т.е. используем контейнер std::vector ? или делаем свой аналог std::vector?, но в первом случае фраза

не имеет никакого смысла
а во втором - не понятно что имеется в виду под "вектор", ну если конечно не подразумевается std::allacator

так то задача элементарная
если говорить о vector<int> - обходим вектор итератором, например, можно индексом, не принципиально тут - и дальше два развития пришло на ум, либо считаем в ассоциативный контейнер map<число, кол-во вхождений> и потом выдаём первое из чисел, в котором количество вхождений >=2 либо юзаем std::sort над vector<int> и находим первое вхождение случая, когда два соседних числа равны и выдаём это число
смотри, я вот начал и не знаю как дальше продолжить(((
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
using namespace std;
 
class Vector
{
protected:
    double* vect;
    int count;
public:
    Vector() 
    {
        vect = new double[10];
        count = 10;
    };
    Vector (int l)
    {
        vect = new double[l];
        count = l;
    };
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
06.05.2013, 00:41     Найти минимальное число, встречающееся в заданном векторе более одного раза #4
Ну молодец. Отлично начал. Теперь нужны:
методы получения доступа к данным и методы назначения данных (геттеры и сеттеры);
конструктор копирования, оператор присваивания и деструктор.

Кстати, поля класса лучше в private убери. В protected им висеть не надо.

Не по теме:

Да что уж там, если вы предмет вертели, то вот почти готовое.

Кликните здесь для просмотра всего текста
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
#include <iostream>
 
class Vector {
 public:
  Vector() : count(10), vect(new int[count]) {}
  Vector(int count) : count(count), vect(new int[count]) {}
  // конструктор копирования
  Vector(const Vector &other) : count(other.getCount()), vect(new int[count]) {
      for (int i = 0; i < count; ++i) {
        vect[i] = other.get(i);
      }
  }
  // оператор присваивания
  Vector &operator=(const Vector &other) {
    if (this != &other) {
      delete [] vect;
      count = other.getCount();
      vect = new int[count];
      for (int i = 0; i < count; ++i) {
        vect[i] = other.get(i);
      }
    }
    return *this;
  }
  // деструктор
  virtual ~Vector() {
    delete [] vect;
  }
  // метод для получения данных
  int get(int position) const {
    return vect[position];
  }
  // метод для назначения данных
  void set(int position, int value) {
    vect[position] = value;
  }
  // метод для получения количества элементов
  int getCount() const {
    return count;
  }
  // а дальше уже упрощение жизни операторы,
  // чтобы можно было обращаться по индексу как к простому массиву
  // обычный
  int &operator[](int position) { return vect[position]; }
  // и константый (возвращающий не изменямое значение)
  const int &operator[](int position) const { return vect[position]; }
 private:
  int count;
  int *vect;
};
 
// с примитивной сортировкой вообще проблем не должно быть
void sort(Vector &v) {
  for (int i = 0; i < v.getCount() - 1; ++i) {
    for (int j = i + 1; j < v.getCount(); ++j) {
      if (v[i] > v[j]) {
        int t = v[i];
        v[i] = v[j];
        v[j] = t;
      }
    }
  }
}
 
// поиск позиции первого дубликата.
// цени, я даже функции говорящее имя выделил.
int getPositionOfFirstDuplicate(Vector &v) {
  for (int i = 0; i < v.getCount() - 1; ++i) {
    if (v[i] == v[i + 1]) {
      return i; // если нашлась позиция, возвращаем
    }
  }
  return -1; // не нашлась -- вернем  -1.
}
 
int main(int argc, char *argv[]) {
  Vector v(100);
 
  // в этом месте должен быть код, заполняющий
  // элементы вектора, но я его писать не хочу
  // пусть будет мусор в памяти
 
  sort(v);
 
  // вывод скорее для дебага, чем осмысленный
  for (int i = 0; i < v.getCount(); ++i) {
    std::cout << v.get(i) << std::endl;
    // а если с операторами, то можно красивее
    //std::cout << v[i] << std::endl;
  }
 
  // поиск позиции повторяющегося элемента
  int position = getPositionOfFirstDuplicate(v);
  // нашлось?
  if (position != -1) {
    // если нашлось
    std::cout << "Smallest found duplicate is " << v[position] << std::endl;
  } else {
    // если не нашлось
    std::cout << "No duplicates found." << std::endl;
  }
  
  return 0;
}

RavilSHai
0 / 0 / 0
Регистрация: 26.10.2012
Сообщений: 82
06.05.2013, 00:46  [ТС]     Найти минимальное число, встречающееся в заданном векторе более одного раза #5
Цитата Сообщение от lemegeton Посмотреть сообщение
Ну молодец. Отлично начал. Теперь нужны:
методы получения доступа к данным и методы назначения данных (геттеры и сеттеры);
конструктор копирования, оператор присваивания и деструктор.

Кстати, поля класса лучше в private убери. В protected им висеть не надо.

Не по теме:

Да что уж там, если вы предмет вертели, то вот почти готовое.

Кликните здесь для просмотра всего текста
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
#include <iostream>
 
class Vector {
 public:
  Vector() : count(10), vect(new int[count]) {}
  Vector(int count) : count(count), vect(new int[count]) {}
  // конструктор копирования
  Vector(const Vector &other) : count(other.getCount()), vect(new int[count]) {
      for (int i = 0; i < count; ++i) {
        vect[i] = other.get(i);
      }
  }
  // оператор присваивания
  Vector &operator=(const Vector &other) {
    if (this != &other) {
      delete [] vect;
      count = other.getCount();
      vect = new int[count];
      for (int i = 0; i < count; ++i) {
        vect[i] = other.get(i);
      }
    }
    return *this;
  }
  // деструктор
  virtual ~Vector() {
    delete [] vect;
  }
  // метод для получения данных
  int get(int position) const {
    return vect[position];
  }
  // метод для назначения данных
  void set(int position, int value) {
    vect[position] = value;
  }
  // метод для получения количества элементов
  int getCount() const {
    return count;
  }
  // а дальше уже упрощение жизни операторы,
  // чтобы можно было обращаться по индексу как к простому массиву
  // обычный
  int &operator[](int position) { return vect[position]; }
  // и константый (возвращающий не изменямое значение)
  const int &operator[](int position) const { return vect[position]; }
 private:
  int count;
  int *vect;
};
 
// с примитивной сортировкой вообще проблем не должно быть
void sort(Vector &v) {
  for (int i = 0; i < v.getCount() - 1; ++i) {
    for (int j = i + 1; j < v.getCount(); ++j) {
      if (v[i] > v[j]) {
        int t = v[i];
        v[i] = v[j];
        v[j] = t;
      }
    }
  }
}
 
// поиск позиции первого дубликата.
// цени, я даже функции говорящее имя выделил.
int getPositionOfFirstDuplicate(Vector &v) {
  for (int i = 0; i < v.getCount() - 1; ++i) {
    if (v[i] == v[i + 1]) {
      return i; // если нашлась позиция, возвращаем
    }
  }
  return -1; // не нашлась -- вернем  -1.
}
 
int main(int argc, char *argv[]) {
  Vector v(100);
 
  // в этом месте должен быть код, заполняющий
  // элементы вектора, но я его писать не хочу
  // пусть будет мусор в памяти
 
  sort(v);
 
  // вывод скорее для дебага, чем осмысленный
  for (int i = 0; i < v.getCount(); ++i) {
    std::cout << v.get(i) << std::endl;
    // а если с операторами, то можно красивее
    //std::cout << v[i] << std::endl;
  }
 
  // поиск позиции повторяющегося элемента
  int position = getPositionOfFirstDuplicate(v);
  // нашлось?
  if (position != -1) {
    // если нашлось
    std::cout << "Smallest found duplicate is " << v[position] << std::endl;
  } else {
    // если не нашлось
    std::cout << "No duplicates found." << std::endl;
  }
  
  return 0;
}

это условие подходит только для тех значений когда минимум идет например подряд 4 4 5 8, а если будет 4 5 4 8 то не прокатит((((
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
06.05.2013, 00:51     Найти минимальное число, встречающееся в заданном векторе более одного раза #6
Цитата Сообщение от RavilSHai Посмотреть сообщение
это условие подходит только для тех значений когда минимум идет например подряд 4 4 5 8, а если будет 4 5 4 8 то не прокатит((((
Вот для этого как раз массив сначала сортируется.
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
06.05.2013, 01:24     Найти минимальное число, встречающееся в заданном векторе более одного раза #7
RavilSHai,
сразу бы и начали со своего уровня)))
вот набросал вам решение в лоб, разбирайтесь
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
#include <iostream>
 
using namespace std;
 
class Vector
{
private:
    double* vect;
    size_t count;
public:
       
    Vector (size_t l = 10)
    {
        vect = new double[l];
        count = l;
    };
    
    ~Vector() {delete[] vect;};
    
    Vector(const Vector& obj) 
    { 
       this->count = obj.count;
       for (size_t i=0; i!=this->count; ++i)
          this->vect = obj.vect;
    };
    
    double get(size_t ind) {return vect[ind];};
    
    void set(size_t ind, double d) {vect[ind]=d;};
private:
    Vector Sort(Vector vec, size_t size)
    {
           for (size_t i=0; i!=size-1; ++i)
           {
             double min = this->get(i);
             for (size_t j=i+1; j!=size; ++j)
             {
                 if (get(i)>get(j))
                 {
                    double tmp = get(j);
                    set(j,get(i));
                    set(i,tmp);
                 }
             }
           }
       return vec;
    };
public:
     double* MyFunc(const Vector* vec)
     {
             size_t size = vec->count;
             Vector vec2;
             vec2 = Sort(*this, size);
             double* p(NULL);
             for (size_t i=0; i!=size-1; ++i) 
                  if (vec2.get(i)==vec2.get(i+1)) 
                      p=&(vec2.vect[i]);
             return p;
     }
};
 
int main()
{
    Vector myvec(4);
    myvec.set(0,5);
    myvec.set(1,2);
    myvec.set(2,3);
    myvec.set(3,3);
    double* test = myvec.MyFunc(&myvec);
    if (test!=NULL) cout<<*test; 
    else cout << "Not match";  
    system("pause");
    return 0;
}
там много чего ещё можно переделать, ибо не всё гладко, но для старта и изучения пойдёт
RavilSHai
0 / 0 / 0
Регистрация: 26.10.2012
Сообщений: 82
06.05.2013, 01:30  [ТС]     Найти минимальное число, встречающееся в заданном векторе более одного раза #8
Цитата Сообщение от abit Посмотреть сообщение
RavilSHai,
сразу бы и начали со своего уровня)))
вот набросал вам решение в лоб, разбирайтесь
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
#include <iostream>
 
using namespace std;
 
class Vector
{
private:
    double* vect;
    size_t count;
public:
       
    Vector (size_t l = 10)
    {
        vect = new double[l];
        count = l;
    };
    
    ~Vector() {delete[] vect;};
    
    Vector(const Vector& obj) 
    { 
       this->count = obj.count;
       for (size_t i=0; i!=this->count; ++i)
          this->vect = obj.vect;
    };
    
    double get(size_t ind) {return vect[ind];};
    
    void set(size_t ind, double d) {vect[ind]=d;};
private:
    Vector Sort(Vector vec, size_t size)
    {
           for (size_t i=0; i!=size-1; ++i)
           {
             double min = this->get(i);
             for (size_t j=i+1; j!=size; ++j)
             {
                 if (get(i)>get(j))
                 {
                    double tmp = get(j);
                    set(j,get(i));
                    set(i,tmp);
                 }
             }
           }
       return vec;
    };
public:
     double* MyFunc(const Vector* vec)
     {
             size_t size = vec->count;
             Vector vec2;
             vec2 = Sort(*this, size);
             double* p(NULL);
             for (size_t i=0; i!=size-1; ++i) 
                  if (vec2.get(i)==vec2.get(i+1)) 
                      p=&(vec2.vect[i]);
             return p;
     }
};
 
int main()
{
    Vector myvec(4);
    myvec.set(0,5);
    myvec.set(1,2);
    myvec.set(2,3);
    myvec.set(3,3);
    double* test = myvec.MyFunc(&myvec);
    if (test!=NULL) cout<<*test; 
    else cout << "Not match";  
    system("pause");
    return 0;
}
там много чего ещё можно переделать, ибо не всё гладко, но для старта и изучения пойдёт
а как тебе вот такое решение?)
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
#include <iostream>
 
using namespace std;
 
class Vector
{
protected:
    int* vect;
    int count;
public:
    Vector() 
    {
        vect = new int[10];
        count = 10;
    };
    Vector (int l)
    {
        vect = new int[l];
        count = l;
    };
    int getCount() { return count; }; 
    int min()
    {
        int min = INT_MAX;
        int tmp = INT_MAX;
        int i;
        for (i =0; i < count; i++)
            {
                if (vect[i]==tmp)
                {
                    min=tmp;
                }
                else if (vect[i] < tmp)
                    {
                        tmp= vect[i];
                    }
            }
        return min;
    };
    int& operator[](int i) { 
        return vect[i];
    };
    void operator()(int l) 
    { 
        int* tmp = new int[l]; 
        for (int i = 0; i < count && i < l; i++) tmp[i] = vect[i]; 
        delete vect; 
        vect = tmp; 
        for (int i = count; i < l; i++) vect[i] = 0; 
        count = l; 
    }
};
int main() 
{
    Vector a;
    int z;
    for (int i = 0; i < a.getCount(); i++) 
    { 
        a[i] = i/2;
    }
 
    cout << "Sozdannie vectora\na: ";
    for (int i = 0; i < a.getCount(); i++) cout << a[i] << " ";
    z=a.min();
    cout <<"z="<<z;
    getchar();
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2013, 01:44     Найти минимальное число, встречающееся в заданном векторе более одного раза
Еще ссылки по теме:

Найти максимальное число из, встречающихся в матрице более одного раза C++
C++ В двухмерном массиве найти строки, не содержащие нулей и максимальное число, встречающееся более одного раза
Найти минимальное число, встречающееся в заданном массиве только один раз C++

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

Или воспользуйтесь поиском по форуму:
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
06.05.2013, 01:44     Найти минимальное число, встречающееся в заданном векторе более одного раза #9
ну тут сходу бросается несколько недочётов
C++
1
2
3
4
5
6
7
8
9
10
Vector() 
    {
        vect = new int[10];
        count = 10;
    };
    Vector (int l)
    {
        vect = new int[l];
        count = l;
    };
не надо, то что я написал аналогично
C++
1
2
3
4
5
6
 
Vector (size_t l = 10)
    {
        vect = new double[l];
        count = l;
    };
где конструктор копирования? куда делся деструктор? - без первого вы не сможете передавать ваши объекты в функции, без второго - ваши программы неизбежно страдают утечками памяти

C++
1
for (i =0; i < count; i++)
тут наверное всё же
C++
1
for (i =0; i != count; i++)
по крайней мере теория так просит

далее, у вас нет проверки на вариант, что не встретилось ни одного совпадения чисел (у меня она есть)

ну а в остальном вроде нормальное решение

Добавлено через 3 минуты
хотя нет всё же, мне кажется вычислительная сложность большая
надо проверить...
Yandex
Объявления
06.05.2013, 01:44     Найти минимальное число, встречающееся в заданном векторе более одного раза
Ответ Создать тему
Опции темы

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