Блог пользователя temarazin

Автор temarazin, 12 лет назад, По-русски

Хочу, наконец, перейти с делфи на с++, поэтому хотелось бы спросить, какую кто литературу посоветует? Когда-то начинал читать Страуструпа, но это жесть, я тогда голову сломал. Потом купил себе "Самоучитель С++" Шилдта, но в нем необходимы знания С. Сейчас решаю подряд задачи из книги Шеня "Программирование: теоремы и задачи", а что не знаю — ищу в интернете. Вроде нормально, но хочется более систематизированных знаний.

И еще вопрос: как отформатировать вещественное число в "cout"? Задать кол-во знаков после разделителя или отображать ли нули? Я искал, но находил примеры лишь для сишной функции printf.

  • Проголосовать: нравится
  • +12
  • Проголосовать: не нравится

»
12 лет назад, # |
Rev. 5   Проголосовать: нравится +3 Проголосовать: не нравится

cout.precision(количество знаков после запятой);

cout<<fixed<<x;

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится

    Или так:

    cout << fixed << setprecision(количество знаков после запятой) << x;

»
12 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится
cout.setf(ios::fixed);
cout.precision(7);
cout<<5.5;
»
12 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится

Тоже переходил с дельфи на с++. Я просто решал задачи с informatics.mccme.ru, и то, что не знал искал в инете. И используйте scanf/printf по возможности, чем cout.

  • »
    »
    12 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    А чем cout хуже? Какие преимущества у scanf/printf? За ссылку спасибо, интересно.

    UPD в принципе, я когда учил делфи, то тоже просто брал конкретную задачу, и искал в инете если не знал чего. Этот подход хорош, но можно упустить некоторые мелочи, которые вплывут позднее. Я вот, например, только недавно узнал, что в делфи есть простая функция, определяющая четное число или нет — хотя начинал учить язык еще лет 5 назад.

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      scanf/printf по умолчанию быстрее. Однако лечится sync_with_stdio(false), потому придерживаюсь противоположного мнения

      • »
        »
        »
        »
        12 лет назад, # ^ |
          Проголосовать: нравится +2 Проголосовать: не нравится

        Вы просто не умеете их готовить. scanf/printf мощнее, если ими уметь пользоваться. Например я сходу не умею cin'ом читать "пока символы из данного набора" или просто считать три числа в формате "12.04.2012". И определять сколько штук считалось тоже. И выводить как надо например в длинке с лидирующими нулями тоже не умею.

        • »
          »
          »
          »
          »
          12 лет назад, # ^ |
          Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится

          ...И выводить как надо например в длинке с лидирующими нулями тоже не умею.

          И о чем это нам должно сказать?

          • »
            »
            »
            »
            »
            »
            12 лет назад, # ^ |
              Проголосовать: нравится +5 Проголосовать: не нравится

            Можно аналог для printf("%0*d",baselen,v[i]); с использованием cout? Буду благодарен, я так делать не умею.

            • »
              »
              »
              »
              »
              »
              »
              12 лет назад, # ^ |
                Проголосовать: нравится +11 Проголосовать: не нравится

              cout << setfill('0') << setw(baselen) << v[i];

              Но я, вообще, не о том. Есть два механизма, один из них подходит лучше для одних задач, другой для других. Спорить, что из них "мощнее", не стоит.

              • »
                »
                »
                »
                »
                »
                »
                »
                12 лет назад, # ^ |
                  Проголосовать: нравится +5 Проголосовать: не нравится

                Клево. Я не знал что так можно. Буду иметь ввиду. Давайте сойдемся на том что это дело привычки. Видимо с тем что спор бесполезен мы согласны оба.

        • »
          »
          »
          »
          »
          12 лет назад, # ^ |
          Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

          Тогда, когда мне нужен scanf/printf, я их юзаю. Например, вывожу даблы я обычно printf'ом(хотя тут скорее дело привычки и нежелания 1 раз запомнить, как это делается цином).

          Однако, зачем их юзать "по умолчанию", я не понимаю. Кроме того, что раздражает писать формат, так еще и описка в формате дает трудноловимые баги, да и менять формат надо, если тип переменной сменился. Я уж не говорю про I64d/lld здесь.

          • »
            »
            »
            »
            »
            »
            12 лет назад, # ^ |
              Проголосовать: нравится +5 Проголосовать: не нравится

            Про I64d/lld лечится дефайном, который разберется сам (см. любую мою посылку). Трудноловимые баги лечатся -Wall -Wextra -Werror. Дисциплинирует. Рекомендую. Но вообще на самом деле дело привычки. А sync_with_stdio(false)... С ним можно нарваться на случайно сделанный endl или еще какое-нибудь сбрасывание всего подряд. Или на еще какую-то нетривиальную реализацию. Я все таки предпочитаю пользоваться тем, что понимаю как работает.

            • »
              »
              »
              »
              »
              »
              »
              12 лет назад, # ^ |
              Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

              Ну дефайн я в силах написать, спасибо.

              Насчет -W*, да, согласен, справедливо, хотя как по мне костыльно.

              А sync_with_stdio не кажется мне более непонятным, чем scanf, так что в целом не убедил

              Но вообще на самом деле дело привычки.

              Видимо, придется остановится на этом, хотя и писал ты эту фразу про строки компиляции:)

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Cо scanf дофига проблем в задачах на строки (тут лучше cin).

»
12 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится

Я когда-то давно давно переходил с Delphi на C++, но я к тому времени C++ уже довольно неплохо знал. Ускорил переход Topсoder с возможностью смотреть чужой код после контестов. Сейчас отлично и Codeforces для этого подходит.

Насчет литературы. Я бы все-таки посоветовал справиться со Страуструпом, сам с него начинал. В книге есть пугающие новичков вторая и третья глава, их можно опустить при первом чтении, а так вроде бы не особо сложное чтиво. Если совсем никак, можно попробовать, например, следующие книги, которые часто советуют новичкам:

Thinking in C++: Introduction to Standard C++

C++ Primer

Accelerated C++: Practical Programming by Example

Сам ничего из этого не читал, сказать ничего не могу. Насчет Шилдта... Вообще, я мало видел настолько критикуемых авторов, как он. Почти все его книги в свое время на accu.org получали оценку "Not recommended". Есть даже жаргонное слово :)

Успехов!