3

私は約1か月間C++に取り組んでいます。それがどのように機能するかはよくわかりませんが、学校用のプログラムを書く必要があります。私は void 関数を使用しましたが、これまでのところ機能しているようですが、次に何をすべきかわかりません。44 行目で迷っています。機能させる方法がわかりません。特定の文字列?値が両方の文字列にある場合、どちらの値をどのように判断しますか? これが私の課題です:

駐車場は、最大 3 時間の駐車に最低 $2.00 の料金を請求します。ガレージは、3 時間を超える各時間またはその一部に対して、1 時間あたり 0.50 ドルの追加料金を請求します。任意の 24 時間の最大料金は $10.00 です。車を 24 時間以上駐車する人は、1 日あたり 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です。これは、2 つの日付文字列から 2 つの整数を差し引くだけで、経過時間を求めることができることを意味します。

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

これはおそらく問題の最も難しい部分です。これが解決されると、残りはより簡単になります。さらにいくつかのヒントを紹介します。

駐車場は、最大 3 時間の駐車に最低 $2.00 の料金を請求します。

基本的には均一料金です。コストを表す出力変数は、少なくとも に等しい必要があります2.00

ガレージは、3 時間を超える各時間またはその一部に対して、1 時間あたり 0.50 ドルの追加料金を請求します。

3 時間を過ぎてから経過した時間を計算し180、 から を引きelapsedTimeます。これが より大きい場合は0、 で割り60、その結果を に格納しますfloat(必ずしも整数の結果であるとは限らないため)、たとえば、 と呼ばれexcessHoursます。excessHours = floor( excessHours ) + 1;この数値を切り上げるために使用します。0.5これに;を掛けます。これが追加料金です。(これが数学的に機能する理由を理解してください)。

任意の 24 時間の最大料金は $10.00 です。車を 24 時間以上駐車する人は、1 日あたり 8.00 ドルを支払います。

これは結局宿題なので、あなたに任せます。うまくいけば、何をする必要があるのか​​ の要点を理解するのに十分な情報がここに提供されました. この問題にも多くの可能なアプローチがあります。

于 2012-04-06T06:04:32.760 に答える
0

入力の読み取りと解析を別々に実行する必要はありません。必要な変数を参照で渡し、を使用して入力を変数に直接読み取ることができますstringstream。構造体を使用して日付と時刻を格納し、operator-2つの日付/時刻値を減算するアルゴリズムでオーバーロードします。これが私がそれをする方法です:

#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()関数で2つの構造体を宣言します。1DateTimeつは開始時間用、もう1つは終了時間用です。次に、両方を読み取りDateTime、終了時間から開始時間を減算し、その結果を使用して正しい出力を生成します。

于 2012-09-17T03:01:12.357 に答える
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);

日付と時刻が解析されたので、2 つの日付を減算するメソッドを実装する必要があります。実際、あなたが気にするのは、入力日時から終了日時までに経過した時間数を切り上げたものです。ここで私が提案するのは、日付を最初の瞬間 (00/01/01 など) からの日数に変換してから、2 つの値を減算することです。次に、両方の時間を 00:00 からの分数に変換し、再度減算します。これは言語固有のものではないので、これらのヒントで十分だと思います。いくつかの組み込みライブラリを使用すると、これは簡単に実行できますが、これはあなたの割り当てのアイデアではないと思います。

時間数を切り上げた後は、ステートメント内のルールを実際に実装するだけです。これにはいくつかの if が必要であり、実際には非常に簡単です。

お役に立てれば。もう少し詳しい説明は省きますので、皆さんに考えていただきたいことがあります。結局のところ、これは宿題であり、その方法を考えさせるためのものです。

于 2012-04-06T05:59:00.047 に答える