Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
beard74®
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 8
#1

Задачка из книги Страуструпа... - C++

11.03.2012, 12:55. Просмотров 1327. Ответов 15
Метки нет (Все метки)

Доброго времени суток всем!
Заранее благодарен за ответы и, возможные, пути исправления...
Итак:
"Считайте последовательности чисел типа double ввектор.Каждое значение - расстояние между двумя городами на определенном марштуте.
Найти и вывести на печать:
-общее расстояние (сумму всех расстояний);
-наименьшее и наибольшее расстояние между двумя соседними городами;
-среднее расстояние между двумя соседними городами;"
На сайте Страуструпа приведен от такой код (код - его, комменты - мои)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<std_lib_facilities.h>
#include<locale.h>
int main()
try
{
    setlocale(LC_ALL,"");
    vector<double> dist;        // расстояния
    double min = 0;              // минимальное расстояние
    double max = 0;              // максимальное расстояние
    double sum = 0;              // сумма всех расстояний
    cout << "Введите расстояние между городами: " << '\n';
    double val = 0;
    while (cin>>val){             // считываем данные 
        if (val<=0){ 
            if (dist.size() == 0) error("no distances");
                cout << "общее расстояние " << sum << '\n';
                cout << "минимальное расстояние " << min << '\n';
                cout << "максимальное расстояние " << max << '\n';
                cout << "среднее расстояние " << sum/dist.size() << '\n';
                return 0;
            }
        dist.push_back(val);     // помещаем в вектор
        sum += val;
        if (val<min) min = val;
        if (max<val) max = val;
    }
    if (dist.size() == 0) error("no distances");
    cout << "общее расстояние " << sum << '\n';
    cout << "минимальное расстояние " << min << '\n';
    cout << "максимальное расстояние " << max << '\n';
    cout << "среднее расстояние " << sum/dist.size() << '\n';
    //return 0;
}
catch (runtime_error e) {   // сообщение об ошибке
    cout << e.what() << '\n';
}
Вопрос - минимальное значение ВСЕГДА равно нулю. А должно быть - минимальным из введенных.
Где что не так? Или я туплю или исходник не корректен?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2012, 12:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задачка из книги Страуструпа... (C++):

Задачка из книги Страуструпа - C++
Здравствуйте могли бы вы мне помочь в решении задачи. Вот собственно само условие. Условие: Теперь измените тело цикла так, чтобы он...

Задачка от Страуструпа для новичков - C++
Вот задачка от Страуструпа для новичков char* cat(const char* str_1, const char* str_2) { int len_1 = strlen(str_1), ...

Задачка из страуструпа , глава 4 ,вектора - C++
Здравствуйте, помогите пожалуйста довести задачку до ума Вот сама задачка: {deleted} Нарушены п.5.18 и 5.19 Правил ...

Задание из книги Страуструпа - C++
Здравствуйте! Я решил начать изучать программирование, конкретнее - язык C++. Самым логичным способом изучения мне показалось попробовать...

Задача из книги Страуструпа - C++
Нужна ваша помощь или хотя бы подсказка, в одном из упражнений в книге Страуструпа &quot; Программирование. Принципы и практика с использованием...

Достаточно ли книги Страуструпа? - C++
В общем, учу с++ по страуструпу и думаю: &quot; а хватит ли этого???&quot; . Подскажите книгу, по которой учиться дальше? Спасибо!

15
Duha666
51 / 51 / 5
Регистрация: 10.03.2012
Сообщений: 138
11.03.2012, 12:57 #2
Из того, что есть - исходник некорректен. Вы изначально присваиваете min = 0. Куда уж меньше? Сделайте min = 10000000(значение, большего которого никогда не будет) и все заработает.
0
beard74®
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 8
11.03.2012, 13:01  [ТС] #3
Цитата Сообщение от Duha666 Посмотреть сообщение
Из того, что есть - исходник некорректен. Вы изначально присваиваете min = 0. Куда уж меньше? Сделайте min = 10000000(значение, большего которого никогда не будет) и все заработает.
В том то и дело, что ИМЕННО этот код приведен на его сайте...
В своих комментариях он пишет - "Why are the min and max correctly computed? ..."
0
Duha666
51 / 51 / 5
Регистрация: 10.03.2012
Сообщений: 138
11.03.2012, 13:03 #4
Можно точно сказать, что это не будет работать на положительных числах. Вероятно, просто опечатка.
0
beard74®
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 8
11.03.2012, 13:05  [ТС] #5
Дык! И варианты решения?
0
Duha666
51 / 51 / 5
Регистрация: 10.03.2012
Сообщений: 138
11.03.2012, 13:06 #6
Я уже написал решение:
Цитата Сообщение от Duha666 Посмотреть сообщение
Сделайте min = 10000000(значение, большего которого никогда не будет) и все заработает.
0
beard74®
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 8
11.03.2012, 13:08  [ТС] #7
Цитата Сообщение от Duha666 Посмотреть сообщение
Я уже написал решение:
Как вариант - да...
Но все же, терзают смутные сомнения о собственной глупости и, непостижимой, мудрости Гуру Страуструпа (((((
0
Duha666
51 / 51 / 5
Регистрация: 10.03.2012
Сообщений: 138
11.03.2012, 13:11 #8
Поверьте, это действительно не может работать. Сам часто допускаю подобные ошибки.
0
beard74®
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 8
11.03.2012, 13:16  [ТС] #9
Цитата Сообщение от Duha666 Посмотреть сообщение
Поверьте, это действительно не может работать. Сам часто допускаю подобные ошибки.
То что код не рабочий - это понятно. Не может быть расстояние меньше нуля, а сравнение идет как раз с ним...
Но и допустить наличие подобной опечатки - как то...
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
11.03.2012, 13:44 #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<std_lib_facilities.h>
#include<locale.h>
int main()
try
{
        setlocale(LC_ALL,"");
        vector<double> dist;        // расстояния
        double min = 0;                          // минимальное расстояние
        double max = 0;                          // максимальное расстояние
        double sum = 0;                          // сумма всех расстояний
        bool min_max_initialized = false;
        cout << "Введите расстояние между городами: " << '\n';
        double val = 0;
    while (cin>>val){             // считываем данные 
                if (val<=0){ 
                        if (dist.size() == 0) error("no distances");
                                cout << "общее расстояние " << sum << '\n';
                                cout << "минимальное расстояние " << min << '\n';
                                cout << "максимальное расстояние " << max << '\n';
                                cout << "среднее расстояние " << sum/dist.size() << '\n';
                                return 0;
                        }
                dist.push_back(val);     // помещаем в вектор
                sum += val;
                if (!min_max_initialized)
                {
                    min = max = val;
                    min_max_initialized = true;
                    continue;
                }
                if (val<min) min = val;
                if (max<val) max = val;
        }
        if (dist.size() == 0) error("no distances");
        cout << "общее расстояние " << sum << '\n';
        cout << "минимальное расстояние " << min << '\n';
        cout << "максимальное расстояние " << max << '\n';
        cout << "среднее расстояние " << sum/dist.size() << '\n';
        //return 0;
}
catch (runtime_error e) {       // сообщение об ошибке
        cout << e.what() << '\n';
}
Такое исправление несколько корректнее, чем предлагали ранее
1
beard74®
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 8
11.03.2012, 13:51  [ТС] #11
ForEveR,
Работает!
Гран Мерси!
Вот только я еще не добрался в изучении до:
"...bool min_max_initialized = false;..." (((
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
11.03.2012, 13:54 #12
beard74®, Т.е. вы изучаете векторы и т.д. но не знаете тип bool? Обычный флажок имеющий два состояния true или false. В данном случае в начале программы устанавливается в false, после ввода первого элемента, если он не был отрицательный или нулем, инициализируются min/max и флажок устанавливается в true.
0
beard74®
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 8
11.03.2012, 18:17  [ТС] #13
Цитата Сообщение от ForEveR Посмотреть сообщение
beard74®, Т.е. вы изучаете векторы и т.д. но не знаете тип bool? Обычный флажок имеющий два состояния true или false. В данном случае в начале программы устанавливается в false, после ввода первого элемента, если он не был отрицательный или нулем, инициализируются min/max и флажок устанавливается в true.
В книге Страуструпа "Программирование. Принципы и практика использования C++", в окончании 4 главы, сии вопросы не имеют место быть рассмотренными...
Так что Увы, мои знания в отношении флажков типа bool, пока ниже плинтуса...
В подтверждение сего грустного факта, могу скинуть оглавление книги ((((((((((((((((((((
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
11.03.2012, 18:18 #14
beard74®, Хм. Типы данных насколько я помню в 3-4 главе обсуждаются. Ну да не суть.
0
beard74®
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 8
12.03.2012, 11:58  [ТС] #15
Цитата Сообщение от ForEveR Посмотреть сообщение
beard74®, Хм. Типы данных насколько я помню в 3-4 главе обсуждаются. Ну да не суть.
Обсуждаюся... Мельком. Т.е., типа есть такой тип - bool... И все...
А как с ним общаться и с чем его употреблять - в дальнейших главах...
Я сейчас на 154 странице бьюсь(это окончание 4 главы)...
Краткое упоминание типа bool обнаружил в контрольных вопросах к пятой главе, но описание типа и как его применять - не нашел там((((((
0
12.03.2012, 11:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2012, 11:58
Привет! Вот еще темы с ответами:

пример из книги страуструпа - C++
struct pair { char* name; // ñòðîêà int val; // öåëîå }; const int large = 1024; ...

Задача из книги Страуструпа - C++
Меня настораживает несколько странная формулировка, я не понимаю зачем так предлагают решать задачу: Напишите программу, содержащую цикл...

Задача из книги Страуструпа (4.6.3) - C++
Читаю книгу Страуструпа не могу понять как сортировать функцией sort. пример взят и переписан их книги: &quot;Принципы и практика...

Библиотеки для книги Страуструпа - C++
Доброго времени суток! Дядя Бьярне использует библиотеки в своей книге &quot;Принципы и практика использования С++&quot;, которых нет в компиляторах....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru