2010-04-11 3 views
0

Я почти закончил свою программу, но у меня есть одна проблема, которую я не могу решить. Как получить минимальные расходы?Обработка и вычисления файлов на C++

Мой преподаватель дал мне задание:

Компания вы работаете получает ежемесячный отчет в текстовом формате. В отчете содержится следующая информация: .

  • Название отдела
  • Руководитель отдела Имя
  • месяц
  • Минимальные расходы месяца
  • Максимальная расходы месяца

Ваша программа должна получить имя из входной файл от пользователя. Реализовать структуру для представления данных:

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

  • списка, какой отдел имеет минимальный расходы в месяц на месяце
  • Список, какой отдел имеет минимальные расходы по месяцам по месяцам

Написать информацию в файл под названием «MaxMin.txt»

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

Вот текстовый файл я получил для работы с:

 
Engineering Bill Jan 2000 15000 
IT Jack Jan 300 20000 
HR Jill Jan 1500 10000 

Engineering Bill Feb 5000 45000 
IT Jack Feb 4500 7000 
HR Jill Feb 5600 60000 

Engineering Bill Mar 5000 45000 
IT Jack Mar 4500 7000 
HR Jill Mar 5600 60000 

Engineering Bill Apr 5000 45000 
IT Jack Apr 4500 7000 
HR Jill Apr 5600 60000 

Engineering Bill May 2000 15000 
IT Jack May 300 20000 
HR Jill May 1500 10000 

Engineering Bill Jun 2000 15000 
IT Jack Jun 300 20000 
HR Jill Jun 1500 10000 

и вот с ++ код, который я написал

ue#include <iostream> 
#include <fstring> 
#include <string> 

using namespace std; 

struct Record 
{ 
string depName; 
string head; 
string month; 
float max; 
float min; 
string name; 
} 
myRecord[19]; 

int main() 
{ 
string line; 
ofstream minmax,jan,feb,mar,apr,may,jun; 
char a[50]; 
char b[50]; 
int i = 0,j,k; 
float temp; 
//float maxjan=myRecord[0].max,maxfeb=myRecord[0].max,maxmar=myRecord[0].max,maxapr=myRecord[0].max,maxmay=myRecord[0].max,maxjune=myRecord[0].max; 
float minjan=myRecord[1].min,minfeb=myRecord[1].min,minmar=myRecord[1].min,minapr=myRecord[1].min,minmay=myRecord[1].min,minjune=myRecord[1].min; 
float maxjan=0,maxfeb=0,maxmar=0,maxapr=0,maxmay=0,maxjune=0; 
//float minjan=0,minfeb=0,minmar=0,minapr=0,minmay=0,minjune=0; 
string maxjanDep,maxfebDep,maxmarDep,maxaprDep,maxmayDep,maxjunDep; 
string minjanDep,minfebDep,minmarDep,minaprDep,minmayDep,minjunDep; 
cout<<"Enter file name: "; 
cin>>a; 
ifstream myfile (a); 
//minmax.open ("MaxMin.txt"); 

if (myfile.is_open()){ 
while (! myfile.eof()){ 
    myfile>>myRecord[i].depName>>myRecord[i].head>>myRecord[i].month>>myRecord[i].min>>myRecord[i].max; 
    cout << myRecord[i].depName<<"\t"<<myRecord[i].head<<"\t"<<myRecord[i].month<<"\t"<<myRecord[i].min<<"\t"<<myRecord[i].max<<endl; 
i++; 
} 
myfile.close(); 
} 
else{ 
cout << "Unable to open file"<<endl;} 

cout<<"Enter file name: "; 
cin>>b; 
ifstream myfile1 (b); 
minmax.open ("MaxMin.txt"); 
jan.open ("Jan.txt"); 
feb.open ("Feb.txt"); 
mar.open ("March.txt"); 
apr.open ("April.txt"); 
may.open ("May.txt"); 
jun.open ("Jun.txt"); 
if (myfile1.is_open()){ 
while (! myfile1.eof()){ 
    myfile1>>myRecord[i].depName>>myRecord[i].head>>myRecord[i].month>>myRecord[i].min>>myRecord[i].max; 
if (myRecord[i].month == "Jan"){ 
jan<< myRecord[i].depName<<"\t"<<myRecord[i].head<<"\t"<<myRecord[i].month<<"\t"<<myRecord[i].min<<"\t"<<myRecord[i].max<<endl; 

if (maxjan< myRecord[i].max){ 
    maxjan=myRecord[i].max; 
    maxjanDep=myRecord[i].depName;} 

    for (k=1;k<=3;k++){ 
    for (j=0;j<2;j++){ 
    if (myRecord[j].min>myRecord[j+1].min){ 
temp=myRecord[j].min; 
    myRecord[j].min=myRecord[j+1].min; 
    myRecord[j+1].min=temp; 
    minjanDep=myRecord[j].depName; 
    }}} 
} 
if (myRecord[i].month == "Feb"){ 
feb<< myRecord[i].depName<<"\t"<<myRecord[i].head<<"\t"<<myRecord[i].month<<"\t"<<myRecord[i].min<<"\t"<<myRecord[i].max<<endl; 
if (maxfeb< myRecord[i].max){ 
maxfeb=myRecord[i].max; 
maxfebDep=myRecord[i].depName;} 

for (k=1;k<=3;k++){ 
    for (j=0;j<2;j++){ 
    if (myRecord[j].min>myRecord[j+1].min){ 
temp=myRecord[j].min; 
    myRecord[j].min=myRecord[j+1].min; 
    myRecord[j+1].min=temp; 
    minfebDep=myRecord[j+1].depName; 
    }}} 

} 

if (myRecord[i].month == "Mar"){ 
mar<< myRecord[i].depName<<"\t"<<myRecord[i].head<<"\t"<<myRecord[i].month<<"\t"<<myRecord[i].min<<"\t"<<myRecord[i].max<<endl; 
if (maxmar< myRecord[i].max){ 
maxmar=myRecord[i].max; 
maxmarDep=myRecord[i].depName;} 
if (myRecord[i].min<minmar){ 
    minmar=myRecord[i].min; 
minmarDep=myRecord[i].depName; 
}} 

if (myRecord[i].month == "Apr"){ 
apr<< myRecord[i].depName<<"\t"<<myRecord[i].head<<"\t"<<myRecord[i].month<<"\t"<<myRecord[i].min<<"\t"<<myRecord[i].max<<endl; 
if (maxapr< myRecord[i].max){ 
maxapr=myRecord[i].max; 
maxaprDep=myRecord[i].depName;} 

if (minapr>myRecord[i].min){ 
    minapr=myRecord[i].min; 
    minaprDep=myRecord[i].min;} 
} 

if (myRecord[i].month == "May"){ 
may<<myRecord[i].depName<<myRecord[i].head<<myRecord[i].month<<myRecord[i].min<<myRecord[i].max<<endl; 
if (maxmay< myRecord[i].max){ 
maxmay=myRecord[i].max; 
maxmayDep=myRecord[i].depName;} 

if (minmay>myRecord[i].min){ 
    minmay=myRecord[i].min; 
    minmayDep=myRecord[i].depName;}  
} 

if (myRecord[i].month == "Jun"){ 
jun<< myRecord[i].depName<<"\t"<<myRecord[i].head<<"\t"<<myRecord[i].month<<"\t"<<myRecord[i].min<<"\t"<<myRecord[i].max<<endl; 
if (maxjune< myRecord[i].max){ 
maxjune=myRecord[i].max; 
maxjunDep=myRecord[i].depName;} 

if (minjune>myRecord[i].min){ 
    minjune=myRecord[i].min; 
    minjunDep=myRecord[i].depName;} 
} 

i++; 

myfile.close(); 
} 
minmax<<"department that has maximum spending at jan "<<maxjanDep<<endl; 
minmax<<"department that has minimum spending at jan "<<minjanDep<<endl; 
minmax<<"department that has maximum spending at Feb "<<maxfebDep<<endl; 
minmax<<"department that has minimum spending at Feb "<<minfebDep<<endl; 
minmax<<"department that has maximum spending at March "<<maxmarDep<<endl; 
minmax<<"department that has minimum spending at March "<<minmarDep<<endl; 
minmax<<"department that has maximum spending at April "<<maxaprDep<<endl; 
minmax<<"department that has minimum spending at April "<<minaprDep<<endl; 
minmax<<"department that has maximum spending at May "<<maxmayDep<<endl; 
minmax<<"department that has minimum spending at May "<<minmayDep<<endl; 
minmax<<"department that has maximum spending at June "<<maxjunDep<<endl; 
minmax<<"department that has minimum spending at June "<<minjunDep<<endl; 
} 

else{ 
cout << "Unable to open file"<<endl;} 
} 
+0

Попробуйте снова вставить свой код, затем вставив его в четыре пробела (используйте кнопку). Это предотвращает разбор HTML-кода. Кроме того, откорректируйте сам код. – Thomas

+0

Я поддержал форматирование всего сообщения, чтобы сделать его доступным для чтения и соблюдать соглашения SO. Тогда вы практически стерли это с помощью вашего редактирования. Это было глупо. Я бы рекомендовал вернуться к моей версии, а затем добавить к ней свои изменения. Это увеличило бы шансы людей, которые приложили усилия, чтобы прочитать ваш пост и оказать вам помощь. –

+0

И btw, так что бы удалить zillion прокомментированные строки из вашего кода и отступывать его правильно. –

ответ

1

Мое первое предложение заключается в том, что профессор хочет список Record - а не hardcoding в 19, используйте вектор и заполните его, как вы идете.

vector<Record> records; 

Мое второе предложение - использовать цикл для обработки каждый месяц.

vector<string> months; 
months.push_back("Jan"); 
months.push_back("Feb"); 

for (int i = 0; i < months.size(); ++i) { 
    string month = months[i]; 
    ReadInMonthBudget(&records, month); // Then use a function to read in each month file. 
} 

Тогда вы можете работать на сборе статистику:

for (int i = 0; i < months.size(); ++i) { 
    string month = months[i]; 
    cout << "Min spender in month " << month << ": " << FindMinSpenderInMonth(records, month); 
} 

Использование функций сделает ваш код намного проще понять (и писать), потому что он ломает проблему вниз в более мелкие куски, которые легче решить.

Начните с работы, а затем улучшите его. Если это класс колледжа, ваш профессор может захотеть, чтобы вы пришли к лучшему, чем O (n^2) решение.

1

Первое, что я рекомендую вам, - это улучшение четкости вашей программы. Попробуйте добавить функции, которые будут выполнять простые операции для вас, например, чтение одной строки ввода в структуру (BTW, есть еще одно поле в структуре, которое на входе).

Объявите свои переменные близко к тому, где они вам нужны, нет смысла объявлять заранее все, что вам нужно, вы даже можете забыть, что это было к тому моменту, когда вы на самом деле его используете. Используйте структуры данных, которые упрощают код (вместо N min_month, max_month переменные просто используют вектор минимальных/максимальных значений, индексированных по месяцам, используют векторы вместо массивов, если вы обнаружите, что вам нужны справочные таблицы, рассмотрите возможность использования карт ...)

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

+0

BTW: Если вы можете захватить копию ускоренного C++, я бы начал ее читать ... Он имеет несколько примеров, похожих на то, что вы хотите, и предлагает имеет идиоматический подход –

Смежные вопросы