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

Создание (вернее, внедрение) манипулятора - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.71
Richie Hawtin
0 / 0 / 0
Регистрация: 14.03.2011
Сообщений: 6
11.05.2011, 09:40     Создание (вернее, внедрение) манипулятора #1
Здравствуйте! Помогите пожалуйста! Лаба горит! Помогите создать манипулятор консольного ввода\вывода (insetup\outsetup). Внедрить его надо в этот код
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
#include <iostream>
#include <conio.h>
#include <locale>
 
using namespace std;
 
class Mas
{
unsigned int n, *V;
public:
        Mas(unsigned int m)
        {n=m;V=new unsigned int[n];}
        //динамическое присвоение;
    Mas(const Mas&); 
 
        //поелементное сложение и вычитание;
        Mas slozhenie(Mas);
        Mas vichitanie(Mas);
 
        //обьединение 2х массивов в 1 (конкатенация);
        Mas concat(Mas);
 
        //упорядочение массива по возрастанию и убыванию;
    void sort(bool);
 
        //консольный ввод и вывод массива.
        void vvod();
        void vivod();
};
 
 
Mas::Mas(const Mas &M)
{
n=M.n;
V=new unsigned int[n];
for(int i=0;i<n;i++)
V[i]=M.V[i];
}; 
 
void Mas::vvod()
{
cout<<"Введите "<<n<<" положительных чисел\n";
for(int i=0;i<n;i++)
cin>>V[i];
}
 
 
 
void Mas::vivod()
{
        cout<<"\nMas= ";
        for( int i=0;i<n;i++)
                cout<<V[i]<<" ";
}
 
 
Mas Mas::slozhenie(Mas M)
{
if(n!=M.n)
{cout<<"Разная длинна!\n";
return (*this);}
Mas r(n);
for( int i=0;i<n;i++)
r.V[i]=V[i]+M.V[i];
return r;
};
 
Mas Mas::vichitanie(Mas M)
{
if(n!=M.n)
{cout<<"Разная длинна!\n"; 
return (*this);}
Mas r(n);
for( int i=0;i<n;i++)
r.V[i]=V[i]-M.V[i];
return r;
}
;
 
Mas Mas::concat(Mas M)
{
Mas r(n+M.n);
for( int i=0;i<n;i++)
r.V[i]=V[i];
for( int i=0;i<M.n;i++)
r.V[i+n]=M.V[i];
return r;
};
 
 
void Mas::sort(bool flag)
{
unsigned int t;
 
  for(int i=0;i<(n-1);i++)
          for(int j=0;j<(n-1);j++)      
                  if(((!flag)&&(V[j]>V[j+1]))||((flag)&&(V[j]<V[j+1])))                   
                  {
            t=V[j];
            V[j]=V[j+1];
            V[j+1]=t;
            }
}
 
 
int main (){
        setlocale(LC_ALL,"Russian");
        Mas M1(5), M2(5), M3(5), M4(5), M5(10);
        M1.vvod();
        M1.vivod();
        M2=M1;
        M2.vivod();
        M3=M1.slozhenie(M2);
        M3.vivod();
        M4=M1.vichitanie(M2);
        M4.vivod();
        M5=M1.concat(M2);
        M5.vivod();
        M5.sort(0);
        M5.vivod();
        M5.sort(1);
        M5.vivod();
        getch();
};
Я пробую пробую что то никак вообще
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2011, 09:40     Создание (вернее, внедрение) манипулятора
Посмотрите здесь:

C++ div и mod, вернее их аналоги в C++ не подходят для вещественных чисел
программа принемает строку, находит самую часто всречающуюся букву, и выводит слова в которых НЕТУ этой буквы. вернее она должна это делать. C++
Внедрение кнопки в тулбар C++
У меня есть курсач с готовой программой, вернее её кодом. смог бы кто саму программу сделать? C++
Внедрение в процесс C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
11.05.2011, 10:25     Создание (вернее, внедрение) манипулятора #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Почитай вот это, может поможет:

