0 / 0 / 0
Регистрация: 14.03.2011
Сообщений: 6
1

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

11.05.2011, 09:40. Показов 6028. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Помогите пожалуйста! Лаба горит! Помогите создать манипулятор консольного ввода\вывода (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();
};
Я пробую пробую что то никак вообще
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.05.2011, 09:40
Ответы с готовыми решениями:

Создание манипулятора
Как создать манипулятор, преобразующий массив символов при выводе из потока в массив тех же символов, но уже верхнего регистра? Например ...

Использование манипулятора setprecision
Какой вариант более правильный. Вычислить значение выражения, включающего 5 членов: Y=(π+3)^2+(π+6)^3+(π+9)^4+... ...

Создание адресного манипулятора
Всем здравствуйте! Пишу уже не одни сутки манипулятор. Сегодня не могу избавиться от одной ошибки. Если кто посоветует чего, буду...

3
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
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. Заметим, что использовать в качестве аргумента шаблона знаковый тип нельзя — программа зациклится!
10
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();
};
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.06.2012, 16:41 4
Немного отвлечённый вопрос. За счёт чего в операторе

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

Добавлено через 1 минуту
А... кажись понял. Имеется оператор << с аргументом "std::ostream& (*)(std::ostream&)". И изнутри него уже вызовется наш манипулятор
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.06.2012, 16:41
Помогаю со студенческими работами здесь

Создание 3D модели манипулятора
Здравствуйте, столкнулся с задачей которую не понимаю как решить :wall: Есть 3х мерная модель манипулятора, каждое звено которого...

Создание графических изображений с помощью манипулятора мыши
Здравствуйте! У меня тема задания по Си такая: Создание графических изображений с помощью манипулятора мыши. Что можете посоветовать по...

Создание фототеки (внедрение объектов OLE)
Столкнулся со следующей проблемой: 1. В таблице создаю поле OLE 2. В форму задаю свойство 'Допустимый тип OLE': связанный но......

Как вернее?
Здравствуйте. Вопрос такой - как будет правильнее сделать ссылки с sitename1 В смысле, не окажется ли такая нагрузка ссылками...

Какой вариант вернее
INSERT INTO какой вариант вернее Procedure или cmd.CommandText=&quot;INSERT INTO ......... cmd.ExecuteNonQuery(); ...


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

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

Новые блоги и статьи
Java Micronaut в Docker: контейнеризация с Maven и Jib
Javaican 16.03.2025
Когда речь заходит о микросервисной архитектуре на Java, фреймворк Micronaut выделяется среди конкурентов. Он создан с учётом особенностей облачных сред и контейнеров, что делает его идеальным. . .
Управление зависимостями в Java: Сравнение Spring, Guice и Dagger 2
Javaican 16.03.2025
Инъекция зависимостей (Dependency Injection, DI) — один из фундаментальных паттернов проектирования, который радикально меняет подход к созданию гибких и тестируемых Java-приложений. Суть этого. . .
Apache Airflow для оркестрации и автоматизации рабочих процессов
Mr. Docker 16.03.2025
Управление сложными рабочими процессами — одна из главных головных болей инженеров данных и DevOps-специалистов. Представьте себе: каждый день нужно запускать десятки скриптов в определенной. . .
Оптимизация приложений Java для ARM
Javaican 16.03.2025
ARM-архитектура переживает настоящий бум популярности в технологическом мире. Когда-то воспринимаемая исключительно как решение для мобильных устройств и встраиваемых систем, сегодня она штурмует. . .
Управление состоянием в Vue 3 с Pinia и Composition API
Reangularity 16.03.2025
Когда я начал работать с Vue несколько лет назад, мне казалось достаточным использовать простую передачу данных через props и события между компонентами. Однако уже на среднем по сложности проекте. . .
Введение в DevSecOps: основные принципы и инструменты
Mr. Docker 16.03.2025
DevSecOps - это подход к разработке программного обеспечения, который объединяет в себе принципы разработки (Dev), безопасности (Sec) и эксплуатации (Ops). Суть подхода заключается в том, чтобы. . .
GitHub Actions vs Jenkins: Сравнение инструментов CI/CD
Mr. Docker 16.03.2025
В этой битве за эффективность и скорость выпуска программных продуктов ключевую роль играют специализированные инструменты. Два гиганта в этой области — GitHub Actions и Jenkins — предлагают разные. . .
Реактивное программировани­е с Kafka Stream и Spring WebFlux
Javaican 16.03.2025
Реактивное программирование – это программная парадигма, ориентированная на потоки данных и распространение изменений. Она позволяет выражать статические или динамические потоки данных и. . .
Простая нейросеть на КуМир: Учебное пособие по созданию и обучению нейронных сетей
EggHead 16.03.2025
Искусственные нейронные сети — удивительная технология, позволяющая компьютерам имитировать работу человеческого мозга. Если вы хотя бы немного интересуетесь современными технологиями, то наверняка. . .
Исполнитель Кузнечик в КуМир: Решение задач
EggHead 16.03.2025
Среди множества исполнителей в системе КуМир особое место занимает Кузнечик — простой, но невероятно полезный виртуальный персонаж, который перемещается по числовой прямой, выполняя ваши команды. На. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru