Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
beard74®
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 8
11.03.2012, 12:55     Задачка из книги Страуструпа... #1
Доброго времени суток всем!
Заранее благодарен за ответы и, возможные, пути исправления...
Итак:
"Считайте последовательности чисел типа 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';
}
Вопрос - минимальное значение ВСЕГДА равно нулю. А должно быть - минимальным из введенных.
Где что не так? Или я туплю или исходник не корректен?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2012, 12:55     Задачка из книги Страуструпа...
Посмотрите здесь:

Задачка от Страуструпа для новичков C++
пример из книги страуструпа C++
Задача из книги Страуструпа C++
Задачка из книги Страуструпа C++
C++ Задание из книги Страуструпа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Duha666
50 / 50 / 5
Регистрация: 10.03.2012
Сообщений: 138
11.03.2012, 12:57     Задачка из книги Страуструпа... #2
Из того, что есть - исходник некорректен. Вы изначально присваиваете min = 0. Куда уж меньше? Сделайте min = 10000000(значение, большего которого никогда не будет) и все заработает.
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? ..."
Duha666
50 / 50 / 5
Регистрация: 10.03.2012
Сообщений: 138
11.03.2012, 13:03     Задачка из книги Страуструпа... #4
Можно точно сказать, что это не будет работать на положительных числах. Вероятно, просто опечатка.
beard74®
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 8
11.03.2012, 13:05  [ТС]     Задачка из книги Страуструпа... #5
Дык! И варианты решения?
Duha666
50 / 50 / 5
Регистрация: 10.03.2012
Сообщений: 138
11.03.2012, 13:06     Задачка из книги Страуструпа... #6
Я уже написал решение:
Цитата Сообщение от Duha666 Посмотреть сообщение
Сделайте min = 10000000(значение, большего которого никогда не будет) и все заработает.
beard74®
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 8
11.03.2012, 13:08  [ТС]     Задачка из книги Страуструпа... #7
Цитата Сообщение от Duha666 Посмотреть сообщение
Я уже написал решение:
Как вариант - да...
Но все же, терзают смутные сомнения о собственной глупости и, непостижимой, мудрости Гуру Страуструпа (((((
Duha666
50 / 50 / 5
Регистрация: 10.03.2012
Сообщений: 138
11.03.2012, 13:11     Задачка из книги Страуструпа... #8
Поверьте, это действительно не может работать. Сам часто допускаю подобные ошибки.
beard74®
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 8
11.03.2012, 13:16  [ТС]     Задачка из книги Страуструпа... #9
Цитата Сообщение от Duha666 Посмотреть сообщение
Поверьте, это действительно не может работать. Сам часто допускаю подобные ошибки.
То что код не рабочий - это понятно. Не может быть расстояние меньше нуля, а сравнение идет как раз с ним...
Но и допустить наличие подобной опечатки - как то...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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';
}
Такое исправление несколько корректнее, чем предлагали ранее
beard74®
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 8
11.03.2012, 13:51  [ТС]     Задачка из книги Страуструпа... #11
ForEveR,
Работает!
Гран Мерси!
Вот только я еще не добрался в изучении до:
"...bool min_max_initialized = false;..." (((
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.03.2012, 13:54     Задачка из книги Страуструпа... #12
beard74®, Т.е. вы изучаете векторы и т.д. но не знаете тип bool? Обычный флажок имеющий два состояния true или false. В данном случае в начале программы устанавливается в false, после ввода первого элемента, если он не был отрицательный или нулем, инициализируются min/max и флажок устанавливается в true.
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, пока ниже плинтуса...
В подтверждение сего грустного факта, могу скинуть оглавление книги ((((((((((((((((((((
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.03.2012, 18:18     Задачка из книги Страуструпа... #14
beard74®, Хм. Типы данных насколько я помню в 3-4 главе обсуждаются. Ну да не суть.
beard74®
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 8
12.03.2012, 11:58  [ТС]     Задачка из книги Страуструпа... #15
Цитата Сообщение от ForEveR Посмотреть сообщение
beard74®, Хм. Типы данных насколько я помню в 3-4 главе обсуждаются. Ну да не суть.
Обсуждаюся... Мельком. Т.е., типа есть такой тип - bool... И все...
А как с ним общаться и с чем его употреблять - в дальнейших главах...
Я сейчас на 154 странице бьюсь(это окончание 4 главы)...
Краткое упоминание типа bool обнаружил в контрольных вопросах к пятой главе, но описание типа и как его применять - не нашел там((((((
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2013, 19:33     Задачка из книги Страуструпа...
Еще ссылки по теме:

Библиотеки для книги Страуструпа C++
C++ Задачка из страуструпа , глава 4 ,вектора
C++ Достаточно ли книги Страуструпа?

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

Или воспользуйтесь поиском по форуму:
Chernobyl
211 / 211 / 67
Регистрация: 30.09.2012
Сообщений: 526
28.06.2013, 19:33     Задачка из книги Страуструпа... #16
Ребята,я всегда удивляюсь,почему многие исходники такие длинные.Я вот только учусь,тоже по Страуструпу и тоже делал это задание,снизу мой код,он короче,и на мой взгляд и проще и делает что надо.Только я понимаю,что мой взгляд может с большой вероятностью оказаться вкорне неверным))
Поетому прошу посмотреть на мой код и сказать,может в нем сть какие-то ошибки что не видны мне или какие-то неточности.
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
# include <iostream>
# include <string>
# include <vector>
# include <algorithm>
# include <cmath>
# include <windows.h>
using namespace std;
int main()
{
SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    vector<double> e;
    double var;
    while(cin>>var)
        e.push_back(var);
    double suma=0;
    sort(e.begin(),e.end());
    for(int i=0; i<e.size();i++) suma+=e[i];
        cout <<suma<<endl;
        cout <<"Min = "<< e[0]<<endl;
        cout <<"Max = "<< e[e.size()-1]<<endl;
        cout <<"Average = "<< suma/e.size()<<endl;
    system("pause");
}
Yandex
Объявления
28.06.2013, 19:33     Задачка из книги Страуструпа...
Ответ Создать тему
Опции темы

Текущее время: 01:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru