Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Работа с файлами.


Автор: Grizli 11.5.2014, 17:47
Код

/*
 Багаж пассажира характеризуется количеством вещей и их общим весом.
 Дан файл Bagazh содержащий сведенья о багаже нескольких пассажиров.
 Сведения о багаже каждого пассажира представляют собой запись с двумя полями:
 одно поле целого типа(количество вещей) и одно действительного (вес в киллограммах).
 Найти багаж, средний вес одной вещи в котором отличается не более чем на 1 кг от общего
 среднего веса одной вещи.
 */

int main() {
    int a;
    float b, c = 0, d = 0, f, e;
    ifstream base("Bagazh.txt");
    if (!base.is_open()) {
        system("echo Файл не может быть открыт");
        system("pause");
        return 0;
    }
    while (!base.eof()) {
        base >> a;
        base >> b;
        c += a; // Считаем общее колличество предметов
        d += b; // Считаем общюю массу предметов
    }
    f = d / c; // Нашли средний
    cout << f << "kg" << " - Sredniy vess odnogo predmeta sredi vsex pasajirov\n";
    while (!base.eof()) {
        base >> a;
        base >> b;
        e = b / a;
        if (fabs(f - e) <= 1) {
            cout << "passajir s " << a << " i " << b << endl;
            system("pause");
            return 0;
        }
    }
    base.close();
    system("pause");
    return 0;
}


В файле Bagazh:
10 50
4 6

В консоле он мне выводит только средний вес одного предмета у всех пассажиров, но не выводит самого пассажира. Хотя по условию (fabs(f - e) <= 1) - он должен это делать.  Я не силён в работе с файлами, может можно ещё как-нибудь оптимизировать этот алгоритм.

Автор: feodorv 11.5.2014, 19:10
Цитата(Grizli @  11.5.2014,  18:47 Найти цитируемый пост)
    while (!base.eof()) {
...
    }
...
    while (!base.eof()) {
...
    }


Ну так первый while уже вычерпал файл до конца, второй вообще не выполняется. Перед вторым циклом нужно переустановить указатель в файле на начало через http://en.cppreference.com/w/cpp/io/basic_istream/seekg smile 

Автор: Grizli 11.5.2014, 19:14
Добавил    base.seekg(0); - спасибО!


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)