• 締切済み

c言語の質問です。回答お願いします

下のプログラムですが、隣り合う配列の値の和を求め、さらにその中で一番大きい値を求めるプログラムです。例えば、下のプログラムの例だと配列の最初を0番目とすると3番目が一番大きく2,3,4番目の値を足して21になります。そして、2,3,4番目の中で値が9の四番目を求めたいのですが2番目の5が求めた値となります。おそらく2回目のfor分の辺りがおかしいと思うのですが・・・ よろしくお願いします。 #include<stdio.h> int main(void){ int va[10]={1,3,5,7,9,0,2,4,6,8}; int a,b,c; int max; int saidai; int i,j; max=va[0]; a=0; b=0; for(a=0;a<10;a++){ if(a==0 && max<va[a]+va[a+1]){ max=va[a]+va[a+1]; b=a; } else if(a==9 && max<va[a-1]+va[a]){ max=va[a-1]+va[a]; b=a; } else if(max<va[a-1]+va[a]+va[a+1]){ max=va[a-1]+va[a]+va[a+1]; b=a; } } saidai=va[b-1]; c=0; i=b-1; for(i=b-1;i<=b+1;i++){ if(va[i]<saidai){ c=i; saidai=va[i]; } } printf("%d番目:最大値%d\n",c+1,saidai); }

みんなの回答

回答No.6

既に回答があるので、別の観点で。 ※課題の範囲を超えている可能性もありますが、考え方のひとつとして。 ※なので、直接の回答ではありません、失礼。 この問題が複雑になっているのは、「隣り合う配列要素」という、均一でないものが悪さをしています。 というわけで、均一でないものを、見かけ上均一にするというのが良い方針であることが多いです。 つまり、不均一さを、関数に任せるという手があります。 int tonari_wa(int a[], int max, int index) { // 配列 a[max] の、index で指定された要素に対して、隣り合う配列の和を返す。 if (index >= max) return 0; // またはエラー処理 if (index < 0) return 0; // またはエラー処理 if (index == max - 1) return a[index] + a[index - 1]; if (index == 0) return a[0] + a[1]; return a[index - 1] + a[index] + a[index + 1]; } int get_array(int a[], int max, int index, int valueIfError) {// a[max] のから、指定された index の値を返す。 // index が範囲を超える場合、valueIfError で指定された値を返す // (配列範囲をはみ出したとき実質処理を無効化するため) if (index < 0) return valueIfError; if (index >= max) return valueIfError; return a[index]; } #include<stdio.h> int main(void){ int va[10]={1,3,5,7,9,0,2,4,6,8}; int max = va[0] + va[1]; int maxIndex = 0; int i; for(i = 1; i < 10; i++) { if (max < tonari_wa(va, 10, i)) { max = tonari_wa(va, 10, i); maxIndex = i; } } // 2段目の最大値探索 i = maxIndex; max= va[i]; for(i = maxIndex - 1; i <= maxIndex + 1; i++) { if (max < get_array(va, 10, i, max)) { max = get_array(va, 10, i, max); maxIndex = i; } } printf("%d番目:最大値%d\n",maxIndex + 1, max); return 0; }

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.5

max = va[0]; b = 0; for (a = 0; a < 10; a++) { if (a == 0) { if (max < va[a] + va[a+1]) { max = va[a] + va[a+1]; b = a + 1; } } else if(a == 9) { if (max < va[a-1] + va[a]) { max = va[a-1] + va[a]; b = a; } } else { if (max < va[a-1] + va[a] + va[a+1]) { max = va[a-1] + va[a] + va[a+1]; b = a + 1; } } } printf("%d番目:最大値%d\n", b, max); return 0;

回答No.4

今のデータでも、このままだと、a=9のときにva[10]を使おうとするので、 ・アクセス違反が発生する ・実行時のメモリの状況によってa=9が最大という結果がでる といったことが起こる可能性があります。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

おっと. このデータでは表に出てこないバグもいるね.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

おかしいと思ったところはほぼ正解. よ~く見るとおかしいところに気づくはず. 「最大値」を求めたい, だよね? まあ a が端に来ると困ったりするけど.

  • KEIS050162
  • ベストアンサー率47% (890/1879)
回答No.1

単純なミスですね。慌てずにゆっくり見れば分かりますよ。 二番目のforループ内のif文 if(va[i]<saidai){ を if(saidai<va[i]){ にしてやってみてください。 デバッグ用に、for文にprint文などを入れて変数を出力しながら実行すると、こういうのはすぐに見つけられます。 以下は蛇足ですが、 前半のif ~ else の連続は個人的には見難くなるので、switch文などを使うとすっきりします。 switch( a) {    case 0:       (if文1)    case 9:       (if文2)    default:       (if文3) } (それぞれに大小比較のif文を入れる。) また、前半のif文では、aが0,9の時を条件分けしているので、後半も条件分けが必要になります。 配列が正の数という条件があるのであれば、a=1; a<9 ; a++ として簡略化しても良いかも知れませんね。 (正の数であれば、2つの数の和が3つの数の和より大きくなることはないので) ご参考に。

関連するQ&A