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

Шаблоны классов и функций - C++

Восстановить пароль Регистрация
 
iKarma
9 / 9 / 0
Регистрация: 17.10.2011
Сообщений: 114
11.12.2011, 21:02     Шаблоны классов и функций #1
Всем доброго времени суток =) Мне нужно создать класс для работы с целыми числами. Используя шаблоны, выполнить тоже задание для вещественных чисел. А само задание звучит так: если в последовательности N целых чисел есть хотя бы один член меньше 10, то все отрицательные числа заменить их квадратами, а в противном случае - домножить все члены на 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
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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
 
using namespace std;
 
template <class AgrType>
class Numbers {
private:
   AgrType *Source; //Исходный массив
   AgrType *Final; //Массив дополнений
   int Size; //Размерность массивов
public:
   Numbers(int N); //Конструктор
   ~Numbers(); //Деструктор
   void NumberAdd(AgrType elem, int index); //Функция добавления элементов
   AgrType Min() const; //Функция поиска минимального элемента
   void Change(); //Функция замены отрицательных чисел на их квадраты
   void Multiply(); //Функция умножения всех членов на 2*
   void MethodChoice(); //Функция выбора метода обработки
   void Print() const; //Функция вывода на экран
};
 
template <class AgrType>
Numbers <AgrType> :: Numbers(int N)
{
   Size = N;
   Source = new AgrType[N];
   if (Source == NULL)
   {
        cout << "ERROR!\n" ;
        cout << "Press Anykey to Exit" ;
        getch();
        exit(1);
   };
   Final = new AgrType[N];
   if (Final == NULL)
   {
        cout << "ERROR!\n" ;
        cout << "Press Anykey to Exit" ;
        getch();
        exit(1);
   };
}
 
template <class AgrType>
Numbers <AgrType> :: ~Numbers()
{
    delete[] Source;
    delete[] Final;
};
 
template <class AgrType>
void Numbers <AgrType> :: NumberAdd(AgrType elem, int index)
{
   Source[index] = elem;
};
 
template <class AgrType>
AgrType Numbers <AgrType> :: Min() const
{
    AgrType min = 0;
    int imin = 0;
    min = Source[0];
    for (int i = 0; i < Size; i++) {
        if (Source[i] < min) {
            min = Source[i];
            imin = i;
        }
    }
    return min;
};
 
template <class AgrType>
void Numbers <AgrType> :: Change()
{
    for (int i = 0; i < Size; i++)
    {
        if (Source[i] < 0) 
            Final[i] = Source[i] * Source[i];
    };
}
 
template <class AgrType>
void Numbers <AgrType> :: Multiply()
{
    for (int i = 0; i < Size; i++)
    {
        Final[i] = Source[i] * 2;
    };
}
 
template <class AgrType>
void Numbers <AgrType> :: MethodChoice()
{
    AgrType min;
    min = Min();;
    if (min < 10)
        Change();
    else 
        Multiply();
}
 
template <class AgrType>
void Numbers <AgrType> :: Print() const
{
   cout << "Source:\n";
   for (int i = 0; i < Size; i++)
      cout << Source[i] << " ";
   cout << "\nFinal:\n";
   for (int i = 0; i < Size; i++)
      cout << Final[i] << " ";
};
 
void main()
{
   int n, i_elem;
   float f_elem;
   char choice;
 
   cout << "Do u wanna work with Integer (I) or Float (F) numbers? ";
   cin >> choice;
 
   switch (choice)
   {
      case 'I':
      case 'i':
      {
          cout << "Array of Integer:\n" ;
          cout << "Input dimension of array: " ;
          cin >> n ;
          Numbers <int> intN(n);
          for (int i = 0; i < n; i++)
          {
              cout << "[" << i+1 << "]=";
              cin >> i_elem ;
              intN.NumberAdd(i_elem, i);
          };
          intN.MethodChoice();
          intN.Print();
          break;
      };
      case 'F':
      case 'f':
      {
          cout << "Array of Float\n" ;
          cout << "Input dimension of array: " ;
          cin >> n ;
          Numbers <float> flN(n);
          for (int i = 0; i < n; i++)
          {
              cout << "[" << i+1 << "]=" ;
              cin >> f_elem ;
              flN.NumberAdd(f_elem, i);
          };
          flN.MethodChoice();
          flN.Print();
          break;
      };
   };
 
   cout << "\nPress Anykey to Exit" ;
   getch();
};
Вроде всё правильно с шаблонами реализовал, но почему-то не работает обработка, как мне кажется функция void MethodChoice(); не работает, здесь ли ошибка?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2011, 21:02     Шаблоны классов и функций
Посмотрите здесь:

