2

私のプログラムはこれを達成するつもりです

(A)larger()渡された任意の 2 つの日付のうち、後の日付を返すという名前の C 関数を作成します。たとえば、日付 10/9/2001 と 11/3/2001 が に渡されたlarger()場合、2 番目の日付が返されます。

(B) ( A) 用に作成された large() 関数を完全なユニットで作成します。large() によって返された日付構造体を別の日付構造体に格納し、返されたデータ構造体のメンバー値を表示します。

私は C 言語コースでこの問題に取り組んでいます。何を入力しても「より大きな日付は: 0/0/0」を取得し続けたことを除いて、すべてがうまくいっていました (私は思っていました)。だから私はいじり始めましたが、今では構文エラーを取り除くことも、0/0/0の問題を理解することもできません. 明らかに、日付は元に戻っていません。私はまだこれでかなり新しいです(そして構造体で非常に新しいです)ので、どんな助けも素晴らしいでしょう!

構文エラーが発生している行は、main() の下部にあります。

DATES result[NUM] = larger(DATES user[NUM]);

完全なコード:

#include <stdio.h>
#define NUM 2
struct Dates
{
       int month;
       int day;
       int year;
};
typedef struct Dates DATES;
DATES larger(DATES[NUM]);
DATES more;
int main()
{
    DATES user[NUM];

    printf("You will enter two dates, and the program will return the larger.\n");
    while (user[0].month < 1 || user[0].month > 12)
         {printf("\nPlease enter the first month, 1-12: ");
         scanf("%d", &user[0].month);}
    while (user[0].day < 1 || user[0].day > 31)
          {printf("\nPlease enter the first day, 1-31: ");
          scanf("%d", &user[0].day);}
    while (user[0].year < 1)
          {printf("\nPlease enter the first year: ");
          scanf("%d)", &user[0].year);}
    printf("\nDate entered: %d/%d/%d.\n", user[0].month, user[0].day, user[0].year);

    while (user[1].month < 1 || user[1].month > 12)
         {printf("\nPlease enter the first month, 1-12: ");
         scanf("%d", &user[1].month);}
    while (user[1].day < 1 || user[1].day > 31)
          {printf("\nPlease enter the first day, 1-31: ");
          scanf("%d", &user[1].day);}
    while (user[1].year < 1)
          {printf("\nPlease enter the first year: ");
          scanf("%d)", &user[1].year);}
    printf("\nDate entered: %d/%d/%d.\n\n", user[1].month, user[1].day, user[1].year);

    DATES result[NUM] = larger(DATES user[NUM]);  /* Problem here */

    printf("The larger date is %d/%d/%d.\n\n", result[0].month, result[0].day, result[0].year);
    system("pause");
    return 0;
}

DATES larger(DATES more[NUM])
{        
      int days0;
      int days1;

      days0 = (more[0].month*31)+(more[0].day)+(more[0].year*365);
      days1 = (more[1].month*31)+(more[1].day)+(more[1].year*365);

      if (days1 > days0)
         {more[0] = more[1];}

return (more[0]);
}
4

5 に答える 5

1
DATES result[NUM] = larger(DATES user[NUM]);

これは何をするためのものですか?DATES result[NUM]の配列を宣言しDATESます。(ただし、それぞれDATESに日付が 1 つしか含まれていないため、紛らわしいです。) しかし、配列であるにもかかわらず、単一のオブジェクトで初期化され、 からの戻り値ですlarger。、 への引数はlarger、既に存在する変数をDATES user[NUM]宣言しているようです。日付の配列であるuserコンパイラに明確にしようとしているようですが、そこには行かず、配列にインデックスを付けているように見えますが、これは望ましくありません。userDATES[NUM]

おそらくあなたが望んでいるのは

DATES result = larger( user );

また、後で問題を引き起こす深刻なスタイルの問題がいくつかあります。

  • のような関数パラメーターの配列型はDATES larger(DATES[NUM]);、ポインターに変換されます。その行では、NUMは何もせず、宣言は と同じDATES larger( DATES * );です。一部の教師が何と言おうと、ポインターと配列は同じものではありません。区別が重要な場合、このスタイルは混乱を招きます。DATES larger( DATES * )代わりに使用してください。

  • 大文字にするのは意味がありませんDATES。大文字は通常、プリプロセッサ マクロを示します。

  • プリプロセッサ マクロはハンマーのようなものです。const int num = 2;単純な数値定数にそれらを使用することは、またはのような構造よりも洗練されていません。enum { num = 2 };

  • input_limitandのようなわかりやすい変数名は、 anduser_inputよりも優れています。numuser

  • 初期化されていないデータに依存しないでください。が定義されているが初期化されていないuser[0].month場合、6 になる可能性があります。user読み取る前に必ず値を書き込んでください。

  • ブレースは見えるようにしておく必要があります。中かっこをループの最初と最後の単語と密接にグループ化すると、それらが隠されます。これは、見苦しいと思われる場合は良いことですが、ループに行を誤って追加するのは非常に簡単であり、デバッグが困難なフロー制御が生成されます。エラー。

于 2013-05-03T02:56:43.957 に答える
0

@Rüppell'sVulture彼のエラーを強調しましたが、コードが間違っています。私はそれのより簡単な解決策に取り組みました。見てください。

@ iMPose27 次のコードを見て、問題が発生した場合はお知らせください

// includes
#include <stdio.h>
#include <string.h>

// macros
#define NUM 2

// structure Definitions
struct Dates
{
       int month;
       int day;
       int year;
};

// typedefs
typedef struct Dates DATES;

// function declarations
DATES* larger(DATES[NUM]);

// function definitions
int main(int argc, char* argv[])
{
    DATES user[NUM];    // array of NUM DATES
    DATES *result=NULL;
    int i=0;
    printf("\nPlease Enter Two Dates, The program will evaluate and return the later date of the two dates passed to it\n\n");
    for(;i<NUM;i++)   
    {    
        printf("For Date %d\n",i+1);

        do{
             printf("Please enter the month, 1-12:\t");
             scanf("%d", &user[i].month);
        }while (user[i].month < 1 || user[i].month > 12);

        do{
              printf("Please enter the day, 1-31:\t");
              scanf("%d", &user[i].day);
        }while (user[i].day < 1 || user[i].day > 31);

        do{           
              printf("Please enter the year: \t");
              scanf("%d)", &user[i].year);
        }while (user[i].year < 1);

        printf("\nDate %d entered: %d/%d/%d.\n\n", i+1, user[i].month, user[i].day, user[i].year);

    } 

    if((result=larger(user))==NULL)
        printf("The two dates passed, date1: %d/%d/%d and date2: %d/%d/%d are the same.\n",user[0].month, user[0].day, user[0].year, user[1].month, user[1].day, user[1].year); 
    else
        printf("%d/%d/%d is the later date of the two dates passed\n",result->month, result->day, result->year); 

    return 0;
}

DATES* larger(DATES more[NUM])
{        
      int days0, days1;

      days0 = (more[0].month*31)+(more[0].day)+(more[0].year*365);
      days1 = (more[1].month*31)+(more[1].day)+(more[1].year*365);

      if (days0 > days1)
        return more;        
      else if (days1 > days0)
        return more+1;
      else
        return 0;       
}
于 2013-05-03T04:51:58.633 に答える
0

このプログラムにはいくつかの小さな修正が必要ですが、主な問題は while ループと do while ループの違いです。

while(<condition>)
{
  //Something
}

do
{
  //Something
}
while(<condition>)

do while が少なくとも 1 回ループに入ってから、条件が満たされているかどうかを確認するという点で異なります。一方、条件が満たされない場合は、決してループに入りません。一言で言えば、while ループに入っていないため、ユーザーから何も読み取っていません。

于 2013-05-03T02:52:41.017 に答える
0

あなたのプログラムには多くの論理エラーと構文エラーがあります。すべての構文部分を修正し、ループのロジックの主な欠陥を指摘しなければなりません。あなたwhileは混乱しているよう><、次の状況に陥っているようです:

while (user[0].month < 1 || user[0].month > 12);  //Wrong

while (user[0].month > 1 || user[0].month < 12);  //Correct

火星だけでは、月は月よりも小さい1か大きいですが、地球上では、汚染のために と の間にあります。私はそれらを修正し、コメントで指摘しました。また、各要素に対して同じことを繰り返す代わりに、ループを使用する必要があります。配列の12112forDATES

これは、質問で言及した 2 つの目的を達成します。ユーザーに 2 つの日付を尋ね、どちらが大きいか遅いかを調べます。BC は含めず西暦のみを含めます。ネアンデルタール人が私たちの誰よりも早く生まれたのか、それとも遅く生まれたのかを知りたい場合を除き、問題はありません。関数は、新しいデータ構造に保存され、出力される答えへのポインターを返します。largerlargerdate

改訂されたコードの簡単な説明は次のとおりです。

外側のforループは、各日付の入力を自動化します。日付ごとに同じコードを繰り返す必要はありません。日付の数が増えると、面倒になります。さらに、do-whileループはユーザーに日付の入力を求めます。指定さuser[]れた範囲DATE*larger()2 つの日付を比較し、大きい方の日付への型のポインターを返す関数。これDATE*は、呼び出されてから出力される新しいデータ構造に大きい方の日付を格納するために使用largerdateされます。

#include <stdio.h>
#define NUM 2
struct Dates
{
       int month;
       int day;
       int year;
};
typedef struct Dates DATES;
DATES  *larger(DATES*);
//DATES more;     //Not needed as you are doing the same in function definition

int main(void)
{
    DATES user[NUM],largerdate;
    int i;
     printf("You will enter two dates, and the program will return the larger.\n");
    for(i=0;i<NUM;i++)   //for loop is handy when NUM increases.
       {
           do
           {
        printf("\nPlease enter the month number %d, 1-12:\n ",i);
         scanf("%d", &user[i].month);
         if(user[i].month<1||user[i].month>12)
         printf("I told you enter a number between 1-12 JERK!!\n");
           }while(user[i].month<1||user[i].month>12);
          do
           {
        printf("\nPlease enter the day number %d, 1-31:\n ",i);
         scanf("%d", &user[i].day);
         if(user[i].day<1||user[i].day>31)
         printf("I told you enter a number between 1-31 JERK!!\n");
           }while(user[i].day<1||user[i].day>31);
           do
           {
        printf("\nPlease enter the year number %d,greater than one:\n ",i);
         scanf("%d", &user[i].year);
         if(user[i].year<1)
         printf("I told you enter a number greater than 1 JERK!!\n");
           }while(user[i].year<1);
    printf("\nDate number %d entered is: %d/%d/%d.\n", i+1,user[i].month, user[i].day, user[i].year);

   } //for loop ends.It avoids repeating the same thing for DATES[1]


   largerdate=*larger(user);
   printf("\n\nThe larger/later date is %d/%d/%d\n",largerdate.month,largerdate.day,\
   largerdate.year);


    system("pause");
    return 0;
}

DATES *larger(DATES *more)
{
      int days0;
      int days1;

      days0 = (more[0].month*31)+(more[0].day)+(more[0].year*365);
      days1 = (more[1].month*31)+(more[1].day)+(more[1].year*365);

      if (days1 > days0)
     return more+1;
      else
      return more;
}
于 2013-05-03T03:03:19.147 に答える