0

@ sarnold わかりました。これが私のアップデートです。あなたがくれたガイドに従ってみました。プロトタイプを型に移動するメインを削除しようとしましたが、それぞれを 1 つだけにして、個々の関数ごとに宣言を含む 1 つの int メインに絞り込み、代わりに void を使用しました。関数ごとに int を使用することをお勧めします。

#include <iostream>
#include <cmath>
#include <stdio.h>
#include <string>

using namespace std;


void function1()
{
    //Enter Variables
    int number;
    cout << "Enter Variable a: ";
    cin >> number;
    int a = number;


    cout << "Enter Variable b: ";
    cin >> number;
    int b = number;
    cout << "Enter Variable c: ";
    cin >> number;
    int c = number;
    if (a > b && a > c);
    return a;
    cout << "This is your highest number(" << a << ")";
    if (b > a && b > c);
    return b;
    cout << "This is your highest number(" << b << ")";
    if (c > a && c > B);
    return c;
    cout << "This is your highest number(" << c << ")";

}

void function2()
{
    // Prompt User for Integer

    int number;
    cout << "Enter integer 1: ";
    cin >> number;
    int a = number;

    cout << "Enter integer 2: ";
    cin >> number;
    int b = number;

    if (a != B)
        cout << "Continue";

    else
        cout << "Number 1 or 2 is the same!";

    cout << "Enter integer 3: ";
    cin >> number;
    int c = number;

    if ((a != B) != c)
        cout << "Continue";
    else
        cout << "Number 3 is the same as number 1 or 2!";
    cout << "Enter integer 4: ";
    cin >> number;
    int d = number;

    if (((a != B) != c) != d)
        cout << "numbers are all different";
    else
        cout << "Number 3 is the same as number 1, 2, or 3!";
    cout << "Thank you enter another number?\n\n";
    cin >> number;
    return 0;
}

std::string numerals = "VXLCDM";
void function3()
{
    char roman_Numeral;
    int arabic_Numeral = 0;
    cout << "Enter the Roman Numeral in Capital letters (e.g. CCXIX) : ";
    while(cin.get(roman_Numeral))
    {
        if(roman_Numeral == 'M')
            arabic_Numeral = arabic_Numeral + 1000;
        else if(roman_Numeral == 'D')
        {
            roman_Numeral = cin.peek();
            if(numerals.find(roman_Numeral, 5) != std::string::npos)
            {
                arabic_Numeral = arabic_Numeral - 500;
                continue;
            }
            else
            {
                arabic_Numeral = arabic_Numeral + 500;
                continue;
            }
        }
        else if(roman_Numeral == 'C')
        {
            roman_Numeral = cin.peek();
            if(numerals.find(roman_Numeral, 4) != std::string::npos)
            {
                arabic_Numeral = arabic_Numeral - 100;
                continue;
            }
            else
            {
                arabic_Numeral = arabic_Numeral + 100;
                continue;
            }
        }
        else if(roman_Numeral == 'L')
        {
            roman_Numeral = cin.peek();
            if(numerals.find(roman_Numeral, 3) != std::string::npos)
            {
                arabic_Numeral = arabic_Numeral - 50;
                continue;
            }
            else
            {
                arabic_Numeral = arabic_Numeral + 50;
                continue;
            }
        }
        else if(roman_Numeral == 'X')
        {
            roman_Numeral = cin.peek();
            if(numerals.find(roman_Numeral, 2) != std::string::npos)
            {
                arabic_Numeral = arabic_Numeral - 10;
                continue;
            }
            else
            {
                arabic_Numeral = arabic_Numeral + 10;
                continue;
            }
        }
        else if(roman_Numeral == 'V')
        {
            roman_Numeral = cin.peek();
            if(numerals.find(roman_Numeral, 1) != std::string::npos)
            {
                arabic_Numeral = arabic_Numeral - 5;
                continue;
            }
            else
            {
                arabic_Numeral = arabic_Numeral + 5;
                continue;
            }
        }
        else if(roman_Numeral == 'I')
        {
            roman_Numeral = cin.peek();
            if(numerals.find(roman_Numeral) != std::string::npos)
            {
                arabic_Numeral = arabic_Numeral - 1;
                continue;
            }
            else
            {
                arabic_Numeral = arabic_Numeral + 1;
                continue;
            }
        }
        else
            break;
    }
    cout << arabic_Numeral << endl;
    return 0;
}
void input (double &);
void convert (double radius, int & feet, double & total);
void output (int, double, double);
void function4()
{
    double total, radius;
    int feet;
    char yn;
    do
    {
        input (radius);
        convert (radius, feet, total);
        output (feet, total, radius);
        cout << "Enter a Different radius? (y or n)\n";
        cin >> yn;
        cout << "\n\n";
    }
    while (yn == 'y'  || yn == 'Y');
    system("pause");
    return 0;
}
void input(double & radius)
{
    cout << "---------------------------Re Enter Radius-------------------------\n\n";
    cout << "Enter Radius:\n";
    cin >> radius;
    cout << "\n";
}
void convert(double radius, int & feet, double & total)
{
    //=======================================================
    total = 3.14 * radius * radius * radius * 4 / 3;
}
//========================================================
void output(int feet, double total, double radius)
{
    cout << "---------------------------Re Enter Radius-------------------------\n\n";
    cout << "The volume is: " << total << " \n\n";
    cout << "---------------------------   Equation    -------------------------\n\n";
    cout << "The Equation with (" << radius << ") being:\n\n";
    cout << "4/3 * 3.14 * (" << radius << ")^3 = " << total << "\n\n";
    cout << "---------------------------     Again?    -------------------------\n\n";
}
void swap( int &x, int &y )
    int number;

