プロが教えるわが家の防犯対策術!

下のプログラムですが、隣り合う配列の値の和を求め、さらにその中で一番大きい値を求めるプログラムです。例えば、下のプログラムの例だと配列の最初を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);

}

A 回答 (6件)

単純なミスですね。

慌てずにゆっくり見れば分かりますよ。

二番目の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つの数の和より大きくなることはないので)

ご参考に。
    • good
    • 0

おかしいと思ったところはほぼ正解. よ~く見るとおかしいところに気づくはず. 「最大値」を求めたい, だよね?



まあ a が端に来ると困ったりするけど.
    • good
    • 0

おっと.



このデータでは表に出てこないバグもいるね.
    • good
    • 0

今のデータでも、このままだと、a=9のときにva[10]を使おうとするので、



・アクセス違反が発生する
・実行時のメモリの状況によってa=9が最大という結果がでる

といったことが起こる可能性があります。
    • good
    • 0

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;
    • good
    • 0

既に回答があるので、別の観点で。


※課題の範囲を超えている可能性もありますが、考え方のひとつとして。
※なので、直接の回答ではありません、失礼。

この問題が複雑になっているのは、「隣り合う配列要素」という、均一でないものが悪さをしています。
というわけで、均一でないものを、見かけ上均一にするというのが良い方針であることが多いです。
つまり、不均一さを、関数に任せるという手があります。

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;
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!