-2

私はC ++が初めてで、自分で学んでいます。だから私の質問は、これを正しい方法でどのようにコーディングするべきですか? これがばかげた質問のように聞こえる場合、または既に回答されている場合は申し訳ありません。

問題は、毎日使用するバッチ ファイルの一部を C++ に変換しようとしていることです。そして、system(); を使用していることに気づきました。私が読んだ多くは間違っています。

悪い習慣を身につける前に、正しい方法を学びたいと思っています。誰かがこのコードを正しい方法で書き直し、詳細に分解してくれるかどうか尋ねています。c++ を初めて使用する人は、C++ をよりよく理解し、特定の方法で行う必要がある理由を理解できるようになります。

前もって感謝します。

    #include <iostream>

    int main ()
    {
       system("title My Age Is?");
       system("mode con: cols=80 lines=25");
       system("color 0a");

       int myAge, yearBorn, yearNow;

       // the year you where born in.
       std::cout << "Enter the Year You where Born in:";
       std::cin >> yearBorn;
       system("cls");

       // the year it is now.
       std::cout << "Enter the Year it is Now:";
       std::cin >> yearNow;
       system("cls");


       // the total of Now - Then = ?
       myAge =  yearNow - yearBorn;

       // the output of Now - Then = ?
       std::cout << "You are " << myAge << " Years Old" << std::endl;
       std::cout << std::endl;
       system("pause");

    return 0;
    }

OK、私はそれを正しくすることに近づいていると思います。これが私が持っているものです。

    #include <iostream>
    #include <windows.h>
    #include <ctime>

    void cls( HANDLE hConsole )
    {
       COORD coordScreen = { 0, 0 };    // home for the cursor 
       DWORD cCharsWritten;
       CONSOLE_SCREEN_BUFFER_INFO csbi; 
       DWORD dwConSize;

       // Get the number of character cells in the current buffer. 

       if( !GetConsoleScreenBufferInfo( hConsole, &csbi ))
       {
          return;
       }

       dwConSize = csbi.dwSize.X * csbi.dwSize.Y;

       // Fill the entire screen with blanks.

       if( !FillConsoleOutputCharacter( hConsole,        // Handle to console         screen         buffer 
                                        (TCHAR) ' ',     // Character to write to the buffer
                                        dwConSize,       // Number of cells to write 
                                        coordScreen,     // Coordinates of first cell 
                                        &cCharsWritten ))// Receive number of characters written
       {
          return;
       }

       // Get the current text attribute.

       if( !GetConsoleScreenBufferInfo( hConsole, &csbi ))
       {
          return;
       }

       // Set the buffer's attributes accordingly.

       if( !FillConsoleOutputAttribute( hConsole,         // Handle to console screen buffer 
                                csbi.wAttributes, // Character attributes to use
                                dwConSize,        // Number of cells to set attribute 
                                coordScreen,      // Coordinates of first cell 
                                &cCharsWritten )) // Receive number of characters written
       {
          return;
       }

       // Put the cursor at its home coordinates.
       SetConsoleCursorPosition( hConsole, coordScreen );
    }

    int main()
    {
        // system("color 0a");
        int color = 0xa0;
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);

        /* using the void cls function to clear the screen instead of system("cls");
   but in this case i used it to clear the screen cache
   as set the text and background colors from above system("color 0a");
   using the void cls function */
        {
            HANDLE hStdout;
            hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
            cls(hStdout);
        }

        /* SetConsoleTitle(myAgeIs); to set the title of the console
        instead of system("title My Age Is?"); */
        char myAgeIs[] = "My Age Is?";
        SetConsoleTitle(myAgeIs);

        // the year you where born in.
        int yearThen;
        std::cout << "Enter the Year You where Born in:";
        std::cin >> yearThen;

        //using std::cin.get(); instead of system("pause");
        std::cin.get();

        // using the void cls function to clear the screen instead of system("cls");
        {
            HANDLE hStdout;
            hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
            cls(hStdout);
        }


        // used to get the system time now
        time_t t = time(0);
        struct tm * now = localtime( & t );

        // the total of current time - yearThen = ?
        int yourAge;
        yourAge = (now->tm_year + 1900) - yearThen;
        std::cout << "Your Age is " << yourAge;

        //using std::cin.get(); instead of system("pause");
        std::cin.get();
        return 0;
    }  
4

1 に答える 1

1

systemコーディングの適切な方法は、関数呼び出しを排除することです。機能にはプラットフォーム固有の API を使用します。

各質問の後に画面をクリアする必要がありますか?
あまり適切ではないようです。前の出力を振り返るのが好きな人もいます。また、ウィンドウ システムでは動作しません。

年齢がマイナスになることはありますか?
C++ にはint、負の数を処理するための型がありunsigned int、値が常にゼロまたは正の場合があります。

計算する前に入力内容を確認してください。
たとえば、生まれた年が現在の年よりも大きい場合、負の年齢が表示されます。

OS から年を読み取ります。
ユーザーが現在の年を入力する必要はありません。ほとんどのプラットフォームには、現在の時刻を取得するための時計と機能があります。

于 2013-11-14T03:59:50.213 に答える