2

私には取り組んできた課題があります。私のコードは正しい数学演算と正しい順序 (少なくともシーケンスに関して) を持っているように見えますが、私の答えは少し厄介です。入力値に従って各質問の一部を正しく取得しますが、入力値と同じ部分が変化することはありません。これを引き起こしているCの操作順序について、私が見逃しているものはありますか?

問題は

intPeople = intCarCounter * intTrainCounter * CAR_CAPACITY;

サンプル ラン #3 では、最初の 2 つの入力に対して 120 人 (正解よりも正確に 20 人多い) を取得し、余剰数はサンプル ラン #4 にあるはずです。3 番目の入力では、112 人が得られました。これは、サンプル ラン #4 の正解です。最後に、サンプル ラン #4 で 128 人 (正解より 16 人多い) が得られ、余剰数はサンプル ラン #3 にあるはずです。何か案は?

割り当て: http://cop3223.blogspot.com/2013/01/problem-c-roller-coaster-design-coasterc.html

私のコード:

#include <stdio.h>
#include <stdlib.h>
#define FIRST_CAR_LENGTH 10
#define NORMAL_CAR_LENGTH 8
#define CAR_CAPACITY 4

int main(void)
{
    /* Initialize Variables */
    int intTrack,intMaxTrainSize,intActualTrainSize,intPeople,intCarCounter,intTrainCounter,n;

    /* Ask user for value of N */
    printf("What is the value for N?> ");
    scanf("%d",&n);
    for (int i=0; i<n;i++)
    {
        /* Ask user for total length of track */
        printf("\nWhat is the total length of the track, in feet?> ");
        scanf("%d",&intTrack);

        /* Ask user for maximum length of each train */
        printf("What is the maximum length of a train, in feet?> ");
        scanf("%d",&intMaxTrainSize);

        /* Set/Reset initial values of intActualTrainSize, intCarCounter and intTrainCounter */
        /* Each train will begin with FIRST_CAR_LENGTH -> intActualTrainSize=FIRST_CAR_LENGTH */
        /* Each train will begin with 1 car -> intCarCounter=1 */
        /* Train counter will begin at 0 -> intTrainCounter=0 */
        intActualTrainSize=FIRST_CAR_LENGTH;
        intCarCounter=1;
        intTrainCounter=0;

        /* Continue to add additional cars using NORMAL_CAR_LENGTH until the maximum train size has been reached */
        /* Count how many NORMAL_CAR_LENGTH cars are added -> intCarCounter++*/
        while (intActualTrainSize < intMaxTrainSize)
        {
            intActualTrainSize=intActualTrainSize+NORMAL_CAR_LENGTH;
            intCarCounter++;
        } 

        /* Count how many trains can be added until 25% of the track is used up -> intTrainCounter++ */
        while (intTrainCounter*intActualTrainSize < (int)(intTrack*.25)) 
        {
            intTrainCounter++;
        }

        /* Count how many people can be on the track at one time -> intPeople = intCarCounter * intTrainCounter * CAR_CAPACITY */
        intPeople = intCarCounter * intTrainCounter * CAR_CAPACITY;
        printf("\nYour ride can have at most %d people on it at one time.",intPeople);

        if (intActualTrainSize>intMaxTrainSize)
            printf("\nMaximum Train Length has surplus of %d feet.\n",intActualTrainSize-intMaxTrainSize);
        else if (intMaxTrainSize==intActualTrainSize)
            printf("\nMaximum Length fits exactly.\n");
    }
    system("pause");
    return 0;
}
4

4 に答える 4

2

ループを使用して列車のカウンターと車両のカウンターを計算しましたが、別の方法として、整数演算を使用してこれらの値を計算することもできます。ループを含まないソリューションを添付しました。デバッグが容易になります。2つのバージョンを提供しています。バージョン 1 では、整数除算が丸められないことを前提としています。バージョン 2 は、除算の前に剰余を減算するため、より安全です。

    //VERSION 1:

    #include <stdio.h>

    #define FIRST_CAR_LENGTH 10
    #define NORMAL_CAR_LENGTH 8
    #define CAR_CAPACITY 4

    int main(void)
    {
      int N, i;
      int trackSize;
      int trainSize;
      int numberPeople;
      int numberCars;
      int trainsPerTrack;
      int surplus;

      printf("What is the value for N?");
      scanf("%d", &N);
      for(i=0; i < N; i++)
      {
         printf("What is the total length of the track, in feet?\n");
         scanf("%d", &trackSize);
         printf("What is the maximum length of a train, in feet?\n");
         scanf("%d", &trainSize);
         trainsPerTrack = trackSize / (4 * trainSize);
         numberCars = (trainSize -FIRST_CAR_LENGTH) / NORMAL_CAR_LENGTH + 1;

         numberPeople = trainsPerTrack * numberCars * CAR_CAPACITY;
         printf("Your ride can have at most %d people on it at one time.\n", numberPeople);

         surplus = (trainSize - FIRST_CAR_LENGTH) % NORMAL_CAR_LENGTH;
         if(surplus)
           printf("Maximum Train Length has surplus of %d feet\n\n", surplus);
         else
           printf("Maximum Length fits exactly\n\n");
      }
      return 0;
    }


VERSION 2:
#include <stdio.h>

#define FIRST_CAR_LENGTH 10
#define NORMAL_CAR_LENGTH 8
#define CAR_CAPACITY 4

int main(void)
{
  int N, i;
  int trackSize;
  int trainSize;
  int numberPeople;
  int numberCars;
  int trainsPerTrack;
  int surplus;

  printf("What is the value for N?");
  scanf("%d", &N);
  for(i=0; i < N; i++)
  {
     printf("What is the total length of the track, in feet?\n");
     scanf("%d", &trackSize);
     printf("What is the maximum length of a train, in feet?\n");
     scanf("%d", &trainSize);
     trainsPerTrack = (trackSize- (trackSize % (4*trainSize))) / (4 * trainSize);
     int forSmallerCars = trainSize - FIRST_CAR_LENGTH;
     numberCars = (forSmallerCars - (forSmallerCars % NORMAL_CAR_LENGTH)) / NORMAL_CAR_LENGTH + 1;

     numberPeople = trainsPerTrack * numberCars * CAR_CAPACITY;
     printf("Your ride can have at most %d people on it at one time.\n", numberPeople);

     surplus = (trainSize - FIRST_CAR_LENGTH) % NORMAL_CAR_LENGTH;
     if(surplus)
       printf("Maximum Train Length has surplus of %d feet\n\n", surplus);
     else
       printf("Maximum Length fits exactly\n\n");
  }
  return 0;
}
于 2013-01-15T08:51:49.083 に答える
1

直接貢献しているかどうかはわかりませんが、以下を再確認する必要があります

while (intActualTrainSize +NORMAL_CAR_LENGTH  <= intMaxTrainSize )
{                         ^^^^^^^^^^^^^^^^^^    
    intActualTrainSize=intActualTrainSize+NORMAL_CAR_LENGTH;
    intCarCounter++;
} 

コードでは、実際の列車のサイズが最大の列車のサイズをオーバーフローすることを許可しているため、余分な 20 のうちの 10 になる可能性があります。

同様に、Train counterもオーバーフローする可能性があります。

可能であれば、そのような while ループをより効率的で読みやすい数式に変換してみてください。

于 2013-01-15T04:31:08.123 に答える
0

あなたの電車は、

    while (intActualTrainSize < intMaxTrainSize)
    {
        intActualTrainSize=intActualTrainSize+NORMAL_CAR_LENGTH;
        intCarCounter++;
    } 

列車が長くなりすぎるまでこのループを実行するので...

于 2013-01-15T04:36:02.573 に答える
0

変数名を入力します。1 文字の変数名はお勧めしません。固定値を使用したループ内のカウンターのインクリメントは乗算で出荷され、反復は必要ありません。ループの最後の繰り返しで、実際のトレイン サイズが最大値を超えています。ユーザーが指定した最大列車サイズが FIRST_CAR_LENGTH 未満の場合はどうなりますか? 実際の列車のサイズを最初に計算するアプローチは正しいです。余剰が存在する場合、ハッサンの答えは正しくないようです。

const double occ = 0.25;

int track;
int max_train;

int cap;
int num_car;
int num_train = 0;
int train = 0;

printf( "Length of track? "); scanf( "%d", &track );
printf( "Max length of train? "); scanf( "%d", &max_train );

num_car = std::max( 0, max_train - FIRST_CAR_LENGTH + NORMAL_CAR_LENGTH ) / NORMAL_CAR_LENGTH;
if( 0 < num_car )
{
    train = FIRST_CAR_LENGTH + NORMAL_CAR_LENGTH * ( num_car - 1 );
    num_train = ( int ) ( occ * track ) / train;
}
cap = CAR_CAPACITY * num_car * num_train;
printf( "Capacity: %d; Train surplus: %d\n", cap, max_train - train );
于 2015-09-22T16:24:11.960 に答える