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

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

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1594
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #330 : 09 Май 2011, 15:59:36 »
Mr2, ну и я так делаю, и что? Это тоже мои личные выдумки?
Не, я просто не в курсе о том можно ли так делать или нет. ;)
Цитата: gepar
Блин, смешно же, как только написал HoRRoR'у только что так и заметил что у меня const во второй же перегрузке, а в первой нет
Даже и не думал что константа влияет на перегрузку. :blush:

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #331 : 09 Май 2011, 16:43:49 »
Задолбался я с этими const, там не хватает, там много, сделал всё что можно const и теперь всё множиться и складывается где нужно (дописывал только const, реализации не трогал), теперь осталось найти ошибку в детерминанте и написать функцию для вычисления ранга.

Добавлено позже:
Кстати вначале задание казалось легче  :D

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #332 : 14 Май 2011, 20:45:26 »
В общем курсовую до чт. оформил, допилил и сдал. Получил в итоге 95 за курсовую (наверное преподша не хочет при сдаче ведомости писать max балл), хотя преподша сказала  что мол всё идеально хорошо, и 100 за сам курс ООП. Курсовая в итоге получилась самая большая в группе так как с кодом она вышла в 62 страницы  :) Теперь можно продолжить в свободное время допроходить Дейтела, я там остановился в последний раз на манипуляторах потока...

Добавлено позже:
Таааак, у меня чувство дежавю, но спрошу:
# include <iostream>
using namespace std;

int main()
{
    int ch;
    int a=3;
    cout<<"Before: "<<cin.eof()<<endl
    <<"Enter sometging: "<<endl;
    while((ch=cin.get())!=EOF)
     cout.put(ch);
    cout<<"\nEOF is: "<<ch<<endl;
    cin>>a;
    cout<<"\nFuck, A has not been changed: "<<a;
    cout<<"\nAfter EOF is: "<<cin.eof()<<endl;
    return 0;
}

Почему "убивается" последний cin и программа завершается? Я так понимаю символ конца строки у нас остался в потоке и при cin>>a он мешает, но как его убрать тогда? Добавление cin.ignore () перед cin>>a ничего не меняет, да и сколько cin'ов не делай он всё равно я вижу остаётся в потоке до завершения программы, но почему?

Добавлено позже:
Ещё непонятно почему gcount подсчитывает количество символов только при бесформатном вводе типа cin.read, было бы удобнее если бы он всегда считал.

Оффлайн ALEX_230_VOLT

  • Модератор
  • Сообщений: 7645
  • Пол: Мужской
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #333 : 14 Май 2011, 20:57:48 »
Я тут тоже курсовик здаю и такой довольно  глупый вопрос:
вот допустим у меня переменная типа string. В ней текст
Цитата
ID 100000 Фамилия: Иванов Имя: Иван Отчество: Иванович Улица: им. Пушкина Дом: 17 Квартира: 26 ID 100000 Фамилия: Иванов Имя: Иван Отчество: Иванович Улица: им. Пушкина Дом: 17 Квартира: 26 ID 100000 Фамилия: Иванов Имя: Иван Отчество: Иванович Улица: им. Пушкина Дом: 17 Квартира: 26
вот как мне посчитать сколько раз там встречается сочиатние символов "ID"? ну и на будущее - как научится извлекать из этого сам номер? ну то есть прога видит "ID" и после пробела берёт следующие 6 символов и заносит в новую переменную. кстатитут походу ещё конверсию из string в int придётся делать  :-\

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #334 : 14 Май 2011, 23:49:03 »
Цитата
Почему "убивается" последний cin и программа завершается? Я так понимаю символ конца строки у нас остался в потоке и при cin>>a он мешает, но как его убрать тогда? Добавление cin.ignore () перед cin>>a ничего не меняет, да и сколько cin'ов не делай он всё равно я вижу остаётся в потоке до завершения программы, но почему?
Не понял ни кода, ни вопроса.