void function5()

{

    cout << "x is ";
    cin >> number;
    int x = number;

    cout << "y is ";
    cin >> number;
    int y = number;
    swap(x, y);
    cout << "Swapped the first number is now(" << x << ")and the second is now (" << y >> ")";

    return 0;
}
int leap (int year);
void function6 (void){
    int month,day,year,dm,dn,leap;

    printf("enter the month:");
    scanf("%d",&month);

    printf("enter the day:");
    scanf("%d",&day);

    printf("enter the year:");
    scanf("%d",&year);

    if (leap==0)
    {   if(month==1)
        dm=0;
        if(month==2)
            dm=31;
        if(month==3)
            dm=59;
        if(month==4)
            dm=90;
        if(month==5)
            dm=120;
        if(month==6)
            dm=151;
        if(month==7)
            dm=181;
        if(month==8)
            dm=212;
        if(month==9)
            dm=243;
        if(month==10)
            dm=273;
        if(month==11)
            dm=304;
        if(month==12)
            dm=334;}

    else
    {    if(month==1)
        dm=0;
        if(month==2)
            dm=31;

        if(month==3)
            dm=60;
        if(month==4)
            dm=91;
        if(month==5)
            dm=121;
        if(month==6)
            dm=152;
        if(month==7)
            dm=182;
        if(month==8)
            dm=213;
        if(month==9)
            dm=244;
        if(month==10)
            dm=274;
        if(month==11)
            dm=304;
        if(month==12)
            dm=335;}

        dn=dm+day;

        printf("the day number is :%d",dn);

        return 0;
}

int leap (int year){
    if((year%100== 0 && year%400==0)||  (year%4==0))

        return 1;
    else
        return 0;}

int main(int argc, char *argv[], int year, int leap, int number, int arabic_Numeral)

{
    function1();
    function2();
    function3();
    function4();
    function5();
    function6();
    return 0;
}
4

2 に答える 2

2

1 つは、int main()3 回定義したことです。それぞれに異なる名前を付ける必要があります。

#includeまた、 andステートメントを複製する必要はありませんusing。最初に 1 回だけ記述してください。

読みやすくするために、プロトタイプもクラスの最初に移動することをお勧めします。

于 2012-04-23T02:07:25.380 に答える
1
if (a > b && a > c);
return a;
cout << "This is your highest number(" << a << ")";

これらの 3 行は、コード内の問題の多くを要約しています。

  • あなたのif条件は役に立たない:

    if (foo);
    

    fooテストのみを実行します。セミコロンは、trueの場合に実行するコードの末尾を囲みます。foo

    if (foo)
        /* then code */ ;
    
  • あなたのステートメントは、直後return aの行を含む残りのコードの実行を防ぎます。cout

これらの小さな問題のいくつかは、vim構文を認識したインデントを実行できる などのテキスト エディタを使用すると、すぐに明らかになります。エディターは常にコンパイラーほど優れているわけではありませんが、コードのレイアウト方法に注意を払えば、時間を節約するのに役立ちます。

さらに、少なくとも code-after-returnはコンパイラによって報告されているはずです。そうでない場合は、警告を上げます。(オンgcc-Wall -Wextraいいですね。)


アップデート

これらをそれぞれ 1 つのファイルに入れ、それぞれを順番に呼び出すには、それらを少し再フォーマットする必要があります。現在、各プログラムは自己完結型であり、ほぼ完全にmain()ルーチン内から実行されます。これはおもちゃのプログラムでは問題ありませんが、単一の実行可能ファイル内からそれらすべてを呼び出す作業は複雑になります。

現在、疑似コードでは、次のようなファイルがいくつかあります。

プログラム 1:

main() {
    /* ask for input */
    /* run the routine */
    /* maybe call functions */
    /* output results */
    /* quit */
}

プログラム 2:

main() {
    /* ask for input */
    /* run the routine */
    /* maybe call functions */
    /* output results */
    /* quit */
}

次のようにプログラムを再配置する必要があります。

プログラム:

void run_routine_one(); /* I think C++ forbids a (void) prototype here */
void run_routine_two();

main() {
    run_routine_one();
    run_routine_two();
    /* quit */
}

void run_routine_one() {
    /* ask for input */
    /* run the routine */
    /* maybe call functions */
    /* output results */
}

void run_routine_two() {
    /* ask for input */
    /* run the routine */
    /* maybe call functions */
    /* output results */
}

この種のテンプレートがあれば、ほぼコピー アンド ペーストできます。実際、グローバル変数は問題を複雑にしますが、そうしたいと思うかもしれません。(正当な理由なくグローバル ストレージを思いとどまらせるもう 1 つの理由。)

プロジェクトの期日までに時間があれば、少し戻ってコードを大幅にリファクタリングすることを強くお勧めします。ルーチンは現在、入力、計算、および出力を混在させており、コードは通常、テストと保守がはるかに簡単です。入力と出力を計算から分離します。いくつかのヘルパー関数を提供すると、入力と出力がより簡単になります。これがどのように見えるかの簡単なスケッチ:

int prompt_for_int(string)
{
    int ret;
    cout << string;
    cin >> ret;
    return ret;
}

int days_in_month(int month, int year)
{
    int leap = is_leap_year(year);
    /*                   J   F   M   A   M   J   J   A   S   O   N   D */
    int days[2][12] = { {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
                        {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
    if (month < 0 || month > 11 || year < 1753)
        return -1;

    return days[leap][month];
}

void program_one()
{
    int month, year, days;

    month = prompt_for_int("Enter month, 1 for January, 2 for February...\n");
    month -= 1; /* zero-indexed month */

    year = prompt_for_int("Enter year, not before 1754...\n");

    days = days_in_month(month, year);
    cout << "There are " << days << " in " << month + 1
        << " " << year << nl;
    /* I'm no C++ expert -- perhaps >> nl isn't idiomatic or even functional */
}

int main(int argc, char *argv[])
{
    program_one();
    program_two();
    /* maybe given them better names */
    return 0;
}

プログラムを小さな断片に分割し、各関数の実行を最小限に抑えることで、読みやすさが向上することを理解していただければ幸いです。おそらく、大きな関数を維持するのが本当に理にかなっている大きな関数に出くわすでしょうが、関数をできるだけ小さな断片に分割する習慣を身につけようとします。タスクが小さければ小さいほど、かなり単純な書き直しがはるかに単純なコードにつながる可能性が高くなります。days_in_month()(そのルーチンを確認してください。配列を使用して日数を格納し、関数の結果に基づいて使用する配列を選択します。これはプログラミング スタイルの要素( 54 ページis_leap_year())から学びました。) -- FORTRAN および PL/1 用に書かれているにもかかわらず、優れた本です。とにかく、この小さなルーチンは、それ自体で入出力を行わないため、小さなプログラムでテストするのが非常に簡単です。)

于 2012-04-23T04:06:44.953 に答える