Шаблоны классов C++
Шаблоны классов и функций C++
Шаблоны функций и классов C++
шаблоны классов C++
Шаблоны классов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
11.12.2011, 21:39     Шаблоны классов и функций #2
по-русски можешь объяснить, что именно у тебя не работает?
iKarma
9 / 9 / 0
Регистрация: 17.10.2011
Сообщений: 114
11.12.2011, 22:06  [ТС]     Шаблоны классов и функций #3
прога не считает просто, то есть вместо ответа показываются просто начальные значения переменных, мне кажется, что в void MethodChoice() что-то не так
Bers
Заблокирован
11.12.2011, 22:25     Шаблоны классов и функций #4
попробуй вот так:


C++
1
2
3
4
5
6
7
8
template <class AgrType>
void Numbers<AgrType>::MethodChoice()
{
    AgrType min;
    min = Min();;
    if (min < 10) { Change(); }
    /*else*/  {  Multiply(); }
}
Добавлено через 4 минуты
И кстати, твой код согласно заданию решает совсем другую задачу
iKarma
9 / 9 / 0
Регистрация: 17.10.2011
Сообщений: 114
11.12.2011, 23:07  [ТС]     Шаблоны классов и функций #5
Bers, да, поправил, спасибо Вам огромное. И да, действительно, у меня выходит так, что всегда программа умножает введённые числа на 2, я что-то в условии напутал?
Bers
Заблокирован
11.12.2011, 23:17     Шаблоны классов и функций #6
Цитата Сообщение от iKarma Посмотреть сообщение
я что-то в условии напутал?
А ты сам как думаешь?
Если у тебя программа делает не то, что нужно, наверное, ты что-то напутал. Ага. Ваш К.О.
iKarma
9 / 9 / 0
Регистрация: 17.10.2011
Сообщений: 114
11.12.2011, 23:31  [ТС]     Шаблоны классов и функций #7
))) просто я вот сейчас на условие смотрю, и вроде всё как надо написано...
Bers
Заблокирован
11.12.2011, 23:55     Шаблоны классов и функций #8
Цитата Сообщение от iKarma Посмотреть сообщение
))) просто я вот сейчас на условие смотрю, и вроде всё как надо написано...
Забудь про такие слова, как "кажется", "вроде бы", и прочие. Это все - слова паразиты.

Компьютерной программе, в отличие от человека никогда ничего не кажется.
Она работает согласно четкой логике алгоритма.

Если она делает не то, что от неё ожидается, значит в самом алгоритме была допущена логическая ошибка.

Многие начинающие программисты говорят такую фразу: "у меня что-то не работает". Это означает, что они сами не понимают, как работает их код.
То есть, они что-то пишут, а что пишут - сами не знают.
Это называется "быдлокодерство" - написание кода без понимания того, что этот код делает.

Как программист, ты должен знать точно, что именно делает твой код.
Твоя задача сейчас - научится понимать, что делает твой код.
Все дело в том, что все программисты всегда ошибаются. В том числе, допускают ошибки в логике. В этом случае, программист должен уметь относительно быстро найти логическую ошибку.

Что бы найти ошибки в собственной логике, нужно освоить техники отладки программы.

Самый простой способ понять, что делает код - пошаговая отладка.
Ставь везде брейкпоинты, и смотри что происходит в твоём алгоритме. Твоя задача - найти то место в исходном коде, где программа начинает делать не то, что тебе нужно.
После чего, все что останется - это понять, почему она делает не то что нужно. Понять свою ошибку. Только потом, ты сможешь эту ошибку исправить.

Если не умеешь выполнять пошаговую отладку - использую логи.

В самом простом варианте, ведение логов осуществляется таким образом: каждая твоя функция начинается с записи типа cout<< "ИмяФункции: запустилась\n";
И соответственно заканчивается: cout<< "ИмяФункции: завершилась\n";
Соответственно в самом теле функции все управляющие переменные так же должны быть отображены, и все ветвления.

Потом ты просто читаешь логи отработавшей программы, и по сообщениям, которые высвечивают логи, глазками увидишь то место, где программа начала делать не то, что от неё ожидается.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2011, 12:05     Шаблоны классов и функций
Еще ссылки по теме:

Шаблоны классов C++
C++ Шаблоны функций и классов
Шаблоны классов C++

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

Или воспользуйтесь поиском по форуму:
iKarma
9 / 9 / 0
Регистрация: 17.10.2011
Сообщений: 114
12.12.2011, 12:05  [ТС]     Шаблоны классов и функций #9
Bers, , благодарствую, доделал вот так вот:
C++
1
2
3
4
5
6
7
8
template <class AgrType>
void Numbers <AgrType> :: Change()
{
    for (int i = 0; i < Size; i++)
    {
        (Source[i] < 0) ? (Final[i] = Source[i] * Source[i]) : (Final[i] = Source[i]); 
    };
}
и
C++
1
2
3
4
5
6
template <class AgrType>
void Numbers <AgrType> :: MethodChoice()
{
    AgrType min = Min();
    (min < 10) ? (Change()) : (Multiply()); 
}
Ошибка была в функции по замене отрицательных чисел их квадратами.
Yandex
Объявления
12.12.2011, 12:05     Шаблоны классов и функций
Ответ Создать тему
Опции темы

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