Calculate Pace (Running Program)
During week 5 of study, learning functions and in particular references passed to and from functions. The following program, in a way, cemented some of the stuff studied. It wasn't a part of the book but since I'm interested in running, I thought I'd write a little program that calculates the average pace of a run given the distance (km) and duration (time) of the run.
// author : Steven Taylor
// 21 Dec, 2007.
#include <iostream>
using namespace std;
const int SECS_IN_MIN = 60;
const int MINS_IN_HOUR = 60;
const int SECS_IN_HOUR = 3600;
struct hms
{
int hour;
int min;
int sec;
};
const hms & pace_is(double distance, hms & duration, hms & rate);
int main()
{
double distance;
hms duration;
hms perkm = {0,0,0};
cout << "Enter distance (km's) run: ";
while (!(cin >> distance))
{
cout << "\nMust enter a number - re-enter: ";
cin.clear();
while (cin.get() != '\n')
continue;
}
cout << "\nEnter duration of run - firstly - hours: ";
while (!(cin >> duration.hour))
{
cout << "\nMust be an integer number - re-enter - hours: ";
cin.clear();
while (cin.get() != '\n')
;
}
cout << "\nEnter minutes (0-59): ";
while (!(cin >> duration.min) || duration.min >= MINS_IN_HOUR)
{
cout << "\nMinutes must be 0 - 59, re-enter - minutes: ";
cin.clear();
while (cin.get() != '\n')
;
}
cout << "\nEnter seconds (0 - 59): ";
while (!(cin >> duration.sec) || duration.sec >= SECS_IN_MIN)
{
cout << "\nSeconds must be 0 - 59, re-enter - seconds: ";
cin.clear();
while (cin.get() != '\n')
;
}
perkm = pace_is(distance,duration,perkm);
cout << "\nThe pace per km is : ";
if (perkm.hour > 0)
cout << perkm.hour << ":";
cout << perkm.min << ":" << perkm.sec << endl;
// exit routine
cout << "\n\n...Press ENTER to Exit System...";
cin.clear();
while (cin.get() != '\n')
continue;
cin.get();
return 0;
}
And now the function pace_is()
{
int total_secs = (d.hour * SECS_IN_HOUR) + (d.min * SECS_IN_MIN) + d.sec;
double secs_per_km = total_secs / distance;
if (secs_per_km > SECS_IN_HOUR)
{
rate.hour = secs_per_km / SECS_IN_HOUR;
secs_per_km = (int)secs_per_km % SECS_IN_HOUR;
}
if (secs_per_km > 0)
{
rate.min = secs_per_km / MINS_IN_HOUR;
rate.sec = (int)secs_per_km % MINS_IN_HOUR;
}
return rate;
}
It works but I'm not overly happy with the fact of the function pace_is returns a reference to a structure and yet that same structure is passed as a reference to the function; what's the point, no real need to have the function return a reference, it might as well be void.
The above file is listed in the attachment, feel free to download.
| Attachment | Size |
|---|---|
| pace-2.zip | 902 bytes |
- Printer-friendly version
- Login or register to post comments
- 366 reads
I revisited the book, somewhere in chapter 8, and now skimming back I can't find the particular reference (page), I thought I highlighted it. In essence, in relation to references as used in the above code, it's merely for demonstration purposes or how they can be used. Further will unfold in later chapters.
For the purpose of the program, there is no need to return a reference from the function pace_is().
Changes required
Firstly, the prototype:
to
Within the main() function:-
to
Lastly, the pace_is() function, change:
to
and remove
as we're not returning any values or references.
Revised Code
Here's the revised code, accounting for the above changes.
// author : Steven Taylor
// 28 Dec, 2007.
#include <iostream>
using namespace std;
const int SECS_IN_MIN = 60;
const int MINS_IN_HOUR = 60;
const int SECS_IN_HOUR = 3600;
struct hms
{
int hour;
int min;
int sec;
};
void pace_is(double distance, hms & duration, hms & rate);
int main()
{
double distance;
hms duration;
hms perkm = {0,0,0};
cout << "Enter distance (km's) run: ";
while (!(cin >> distance))
{
cout << "\nMust enter a number - re-enter: ";
cin.clear();
while (cin.get() != '\n')
continue;
}
cout << "\nEnter duration of run - firstly - hours: ";
while (!(cin >> duration.hour))
{
cout << "\nMust be an integer number - re-enter - hours: ";
cin.clear();
while (cin.get() != '\n')
;
}
cout << "\nEnter minutes (0-59): ";
while (!(cin >> duration.min) || duration.min >= MINS_IN_HOUR)
{
cout << "\nMinutes must be 0 - 59, re-enter - minutes: ";
cin.clear();
while (cin.get() != '\n')
;
}
cout << "\nEnter seconds (0 - 59): ";
while (!(cin >> duration.sec) || duration.sec >= SECS_IN_MIN)
{
cout << "\nSeconds must be 0 - 59, re-enter - seconds: ";
cin.clear();
while (cin.get() != '\n')
;
}
pace_is(distance,duration,perkm);
cout << "\nThe pace per km is : ";
if (perkm.hour > 0)
cout << perkm.hour << ":";
cout << perkm.min << ":" << perkm.sec << endl;
// exit routine
cout << "\n\n...Press ENTER to Exit System...";
cin.clear();
while (cin.get() != '\n')
continue;
cin.get();
return 0;
}
void pace_is(double distance, hms & d, hms & rate)
{
int total_secs = (d.hour * SECS_IN_HOUR) + (d.min * SECS_IN_MIN) + d.sec;
double secs_per_km = total_secs / distance;
if (secs_per_km > SECS_IN_HOUR)
{
rate.hour = secs_per_km / SECS_IN_HOUR;
secs_per_km = (int)secs_per_km % SECS_IN_HOUR;
}
if (secs_per_km > 0)
{
rate.min = secs_per_km / MINS_IN_HOUR;
rate.sec = (int)secs_per_km % MINS_IN_HOUR;
}
}


Recent comments
2 weeks 1 day ago
2 weeks 1 day ago
2 weeks 2 days ago
8 weeks 3 days ago
10 weeks 1 hour ago
10 weeks 1 day ago
10 weeks 1 day ago
11 weeks 4 days ago
13 weeks 2 days ago
13 weeks 2 days ago