Найти среднюю зарплату из файла в C++

Мне нужно найти среднюю зарплату из сотрудников файла

   John Harris $50000.00
   Lisa Smith $75000.00
   Adam Johnson $68500.00
   Sheila Smith $150000.00
   Tristen Major $75800.00
   Yannic Lennart $58000.00
   Lorena Emil $43000.00
   Tereza Santeri $48000.00

Как я могу получить доступ к зарплате сотрудников, чтобы найти среднее значение? Мне удалось получить каждую строку файла в строку, но я не знаю, как получить доступ к зарплате каждого сотрудника, мой код:

#include<iostream>
#include<fstream>
#include<cstring>

#include<cstdlib>
using namespace std;

int main()
{
    ifstream in;
    in.open("HW6Prob2.txt");

    if(in.fail())
    {
        cout<<"ERROR: File could not open."<<endl;
        exit(1);
    }

    string word[8];

    int i=0;
    for(i=0;i<8;i++)
    {
        getline(in,word[i]);    //get line string
        out<<word[i]<<endl;
    }
    string a=word[0];
    string b=word[1];
    string d=word[3];
    string e=word[4];
    string f=word[5];
    string g=word[6];
    string h=word[7];
    cout<<a[13]<<endl;
    string sum=
    cout<<sum<<endl;

    return 0;
}

4 ответа

Решение

Я бы посоветовал вам продолжать добавлять среднее значение, пока вы читаете строки, поэтому вы просто перебираете список зарплат один раз.

int i = 0; 
float avg_salary = 0;
string line;
// get the sum while you read the lines
while(getline(in, line)) {
    // find the first salary digit position (just after the $ sign)
    int salaryStartPos = line.find('$') + 1;
    // Convert the salary string to a float with the atof method
    avg_salary += atof(line.substr(salaryStartPos, line.size()-1)
    ++i;
}
// Finally calculate the average
avg_salary = avg_salary / i;

Это похоже на школьное задание, поэтому я дам вам несколько советов о том, как решить проблему с помощью псевдокода:

sum = 0
numberOfPersons = 0
for each line in "HW6Prob2.txt"
  pos = find position of $
  salary = cut the string from pos and parse as double

  sum = sum + salary
  numberOfPersons = numberOfPersons + 1
loop

average = sum / numberOfPersons

Я надеюсь, вы найдете это полезным!

Вы можете использовать функцию stof для получения значения типа float из строки. Все, что вам нужно, это выяснить начальную точку поплавка. В вашем случае вы можете использовать position of $ + 1 в качестве отправной точки. Используйте функцию поиска для этого.

Сначала вы должны перебрать строки файла (до конца), чтобы прочитать все данные:

std::string line;
while(std::getline(file, line))
{
  // tokenize to get the last item and store it
}

Если ваша файловая структура строго определена, как представлено: [first_name] [last_name] $[salary], вы можете прочитать каждую запись о зарплате следующим образом:

const string salaryText = line.substr(line.find_last_of('$') + 1);

Извлеченный текст зарплаты должен быть преобразован в число и сохранен в vector<float> или агрегировано для каждой строки. Это зависит от того, нужен ли вам в определенный момент доступ к определенной зарплате. Если бы вы использовали векторную опцию, вы могли бы написать что-то вроде:

salaryList.push_back(std::stof(salaryText));

После этого вы можете рассчитать среднюю зарплату с помощью:

const double salarySum = std::accumulate(salaryList.begin(), salaryList.end(), 0.0);
const double salaryMean = salarySum / salaryList.size();

Преимущество наличия списка зарплат состоит в том, что вы можете дополнительно рассчитать другую статистику, а не только среднее значение.

Другие вопросы по тегам