LoveRead.info » Книги » Разная литература » Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Книгу Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

288 0 18:03, 26-08-2023
Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
26 август 2023

Книга Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читать онлайн бесплатно без регистрации

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

    1 ... 64 65 66 67 68 69 70 71 72 ... 337
    Перейти на страницу:
    а не иначе?”, или “Что же она делает?” Введите число 2 и символ перехода на новую строку. Ответа вы не получите! Введите символ перехода на новую строку еще раз, чтобы убедиться, что компьютер не завис. Ответа по-прежнему нет. Введите число 3 и символ перехода на новую строку. Ответа нет! Введите число 4 и символ перехода на новую строку. Ответ равен 2! Теперь экран выглядит так:

    2

    3

    4

    2

    Введем выражение 5+6. Ответ равен 5, а экран выглядит так:

    2

    3

    4

    2

    5+6

    5

    Несмотря на свой опыт, скорее всего, вы будете сильно озадачены. Даже опытный программист будет озадачен таким поведением программы. Что происходит? В этот момент попробуйте выйти из программы. Как это сделать? Мы “забыли” указать в программе команду выхода, но прекращение работы может спровоцировать ошибка, поэтому введите символ х, и программа в ответ выведет на экран фразу Неправильная лексема и закончит работу. Наконец-то хоть что-то работает, как запланировано!

     Однако мы забыли провести различие между вводом и выводом на экран. Прежде чем перейти к решению основной задачи, давайте исправим вывод, чтобы экран лучше отражал то, что мы делаем. Добавим символ =, чтобы отметить результат.

    while (cin) cout << "= " << expression() << 'n'; // версия 1

    Теперь введем ту же самую последовательность символов, что и раньше. На экране появится следующее:

    2

    3

    4

    = 2

    5+6

    = 5

    x

    Неправильная лексема

    Странно! Попробуйте понять, почему программа делает это. Мы попробовали еще несколько примеров. Только посмотрите на эту головоломку!

    • Почему программа реагирует после ввода символов 2 и 3 и ввода символа перехода на новую строку?

    • Почему после ввода числа 4 программа выводит на экран число 2, а не 4?

    • Почему при вычислении выражения 5+6 программа выводит число 5, а не 11?

    Существует множество способов получить такие загадочные результаты. Некоторые из них мы проверим в следующей главе, а пока просто подумаем. Может ли программа руководствоваться неверной арифметикой? Это крайне маловероятно: значение 4 не может быть равным 2, а 5+6 равно 11, а не 5. Попробуем разобраться, что происходит, когда мы вводим символы 1 2 3 4+5 6+7 8+9 10 11 12 и символ перехода на новую строку.

    1 2 3 4+5 6+7 8+9 10 11 12

    = 1

    = 4

    = 6

    = 8

    = 10

    Что? Ни 2, ни 3. Почему число 4 в выводе есть, а числа 9 нет (т.е. 4+5)? Почему среди результатов есть число 6 и нет числа 13 (т.е. 6+7)?

    Хорошенько подумайте: программа выводит каждую третью лексему! Может быть, программа “съедает” часть входной информации без вычислений? Похоже на это. Проанализируем функцию expression().

    double expression()

    {

      double left = term();  // считываем и вычисляем Терм

      Token t = get_token(); // получаем следующую лексему

      while(true) {

        switch(t.kind) {

        case '+':

          left += term();    // вычисляем и добавляем Term

          t = get_token();

          break;

        case '–':

          left –= term();    // вычисляем и вычитаем Терм

          t = get_token();

          break;

        default:

          return left;       // финал: символов + и – нет;

                             // возвращаем ответ

        }

      }

    }

    Если объект класса Token, возвращаемый функцией get_token(), не равен '+' или '–', выполняем оператор return. Мы не используем этот объект и не храним его в памяти для использования в других функциях. Это не умно. Отбрасывание входной информации без анализа недальновидно. Беглый анализ показывает, что функции term() присущ такой же недостаток. Это объясняет, почему наш калькулятор “съедает” по две лексемы после одной использованной.

    Модифицируем функцию expression() так, чтобы она не “съедала” лексемы. Куда поместить следующую лексему (t), если программа никак не использует ее? Можно рассмотреть много сложных схем, но давайте просто перейдем к очевидному ответу (его очевидность станет ясной позднее): поскольку лексема будет использована другой функцией, которая будет считывать ее из потока ввода, давайте вернем лексему обратно в поток ввода, чтобы ее могла считать другая функция! Действительно, мы можем вернуть символ обратно в поток ввода, но это не совсем то, что мы хотим. Мы хотим работать с лексемами, а не возиться с символами. Итак, хотелось бы, чтобы поток ввода работал с лексемам, а мы имели бы возможность записывать в него уже считанные лексемы.

    Предположим, в нашем распоряжении есть поток лексем — “Token_stream” — с именем ts. Допустим также, что поток Token_stream имеет функцию-член get(), возвращающую следующую лексему, и функцию-член putback(t), возвращающую лексему t обратно в поток.

    Мы реализуем класс Token_stream в разделе 6.8, как только увидим, как его следует использовать. Имея поток Token_stream, можем переписать функцию expression() так, чтобы она записывала неиспользованную лексему обратно в поток Token_stream.

    double expression()

    {

      double left = term(); // считываем и вычисляем Терм

      Token t = ts.get();   // получаем следующую лексему

                            // из потока лексем

      while(true) {

        switch(t.kind) {

        case '+':

          left += term();   // вычисляем и добавляем Терм

          t = ts.get();

          break;

        case '–':

          left –= term();   // вычисляем и вычитаем Терм

          t = ts.get();

          break;

        default:

          ts.putback(t);    // помещаем объект t обратно

                            // в поток лексем

          return left;      // финал: символов + и – нет;

                            // возвращаем ответ

        }

      }

    }

    Кроме того, такие же изменения следует внести в функцию

    1 ... 64 65 66 67 68 69 70 71 72 ... 337
    Перейти на страницу:
    1. Жалоба
    Отзывы - 0

    Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


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

    • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
    • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
    • 3. Просьба отказаться от нецензурной лексики.
    • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

    Надеемся на Ваше понимание и благоразумие. С уважением, администратор LoveRead.info.


    Установить VPN и читай слушай бесплатно

    Новые отзывы

    1. Людмила Хофман Людмила Хофман10 июнь 22:13 У меня перевернулся мир после прочтения ваших книг! Так приятно и чисто на душе, ведь по сути неважно кто с кем , а только любовь... Долгая игра - Рейчел Рид
    2. Анна Анна08 июнь 11:28 Спасибо за новую историю жизни и любви на сайте,прочитала с удовольствием .... Давай поженимся - Юлия Резник
    3. Елена Елена08 июнь 11:13 Прочла несколько романов этого, без сомнения, талантливого автора. Впечатление прекрасное, но хотелось бы когда-нибудь прочесть... Предатель. Ты врал мне годами - Арина Арская
    Все комметарии
    Новинки бесплатной онлайн библиотеки