Автор Тема: Програмирование на C++  (Прочитано 76713 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #270 : 11 Апрель 2011, 01:11:43 »
Цитата
HoRRoR,так с определением того одна или две у меня цифры проблем и не возникает. Проблема возникает с копированием из строки с заданной позиции или с удалением заданного числа символов из этой строки  с последующим сдвигом оставшихся символов.

Цифр может быть и больше. А вообще, используй мою функцию и сделай так:
char real_name[256];
strcpy(real_name, getName(typeid(...).name()));

Цитата
У меня не просит оно никаких сиситайпов так что не знаю, но буду иметь в виду что подключить если попросит
Ну значит компилятор по дефолту использует нужные либы.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #271 : 11 Апрель 2011, 02:33:38 »
Цитата: HoRRoR
Ну значит компилятор по дефолту использует нужные либы.
Ну он у меня хитрый, exit тоже если помнишь без cstdlib работает.
Цитата: HoRRoR
Цифр может быть и больше. А вообще, используй мою функцию и сделай так:Код:char real_name[256];strcpy(real_name, getName(typeid(...).name()));
Больше 2х и меньше 1го пока ни разу не было так что я вот и решил что здесь подойдёт и такая проверка.
Ну а в char массиве я уже помню как копировать начиная с нужного символа, просто хотел и здесь как-то схитрить чтобы было копирование начиная с заданного символа посредством директивы <string>.

Добавлено позже:
Получилось в итоге сделать вот так:
    for(int i=0;i<shape.size();i++) //цикл по всем элементам вектора
    {
        Thshape *temp=dynamic_cast<Thshape*> (shape[i]);
        char abc[10];
        cout<<"Figure ";
        strcpy(abc,typeid(*shape[i]).name());
        if (isdigit(abc[1]))
         strcpy(abc,&abc[2]);
        else if (isdigit(abc[0]))
         strcpy(abc,&abc[1]);
        cout<<abc<<" Area: "<<shape[i]->getArea();
        if (temp) //если фигура трёхмерная
         cout<<" Volume: "<<temp->getVolume();
        cout<<endl;
    }
Хотя я всё сомневался поймёт ли меня strcpy, как оказалось поняла и сделала тот сдвиг что я и хотел  :)
Спасибо за подсказку, с string и её фишками чуть потом разберусь, по Дейтелу дальше шаблоны идут, хотя лабу ещё нужно бы сделать по с++ ту что сдавать на наследование, ато я всё по Дейтелу задачки решаю. Да вот только лаба что сдавать нужна в борланде с++, а он такой гадостный, а его библиотека graphick.h тупая и неудобная + этот борланд код любит портить, после написания в текстовом редакторе он вечно какие-то символы испортит и потом из него приходиться править до этого работающий код, не удивительно что его компилятор не популярен.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #272 : 11 Апрель 2011, 10:22:53 »
Цитата
Больше 2х и меньше 1го пока ни разу не было так что я вот и решил что здесь подойдёт и такая проверка.
Слушай, какой из тебя программист с таким мышлением? Логику хотя бы включи - если у тебя больше 100 типов, то и нумерация будет соответствующая. Да и без логики понятно, что нельзя утверждать того, чего не знаешь.

Цитата
Ну а в char массиве я уже помню как копировать начиная с нужного символа, просто хотел и здесь как-то схитрить чтобы было копирование начиная с заданного символа посредством директивы <string>.
Какой ещё директивы <string>? Нет такой директивы, есть такой заголовок. И при чём тут заголовок класса string?

Цитата
Получилось в итоге сделать вот так:
А ты упёртый. В итоге всё равно сделал через одно место и ненадёжно, потому что рассматриваешь всего два случая из неизвестно сколько возможных.

strcpy(abc,&abc[1]);
А вот так не делают. Не копируют между перекрывающимися областями памяти, потому что могут быть какие угодно последствия - ты не знаешь, как конкретно реализовано. Иногда такое вообще не работает.


Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #273 : 11 Апрель 2011, 18:53:06 »
HoRRoR,спасибо, учту на следующий раз, но я упёртый и проверку в этот раз уже править не буду  :) Ну хотя бы потому что судя по выводу оно цифры как-то рандомно добавляет, ну вот сам посмотри оно выдаёт 6Circle для объекта класса двухмерных фигур, 6Square (для объекта того же класса) и 6Sphere для объекта другого класса трёхмерных фигур. Максимальное число оно выдаёт перед одним из классов 11, но у меня только 6 классов  и 6 объектов.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #274 : 11 Апрель 2011, 19:38:17 »
А с чего ты взял, что оно всегда будет выдавать 1-2 символа? Где гарантия, что ты не получишь 100500Circle? Так что это не решение проблемы, это костыль, который может перестать работать.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #275 : 11 Апрель 2011, 20:53:20 »
HoRRoR, блин, я понял магию цифр, это пишется количество символов в имени типа, а мы тут гадаем  :) Ну тогда 100500 точно не будет, да и больше двух цифр тоже не будет :)

Добавлено позже:
HoRRoR,а можно вопрос, а что у нас C++ Builder собой являет? Я предварительно в википедии почитал, но до конца так и не понял в чём отличие его от обычного компилятора? В этой drag-and-drop возможности аля дельфи и всё?

Добавлено позже:
Алгоритм сортировки (с подтанцовкой)  :)

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #276 : 11 Апрель 2011, 21:32:21 »
Цитата
HoRRoR,а можно вопрос, а что у нас C++ Builder собой являет? Я предварительно в википедии почитал, но до конца так и не понял в чём отличие его от обычного компилятора? В этой drag-and-drop возможности аля дельфи и всё?
Драг-н-дроп - это VCL, а не дельфи и не билдер. В принципе - в билдере используется борладовский компилятор C/C++, но с поддержкой VCL (с помощью своего рода костыля - классы скомпилированы на дельфях, могут создаваться только через new, ибо в дельфях объект класса мог быть только указателем). Не знаю, что именно виновато - IDE или компилятор, но всё это дело очень часто безбожно глючит, поэтому я им не пользуюсь.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #277 : 14 Апрель 2011, 11:35:57 »
А почему я не могу сделать вот так:
    Account a(5); // Базовый класс, остальные его наследуют (public)
    SavingAccount b(5,2);
    CheckingAccount c(5,1);
    SavingAccount d(10,3);
    CheckingAccount e(7,2);
    vector <Account*> acc(4);
    acc[0]=&b;
    acc[1]=&c;
    acc[2]=&d;
    acc[3]=&e;
    for (size_t i=0;i<acc.size();i++)
    {
        SavingAccount *f=dynamic_cast<SavingAccount*>(acc[i]); //Нельзя преобразовать если в базовом нет виртуальных функций
        if (f)
         cout<<"Interest: "<<f->calculateInterest();
    }
те: я не могу использовать преобразование если в моём базовом классе нет ни одной virtual функции (пусть и не обязательно полностью виртуальной( =0 ))? Я по ходу плохо понял как именно оно делает динам. преобразование в ходе выполнения программы.

Добавлено позже:
И ещё можно как-то получать не только название класса, но и ещё какой именно это класс. Ну чтобы было не просто возвращено CheckingAccount, а CheckingAccount  a например.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #278 : 14 Апрель 2011, 12:19:54 »
Цитата
А почему я не могу сделать вот так:
Пора бы уже научиться читать тексты ошибок - source type is not polymorphic. Т.е. в нём должна быть хотя бы одна виртуальная функция, чтобы он стал был полиморфным.

Цитата
И ещё можно как-то получать не только название класса, но и ещё какой именно это класс. Ну чтобы было не просто возвращено CheckingAccount, а CheckingAccount  a например.
Нет.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #279 : 14 Апрель 2011, 23:08:06 »
HoRRoR,я читал, но оно ругалось страшно и длинно  :)
Цитата: HoRRoR
Нет.
Блин, хотя я изначально думал что и название класса не получиться вот так просто получить.

Добавлено позже:
Начал читать о шаблонах. Удобно пользоваться, но не удобно объявлять так как объявление не совсем логично выглядит.
Допустим я в .h файле сделал вот так
template <typename T>
class Stack
{
public:
    Stack(int =10);
    ~Stack()
    {
        delete [] stackPtr;
    }

    bool push(const T&);
    bool pop(T&);
    bool isEmpty() const
    {
        return top==-1;
    }
    bool isFull() const
    {
        return top==size-1;
    }

private:
    int size;
    int top;
    T *stackPtr;
};

Так чтобы потом функции написать по этим прототипам нужно же писать
template <typename T>
bool Stack<T>::push(const T &pushValue)
что имхо не логично - класс же у меня Stack и если я и так уже написал что это класс с использованием шаблона то почему бы дальше не написать просто
bool Stack::push(const T &pushValue) ?
Класс у меня просто Stack ведь называется, зачем тогда придумали дописывать ещё и <T>? Я ведь и так предыдущей строчкой обязан напомнить о шаблоне так зачем же дважды это делать?   :-\

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #280 : 15 Апрель 2011, 00:43:44 »
Цитата
Класс у меня просто Stack ведь называется, зачем тогда придумали дописывать ещё и <T>? Я ведь и так предыдущей строчкой обязан напомнить о шаблоне так зачем же дважды это делать?  
Потому что тебе никто не запрещает написать какой угодно другой шаблон для этой функции класса:
template <>
bool Stack<int>::push(const int &pushValue)
{
    cout << "Stack::push() for int called!" << endl;
    ...
}

template <typename T>
bool Stack<T>::push(const T &pushValue)
{
    cout << "Stack::push() for another type called!" << endl;
    ...
}
А T писать - потому что класса Stack не существует, существует класс Stack<тип> для каждого из типов, с которыми используется шаблон Stack.
« Последнее редактирование: 15 Апрель 2011, 00:45:57 от HoRRoR »

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #281 : 17 Апрель 2011, 16:34:33 »
А почему нельзя так
double printArray( const T *array, int count, int low=0, int high=count )Count у меня здесь количество элементов в массиве, low - первый элемент который нужно печатать, high - последний элемент который нужно печатать.
И как в таком случае тогда поступать?
Здесь я хочу чтобы на печать отправлялся полностью массив если функции передано два аргумента, и не полностью если 3 или 4 аргумента.

Добавлено позже:
Нет, я конечно могу сделать так чтобы вместо count  сразу был high
double printArray( const T *array, int high, int low=0)И это в данном случае подойдёт но мне на будущее, так сказать, хотелось бы знать что делать когда я хочу необязательному аргументу функции присвоить значение обязательного аргумента вот как здесь я писал.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #282 : 17 Апрель 2011, 16:40:00 »
Цитата
А почему нельзя так
Потому что спецификация этого не позволяет.

Цитата
И как в таком случае тогда поступать?
Как вариант:
double printArray( const T *array, int count, int low=0, int high=-1)
{
    if(high == -1)
        high = count;
    ...
}

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #283 : 17 Апрель 2011, 18:33:12 »
Переделываю старую программу которая была что-то вроде искуственного массива, так вот там раньше была перегрузка в классе объявлена вот так в .h файле:
const Array &operator=( const Array & ); // assignment operatorи вот так потом в cpp файле
const Array &Array::operator=( const Array &right )Когда я создал свой шаблон с этим классом для template <typename T> то я теперь не знаю как в cpp файле указать что функция пренадлежит шаблону, я уже и так и эдак, а оно всё равно ошибки сыплет.

Добавлено позже:
Уже разобрался, тип же тоже меняется так что надо было писать
template <typename T>
const Array<T> &Array<T>::operator=( const Array &right )


Добавлено позже:
И всё равно не смог я всё подружить с шаблоном, перегрузка операций ввода и вывода у меня говорят что объявляю я их криво , посмотрите пожалуйста.
P.S main находится в Array.cpp.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #284 : 17 Апрель 2011, 19:57:15 »
Нельзя шаблонные функции описывать в cpp. Там будут присутствовать только те шаблонные типы, которые использовались. Т.е. если ты используешь Array<int> в .cpp, то он будет там присутствовать, иначе - нет. Так что всё описывай в .h.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #285 : 17 Апрель 2011, 20:14:39 »
Ну я пробовал перенести перегрузку ввода и вывода в .h файл, но это не помогло, сейчас попробую всё перенести туда.
Ну и маленькая программка для разминки из примера преподши (я добавил только вывод в каждой функции чтобы было видно что запускается)
#include<iostream>
using std::cout;
//Перегрузка abs() тремя способами
int abs(int n);
long abs(long n);
double abs(double n);

int main()
{
cout<<"Absolute -10: "<<abs(-10)<<'\n';
cout<<"Absolute -10L: "<<abs(-10L)<<"\n";
cout<<"Absolute-10.01: "<<abs(-10.01)<< "\n";
return 0;
}
//abs() для целых
int abs(int n)
{
    cout<<"NORMAL!!!!!";return n<0?-n:n; }

// abs() для длинных целых
long abs(long n)
{
    cout<<"LONG!!!!!";return n<0?-n:n; }
// abs() для вещественных двойной точности

double abs(double n)
{cout<<"DOUBLE!!!!!";return n<0?-n:n; }
Собственно как это вообще работает?  o_0 Судя по выводу (и по тому что для функцию int abs(int n) можно удалить) для int эта функция abs не используется вообще. Дальше каким это образом компилятор принимает -10L как аргумент функции, там же после цифры буква. Ну и почему идёт странный вывод в итоге: печатается сначала то что на вывод в потоке в функции я отправил, а потом уже что отправлено в поток в main  o_0
Ведь по идеи должно печатать сначала Absolute -10L: из main'а, потом то что в функции на вывод отправлено LONG!!!!!, а потом уже число после обработки которое возвращает функция так почему же всё происходит совсем не так?

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #286 : 17 Апрель 2011, 20:24:33 »
Ты основы вообще изучал? В частности - порядок вычисления выражения. Сначала вычисляется функция (в ней срабатывает вывод), а уже затем только вывод в main с результатом вычисления функции.
А буквы в конце констант вообще стыдно не знать. L - long, U - unsigned, F - float. 10ULL - unsigned long long, к примеру.

А с интом не работает, видимо, потому, что где-то эта функция уже определена. Если ты опишешь тело функции до main - то будет вызываться именно та, которая нужна.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #287 : 17 Апрель 2011, 20:36:11 »
Цитата: HoRRoR
Ты основы вообще изучал? В частности - порядок вычисления выражения. Сначала вычисляется функция (в ней срабатывает вывод), а уже затем только вывод в main с результатом вычисления функции.А буквы в конце констант вообще стыдно не знать. L - long, U - unsigned, F - float. 10ULL - unsigned long long, к примеру.
Ну я первый раз увидел чтобы вот так можно было дописать после цифры буквы в конце и компилятор это понял.

Добавлено позже:
А вот запихнуть всё в .h файл по отношению к шаблонам тоже не получилось, ну точнее в итоге я всё равно дохожу до ошибки как не извращаюсь...
Array.cpp||undefined reference to `operator<<(std::ostream&, Array<int> const&)'|
Посмотри пожалуйста.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #288 : 17 Апрель 2011, 21:24:34 »
Проблема в том, что у тебя этот оператор внутри класса описан не как шаблонная функция.
1. Опиши функции операторов выше, чем класс.
2. Для этого оставь выше этих функций упоминание о классе - template <typename T> class Array;
3. Измени описание friend'ов с учётом шаблона:
   friend ostream &operator<< <T>( ostream &, const Array<T> & );
   friend istream &operator>> <T>( istream &, Array<T> & );

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #289 : 17 Апрель 2011, 21:39:58 »
Цитата: HoRRoR
Проблема в том, что у тебя этот оператор внутри класса описан не как шаблонная функция.
Ну это я с самого начала заметил в виде предупреждений компилятора, но не знал как исправить это.
Так работает, спасибо за помощь. Но тут ещё хотелось бы хоть косвенно понять почему так .
Вот зачем было дописывать вот так например
  friend ostream &operator<< <T>( ostream &, const Array<T> & );в итоге получается при вызове
  friend ostream &operator<< int ( ostream &, const Array<int> & );что непонятно как работает (зачем int перед аргументами?)
Ну и почему надо было дружественные функции писать перед тем как их использовать (я же попробовал специально оставить их в конце - фигушки, так не получается).Ну хотя бы в двух словах.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #290 : 17 Апрель 2011, 22:33:57 »
Это каким чудом у тебя <int> превращается в int? Ты же не писал "operator << T (...". int в классе подставится вместо T таким образом:
  friend ostream &operator<< <int>( ostream &, const Array<int> & );
В самой функции это будет так:
ostream &operator<<( ostream &output, const Array<int> &a )
Т.е. <int> по сути означает "typename T = int". Это как аргумент функции, только аргумент шаблона.
Проводя аналогию:
void foo(int a);
...
foo(10);

template <typename T>
void foo(T a);
...
foo<int>(10);
Вот <int> - это передача аргумента шаблона.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #291 : 19 Апрель 2011, 00:33:47 »
Я тут создаю свой класс вектор и в итоге получаю вот такое:
C:\c++\Projects\Vector\Vector.cpp|137|error: cannot declare member function `static int Vector::getCount()' to have static linkage|Собственно в первый раз с такой ошибкой встречаюсь,в чём может быть проблема?
В классе Vector в private есть
static int count;// колличество созданных классовНу а функция по возврату этого значения выглядит как
static int Vector::getCount()
{
    return count;
}

