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

Как удалить первый элемент из std::list? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Дан одномерный массив A[N]. Найти max(a2,a4,...a2*k)+min(a1,a3,...,a2*k+1 http://www.cyberforum.ru/cpp-beginners/thread294867.html
Дан одномерный массив A. Найти max(a2,a4,...a2*k)+min(a1,a3,...,a2*k+1=-O)
C++ свой строковой тип помогите пожалуйста разобраться со строковым типом! пишу свой класс строки, запнулся на реализации оператора + есть вот такие виды операторов + и = void operator =(const WCHAR *val); void... http://www.cyberforum.ru/cpp-beginners/thread294866.html
C++ Определить, сколько среди чисел меньших К, равных К и больших К
Задана последовательность из N вещественных чисел. Определить, сколько среди них чисел меньших К, равных К и больших К.
C++ Сортировка слов по алфавиту с ипользованием классов
Есть задание - написать программу, которая бы сортировала слова в строке по алфавиту. У меня есть такой вот алгоритм. Надо его усовершенствовать так, что бы он сортировал еще и русские слова, а так...
C++ Выберите из строки все буквы от Q (q) до Z (z) и отсортируйте их в алфавитном порядке http://www.cyberforum.ru/cpp-beginners/thread294850.html
Всем доброго времени суток. Задачка: С клавиатуры вводится строка. Выберите из нее все буквы от Q (q) до Z (z) (строчные преобразуйте в прописные) и отсортируйте их в алфавитном порядке....
C++ манипуляторы Создайте свои манипуляторы которые будут выполнять 1)вывод всех символов равных заданному заменить пробелом 2)вывод всех символов прописными и замена пробелов на * 3)вывод всех чисел в ОСТ... подробнее

Показать сообщение отдельно
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
13.05.2011, 19:20
Ага. Задание опять мое. Только в сборнике - опечатка. Там цифра должна быть двоичной, а не десятичной.
Я тебе поправлю интерфейс пока.
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
#ifndef BIN
#define BIN
 
#include <list>
#include <iostream>
 
using namespace std;
class Bin{
      public:
             friend istream& operator>>(istream&, Bin&);
             friend ostream& operator<<(ostream&, const Bin&);
             Bin operator+(const Bin&);
             Bin operator-(const Bin&);
             Bin operator*(const Bin&);
             Bin operator/(const Bin&);
             Bin operator%(const Bin&);
             bool operator>(const Bin&);
             bool operator<(const Bin&);
             bool operator==(const Bin&);
             bool operator!=(const Bin&);                  // -- это можно не делать, поскольку можно обойтись предыдущими операциями 
             int check();                                        // -- это что делает?
             Bin sign();                                          // это что делает?
             private:
             list <unsigned char> n;                         
             list <unsigned char>::iterator it;             // -- это не нужно как отдельное поле
             long Transfer();                                   // -- это что делает? 
             friend void conclusion(const Bin&);         // -- это зачем?
};
#endif
Добавлено через 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
class LongLong
{   public:
    // Конструкторы
    LongLong(const string &s);          // инициализация строкой
    LongLong(const long &number=0);
// операции c с присваиванием
    LongLong& operator+=(const LongLong &r);
    LongLong& operator-=(const LongLong &r);
    LongLong& operator*=(const LongLong &r);
    LongLong& operator/=(const LongLong &r);
    LongLong& operator%=(const LongLong &r);
// операции без присваивания
    friend LongLong operator+(const LongLong &l, const LongLong &r);
    friend LongLong operator-(const LongLong &l, const LongLong &r);
    friend LongLong operator*(const LongLong &l, const LongLong &r);
    friend LongLong operator/(const LongLong &l, const LongLong &r);
    friend LongLong operator%(const LongLong &l, const LongLong &r);
// ввод – вывод
    friend istream& operator>>(istream &is, LongLong &r);
    friend ostream& operator<<(ostream &os, const LongLong &r);
private:
    vector<char> v;
};
Помимо приведенных дружественных операций можно добавить еще операции длинных чисел с целыми, например
C++
1
2
friend LongLong operator+(const LongLong &l, const long &r);
friend LongLong operator+(const long &l, const LongLong &r);
Само число находится в поле-контейнере. Каждая цифра — это один элемент вектора, младшая цифра расположена в контейнере по младшему индексу. Например, число 765 будет расположено так:
C++
1
v[0]=5,v[1]=6,v[2]=7.
Конструкторов всего два: конструктор копирования создается автоматически, а конструктор без аргументов нам просто не нужен, так как в конструкторе инициализации задан аргумент по умолчанию. Реализацию покажем на примере конструктора с аргументом-целым (листинг 11.18).
C++
1
2
3
4
5
6
7
8
9
10
Листинг 11.18. Конструктор инициализации длинного целого
LongLong::LongLong(const long &number)
{  long t = number, i = 0; 
   char digit;
   while(t>0)
   { digit = t % 10;
     v.push_back(digit);
     t/=10; i++;
   }
}
Операции с длинными числами, естественно, выполняются поэлементно. Покажем реализацию самого простого метода — сложения с присваиванием (листинг 11.19).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Листинг 11.19. Метод сложения с присваиванием
LongLong& LongLong::operator+=(const LongLong &r)
{ typedef vector<char>::size_type sizeT;
  sizeT size = (v.size()>r.v.size())?v.size():r.v.size();   // большая длина
  unsigned carry = 0, sumDigit;             // перенос и цифра суммы
  LongLong Summa;                           // результат-сумма
  for(sizeT i = 0; i < size; i++)
  { sumDigit = digit(i) + r.digit(i) + carry;
    carry = sumDigit/10;                    // вычисляем новый перенос
    Summa.v.push_back(sumDigit%10);         // добавляем цифру в сумму
  }
  if (carry) Summa.v.push_back(carry);      // добавляем последний перенос
  v = Summa.v;
  return *this;
}
Нам потребовалась вспомогательная функция digit(), которая выдает очередную цифру длинного целого. Функция очень проста и ее реализацию можно прописать непосредственно в приватной части класса:
C++
1
2
char digit(unsigned i) const
{ if(i<v.size()) return v[i]; else return 0; }
Ну, и наконец, реализация функции вывода тоже тривиальна:
C++
1
2
3
4
5
ostream& operator<<(ostream &os, const LongLong &r)
{ for(int i = 0; i < r.v.size(); i++)
  os << int(r.v[r.v.size()-i-1]);       // вывод в обратном порядке
  return os;
}
Единственный нюанс — это вывод цифр числа (элементов вектора) в обратном порядке, поскольку число в векторе «лежит» от младшей цифры к старшей, а читаем мы числа от старшей цифры к младшей.
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru