Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Уроки по C++. Обсуждение.  (Прочитано 14697 раз)

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

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #30 : 28 Октябрь 2013, 21:03:24 »
Цитировать
Функция для получения корня находится в заголовочном файле math.h и называется sqrt

Так часто пишут, но она ведь там не находится.

Там находится описание этой функции. А именно: какие у неё
должны быть аргументы и какой получается результат.

И лучше было бы чуть подробнее рассказать про #include
А то #include <iostream>, но #include <math.h>;
там std, а тут без него...
Делюсь знаниями, но их у меня мало!

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7166
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #31 : 28 Октябрь 2013, 21:24:03 »
inkblack, обязательно постараюсь рассказать, но думал ближе к объявлениям и определениям. А про них надо говорить только после начала изучения функций. Но текст исправлю так, чтоб не было неточностей. Так, кстати не всегда бывает, иногда функция может находиться прямо в хидере, а вся библиотека состоит из хидеров, такое возможно, благодаря работе препроцессора, который включает содержимое всех подключённых файлов в код нашей программы. Но это несколько коряво.
« Последнее редактирование: 28 Октябрь 2013, 21:28:13 от peregrine »

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #32 : 28 Октябрь 2013, 21:38:39 »
Да, вы правы.

Ответы к первому уроку:
(Нажмите, чтобы показать/скрыть)

Естественно, всякие переполнения пока не проверяем,
поскольку это совсем для начинающих.
« Последнее редактирование: 04 Ноябрь 2013, 00:31:11 от inkblack »
Делюсь знаниями, но их у меня мало!

Оффлайн tagezi

  • Оператор IRC
  • Активист
  • *
  • Сообщений: 359
    • Просмотр профиля
    • Информатика в экономике и управлении
Re: Уроки по C++. Обсуждение.
« Ответ #33 : 28 Октябрь 2013, 21:44:46 »
tagezi, почему, же кому-то может быть полезно.
1) Систематизировать свои знания -Да
2) Понять свои пробелы, ошибки, доучиться Да
3) Понять будет ли этот материал кому-то полезен (если да) Может быть полезен.
4) Структурировать так что бы материал свободно воспринимался другим человеком, тем кому это может быть полезно
И если получилось создать такую структуру Ну а что будет, если я сразу начну рассказывать про классы (cout) и структуры? Это уже ООП, а ООП надо изучать только после того, как знаешь и умеешь использовать простые вещи.
5) Разместить его в доступном для заинтересованных месте Потому пока и не в вики, а на форуме и обсуждение есть.

Я говорил не про пункты которые должны присутствовать, а про план действий, который принесёт пользу.
Сначала вы систематизируете, потом ищите ошибки..... и в конце концов выкладываете на форум.
Вы же делаете в обратном порядке все, Сначала выкладываете на форум (что бы вспомнить и систематизировать)...
ASUS K53E, intel i5, 8 Gb, Integrated Intel® GMA HD
wiki LibreOffice
справка LibreOffice

Оффлайн Grigory Smirnov

  • Старожил
  • *
  • Сообщений: 1339
  • Дайте мне исходники, и я переверну Землю.
    • Просмотр профиля
    • Дафтер
Re: Уроки по C++. Обсуждение.
« Ответ #34 : 29 Октябрь 2013, 08:51:24 »
peregrine, я знаю про типизацию. Только вопрос про другое был.

Странно, уже в вводном уроке обсуждают ветвление...

(Нажмите, чтобы показать/скрыть)
tagezi, согласен.

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #35 : 29 Октябрь 2013, 15:10:20 »
RingOV, отлично!
Удовлетворительно :/
Легко делается переполнение.

К сожалению, всё гораздо, гораздо сложнее!
В компьютерных вычислениях нас подстерегает
огромное количество неприятных неожиданностей!

Даже в случае простейшего квадратного уравнения:

Код: Text
  1. sol@eee:~/cpp-lessons$ ./sqsolve
  2. ax²+bx+c=0
  3. Введите через пробел коэффициенты a b c:
  4. 10 2 0.1
  5. D = b²-4ac = -5.96046e-08
  6. D < 0 => уравнение не имеет действительных корней

Из-за ошибки округления неправильно вычислен
дискриминант, и вместо кратного корня получили
отсутствие корней.

Это не ошибка округления, а ПРИНЦИПИАЛЬНО
НЕПРАВИЛЬНЫЙ результат. И исключить все
подобные неприятности — далеко не тривиальная
задача. И она — не для первого урока по C++.

А вот это неправильно:
Код: Text
  1. sol@eee:~/cpp-lessons$ ./sqsolve
  2. ax²+bx+c=0
  3. Введите через пробел коэффициенты a b c:
  4. 0 1 2
  5. D = b²-4ac = 1
  6. D > 0 => уравнение имеет 2 различных корня
  7. x1 = (-b-sqrt(D))/2/a = -inf
  8. x1 = (-b+sqrt(D))/2/a = -nan
Делюсь знаниями, но их у меня мало!

Оффлайн RingOV

  • Активист
  • *
  • Сообщений: 759
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #36 : 29 Октябрь 2013, 15:52:48 »
inkblack,
На счет ошибки округления не понял:
Код: Text
  1. > ./kv_ur
  2. ax²+bx+c=0
  3. Введите через пробел коэффициенты a b c:
  4. 10 2 0.1
  5. D = b²-4ac = 0
  6. D = 0 => уравнение имеет 2 совпадающих корня
  7. x1,2 = -b/2/a = -0.1

Оффлайн JmAbuDabi

  • Старожил
  • *
  • Сообщений: 2468
  • 나는 빅터 해요. 나는 프로그래머입니다
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #37 : 29 Октябрь 2013, 17:33:28 »
Мой вариант квадратного уравнения. Устанена ошибка с округлением, по крайней мере тест на тройке 10 2 0.1 не отваливается.
Для сборки использовал make
(Нажмите, чтобы показать/скрыть)
(Нажмите, чтобы показать/скрыть)


Дополню листингом работы программы:

(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 29 Октябрь 2013, 19:08:27 от JmAbuDabi »
Покой – это не место, где тихо и мирно, где нет шума и беспокойства.
Покой – это когда при всем этом, вы сохраняете мир и спокойствие в своем сердце.

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 4972
  • Все по палатам!
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #38 : 29 Октябрь 2013, 18:02:27 »
JmAbuDabi,
Неверно
  if (D == 0)
читать
http://habrahabr.ru/post/112953/
и в гугле искать "сравнение чисел с плавающей точкой"
Извините, я все еще учусь

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7166
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #39 : 29 Октябрь 2013, 18:20:51 »
inkblack, буду строже ;)
У вас в первой задачке не ошибка есть, а некоторые странности. Что будет, если a==b? Он напишет, что числа a и b отличаются на 0, лучше вывести, что они не отличаются. И зачем перед diff во втором случае -? -0 выведется как 0. Зачем его в +0 превращать при выводе?
Grigory Smirnov, ветвление только для того, чтоб не было совсем скучно. А то считать a+b. a%b, неинтересно.
RingOV, так как операции над числами проходят в двоичной системе, то и округление происходит в двоичной системе и есть ещё одна проблема: в двоичной системе нельзя представить все дробные числа от 0 до 1, так как их бесконечное множество, а размер памяти, отведённый под целую часть переменной и под количество знаков после запятой ограничен.

Оффлайн soarin

  • Старожил
  • *
  • Сообщений: 1751
  • ubuntu 20.04
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #40 : 29 Октябрь 2013, 18:22:26 »
inkblack,
Я про это и имел ввиду, олсо использование float тут непонятно вдвойне.

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7166
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #41 : 29 Октябрь 2013, 18:30:14 »
soarin,
float - понятно. Уравнение вида 0.5x2+0.7x-2 решается. Для большей точности можно double использовать.
RingOV,
Для интереса вот такой код выполните и посмотрите на результат.
Код: C++
  1. #include <iostream>
  2. int main()
  3. {
  4.     float d=100000005;
  5.     std::cout << std::fixed << d << std::endl;
  6.     d=1005;
  7.     std::cout << std::fixed << d << std::endl;
  8.     return 0;
  9. }
У чисел с плавающей точкой есть ещё точность, т.е. количество значащих чисел после запятой.

Оффлайн soarin

  • Старожил
  • *
  • Сообщений: 1751
  • ubuntu 20.04
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #42 : 29 Октябрь 2013, 18:31:24 »
Для большей точности можно double использовать.
В данном случае - нужно, а не можно.

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 4972
  • Все по палатам!
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #43 : 29 Октябрь 2013, 18:33:36 »
soarin,
Это спорно - нужна точность та, которая требуется
Извините, я все еще учусь

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7166
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #44 : 29 Октябрь 2013, 18:34:26 »
soarin, ну тогда уж сразу long double, чего уж мелочиться...

 

Страница сгенерирована за 0.425 секунд. Запросов: 24.