Написание собственных манипуляторов
Иногда требуется нестандартный манипулятор. Программирование манипуляторов без аргументов не представляет особой сложности. Для этого надо просто написать функцию, которая получает и возвращает ссылку на поток. Например, пусть нам нужен манипулятор, вставляющий в поток символ табуляции (листинг 14.11).
C++
1
2
3
Листинг 14.11. Манипулятор без аргументов
std::ostream& tab(std::ostream& os)
{    return (os << '\t');  }
Использовать такой манипулятор так же просто, как и стандартный:
C++
1
cout << 12 << tab << 25 << endl;
Обычно манипуляторы без аргументов пишутся для объединения свойств нескольких стандартных манипуляторов. Например, ранее мы рассматривали следующий оператор вывода:
C++
1
cout << setfill('~') << setw(10) << hex << internal << val << endl;
Этот оператор можно записать значительно короче, если объединить все использованные в нем манипуляторы в одной функции (листинг 14.12).
C++
1
2
3
4
5
6
7
Листинг 14.12. «Объединяющий» манипулятор
ostream& setfix(ostream& os)
{    os.width(10); os.fill('~');
    os.setf(ios::internal, ios::adjustfield);
    os.setf(ios::hex, ios::basefield);
    return os;  
}
В результате вывод в cout той же переменной val в том же формате записывается значительно короче:
C++
1
cout << setfix << val << endl;
Написать манипулятор с аргументами несколько сложнее. Собственно, для создания манипулятора, совместимого по интерфейсу со стандартными манипуляторами, нужно разобраться в стандартном механизме реализации. Однако вместо этого можно просто написать некоторый класс, для которого, как обычно, определить функцию operator<<. Джерри Шварц назвал такие классы эффекторами (см. также [12]). Например, пусть нам требуется выводить целые значения в двоичном виде. Напишем класс binary (листинг 14.13).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Листинг 14.13. «Манипулятор» для двоичного вывода
class binary
{ unsigned long k;
  public:
    binary(unsigned long k): k(k) {}
    friend ostream& operator<<(ostream& os, const binary& t);
};
inline ostream& operator<<(ostream& os, const binary& t)
{ const unsigned long MAX = numeric_limits<unsigned long>::max();
  unsigned long bit = ~(MAX >> 1);                    // старший бит
  while(bit) { os << (t.k & bit?'1':'0'); bit >>= 1; }
  return os;
}
В функции operator<< самыми важными являются две строки:
C++
1
2
const unsigned long MAX = numeric_limits<unsigned long>::max();
unsigned long bit = ~(MAX >> 1);                    // старший бит
В первой строке в переменную MAX заносится максимально возможное беззнаковое целое число, определенное в стандартном классе числовых пределов numeric_limits.

ПРИМЕЧАНИЕ
Класс-шаблон numeric_limits<> определен в заголовоке <limits>.

В двоичной записи это максимальное число представляет собой набор единичных битов:
1111...111
Во второй строке все биты числа сдвигаются вправо на один разряд; самый правый бит (младший разряд числа) теряется; в самый левый бит (старший разряд числа) заносится ноль, так как тип — беззнаковый. Таким образом, в результате сдвига образуется такая конфигурация битов:
0111...111
Потом эта конфигурация инвертируется операцией ~ и превращается в
1000...000
Это значение и заносится в переменную bit. Далее старшая единичка в цикле сдвигается на 1 разряд, пока значение bit не станет равно 0.
Такой класс позволяет нам выводить любые целые в двоичном виде, например:
C++
1
2
short a = -2;
cout << binary(a) << endl;
Однако этот класс выводит в выходной поток всегда такое количество битом, которое содержится в типе unsigned long. Мы легко можем преобразовать этот класс в шаблон, который позволит выводить для беззнаковых целых нужное количество битов (листинг 14.14).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Листинг 14.14. Эффектор-шаблон
// опережающие объявления
template <class T> class binary;
template<class T> ostream& operator<<(ostream& os, const binary<T>& t);
// класс-шаблон
template <class T>
class binary
{ T k;
  public:
    binary(T k): k(k) {}
    friend ostream& operator<< <>(ostream& os, const binary<T>& t);
};
template<class T>
inline
ostream& operator<<(ostream& os, const binary<T>& t)
{ T MAX = numeric_limits<T>::max();
  T bit = ~(MAX >> 1);
  while(bit)
  { os << (t.k & bit?'1':'0'); bit >>= 1; }
  return os;
}
Обратите внимание на опережающие объявления и прототип функции-шаблона operator<< в классе binary.
Использовать данный класс-шаблон в качестве манипулятора можно так:
C++
1
2
3
short a = -2;
cout << binary<unsigned short>(a) << endl;
cout << binary<unsigned char>(128)<< endl;
В результате на экран выводится следующее:
1111111111111110
10000000
Как видим, на экране ровно столько битов, сколько занимают типы unsigned short и unsigned char. Заметим, что использовать в качестве аргумента шаблона знаковый тип нельзя — программа зациклится!
Richie Hawtin
0 / 0 / 0
Регистрация: 14.03.2011
Сообщений: 6
11.05.2011, 10:39  [ТС]     Создание (вернее, внедрение) манипулятора #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
#include<iostream>
#include<iomanip>
#include<conio.h>
using namespace std;
class Mas{
unsigned int n, *V;
public:
    Mas(unsigned int m){n=m;V=new unsigned int[n];}
    //динамічного присвоєння;
    Mas(const Mas&); 
    //поелементного складання та віднімання;
    Mas dodavannya(Mas);
    Mas vidnimannya(Mas);
    //об’єднання двох масивів у один (конкатенація);
    Mas concat(Mas);
    //упорядкування масиву по збільшенню та по зменшенню;
    void sort(bool);
    //консольне введення та виведення масиву.
    void vvod();
    void vivod();
    friend istream& operator>>(istream&,Mas&);
    friend ostream& operator<<(ostream&,Mas);};
istream& insetup(istream&  stream){
cin>>hex;
return stream;} 
ostream& outsetup(ostream&  stream){
cout<<setw(5)<<setfill('.');
return stream;} 
Mas::Mas(const Mas &M){
n=M.n;
V=new unsigned int[n];
for(int i=0;i<n;i++)V[i]=M.V[i];}; 
void Mas::vvod(){
cout<<"Vvedite "<<n<<" pologitelnih chisel\n";
for(int i=0;i<n;i++)cin>>V[i];}
istream& operator>>(istream& stream,Mas& m){
//cout<<"Vvedite "<<n<<" pologitelnih chisel\n";
for(int i=0;i<m.n;i++)cin>>insetup>>m.V[i];
return stream;}
void Mas::vivod(){
    cout<<"\nMas= ";
    for( int i=0;i<n;i++)cout<<V[i]<<" ";}
ostream& operator<<(ostream& stream,Mas m){
//cout<<"Vvedite "<<n<<" pologitelnih chisel\n";
for(int i=0;i<m.n;i++)cout<<outsetup<<m.V[i]<<" ";
cout<<endl;
return stream;}
Mas Mas::dodavannya(Mas M){
if(n!=M.n) {cout<<"Raznaja dlina\n"; return (*this);}
Mas r(n);
for( int i=0;i<n;i++)r.V[i]=V[i]+M.V[i];
return r;};
Mas Mas::vidnimannya(Mas M){
if(n!=M.n) {cout<<"Raznaja dlina\n"; return (*this);}
Mas r(n);
for( int i=0;i<n;i++)r.V[i]=V[i]-M.V[i];
return r;};
 
Mas Mas::concat(Mas M){
Mas r(n+M.n);
for( int i=0;i<n;i++)r.V[i]=V[i];
for( int i=0;i<M.n;i++)r.V[i+n]=M.V[i];
return r;};
void Mas::sort(bool flag){
unsigned int t;
  for(int i=0;i<(n-1);i++)
      for(int j=0;j<(n-1);j++)  
          if
          (
              ((!flag)&&(V[j]>V[j+1]))
              ||
              ((flag)&&(V[j]<V[j+1]))
              )
                  
          {
            t=V[j];
            V[j]=V[j+1];
            V[j+1]=t;
            }
};
int main (){
    Mas M1(5), M2(5), M3(5), M4(5), M5(10);
    cout<<"Vvedite 5 pologitelnih chisel\n";
    //M1.vvod();
    //M1.vivod();
    cin>>M1;
    cout<<M1;
    M2=M1;
    M2.vivod();
    M3=M1.dodavannya(M2);
    M3.vivod();
    M4=M1.vidnimannya(M2);
    M4.vivod();
    M5=M1.concat(M2);
    M5.vivod();
    M5.sort(0);
    M5.vivod();
    M5.sort(1);
    M5.vivod();
    getch();
};
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
24.06.2012, 16:41     Создание (вернее, внедрение) манипулятора #4
Немного отвлечённый вопрос. За счёт чего в операторе

C++
1
cout << 12 << tab << 25 << endl;
"tab" будет вызван? Ведь номинально тут имеет место быть оператор << с аргументом типа "указатель на функцию"

Добавлено через 1 минуту
А... кажись понял. Имеется оператор << с аргументом "std::ostream& (*)(std::ostream&)". И изнутри него уже вызовется наш манипулятор
Yandex
Объявления
24.06.2012, 16:41     Создание (вернее, внедрение) манипулятора
Ответ Создать тему
Опции темы

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