Цитата
вот как мне посчитать сколько раз там встречается сочиатние символов "ID"? ну и на будущее - как научится извлекать из этого сам номер? ну то есть прога видит "ID" и после пробела берёт следующие 6 символов и заносит в новую переменную. кстатитут походу ещё конверсию из string в int придётся делать
#include <cstring>
#include <cstdlib>
#include <vector>

void findIDs(const char *str, vector<int>& ids)
{
    char buf[7] = "";
    while(str = strstr(str, "ID"))
    {
        str += 3;
        strncpy(buf, str, 6);
        ids.push_back(atoi(buf));
    }
}

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #335 : 15 Май 2011, 00:33:19 »
ALEX_230_VOLT,элементарно, Ватсон. Даже писать ничего толком не надо  :)
# include <iostream>
using namespace std;

int main()
{
    char a[]="ID 1043500 bla bla ID 10235400 bla bla ID 12340"; //наша строка
    char *b;
    int n; //сколько всего таких ID
    b=strtok(a,"ID");
    cout<<"Our id is: "<<atoi(b);
    n++;
    while(b=strtok(NULL,"ID"))//пока у нас ещё есть в строке сочетания символов ID
    {
        cout<<"\nOur id is:"<<atoi(b);//Выводим этот ID на печать
        n++;//увеличиваем счётчик
    }
    return 0;
}

Собственно алгоритм я написал, не забудь учесть что ID то может и не быть вообще в строке твоей то.

Добавлено позже:
HoRRoR,а если ID больше 6 цифр? Хотя это я думаю уже пусть ALEX_230_VOLT учитывает.
Цитата: HoRRoR
Не понял ни кода, ни вопроса.
Ну вот скомпилируй этот код, в итоге символ конца строки введённый чтобы пройти это
    while((ch=cin.get())!=EOF)
     cout.put(ch);
застрянет и
    cin>>a;выполняться не будет (оно сразу получает символ конца строки и пропускается). Убедиться в том что символ конца строки остаётся в потоке можно дописав в конце ещё cin.peek(), которая тоже возвращает код конца строки (-1). Как убрать символ конца строки из буфера чтобы можно было и дальше читать символы в таком случае? cin.ignore() не помогает.

Добавлено позже:
Ещё у меня тут было чудо задание написать на асме обработчик прерываний чтобы клава мигала,а спикер пк пищал. Сколько примеров не находил - не работали они у меня на пк и всё тут. Решил тогда взяться за написание на с++ и за инструмента от майкрософта под винду.
Что мы имеем: майкрософт предоставляет вот такие вот возможности, использовать можно где угодно по сути. Но я так до конца со всем и не разобрался: есть клавиша и есть её скан код и вроде бы всё логично, да толкьо в примере сканкод у намлока  0x45, а в таблице кодов на которую есть ссылка там же код   0x45 принадлежит одной из клавиш основного ряда клавиатуры что сразу же меня запутало. Методом тыка и смотря на тот пример создал тогда вот такую прогу и сдал
#include <windows.h>
 #include <iostream>
 
   void SetNumLock( BOOL bState )
   {
      BYTE keyState[256];
 
      GetKeyboardState((LPBYTE)&keyState);
      if( (bState && !(keyState[VK_NUMLOCK] & 1)) ||
          (!bState && (keyState[VK_NUMLOCK] & 1)) )
      {
 
         keybd_event( VK_NUMLOCK,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | 0,
                      0 );
 
 
         keybd_event( VK_NUMLOCK,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                      0);
      }
   }
   void SetCapsLock( BOOL bState )
   {
      BYTE keyState[256];
 
      GetKeyboardState((LPBYTE)&keyState);
      if( (bState && !(keyState[VK_CAPITAL] & 1)) ||
          (!bState && (keyState[VK_CAPITAL] & 1)) )
      {
 
         keybd_event( VK_CAPITAL,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | 0,
                      0 );
 
 
         keybd_event( VK_CAPITAL,
                      0x14,
                      KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                      0);
      }
   }
 
   void SetScrLock( BOOL bState )
   {
      BYTE keyState[256];
 
      GetKeyboardState((LPBYTE)&keyState);
      if( (bState && !(keyState[VK_SCROLL] & 1)) ||
          (!bState && (keyState[VK_SCROLL] & 1)) )
      {
 
         keybd_event( VK_SCROLL,
                      0x91,
                      KEYEVENTF_EXTENDEDKEY | 0,
                      0 );
 
 
         keybd_event( VK_SCROLL,
                      0x91,
                      KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                      0);
      }
   }
 
 
int main()
{
int count=1000;
do
{
    SetNumLock( TRUE );
    SetCapsLock(TRUE);
    SetScrLock (TRUE);
    SetNumLock( FALSE );
    SetCapsLock(FALSE);
    SetScrLock (FALSE);
    if (count%50==0)
    std::cout<<'\a';
    count--;
}while(count);
return 0;
}
 
Но до конца так и не разобрался почему же она так странно работает. Вот например начальная версия программы на которой странности лучше заметны

 #include <windows.h>
 #include <iostream>
 
   void SetNumLock( BOOL bState )
   {
      BYTE keyState[256];
 
      GetKeyboardState((LPBYTE)&keyState);
      if( (bState && !(keyState[VK_NUMLOCK] & 1)) ||
          (!bState && (keyState[VK_NUMLOCK] & 1)) )
      {
      // Simulate a key press
         keybd_event( VK_NUMLOCK,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | 0,
                      0 );
 
      // Simulate a key release
         keybd_event( VK_NUMLOCK,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                      0);
      }
   }
   void SetCapsLock( BOOL bState )
   {
      BYTE keyState[256];
 
      GetKeyboardState((LPBYTE)&keyState);
      if( (bState && !(keyState[VK_CAPITAL] & 1)) ||
          (!bState && (keyState[VK_CAPITAL] & 1)) )
      {
      // Simulate a key press
         keybd_event( VK_CAPITAL,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | 0,
                      0 );
 
      // Simulate a key release
         keybd_event( VK_CAPITAL,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                      0);
      }
   }
 
   void SetScrLock( BOOL bState )
   {
      BYTE keyState[256];
 
      GetKeyboardState((LPBYTE)&keyState);
      if( (bState && !(keyState[VK_SCROLL] & 1)) ||
          (!bState && (keyState[VK_SCROLL] & 1)) )
      {
      // Simulate a key press
         keybd_event( VK_SCROLL,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | 0,
                      0 );
 
      // Simulate a key release
         keybd_event( VK_SCROLL,
                      0x45,
                      KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                      0);
      }
   }
 
   int main()
   {
      SetNumLock( TRUE );
      SetCapsLock(TRUE);
      SetScrLock (TRUE);
      int a;
      std::cin>>a;
      SetNumLock( FALSE );
      SetCapsLock(FALSE);
      SetScrLock (FALSE);
   }
 
 

Если в коде оставить в конце SetScrLock (FALSE) то выключится только scrolLock, а если убрать то выключиться капс и нам лок. Почему так?
Я понял что там у нас вроде как идёт какой-то буфер в какой запихывая новые значения мы подпихиваем предыдущие, но всё же чего оно так странно работает-то ? :) Ну это я спрашиваю если кто пробовал таким баловаться, может там себе визуализатор музыки на индикаторы клавиатуры прикрутить пытались или ещё что  :)
« Последнее редактирование: 15 Май 2011, 00:57:42 от gepar »

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #336 : 15 Май 2011, 02:35:26 »
Цитата
ALEX_230_VOLT,элементарно, Ватсон. Даже писать ничего толком не надо
Из пушки по воробьям.

Цитата
HoRRoR,а если ID больше 6 цифр? Хотя это я думаю уже пусть ALEX_230_VOLT учитывает.
Тогда парсить. Что-то вроде
int value = 0;
while(*str >= '0' && *str <= '9')
{
    value *= 10;
    value += (*str - '0');
    str++;
}

Цитата
Ну вот скомпилируй этот код, в итоге символ конца строки введённый чтобы пройти это
Ещё бы знать, чему у тебя равен EOF. У меня при #define EOF '\n' всё отлично срабатывает.

Добавлено позже:
Если EOF у тебя -1 и ты ожидаешь конца потока, то как можно что-то считывать после того, как всё закончилось?
Естественно, что при достижении конца потока попытка считать что-либо приведёт лишь к ошибке.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #337 : 15 Май 2011, 14:11:02 »
Цитата: HoRRoR
Из пушки по воробьям.
Ну почему же  :) Вполне логично - ищем следующее вхождение ID преобразуем все цифры до первого символа в код ID, потом опять ... так не будем зависить от того сколько там цифр да и логично вроде, ну в общем я бы сделал так. Такую вещь как  strstr я пока не использовал и не знал о ней, может с ней и правда удобнее.
Цитата: HoRRoR
Ещё бы знать, чему у тебя равен EOF.
-1
Цитата: HoRRoR
Если EOF у тебя -1 и ты ожидаешь конца потока, то как можно что-то считывать после того, как всё закончилось?
Я хочу сбросить это состояние потока (помоему я повторяюсь повторяюсь повторяюсь  :) ).
Вот как пример будет надо сохранить два куска текста с пробелами и переводами каретки в два массива символов
# include <iostream>
using namespace std;

int main()
{
    int n=127;
    char ch1[n];
    char ch2[n];
    cout<<"cin.get in ch1: ";
    cin.get(ch1,n, EOF);
    cout<<"/ncin.get in ch2: ";
    cin.get(ch2,n, EOF);
    cout<<"/n/nCh1 is: "<<ch1<<"\nCh2 is: "<<ch2;
}
Так вот закончив ввод первого куска текста через ctrl+Z ввод второго не начнётся (ctrl+Z останется в потоке же), как его убрать оттудова чтобы был возможен ввод и второго куска текста? Ну должен же быть какой-то способ.

Добавлено позже:
Разобрался что мне нужен не cin.ignore(), а cin.clear() в данной ситуации.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #338 : 15 Май 2011, 14:43:31 »
Цитата
Вполне логично - ищем следующее вхождение
Ты не ищешь вхождение, ты разбиваешь на лексемы, что абсолютно не нужно в данном случае. Тем более что поиск подразумевает под собой неизменность текста.

Цитата
Так вот закончив ввод первого куска текста через ctrl+Z ввод второго не начнётся (ctrl+Z останется в потоке же), как его убрать оттудова чтобы был возможен ввод и второго куска текста? Ну должен же быть какой-то способ.
Это не символ, это конец потока. Как ты из файла уберёшь конец файла, например?

Оффлайн ALEX_230_VOLT

  • Модератор
  • Сообщений: 7645
  • Пол: Мужской
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #339 : 15 Май 2011, 15:10:48 »
спасибо что откликнулись, но не сильно это помогло. дело в том, что у меня тип строки string, а НЕ массив из char. хотя покопавшись в инете я смог преобразовать string в char и код gepar заработал. а вот как использовать функцию HoRRoR я что то не понял. можно это сделать не в виде отдельной функции, а как кусок основной программы? ну или обьясни какие параметры ей задавать (ну первый то понятно, а вот второй)

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #340 : 15 Май 2011, 19:37:56 »
Цитата: HoRRoR
Ты не ищешь вхождение, ты разбиваешь на лексемы
Я нахожу лексемы и беру только числа содержащие в начале новой лексемы, это то какраз и будут ID  :) Смысла копировать n символов и их преобразовать через atoi я не вижу так как atoi всё равно вернёт число до первого символа.
Цитата: ALEX_230_VOLT
дело в том, что у меня тип строки string, а НЕ массив из char
В с++ как строку часто воспринимают и массив символов так как им довольно удобно пользоваться, у HoRRoR как видишь тоже указатель на char.
Цитата: ALEX_230_VOLT
а вот как использовать функцию HoRRoR я что то не понял
А вот это плохо так как при написании курсовой уже надо уметь вызывать функции
#include <cstring>
#include <cstdlib>
#include <vector>
#include <iostream>
using namespace std;

void findIDs(const char *str, vector<int>& ids)
{
    char buf[7] = "";
    while(str = strstr(str, "ID"))
    {
        str += 3;
        strncpy(buf, str, 6);
        ids.push_back(atoi(buf));
    }
}

int main()
{
    char *string="Bla bla ID 100500 bla bla ID 200300 bla bla ID 300400";
    vector <int> abc;
    findIDs(string,abc);
    cout<<"Result for string \""<<string<<"\" is:\n";
     for(int i=0;i<abc.size();i++)
      cout<<abc[i]<<endl;
}


Добавлено позже:
Цитата: HoRRoR
Это не символ, это конец потока. Как ты из файла уберёшь конец файла, например?
Ну через cin.clear() убрал же очистив флаги состояний  :)

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #341 : 15 Май 2011, 20:20:53 »
Цитата
Я нахожу лексемы и беру только числа содержащие в начале новой лексемы, это то какраз и будут ID
И что? Говорю же - из пушки по воробьям. Тебя бы на работу не взяли, если бы ты тестовое задание решил так.

Цитата
Смысла копировать n символов и их преобразовать через atoi я не вижу так как atoi всё равно вернёт число до первого символа.
Как ты тогда возьмёшь именно N цифр? Ты не видишь, а я вижу.

Цитата
Ну через cin.clear() убрал же очистив флаги состояний
Что ты убрал? Ничего ты не убрал, а именно что очистил флаги состояний.

Добавлено позже:
К слову, совсем забыл, если ты почитаешь спецификацию strtok, то ты поймёшь, что использование этой функции - ошибка. Попробуй на строке "ID 123214 ololo sfdb sd I sdfs D  sdfsdfpi I III DDDD ID 234234".

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #342 : 15 Май 2011, 20:38:32 »
Цитата: HoRRoR
Что ты убрал? Ничего ты не убрал, а именно что очистил флаги состояний.
Всё я убрал  :) Вот наглядно будет:
# include <iostream>
using namespace std;

int main()
{
    int n=127;
    char ch1[n];
    char ch2[n];
    cout<<"cin.get in ch1: ";
    cin.get(ch1,n, EOF);
    cout<<"\n\n!!!cin.eof() before cin.clear()="<<cin.eof();
    cin.clear();
    cout<<"\n!!!cin.eof() after cin.clear()="<<cin.eof();
    cout<<"\n\ncin.get in ch2: ";
    cin.get(ch2,n, EOF);
    cout<<"\n\nCh1 is: "<<ch1<<"\nCh2 is: "<<ch2;
}

Теперь после конца ввода в первую символьную переменную и нажатия ctrl+z будет идти считывание во вторую переменную чего я и добивался. При cin.clear() очищается состояние флагов, в том числе и cin.eof().

Добавлено позже:
Цитата: HoRRoR
И что? Говорю же - из пушки по воробьям. Тебя бы на работу не взяли, если бы ты тестовое задание решил так.
Ну вот тебе на  :'( Но я не вижу в чём преимущество твоего кода. Функция strstr возвращает указатель на вхождение ID, функция strtok тоже возвращает указатель на вхождение ID.  Дальше ты копируешь 6 символов (если ID больше то надо считать, а это ещё плюс строки и переменные) и корректируешь адрес своей строки (str += 3), если после ID не будет пробела то ID считано вовсе будет не верно так что ещё и тут надо проверку добавлять ... а если пробел не 1 а 2 или больше ( ещё + проверка) ... в итоге объём кода и количество проверок для переменной для столь простой задачи и правда будет больше похож на курсовую (ALEX_230_VOLT, задумайся над этим  :D).
В общем может это я по неопытности не вижу преимущества всех твоих проверок и использования функции strstr вместо strtok (ну блин, они же тоже самое делают) так что пусть будет так. Если при приёме на работу попросят такую программу написать - буду знать что делать :)
« Последнее редактирование: 15 Май 2011, 20:41:02 от gepar »

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #343 : 15 Май 2011, 22:27:19 »
Цитата
(ну блин, они же тоже самое делают)
Во-первых, strstr не изменяет строку (работает с const char*, что важно).
Во-вторых, strtok разделяет на лексемы, поиск не является её применением по назначению. Это как минимум архитектурная ошибка. К тому же, при таком способе требуется копирование памяти, чтобы сохранить оригинал. Это бред.
В-третьих, функция strtok не ищет строку, она ищет первый попавшийся символ из строки, а не всю строку целиком. Если у тебя в тексте отдельно встречаются I и D, он на них тоже среагирует.

Цитата
Если при приёме на работу попросят такую программу написать - буду знать что делать
Я вот устраиваюсь, мне дали восемь заданий, в первом надо примерно такой сложности косяки исправить. Так что всё может быть.

В общем, ты просто упёртый.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #344 : 16 Май 2011, 01:13:14 »
Цитата: HoRRoR
В-третьих, функция strtok не ищет строку, она ищет первый попавшийся символ из строки, а не всю строку целиком. Если у тебя в тексте отдельно встречаются I и D, он на них тоже среагирует.
А вот этого не знал, и правда на I отдельно реагирует, я всегда думал что она ищет указанную строку, а не просто вхождение первого символа из указанной строки, тогда и правда не пойдёт она для такой цели.

Добавлено позже:
Цитата: HoRRoR
Я вот устраиваюсь, мне дали восемь заданий, в первом надо примерно такой сложности косяки исправить. Так что всё может быть.
Даёшь в публичный доступ, интересно же что за задания, ато на хабре была статья с вопросами на собеседовании так вот всё  были по основам и я смог ответить сразу же почти на все (несмотря на то что даже Дейтела ещё не дочитал) так что хочу видеть серьёзные тестовые задания, которые дают при приёме на работу  :)

Оффлайн AjaxVS

  • Пользователь
  • Сообщений: 305
    • Youtube
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #345 : 16 Май 2011, 02:46:15 »
Я вот устраиваюсь, мне дали восемь заданий, в первом надо примерно такой сложности косяки исправить.
о, я таким интересуюсь. можно задания на мыло? за какое время надо решать? и если не секрет - что за уровень фирмы (читай - какая зарплата)?

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #346 : 16 Май 2011, 11:48:48 »
Даёшь в публичный доступ
Только лично. См. ЛС.

Цитата
о, я таким интересуюсь. можно задания на мыло? за какое время надо решать? и если не секрет - что за уровень фирмы (читай - какая зарплата)?
См. ЛС.

Оффлайн DeniSS

  • Пользователь
  • Сообщений: 1088
  • Пол: Мужской
  • Сама скрытность
    • ВКонтакте
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #347 : 18 Май 2011, 09:15:47 »
Только лично. См. ЛС.
См. ЛС.
О, если можно, форвард мне пожалуйста.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #348 : 22 Май 2011, 22:07:04 »
Тааак, задам экстремальный вопрос:
В общем была себе перегрузка оператора ввода в одном примере, рассчитана на ввод 14 символов и их сохранение в разных переменных, а теперь вот захотелось мне добавить изначально проверку содержимого, но хитро - так чтобы предыдущий написанный код не редактировать. Так вот проверку входящего потока я пририсовал, а вот теперь хочу чтобы если всё хорошо с потоком то из моего символьного массива всё запихивалось в поток на ввод, те: создать для программы впечатление что во входящем потоке уже есть 14 символов из моего массива и теперь при следующем cin>> оно сначала сжевало мои запихнутые 14 символов, а потом уже принималось за ввод с клавиатуры. Можно так?  :)
Изначально вообще код был такой
istream &operator>>( istream &ainput, PhoneNumber &number )
{
   ainput.ignore(); // skip (
   ainput >> setw( 3 ) >> number.areaCode; // input area code
   ainput.ignore( 2 ); // skip ) and space
   ainput >> setw( 3 ) >> number.exchange; // input exchange
   ainput.ignore(); // skip dash (-)
   ainput >> setw( 4 ) >> number.line; // input line
   return ainput; // enables cin >> a >> b >> c;       
}; // end function operator>>

