Как рассчитать процент при чтении файла?

0

Я хочу знать, как я могу вычислить процент, пока я читаю данные из потока файлов. Я пробовал этот путь, и все, что я получаю, равно нулю

typedef struct Counter{
    int range1,range2,range3,range4;
    double preset1 ,preset2 ,preset3 ,preset4;
}  countType;

    void analysis_range(double d, countType &ctp) {

        // from 0 to 1.00 KM
        if (d >= 0.00 && d <= 1.00) {
            ctp.range1 += 1;
            ctp.preset1 = ((ctp.range1 / (ctp.range1 + ctp.range2 + ctp.range3 +
                                          ctp.range4)));
        }
        // from 1.00 to 2.00 KM
        else if (d > 1.00 && d <= 2.00) {
            ctp.range2 += 1;
            ctp.preset2 = ((ctp.range2 / (ctp.range1 + ctp.range2 + ctp.range3 +
                                          ctp.range4))) *
                          10;
        }
        // from 1.00 to 2.00 KM
        else if (d > 2.00 && d <= 5.00) {
            ctp.range3 += 1;
            ctp.preset3 = ((ctp.range3 / (ctp.range1 + ctp.range2 + ctp.range3 +
                                          ctp.range4))) *
                          10;
        }
        // grater than 5.00 KM
        else if (d > 5.00) {
            ctp.range4 += 1;
            ctp.preset4 = ((ctp.range4 / (ctp.range1 + ctp.range2 + ctp.range3 +
                                          ctp.range4))) *
                          10;
        }
    }

    void ProcesData(int rank, int numProcs) {

        static countType count;
        MPI_Datatype recType = createRecType();
        // read file and populate the vectors
        ifstream foodbankFile("foodbanks.dat");
        ifstream residenceFile("residences.dat");

        // populate datavector
        std::vector<Foodbank> foodbankData(
            (std::istream_iterator<Foodbank>(foodbankFile)),
            std::istream_iterator<Foodbank>());

        Residence res;
        int numLines = 0;

        while (!residenceFile.eof()) {
            residenceFile >> res.x >> res.y;

            if (numLines % numProcs == rank) {
                // call the  process
                // populate_distancesVector(res,foodbankData);
                analysis_range(populate_distancesVector(res, foodbankData),
                               count);
            }
            ++numLines;
        }

        std::cout << "for Rank" << rank << ",from 0 to 1.00 KM:" << count.range1
                  << ",%" << count.preset1
                  << ",from 1.00 to 2.00 KM:" << count.range2 << ",%"
                  << count.preset2 << ",from 2.00 to 5.00 KM:" << count.range3
                  << ",%" << count.preset3
                  << ",grater than 5.00 KM:" << count.range4 << ",%"
                  << count.preset3 << std::endl;
    }
  • 2
    Извините, но я уверен, что вам придется задать вопрос на английском языке. Это невозможно понять сейчас.
  • 3
    Процент чего, пожалуйста?
Показать ещё 2 комментария
Теги:

2 ответа

2
Лучший ответ

Вероятно, вы получаете нуль, потому что ctp.range1 в ctp.range4 не являются значениями с плавающей запятой. Если вы разделите целое число на целое число, результат также станет целым. Включите один из операндов, чтобы поплавать или удвоить, например:

ctp.preset1 = (((float) ctp.range1/(ctp.range1+ctp.range2+ctp.range3+ctp.range4)));
  • 0
    Как вы узнали, что ctp.range1 не является float ? o__O
  • 0
    Угадай, потому что ты сказал, что получаешь ноль, что бы ты ни пытался. Неправильно?
Показать ещё 4 комментария
1

Итак, я понимаю, что ctp.preset1 предполагает удерживать процент для диапазона 1, основываясь на счете в ctp.range1.

Причина, по которой вы носите нуль, если вы используете целые числа, в этой части уравнения:

(ctp.range1/(ctp.range1+ctp.range2+ctp.range3+ctp.range4))

Это всегда будет оцениваться до нуля для значимых значений диапазона, поскольку целые математические вычисления усекаются. Измените его на:

(ctp.range1/double(ctp.range1+ctp.range2+ctp.range3+ctp.range4))

и все должно быть хорошо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню