3

我只在 C++ 上工作了大约一个月。我不太了解它是如何工作的,但是我需要为学校编写一个程序。我使用了一个 void 函数,到目前为止它似乎正在工作,但我不知道接下来要做什么我在第 44 行迷路了,我不知道如何让它工作,有没有办法从某个字符串?如果值在两个字符串中,我将如何确定哪个值?这是我的任务:

停车库收取 2.00 美元的最低停车费,最多可停放三个小时。超过三个小时,车库每小时或部分每小时额外收费 0.50 美元。任何给定 24 小时期间的最高费用为 10.00 美元。停车超过 24 小时的人每天将支付 8.00 美元。

编写一个计算并打印停车费的程序。程序的输入是汽车进入停车场的日期和时间,以及同一辆车离开停车场的日期和时间。两个输入的格式为 YY/MM/DD hh:mm

这是我到目前为止编写的代码:

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <cmath>
#include <algorithm>
#include <sstream>
using namespace std;

stringstream ss;
string enter_date;
string enter_time;
string exit_date;
string exit_time;
int calculatecharge;
int num;
int i;
int year;
int month;
int ddmmyyChar;
int dayStr;
string line;
int x;

void atk() 
{
    getline (cin,line);             // This is the line entered by the user
    stringstream  ss1(line);        // Use stringstream  to interpret that line
    ss >> enter_date >> enter_time;
    stringstream  ss2(enter_date);  // Use stringstream  to interpret date
    string year, month, day;
    getline (ss2, year, '/');
}

int main()
{
    cout << "Please enter the date and time the car is entering "<< endl
         << "the parking garage in the following format: YY/MM/DD hh:mm"<< endl;
    atk();
    cout << "Please enter the date and time the car is exiting "<< endl
         << "the parking garage in the following format: YY/MM/DD hh:mm"<< endl;
    atk();
    if (hr - hr < 3)
        cout<<"Parking fee due: $2.00" << endl;
4

3 回答 3

3

编写一个计算并打印停车费的程序。

这是我们计划的目标。基本上,这就是输出。

程序的输入是汽车进入停车场的日期和时间,以及同一辆车离开停车场的日期和时间。两个输入的格式为 YY/MM/DD hh:mm

因此,我们需要某种方式将作为字符串输入的日期格式转换为时差。您可以将时间存储在 中int,它表示停车期间经过的分钟数(我选择分钟,因为这是输入的最小时间段)。这里的挑战是将字符串解析成这个整数。

你可以写一个这样的函数:

int parseDate( std::string dateStr )
{
    // Format: YY/MM/DD hh:mm
    int year  = atoi( dateStr.substr( 0, 2 ).c_str() );
    int month = atoi( dateStr.substr( 3, 2 ).c_str() );
    int day   = atoi( dateStr.substr( 6, 2 ).c_str() );
    int hour  = atoi( dateStr.substr( 9, 2 ).c_str() );
    int min   = atoi( dateStr.substr( 12, 2 ).c_str() );

    // Now calculate no. of mins and return this
    int totalMins = 0;
    totalMins += ( year * 365 * 24 * 60 ); // Warning: may not be accurate enough
    totalMins += ( month * 30 * 24 * 60 ); // in terms of leap years and the fact
    totalMins += ( day * 24 * 60 );        // that some months have 31 days
    totalMins += ( hour * 60 );
    totalMins += ( min );

    return totalMins;
}

小心!我在这里的功能只是一个说明,并没有考虑到闰年和不同月份长度等细微之处。你可能需要改进它。重要的是要认识到它试图获取一个字符串并返回自 year 以来经过的分钟数'00。这意味着我们只需从两个日期字符串中减去两个整数即可找到经过的时间:

int startTime = parseDate( startDateString );
int endTime   = parseDate( endDateString );
int elapsedTime = endTime - startTime; // elapsedTime is no. of minutes parked

这可能是问题中最难的部分,一旦你解决了这个问题,剩下的就应该更简单了。我再给你一些提示:

停车库收取 2.00 美元的最低停车费,最多可停放三个小时。

基本上只是一个统一费率:无论如何,描述成本的输出变量应该至少等于2.00.

超过三个小时,车库每小时或部分每小时额外收费 0.50 美元。

算出过去三个小时过去的小时数 -减去180elapsedTime如果这大于0,则将其除以60并将结果存储在 a 中float(因为它不一定是整数结果),称为excessHours。用于excessHours = floor( excessHours ) + 1;四舍五入此数字。现在乘以0.5; 这是额外的费用。(尝试理解为什么这在数学上有效)。

任何给定 24 小时期间的最高费用为 10.00 美元。停车超过 24 小时的人每天将支付 8.00 美元。

我会把这留给你来解决,因为这毕竟是家庭作业。希望我在这里提供了足够的信息,让您了解需要做的事情的要点。这个问题也有很多可能的方法,这只是一种,可能是也可能不是“最好的”。

于 2012-04-06T06:04:32.760 回答
0

首先,由于日期字符串和时间字符串都是连续的(不包​​含空格),因此您不需要使用 stringstream 来解析该行。您可以像这样读取日期和时间:

cin >> enter_date >> enter_time;
cin >> exit_date >> exit_time;

现在您需要将这些字符串转换为实际的日期和时间。由于两者的格式都是固定的,您可以编写如下内容:

void parse_date(const string& date_string, int& y, int& m, int& d) {
  y = (date_string[0] - '0')*10 + date_string[1] - '0'; // YY/../..
  m = (date_string[3] - '0')*10 + date_string[4] - '0'; // ../mm/..
  d = (date_string[6] - '0')*10 + date_string[7] - '0'; // ../../dd
}

当然,这段代码有些难看,可以用更好的方式编写,但我相信这种方式更容易理解。有了这个函数,如何编写这个函数应该很明显:

void parse_time(const string& time_string, int& h, int &m);

现在您已经解析了日期和时间,您需要实现一个减去两个日期的方法。实际上,您关心的是从进入日期时间到退出日期时间四舍五入的小时数。我在这里建议的是,您将日期从某个初始时刻(例如 00/01/01)转换为天数,然后减去这两个值。然后将两个时间转换为自 00:00 以来的分钟数,然后再次减去它们。这不是特定于语言的,所以我相信这些提示应该足够了。再次使用一些内置库可以更轻松地完成,但我认为这不是您分配的想法。

将小时数四舍五入后,您实际上需要做的就是执行语句中的规则。这将只需要几个如果,实际上很容易。

希望这可以帮助。我故意不给出更详细的解释,以便您可以考虑一些事情。毕竟这是家庭作业,旨在让您思考如何去做。

于 2012-04-06T05:59:00.047 回答
0

您不需要执行单独的输入读取和解析操作。您可以通过引用传递必要的变量,并使用stringstream. 我会使用一个结构来存储日期和时间,并operator-使用一个算法来减去两个日期/时间值。这是我的做法:

#include <iostream>
#include <sstream>

using namespace std;

struct DateTime {
    // Variables for each part of the date and time
    int year, month, day, hour, minute;

    // Naive date and time subtraction algorithm
    int operator-(const DateTime& rval) const {
        // Total minutes for left side of operator
        int lvalMinutes = 525600 * year
                        + 43200 * month
                        + 1440 * day
                        + 60 * hour
                        + minute;

        // Total minutes for right side of operator
        int rvalMinutes = 525600 * rval.year
                        + 43200 * rval.month
                        + 1440 * rval.day
                        + 60 * rval.hour
                        + rval.minute;

        // Subtract the total minutes to determine the difference between
        // the two DateTime's and return the result.
        return lvalMinutes - rvalMinutes;
    }
};

bool inputDateTime(DateTime& dt) {
    // A string used to store user input.
    string line;
    // A dummy variable for handling separator characters like "/" and ":".
    char dummy;

    // Read the user's input.
    getline(cin, line);
    stringstream lineStream(line);

    // Parse the input and store each value into the correct variables.
    lineStream >> dt.year >> dummy >> dt.month >> dummy >> dt.day >> dummy 
               >> dt.hour >> dummy >> dt.minute;

    // If input was invalid, print an error and return false to signal failure
    // to the caller.  Otherwise, return true to indicate success.
    if(!lineStream) {
        cerr << "You entered an invalid date/time value." << endl;
        return false;
    } else
        return true;
}

从这里开始,在main()函数中,声明两个DateTime结构,一个用于进入时间,一个用于退出时间。然后读入两者DateTime,从退出时间中减去进入时间,并使用结果生成正确的输出。

于 2012-09-17T03:01:12.357 回答