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

Выбрать машину с наибольшим пробегом - C++

Восстановить пароль Регистрация
 
Бедел
 Аватар для Бедел
232 / 28 / 4
Регистрация: 04.06.2010
Сообщений: 283
30.05.2014, 01:44     Выбрать машину с наибольшим пробегом #1
Приветствую вас, уважаемые форумчане.

Запускаю одну и ту же программу в CodeBlocks(mingw) и в VS2010, результат разный..
Привожу код программы:

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
 
class Country
{
public:
    Country()  // Конструктор без параметров
    {
        cout << "\nИспользован конструтор без параметров !" << "\n";
    }
    Country (string nameC) // Конструктор с параметрами
    {
        cout << "\nИспользован конструтор c параметрами !" << "\n";
        nameCountry = nameC;
    }
    void set_N(string nameC) {nameCountry = nameC;}  // метод для ввода названия страны
    string get_N() { return nameCountry; } // метод для возвращения названия страны
    void show_N() // метод для вывода названия страны
        {
            cout << "Название страны: " << nameCountry << "\n";
        }
private:
    string nameCountry;
};
class Car : public Country
{
public:
    Car () : Country() // конструктор класса Car вызывает конструктор класса Country без параметров
    {}
    Car (string nameC) : Country(nameC) // конструктор класса Car вызывает конструктор класса Country c параметрами
    {
        nameCountry = nameC;
    }
    void NameCar (int i) // метод для ввода и вывода названия машины, её марки, потребляемого горючего и объёма бензобака
    {
        cout << "Введите название марки №" << i+1 << ": ";
        cin >> carName;
        cout << "Введите название модели №" << i+1 << ": ";
        cin >> modelName;
        cout << "Введите потребление горючего л/км для модели №" << i+1 << ": ";
        cin >> liters;
        cout << "Введите  объем бензобака(л) для модели №" << i+1 << ": ";
        cin >> bulk;
        cout << "Название марки: " << carName << "\n";
        cout << "Название модели: " << modelName << "\n";
        cout << "Потребление горючего л/км: " << liters << "\n";
        cout << "Объём бензобака: " << bulk << "\n";
    }
    void Probeg(int i) // метод для вычисления пробега машины
    {
        pr[i]=bulk/liters;
        cout << "Пробег машины: " << pr[i] << "км." << "\n";
    }
    void MaxProbeg(int kol) // метод для выбора машины с наибольшим пробегом
    {
        cout << "Это функция, вызванная объектом, который передан в функцию !" << "\n";
        cout << "Используем её для выбора машины с наибольшим пробегом.";
        double maxProbeg=pr[0];
        int indexCar=0;
        for (int i=0; i<kol; i++)
        {
            if (maxProbeg <= pr[i])
            {
                maxProbeg = pr[i];
                indexCar = i;
            }
        }
        cout << "\nМашина с максимальным пробегом №" << indexCar+1 << ", её пробег составляет: " << maxProbeg << "км." << "\n";
    }
private:
    string nameCountry, carName, modelName;
    double liters, bulk, pr[10];
};
void display (Car ob, int k) // Функция вне класса для передачи функции объекта
{
    ob.MaxProbeg(k);
    cout << "\n";
}
int main()
{
    setlocale(LC_ALL, "Russian");
    string nameC;
    double kol;
    Car p1;
    cout << "Введите страну: ";
    cin >> nameC;
    p1.set_N(nameC);
    p1.show_N();
    cout << "Введите количество машин: ";
    cin >> kol;
    for (int i=0; i<kol; i++)
    {
        Car p2(nameC);
        p2.NameCar(i);
        p2.Probeg(i);
    }
    if (kol>1) // функция определения максимального пробега вычисляется только в том случае, когда количество машин больше 1
    {
        Car ob;
        display(ob, kol);
    }
    system("PAUSE");
    return 0;
}
После выполнения этого кода в VS2010, программа неправильно считает максимальный пробег, берёт значение из "мусора". В случае с CodeBlocks всё нормально. Прилагаю два скрина:
Выбрать машину с наибольшим пробегом

Выбрать машину с наибольшим пробегом

Понимаю, что код не маленький, и копаться в нём станет не каждый, но прошу всё же в свободное время кого-нибудь посмотреть(проблема не такая уж и большая, просто хочется понять, почему так). Заранее спасибо всем за уделённое внимание.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2014, 01:44     Выбрать машину с наибольшим пробегом
Посмотрите здесь:

Как заставить машину ждать перед очередным выполнением цикла? C++
Как перенести приложение вместе с классом на другую машину? C++
C++ Найти паралелограмм с наибольшим количеством точек
Поменять наименьший элемент с наибольшим C++
Через сколько лет этот человек сможет купить машину? C++
Через сколько лет этот человек сможет купить машину? C++
Найти папку с наибольшим числом папок C++
C++ Найти слова с наибольшим количеством гласных букв

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
30.05.2014, 02:26     Выбрать машину с наибольшим пробегом #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
во 2м случае вам просто везет, что переменная ob занимает тот же участок памяти что и p2
повнимательнее прочитайте про области видимости
по всем правилам С++ р2 удаляется после завершения цикла
а у ob область видимости - только блок условия

VS видимо выделяет новое место для ob, поэтому в массиве "мусор"
GCC же использует освободившееся место из под переменной р2

в общем этот код НЕ ДОЛЖЕН работать вообще
Бедел
 Аватар для Бедел
232 / 28 / 4
Регистрация: 04.06.2010
Сообщений: 283
30.05.2014, 02:50  [ТС]     Выбрать машину с наибольшим пробегом #3
Cra3y, понял Вас, спасибо большое за разъяснения. Не подскажете, как лучше всего решить эту проблему ? Как правильно перестроить код ?

Добавлено через 7 минут
Cra3y, ладно, не надо пока ничего, хочу сам разобраться) если не получится, то апну тему.
Yandex
Объявления
30.05.2014, 02:50     Выбрать машину с наибольшим пробегом
Ответ Создать тему
Опции темы

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