Так в чём же тогда может быть проблема?

Добавлено позже:
Тьфу, static же  в cpp файле не надо было писать уже, я и забыл.

Добавлено позже:
Почему при делении на число получается 1.#INF в выводе, когда я допустил ошибку (вместо равно в проверке условия написал присваивание)? Программа ведь должна была вылететь с кодом ошибки 100
Собственно .h файл
# ifndef VECTOR_H
# define VECTOR_H

#include <iostream>
using std::ostream;
using std::istream;

class Vector
{
    friend ostream &operator<<(ostream&,const Vector&);
public:
    Vector();
    Vector(const Vector&);
    ...
    void operator/ (double);
    static int getCount();


private:
    int size; //количество элементов
    int now;// состояние
    double *vect;//сам вектор
    static int count;// количество созданных классов
};

#endif

И функция деления:
void Vector::operator/ (double p)
{
    if (p=0)
     exit(100);
    if (size==1)
     *vect/=p;
    else
     for (int i=0;i<size;i++)
      vect[i]=(double)vect[i]/p;
}

Почему работа продолжается при такой ошибке, я ведь явно указал выход с ошибкой 100 и никаких или.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #292 : 19 Апрель 2011, 01:10:46 »
Цитата
    if (p=0)
     exit(100);
Сам вдумайся в то, что ты написал.
Во-первых, это присваивание.
Во-вторых, оно всегда будет давать false.
В-третьих, даже при ненулевых значениях возможно получить INF - если число будет слишком маленьким, чтобы результат деления поместился.
В-четвёртых, возьми за правило писать double как 0.0, float как 0.0f.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #293 : 19 Апрель 2011, 01:16:49 »
Цитата: HoRRoR
Во-первых, это присваивание.
А я то и не заметил  :). Я нашёл эту ошибку о чём и написал, но мне стало потом интересно почему же программа не вылетала каждый раз с кодом ошибки 100.
HoRRoR,тоесть оно присвоит p значение 0, но тем не менее будет идти как false? Но в таком случае оно дальше бы должно делить на 0 и вылететь всё равно с ошибкой.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #294 : 19 Апрель 2011, 01:32:36 »
Деление числа с плавающей запятой на ноль - не ошибка и даёт infinitiy.

Добавлено позже:
Цитата
тоесть оно присвоит p значение 0, но тем не менее будет идти как false?
Выражение присваивания возвращает результат присваивания. Т.е. (a = 1) == 1 - true. И тут так же, только с нулём, а ноль - это false.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #295 : 19 Апрель 2011, 16:31:04 »
HoRRoR,ага, вот так оно расценило моё условие, теперь понятно.
Цитата: HoRRoR
Деление числа с плавающей запятой на ноль - не ошибка и даёт infinitiy.
Я думал деление на 0 хоть int, хоть double будет приводить к ошибке при выполнении, а оно во как. Спасибо, буду знать.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #296 : 24 Апрель 2011, 18:01:23 »
Читаю о манипуляторах потоков и тут тоже возникли некоторые вопросы.
Есть ли разница между
# include <iostream>
using namespace std;

int main()
{
    char *abc="word";
    cout<<abc<<'\n';

 cout<<static_cast<void*> (abc); // и cout<<(void*) abc;
}

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #297 : 24 Апрель 2011, 20:14:31 »
Разница только в операторах приведения типа, поток тут можно и не затрагивать.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #298 : 24 Апрель 2011, 20:28:50 »
А как бы его избавиться от пробелов в этом случае
    char abc[80];
    cin.getline(abc,80,EOF);
? Вычитал что есть некаю skipws, но что-то никак не придумаю как бы её подпихнуть во входной поток.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #299 : 24 Апрель 2011, 20:48:32 »
http://www.cplusplus.com/reference/iostream/manipulators/skipws/

Вообще и самому пробелы убрать можно, раз уж строку целиком читаешь. Или читать посимвольно, игнорируя пробелы.