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

итератор - C++

Восстановить пароль Регистрация
 
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
08.05.2011, 09:53     итератор #1
скажите как в этой задачи перевести десятичное число в двоичное???
вот условие задачи!!!
итератор
вот код!!
main.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include "long.h"
 
using namespace std;
 
int main(int argc, char *argv[])
{ string c; //ÊîìГ*Г*Г¤Г*
    Long1 h1, h2;
    cin>>h1;
 
 cout<<h1<<h1.Transfer();
    system("PAUSE");
    return EXIT_SUCCESS;
}
long.cpp
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
#include "long.h"
#include <iostream>
#include <math.h>
#include <cstdlib>
using namespace std;
istream& operator>>(istream& in, Long1& h1){ //Ââîä Г± ГЄГ«Г*ГўГЁГ*òóðû
         string s1; //ÑòðîêГ* ââîäèìГ*Гї Г± ГЄГ«Г*ГўГЁГ*òóðû
         int i;
      
             in>>s1;
         for(i=0; i<s1.size(); i++){ //ÏåðåГ*îñèì ñòðîêó Гў ГёГҐГ±ГІГ*Г*äöГ*òåðè÷Г*îå ÷èñëî
         
         }
         for(i=s1.size()-1; i>=0; i--){ //ГЋГІГЇГ°Г*âëÿåì ìåГ*ГјГёГЁГҐ ýëèìåГ*ГІГ» Гў Г*Г*Г·Г*ëî Г±ГЇГЁГ±ГЄГ*
           h1.n.push_back(s1[i]);}
           
         return in;
};
ostream& operator<<(ostream& out, const Long1& h1){ //Âûâîä Г*Г* ГЅГЄГ°Г*Г*
    Conclusion(h1); //Âûâîäèì Г°Г*çðÿäû
    out<<endl;
    return out;
};
void Conclusion(Long1 h1){ //Âûâîä Г°Г*çðÿäîâ
    int i;
    h1.it=h1.n.end(); //ÓêГ*Г§Г*òåëü Г*Г* ГЄГ®Г*ГҐГ¶ Г·ГЁГ±Г«Г*
    for(h1.it--, i=h1.n.size()-1; i>=0; h1.it--, i--) //Âûâîäèì Гў îáðГ*ГІГ*îì ïîðÿäêå
    cout<<*h1.it;
};
     
long Long1::Transfer(){ //Ïåðåâîä Г·ГЁГ±Г«Г* ГЁГ§ ГёГҐГ±ГІГ*Г*äöГ*òåðè÷Г*îé ñèñòåìû ñ÷èñëåГ*ГЁГї Гў äåñÿòè÷Г*ГіГѕ
   
    it=n.begin();
    
  //if((*it%2)==0)
    
    return 
}
long.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef Long
#define Long 
#include <list>
#include <iostream> 
 
 
using namespace std;
class Long1{
      public:
      friend istream& operator>>(istream&, Long1&); //Ââîä Г·ГЁГ±Г«Г*
      friend ostream& operator<<(ostream&, const Long1&); //Âûâîä Г·ГЁГ±Г«Г*
      int Check();
      Long1 operator+(Long1&);
         long Transfer(); 
     private:
     friend void Conclusion(Long1); //ÂñïîìîãГ*òåëüГ*Г*Гї ГґГіГ*êöèÿ äëÿ âûâîäГ*
     list<unsigned char> n; //ГЉГ«Г*Г±Г± äëÿ õðГ*Г*ГҐГ*ГЁГї öèôð Г·ГЁГ±Г«Г*
     list<unsigned char>::iterator it; //ÈòåðГ*òîð
      
      };
 
 
#endif
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2011, 09:53     итератор
Посмотрите здесь:

C++ Итератор С++
итератор C++
Итератор!!!!! C++
Итератор ? C++
Итератор C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
08.05.2011, 10:04     итератор #2
В задача требуется создать класс с массивом из char. У тебя это список из char. Единственная функция, которая присваивает значение в твой список - это функция ввода. Ну и вводи цифры как символы.
И попутный вопрос: почему сложение у тебя определено так
C++
1
Long1 operator+(Long1&);
Ссылка-то зачем? Ты меняешь правый аргумент?
Обычно похожую сигнатуру имеют функции с присваиванием:
C++
1
Long1& operator+=(const Long1& r);
А обычная функция сложения чаще реализуется так:
C++
1
friend Long1 operator+(const Long1 &L, const Long1 &R);
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
08.05.2011, 10:11  [ТС]     итератор #3
ну сложение нас так учили перегружать , но для сложения мне сначало нужно перевести число из 10-ной системы в 2-ную....... пробовал так _itoa(t, f, 2), где t-число, f-строка (типа char), 2- система счисления.. но у меня не возвращает это значение....
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
08.05.2011, 10:29     итератор #4
1. Хреново вас учили! Читай мои книжки: Экспересс-курс и Объектно-ориентированное программирование. Кстати, задачка - из моего сборника...
2. Не надо ничего переводить... Если б ты конструктор написал:
C++
1
Long1(int t);
Вот там надо инт в цифры разложить.
А в функции ввода ВВОДИШЬ СИМВОЛ_ЦИФРУ и кладешь в список.
Ну, можно класть не символ, а непосредственно цифру:
C++
1
d = ch - '0'; n.push_back(d);
B сложение делаешь в цикле посредством итератора, складывая поэлементно, и учитывая перенос в следующую цифру.
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
08.05.2011, 10:35  [ТС]     итератор #5
конструктор вы имеете в виду
C++
1
2
3
Long1();
Long1(int );
Long1(const int);
по поводу "Хреново вас учили"- отчасти я согласен, потому что матерьяла ноль , даже нет никаких пособий...... приходится все научным тыком изучать!!!
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
08.05.2011, 10:41     итератор #6
По конструкторам - да.
А насчет нет материала - это ты не прав! Материала -ДОФИГА! Две своих книжки я тебе назвал. Но есть еще БОЛЬШАЯ КУЧА книжек, и очень ХОРОШИХ!
Просто в программировании самому думать надо. Примеров на все случаи жизни не бывает. По аналогии надо делать и изменять по своей потребности.
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
08.05.2011, 10:48  [ТС]     итератор #7
да да да я с вами полностью согласен по поводу книг, стараюсь учить, вашу книгу тоже скачал, читаю когда свободное вреся есть!!! в вашем задачнике нашел небольшую ошибку, есть задача с классом FAzzyNumber , там опечатка FUzzyNumber=) ПО ПОВАДУ РЕАЛИЗАЦИИ!!
C++
1
2
3
4
5
6
7
8
9
Long1::Long1(){
              t=0;
 };
 Long1::Long1(int t1){
                  t=t1;
 };
 Long1::Long1(const Long1 &u1){
 t=u1.t;                   
 };
но я так и непонял для чего это???
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.05.2011, 10:53     итератор #8
А при чём тут "Итератор!!!"?
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
08.05.2011, 10:54  [ТС]     итератор #9
НАДО НАПИСАТЬ ПРОГРАММУ ИСПОЛЬЗУЯ ИТЕРАТОР!!
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
08.05.2011, 10:55     итератор #10
Цитата Сообщение от 2008kedr2008 Посмотреть сообщение
да да да я с вами полностью согласен по поводу книг, стараюсь учить, вашу книгу тоже скачал, читаю когда свободное вреся есть!!! в вашем задачнике нашел небольшую ошибку, есть задача с классом FAzzyNumber , там опечатка FUzzyNumber=) ПО ПОВАДУ РЕАЛИЗАЦИИ!!
C++
1
2
3
4
5
6
7
8
9
Long1::Long1(){
              t=0;
 };
 Long1::Long1(int t1){
                  t=t1;
 };
 Long1::Long1(const Long1 &u1){
 t=u1.t;                   
 };