Теперь такой
istream &operator>>( istream &ainput, PhoneNumber &number )
{
   char c[15];
   ainput.get(c,14);
   if (ainput.gcount()<14)
    ainput.clear(ios::failbit);
   if (c[1]==1 || c[1]==0)
    ainput.clear(ios::failbit);
   if (c[2]!=0 && c[2]!=1 )
    ainput.clear(ios::failbit);
// ВОТ ЗДЕСЬ НАДО БЫ КАК-ТО ПОДПИХНУТЬ В ПОТОК СОДЕРЖИМОЕ МАССИВА СИМВОЛОВ C, НУ КРОМЕ СИМВОЛА '\0' КОНЕЧНО ЖЕ
   if (!(ainput.fail()))
   {
   ainput.ignore(); // skip (
   ainput >> setw( 3 ) >> number.areaCode; // input area code
   ainput.ignore( 2 ); // skip ) and space
   ainput >> setw( 3 ) >> number.exchange; // input exchange
   ainput.ignore(); // skip dash (-)
   ainput >> setw( 4 ) >> number.line; // input line
   return ainput; // enables cin >> a >> b >> c;       
   }
}; // end function operator>>

Добавлено позже:
Написал тут очередное задание по Дейтелу и удостоверился что для проверки данных уходит слишком много усилий. Если интересно

Добавлено позже:
И ещё один вопрос:
В Дейтеле как-то косвенно упомянута хитрая возможность, вот текст
Элемент-функция operator! из basic_ios возвращает true, если установлен
или badbit, или failbit, или оба бита. Элемент-функция operator void * 
возвращает false (О), если установлены badbit и/или failbit. Эти функции удобны
при обработке файлов, когда в операторе выбора или повторения проверяется
условие true/false.
К чему применять оператор ! и что приводить к указателю на void чтобы узнать установлен ли badbit и failbit вместе? Помоему переводчик что-то пропустил, в книге уже такое было не раз, но раньше я дешифровывал что же написано не так, а тут не могу. Подскажите же пожалуйста  :)

Оффлайн DeniSS

  • Пользователь
  • Сообщений: 1088
  • Пол: Мужской
  • Сама скрытность
    • ВКонтакте
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #349 : 22 Май 2011, 22:14:23 »
! - это ж логическое отрицание.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #350 : 22 Май 2011, 22:25:34 »
DeniSS, это ты так тонко пошутил, да?  :lol:
Уж после того как мне полгода читали курс с++ я как-то заметил уж, поначалу не верил, но потом заметил тождество что каждый раз когда его пишу так и идёт отрицание  :D
К чему отрицание применять чтобы сразу проверить и badbit и failbit? Переводчик видать пропустил.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #351 : 23 Май 2011, 02:01:57 »
gepar, ну читай же ты спецификацию, прежде чем глупые вопросы задавать.
http://www.cplusplus.com/reference/iostream/ios/operatornot/

К потоку применяй. !cin = cin.fail().

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #352 : 23 Май 2011, 11:26:14 »
HoRRoR,аааа, ясно. А что с запихиванием данных назад в поток? Или так нельзя?

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #353 : 24 Май 2011, 19:02:07 »
По поводу баловства с потоком: нашёл такую штуку как unget, но она может возвратить только один последний считанный символ что неудобно (результат последующих вызовов не определён). Потом наткнулся на  putback, но тем не менее работает она странно при каскадировании ... хотелось бы посмотреть что же творится во входящем потоке в это время через дебагер, но не знаю как это сделать. Подскажите как следить за данными в потоках, ато что-то code::blocks и devc++ предлагают следить только за переменными.

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1284
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #354 : 24 Май 2011, 19:43:57 »
офф: gepar, если составлять представление о языке по этой теме, то возникает такое чувство, что цпп сделан, чтобы усложнить жизнь нормальным людям. По большей части за это я его не люблю. Языки должны наоборот, облегчать жизнь и понимание написанного. Вспоминаю сравнение перла и питона. А в сях некоторые простые вещи делаются через ж*пу, а при желании можно заставить и остальные вещи делать через ж*пу, макросами или перегрузкой.
Можно было сделать синтаксис намного проще и понятней, без всяких закорючек, строгих (или индусских) последовательностей закорючек, двусмысленностей и т.д., при этом с такой же функциональностью. И с нормальной совместимостью между компиляторами/средами или хотя бы их версиями. Но люди не ищут лёгких путей!
Вспоминаю, как часто путался в указателях и ссылках и const'ами на ссылку или на значение. Как путался, ставя точку вместо -> для классов. Да, формально так и должно быть, но почему-то дельфисты решили, что человек важнее, поэтому не стали никому морочить голову, и в структурах, и в классах ставится точка. Кстати, структуры в новых дельфях - это почти полноценные классы, единственное отличие - их не надо создавать через конструктор.

Если не согласны насчёт сложности и заморочек, сравните, сколько страниц в ЭТОЙ теме и в теме про паскаль.

Это как: чтобы включить свет, надо передвинуть рычаг коробки передач (рядом с выключателем) в строгой последовательности. А если сделаешь неправильно, будет пожар. Или хочешь открыть холодную воду, поворачиваешь вентиль, а вместо этого на тебя льётся кипяток из душа. Примеры утрированы.

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #355 : 24 Май 2011, 20:10:49 »
GManiac,ты утрируешь  :) Особенно здесь
Цитата: GManiac
Вспоминаю, как часто путался в указателях и ссылках и const'ами на ссылку или на значение. Как путался, ставя точку вместо -> для классов.
В моей теме по паскаль меньше страниц потому что у паскаля возможностей же меньше, я за пол года его практически полностью изучил (кстати ничего себе полезного так на нём и не написал, разве что по чм каким-то методом решал уравнение , методом Симпсона вроде) а вот дельфи после паскаля что-то показалась мечтой быдло-программиста (программирование мышкой же!) и я после созданий пары кнопок да окошек (без путеводителя найти ничего невозможно, даже банально откомпилировать скопипащенный код) закинул это дело. Ну и на данный момент меня всё же привлекает с++, а для тех кому хочется в коде видеть больше не сокращённых понятных слов  есть си решётка  :)

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1594
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #356 : 24 Май 2011, 20:26:29 »
Цитата: GManiac
Как путался, ставя точку вместо -> для классов.
Можешь также вызывать указатель на класс  без ->.
(*obj).one;
Цитата: GManiac
Можно было сделать синтаксис намного проще и понятней, без всяких закорючек
Что же не сделал? :)
Цитата: GManiac
А в сях некоторые простые вещи делаются через ж*пу, а при желании можно заставить и остальные вещи делать через ж*пу, макросами или перегрузкой.
Это зависит не от языка, а от выбора программиста.Можешь писать через Ж, можеш через.....Свобода.
« Последнее редактирование: 24 Май 2011, 20:46:34 от Mr2 »

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #357 : 24 Май 2011, 20:55:08 »
Цитата: Mr2
Что же не сделал?
Не, он о cout например (взглянув не зная синтаксиса можно не догадаться что это), writeln  в этом случае выглядите логичние, но само слово то длиннее . А вообще все эти разделения на процедуры , bigin /end'ы ({} короче же и не менее понятно да ещё и выделяются хорошо  :) ).

Добавлено позже:
Кстати о веслых штуках в с++
int main ()
{
    int i=1;
    i=++i + ++i;
    cout<<i;
}

Почему шесть?  :lol:

Оффлайн topos84

  • Emu-Land Team
  • Сообщений: 2762
  • Пол: Мужской
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #358 : 24 Май 2011, 21:05:02 »
Цитата: gepar
Почему шесть?
А не 5. :) Одна из операций ++i выполняется 2 раза?
« Последнее редактирование: 24 Май 2011, 21:07:05 от topos84 »

Оффлайн Fly

  • Пользователь
  • Сообщений: 1896
  • Пол: Мужской
    • Steam
    • Youtube
    • Просмотр профиля
Re: Програмирование на C++
« Ответ #359 : 24 Май 2011, 21:10:14 »
Наверное сначала выполняются обе операции ++i, а потом уже сложение получившихся i. Получается 3+3=6.