2016-01-31 1 views
-1

Я создаю программу для отслеживания времени окончания соревнований (лыжи, бег и т. Д.) С интервальным запуском. Программа запрашивает пользователя при первом запуске участника и какие интервалы используются участниками (30 секунд и 60 секунд).Рассчитать собственный объект времени с другими объектами того же класса (перегрузка оператора)

Я пытаюсь рассчитать время, используемое в гонке для каждого конкурента, вычитая время начала с момента окончания (так как все они имеют разные времена начала), но я не могу заставить его работать. Он регистрирует правильное время начала и окончания для каждого участника, но прошедший время объект (который я вычисляю с помощью «Истекшее = завершение - начало» внутри конструктора конкурента) устанавливается только 00:00:00.

Может ли кто-нибудь увидеть, что я сделал неправильно? Что-то не так с моими перегруженными операторами?

#include <iostream> 
#include <iomanip> 
#include <fstream> 
#include "timer.h" 
using namespace std; 

const int MAX_NAME = 30;      // Maks. lengde på navn/nasjonalitet 
const int MAX_COMPS = 20;      // Antall utøvere 
const int MAX_LINE = 60;      // Length of line + '/0' 

class Time 
    { 
    private: 
     int hh, 
      mm, 
      ss; 
    public: 
     Time() 
      { hh = mm = ss = 0; } 
     Time(int h, int m, int s) 
      { hh = h; mm = m; ss = s; } 
     Time operator + (Time t); 
     Time operator - (Time t); 
     bool operator < (Time t); 
     Time operator * (int n); 
     void showTime(); 

    }; 

class Competitor 
    { 
    private: 
     int startNumber; 
     char name[MAX_NAME + 1]; 
     char nationality[MAX_NAME + 1]; 
     Time start; 
     Time finish; 
     Time sinceStart = finish - start; 
    public: 
     Competitor() 
      { 
      startNumber = 0; 
      strcpy_s(name, ""); 
      strcpy_s(nationality, ""); 
      } 
     Competitor(int n, char nm[], char nt[], Time calcStart); 
     void showCompetitor(); 
     void setCompetitor(char buffer[], int n); 
     void setFinish(int h, int m, int s); 
    }; 

void menu(); 
void readFromFile(); 
void showAllCompetitors(); 
Time setInterval(); 
void registerFinish(); 
int read(char text[], int one, int two); 
char read(); 

Competitor competitors[MAX_COMPS];     // Array med plass til MAX_COMPS løpere 

int lastCompetitor = 0;        // Holder styr på antall løpere 
Time compStart, 
    interval; 

// MAIN-FUNKSJON 
int main() 
    { 
    int startH, 
     startM; 
    char choice; 

    interval = setInterval(); 

    cout << "\nEnter start Time for the first competitor (HH MM): "; 
    cin >> startH >> startM; compStart = Time(startH, startM, 0); 

    readFromFile();    // Løpere leses inn fra fil og legges i løper-array 

    menu(); 
    cout << "\nEnter choice: "; choice = read(); 
    while(choice != 'Q') 
     { 
     switch(choice) 
      { 
       case 'R': 
        registerFinish(); 
        break; 
       case 'D': 
        showAllCompetitors(); 
        break; 
       case 'W': 
        // Lag funksjon som skriver resultater til fil 
        // break; 
       default: 
        menu(); 
        break; 
      } 
     cout << "\nEnter choice: "; choice = read(); 
     } 

    competitors[1].showCompetitor(); 

    cout << endl << endl; 



    return 0; 
    } 

// KLASSE-FUNKSJONSDEFINISJONER 
void Competitor::setCompetitor(char buffer[], int n) 
    { 
    startNumber = n; 
    strncpy_s(name, buffer, MAX_NAME); 
    strncpy_s(nationality, buffer + 30, MAX_NAME); 
    } 

void Competitor::showCompetitor() 
    { 
    cout << startNumber << ". " << name << " (" << nationality << ")"; 
    cout << "\nStarted: "; start.showTime(); 
    cout << "\nFinished: "; finish.showTime(); 
    cout << "\nTime used: "; sinceStart.showTime(); 
    } 

Competitor::Competitor(int n, char nm[], char nt[], Time calcStart) 
    { 
    startNumber = n; 
    strncpy_s(name, nm, MAX_NAME); 
    strncpy_s(nationality, nt, MAX_NAME); 
    start = compStart + interval * (startNumber - 1); 
    } 

void Competitor::setFinish(int h, int m, int s) 
    { finish = Time(h, m, s); } 

Time Time::operator + (Time t) 
    { 
    int totalSecs, 
     totalSecs2, 
     diffSecs; 
    Time elapsed; 
    totalSecs = hh * 3600 + mm * 60 + ss;     // Objekt-tidspunkt i sekunder. 
    totalSecs2 = t.hh * 3600 + t.mm * 60 + t.ss;   // Starttidspunkt for løp i sek. 
    diffSecs = totalSecs + totalSecs2;      // Differanse mellom starttidspunkt og objekt-tidspunkt i sek. 

    elapsed.hh = diffSecs/3600; 
    elapsed.mm = (diffSecs % 3600)/60; 
    elapsed.ss = (diffSecs % 60); 

    return elapsed; 
    } 

Time Time::operator - (Time t) 
    { 
    int totalSecs, 
     totalSecs2, 
     diffSecs; 
    Time diff; 
    totalSecs = hh * 3600 + mm * 60 + ss; 
    totalSecs2 = t.hh * 3600 + t.mm * 60 + t.ss; 
    diffSecs = totalSecs2 - totalSecs; 

    diff.hh = diffSecs/3600; 
    diff.mm = (diffSecs % 3600)/60; 
    diff.ss = (diffSecs % 60); 

    return diff; 
    } 

bool Time::operator < (Time t) 
    { 
    int totalSecs, 
     totalSecs2; 
    totalSecs = hh * 3600 + mm * 60 + ss; 
    totalSecs2 = t.hh * 3600 + t.mm * 60 + t.ss; 
    if(totalSecs < totalSecs2) 
     return true; 
    else 
     return false; 
    } 

Time Time::operator * (int n) 
    { 
    int totalSec;     // Gjør om Tid intervall til en int med 30/60 
    Time secToTime;     // Tiden siden start for hver enkelt løper 

    totalSec = (hh * 3600 + mm * 60 + ss) * n;  // Multipliserer intervall-tid med startnummer-1 
    secToTime.hh = totalSec/3600; 
    secToTime.mm = (totalSec % 3600)/60; 
    secToTime.ss = (totalSec % 60); 
    return secToTime;    // Returnerer Tid-objekt med tid siden løpets start 
    } 

void Time::showTime() 
    { 
    cout << " " << setw(2) << setfill('0') << hh << ":" 
     << setw(2) << setfill('0') << mm << ":" 
     << setw(2) << setfill('0') << ss; 
    } 

// ANDRE FUNKSJONSDEFINISJONER 
void menu() 
    { 
    cout << "\nR - Register a new finish"; 
    cout << "\nD - Displays the current list of finished competitors"; 
    cout << "\nW - Write results to file"; 
    cout << "\nQ - Quit program"; 
    cout << endl; 
    } 

void readFromFile() 
    { 
    ifstream infile("COMPETITORS.DTA"); 
    int count = 1; 
    char name[MAX_NAME]; 
    char nat[MAX_NAME]; 
    Time calcStart; 

    if(infile) 
     { 
     infile.getline(name, MAX_NAME); 
     infile.getline(nat, MAX_NAME); 
     competitors[count] = Competitor(count, name, nat, calcStart); 
     while(infile) 
      { 
      ++lastCompetitor; 
      infile.getline(name, MAX_NAME); 
      infile.getline(nat, MAX_NAME); 
      competitors[++count] = Competitor(count, name, nat, calcStart); 
      } 
     } 
    } 

void showAllCompetitors() 
    { 
    for(int i = 0; i < lastCompetitor; i++) 
     { 
     competitors[i+1].showCompetitor(); 
     cout << endl; 
     } 
    } 

Time setInterval() 
    { 
    int choice; 
    cout << "\nEnter interval between competitors\n\t1. 30 seconds\n\t2. 60 seconds"; 
    choice = read("Choice", 1, 2); 
    if(choice == 1) 
     return Time(0, 0, 30); 
    else 
     return Time(0, 1, 0); 
    } 

void registerFinish() 
    { 
    Timer t; 
    int n, 
     h, 
     m, 
     s; 
    n = read("\nEnter start number", 1, lastCompetitor); 
    t.hent(h, m, s); 
    competitors[n].setFinish(h, m, s); 
    } 

int read(char text[], int one, int two) 
    { 
    int n; 
    do 
     { 
     cout << endl << text << " (" << one << " - " << two << "): "; 
     cin >> n; 
     } while(n < one || n > two); 
    return n; 
    } 

char read() 
    { 
    char ch; 
    cin >> ch; cin.ignore(); 
    return (toupper(ch)); 
    } 
+0

Добро пожаловать на Stack Overflow. _Questions ищет помощь для отладки («почему этот код не работает?») Должен включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для воспроизведения в самом вопросе. Вопросы без четкого описания проблемы не полезны другим читателям. См.: Как создать [MCVE] ._ –

ответ

0

Используйте элемент для расчета sinceStart:

class Competitor 
    { 
    private: 
     int startNumber; 
     char name[MAX_NAME + 1]; 
     char nationality[MAX_NAME + 1]; 
     Time start; 
     Time finish; 
     Time sinceStart() const {return finish - start;} 
    public: 
     Competitor() 
      { 
      startNumber = 0; 
      strcpy_s(name, ""); 
      strcpy_s(nationality, ""); 
      } 
     Competitor(int n, char nm[], char nt[], Time calcStart); 
     void showCompetitor(); 
     void setCompetitor(char buffer[], int n); 
     void setFinish(int h, int m, int s); 
    }; 
+0

Не разрешено ли назначать объект, как я сделал? –

+0

Лучше не хранить избыточную переменную типа sinceStart. Ваша инициализация не означает, что значениеStart будет обновлено до того, как будет завершено - начнется. Кажется, вы не обновляете значение сStart в setFinish (что может быть альтернативным, но хуже, решением). – user2672165