Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 8
1

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток всем!
Заранее благодарен за ответы и, возможные, пути исправления...
Итак:
"Считайте последовательности чисел типа 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2012, 12:55
Ответы с готовыми решениями:

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

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

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

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

15
53 / 53 / 19
Регистрация: 10.03.2012
Сообщений: 138
11.03.2012, 12:57 2
Из того, что есть - исходник некорректен. Вы изначально присваиваете min = 0. Куда уж меньше? Сделайте min = 10000000(значение, большего которого никогда не будет) и все заработает.
1
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
53 / 53 / 19
Регистрация: 10.03.2012
Сообщений: 138
11.03.2012, 13:03 4
Можно точно сказать, что это не будет работать на положительных числах. Вероятно, просто опечатка.
0
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 8
11.03.2012, 13:05  [ТС] 5
Дык! И варианты решения?
0
53 / 53 / 19
Регистрация: 10.03.2012
Сообщений: 138
11.03.2012, 13:06 6
Я уже написал решение:
Цитата Сообщение от Duha666 Посмотреть сообщение
Сделайте min = 10000000(значение, большего которого никогда не будет) и все заработает.
0
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 8
11.03.2012, 13:08  [ТС] 7
Цитата Сообщение от Duha666 Посмотреть сообщение
Я уже написал решение:
Как вариант - да...
Но все же, терзают смутные сомнения о собственной глупости и, непостижимой, мудрости Гуру Страуструпа (((((
0
53 / 53 / 19
Регистрация: 10.03.2012
Сообщений: 138
11.03.2012, 13:11 8
Поверьте, это действительно не может работать. Сам часто допускаю подобные ошибки.
0
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 8
11.03.2012, 13:16  [ТС] 9
Цитата Сообщение от Duha666 Посмотреть сообщение
Поверьте, это действительно не может работать. Сам часто допускаю подобные ошибки.
То что код не рабочий - это понятно. Не может быть расстояние меньше нуля, а сравнение идет как раз с ним...
Но и допустить наличие подобной опечатки - как то...
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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';
}
Такое исправление несколько корректнее, чем предлагали ранее
2
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 8
11.03.2012, 13:51  [ТС] 11
ForEveR,
Работает!
Гран Мерси!
Вот только я еще не добрался в изучении до:
"...bool min_max_initialized = false;..." (((
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.03.2012, 13:54 12
beard74®, Т.е. вы изучаете векторы и т.д. но не знаете тип bool? Обычный флажок имеющий два состояния true или false. В данном случае в начале программы устанавливается в false, после ввода первого элемента, если он не был отрицательный или нулем, инициализируются min/max и флажок устанавливается в true.
1
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
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.03.2012, 18:18 14
beard74®, Хм. Типы данных насколько я помню в 3-4 главе обсуждаются. Ну да не суть.
0
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 8
12.03.2012, 11:58  [ТС] 15
Цитата Сообщение от ForEveR Посмотреть сообщение
beard74®, Хм. Типы данных насколько я помню в 3-4 главе обсуждаются. Ну да не суть.
Обсуждаюся... Мельком. Т.е., типа есть такой тип - bool... И все...
А как с ним общаться и с чем его употреблять - в дальнейших главах...
Я сейчас на 154 странице бьюсь(это окончание 4 главы)...
Краткое упоминание типа bool обнаружил в контрольных вопросах к пятой главе, но описание типа и как его применять - не нашел там((((((
0
232 / 232 / 69
Регистрация: 30.09.2012
Сообщений: 545
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");
}
1
28.06.2013, 19:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.06.2013, 19:33
Помогаю со студенческими работами здесь

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

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

Задача из книги Страуструпа
В общем, не могу понять логику, по которой необходимо выполнить небольшое задание. Само задание:...

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru