2017-05-28 2 views
1

私のクラスのこの宿題は、2D配列に30値をハードコードするよう求められています(4週間、温度が記録された7日間毎日)。次に、私のプログラムが最大値を見つけて印刷するようにして、その日には&が記録されています。しかし3つの別々の日に3つの最大値があります。私は3つすべてのケースを印刷しなければならないと仮定します。stdio.hを使用してCの2D配列から複数の最大値を記録する方法

ScreenShot of the question is here. 私はまだ初心者ですが、これまでにこのような問題は発生していません。私はそれを下に記載されて3の1つの最大値を印刷するためのコードを書いた:

#include <stdio.h> 

#define y 4 
#define x 7 

int main() 
{ 
    int max = 0, week, i, j, day; 
    int table[y][x] = { 
     {32,31,30,31,32,33,32}, 
     {33,32,34,35,34,36,36}, 
     {34,34,36,36,37,38,38}, 
     {38,37,36,35,34,33,32}}; 

    for (i = 0; i < y; i++) 
    { 
     for (j = 0; j < x; j++) 
     { 
      if (max <= table[i][j]) 
      {   
       max = table[i][j]; 
       day = j + 1; 
       week = i + 1;   
      } 
     } 
    } 

    switch (day) 
    { 
     { case 1: printf("The highest temperature %d was recorded on Monday of week %d\n", max, week); break; } 
     { case 2: printf("The highest temperature %d was recorded on Tuesday of week %d\n", max, week); break; } 
     { case 3: printf("The highest temperature %d was recorded on Wednesday of week %d\n", max, week); break; } 
     { case 4: printf("The highest temperature %d was recorded on Thursday of week %d\n", max, week); break; } 
     { case 5: printf("The highest temperature %d was recorded on Friday of week %d\n", max, week); break; } 
     { case 6: printf("The highest temperature %d was recorded on Saturday of week %d\n", max, week); break; } 
     { case 7: printf("The highest temperature %d was recorded on Sunday of week %d\n", max, week); break; } 
    } 
    return 0; 
} 

は君たちが私が邪魔にこのコードを書くために助けることができる最大値のx個のすべてのケースがある場合x値は日と週で表示されます。また、クラス内のすべての図書館をカバーしていないためです。彼らは私がstdio.hを使ってプログラムを書くことだけを期待しています。

お読みいただきありがとうございます。また、あなたの返信を事前に感謝します。

PS:私がまだコーディングの他の面をカバーしていないので、<stdio.h>、配列、ポインタ、ループを使用して解決策を提案できるかどうか本当にありがとうと思います。

+0

:ここ

は修正版です。値が最大値に等しい場合は、各要素で、日、週、および最大値をループ内に表示します。 –

答えて

1

コードは機能しており、最終日の最高温度を記録しています。このようx#defineyような単純な小文字の識別子を定義する

  • 避けてください:まだここに改善のいくつかの領域があります。
  • 多くの冗長コードを含む長文のswitchステートメントを避けるために、曜日名の配列を使用する必要があります。
  • 記録された最初の温度の値にmaxを初期化する必要があります。コード化されているため、すべての温度が負の場合に最大値を見つけることができません。

あなたは最高温度が複数日に記録されていることに気付きましたが、これは非常に良い点であり、何を出力するかに関しては仕様が多少あいまいです。複数の結果を生成することは、期待通りではないかもしれませんが、割り当てが手作業で検証された場合は、確かにボーナスになります。

すべての一致日を印刷するには、まず最高温度を決定し、2番目のループを使用して記録日を列挙します。あなたがしなければならないのは、再び2次元配列を横断し、最大値を取得した後に一度ある

#include <stdio.h> 

#define NWEEKS 4 
#define WEEKDAYS 7 

int main(void) { 
    int max, week, day; 
    int table[NWEEKS][WEEKDAYS] = { 
     { 32, 31, 30, 31, 32, 33, 32 }, 
     { 33, 32, 34, 35, 34, 36, 36 }, 
     { 34, 34, 36, 36, 37, 38, 38 }, 
     { 38, 37, 36, 35, 34, 33, 32 }}; 
    const char *dayname[WEEKDAYS] = { 
     "Monday", "Tuesday", "Wednesday", "Thursday", 
     "Friday", "Saturday", "Sunday" }; 

    max = table[0][0]; 
    for (week = 0; week < NWEEKS; week++) { 
     for (day = 0; day < WEEKDAYS; day++) { 
      if (max < table[week][day]) {   
       max = table[week][day]; 
      } 
     } 
    } 
    printf("The highest temperature is %d\n", max); 
    for (week = 0; week < NWEEKS; week++) { 
     for (day = 0; day < WEEKDAYS; day++) { 
      if (table[week][day] == max) { 
       printf("It was recorded on %s of week %d\n", 
         dayname[day], week + 1); 
      } 
     } 
    } 
    return 0; 
} 
+0

このソリューションをありがとうございました。それは本当の頭を掻く者だった。上記のコメントのように、私は最大値を見つけ、それがどの日に記録されたかを記録する2回の反復を行い、完全に機能しました。しかし、あなたの解決策はより重要です。 もう一度ありがとうございます。 –

0

これを試してください。複数の場合は、リンクされたリストに日の詳細を格納します。

#include<stdio.h> 
#define y 4 
#define x 7 
typedef struct record{ 
int week; 
int day; 
record* next; 
}dayRecord; 

int main() 
{ 
    int max=0,week,i,j,day; 
    int table[y][x]={{32,31,30,31,32,33,32},{33,32,34,35,34,36,36},{34,34,36,36,37,38,38},{38,37,36,35,34,33,32}}; 
    dayRecord* list = NULL; 

    for(i=0; i<y ; i++) 
    { 
     for(j=0; j<x ; j++) 
     { 
      if(max<table[i][j]) 
      {   
       max=table[i][j]; 
       dayRecord* d = malloc(sizeof(dayRecord)); 
       d->day=j+1; 
       d->week=i+1; 
       d->next = NULL; 
       list = d; 
      }else if(max == table[i][j]){ 
       dayRecord* d = malloc(sizeof(dayRecord)); 
       d->day=j+1; 
       d->week=i+1; 
       d->next = list; 
       list = d; 
      } 
     } 

    } 
    while(list->next != NULL){ 
     int day = list->day; 
     int week = list->week; 
     list = list->next; 
     switch(day) 
     { 
      {case 1: printf("The highesest tempreture %d was recorded on Monday of week %d\n",max,week);break;} 
      {case 2: printf("The highesest tempreture %d was recorded on Tuesday of week %d\n",max,week);break;} 
      {case 3: printf("The highesest tempreture %d was recorded on Wednesday of week %d\n",max,week);break;} 
      {case 4: printf("The highesest tempreture %d was recorded on Thursday of week %d\n",max,week);break;} 
      {case 5: printf("The highesest tempreture %d was recorded on Friday of week %d\n",max,week);break;} 
      {case 6: printf("The highesest tempreture %d was recorded on Saturday of week %d\n",max,week);break;} 
      {case 7: printf("The highesest tempreture %d was recorded on Sunday of week %d\n",max,week);break;} 
     } 
    } 
    return 0; 
} 
0

あなたが初心者の場合は、2セットのイテレーターを持つことをお勧めします。

イテレータは、基本的に

for(i=0;i<n;i++) 
{ 
for(j=0;j<m;j++) 
{ 
// Do something here. 
} 
} 

だから何あなたがすることは、第1のイテレータで最大温度を見つけ、である、との条件が第二イテレータに現在の値を最大値に一致する場合は持っています。値が一致する場合は、既に書いたスイッチのケースを実行します。

このように、複雑なリンクリストをプログラムする必要はありません。

プログラミングで通信事業者をご希望の場合は、リンクリストの使用を強くお勧めします。

関連する問題