но я так и непонял для чего это???
1. По-первых, в твоем классе нет поля t.
2. Во-вторых, конструкторы для того, чтобы при объявлении можно было инициализировать объекты
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
08.05.2011, 10:56  [ТС]     итератор #11
в смысле нет поля t???
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
08.05.2011, 11:00     итератор #12
Да. В твоем классе поле t отсутствует.
вот тебе пример - переделаешь для себя

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 будет расположено так: 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;
}
Единственный нюанс — это вывод цифр числа (элементов вектора) в обратном порядке, поскольку число в векторе «лежит» от младшей цифры к старшей, а читаем мы числа от старшей цифры к младшей.
Реализацию остальных методов оставляем читателю. Используйте для реализации дружественных функций уже реализованные операции с присваиванием, например
C++
1
2
LongLong operator+(const LongLong &l, const LongLong &r)
{ LongLong tmp = l; tmp+=r; return tmp; }
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
08.05.2011, 11:04  [ТС]     итератор #13
спасибо!!! постараюсь её все написать задачу!!!
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
08.05.2011, 11:13     итератор #14
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
А обычная функция сложения чаще реализуется так:
C++
1
friend Long1 operator+(const Long1 &L, const Long1 &R);
Вы знаете, вот тут я с вами не согласен. Да, я и сам, например, так пишу, мне удобнее работать с двумя операндами явно, а не с одним явным и одним скрытым, но есть мнение, что дружественность надо использовать только там, где это существенно упрощает задачу, и здесь вполне можно перегрузить сложение как метод.
Это я всё к тому, что говорить, что делают обычно вот так, а так не делают - неверно, очень многие перегружают все операторы, какие возможно, как методы, а не глобально.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.05.2011, 11:40     итератор #15
Цитата Сообщение от 2008kedr2008 Посмотреть сообщение
НАДО НАПИСАТЬ ПРОГРАММУ ИСПОЛЬЗУЯ ИТЕРАТОР
Ещё раз перечитал задание. Где это там написано?
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
08.05.2011, 11:41  [ТС]     итератор #16
в задании не написано,это все препод придумал
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
08.05.2011, 11:50     итератор #17
2008kedr2008, что значит "используя итератор"? Нужно представить данные в каком-нибудь стандартном контейнере и итерировать их стандартным итератором этого контейнера, или же написать собственный итератор для собственного представления данных?
В общем, пока вы чётко и ясно не сформулируете задание - вас так и будут швырять из вопроса в вопрос.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2011, 13:15     итератор
Еще ссылки по теме:

итератор C++
Итератор C++
Итератор C++

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

Или воспользуйтесь поиском по форуму:
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
08.05.2011, 13:15     итератор #18
Цитата Сообщение от silent_1991 Посмотреть сообщение
Вы знаете, вот тут я с вами не согласен. Да, я и сам, например, так пишу, мне удобнее работать с двумя операндами явно, а не с одним явным и одним скрытым, но есть мнение, что дружественность надо использовать только там, где это существенно упрощает задачу, и здесь вполне можно перегрузить сложение как метод.
Это я всё к тому, что говорить, что делают обычно вот так, а так не делают - неверно, очень многие перегружают все операторы, какие возможно, как методы, а не глобально.
В данном случае важно, что это "функция сложения". Если мы реализуем метод, то левым аргументом может быть ТОЛЬКО ОБЪЕКТ РЕАЛИЗУЕМОГО КЛАССА. А если делаем дружественную функцию, то можно ее перегрузить, например, для вешественного или целого ЛЕВОГО аргумента. И получим нормальную коммутативную операцию сложения. Метод не позволяет реализовать коммутативность.
Yandex
Объявления
08.05.2011, 13:15     итератор
Ответ Создать тему
Опции темы

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