下のプログラムですが、隣り合う配列の値の和を求め、さらにその中で一番大きい値を求めるプログラムです。例えば、下のプログラムの例だと配列の最初を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件)
- 最新から表示
- 回答順に表示
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つの数の和より大きくなることはないので)
ご参考に。
No.4
- 回答日時:
今のデータでも、このままだと、a=9のときにva[10]を使おうとするので、
・アクセス違反が発生する
・実行時のメモリの状況によってa=9が最大という結果がでる
といったことが起こる可能性があります。
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.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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 物理学 高1力学の運動量の問題です。問題を一通り解いたのですが、行き詰まってしまったのでご回答頂ければ嬉しい 3 2022/06/29 11:20
- 物理学 Va=1/4πε × (q1/a + q2/b + q3/c) Vc=1/4πε × (q1+q2+ 2 2023/04/16 14:08
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- 物理学 2物体の単振動 1 2023/08/17 20:27
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- 物理学 なぜ(C)でF=√3mg……(aから求めました) を使って Fのした仕事は Flcos30°だから 6 2022/08/15 18:24
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- 物理学 電気磁気測定の整流形電圧計の問題についてです。 写真の問題についてで、正弦波での実効値Ve、最大値V 2 2023/02/16 11:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
比較回数と交換回数表示について
-
複数桁10進数の*桁目だけを抽出...
-
nCmの関数
-
構造体の勉強中です 合計点の高...
-
C言語 配列と関数の練習問題
-
[C言語] 関数を利用する計算
-
実数の整数部,小数部の取得
-
C言語での引数の省略方法
-
数字列を3桁ごとにカンマで区切...
-
アスタリスクでダイヤ型を作る
-
覆面算のプログラムが分かりません
-
C言語の基礎 . 2乗値の差につ...
-
c言語
-
プログラミング
-
【C++】関数ポインタの使い方
-
毎回違う乱数を生成するにはど...
-
if と配列の組み合わせ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
「指定されたキャストは有効で...
-
C言語 配列と関数の練習問題
-
複数桁10進数の*桁目だけを抽出...
-
(int *)の意味
-
if と配列の組み合わせ
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
c言語
-
足して100になるような乱数のア...
-
C言語初心者です、、、お助けく...
-
数字列を3桁ごとにカンマで区切...
-
C言語 エラーの原因がわからな...
-
実数の整数部,小数部の取得
-
課題でつまってます・・・
-
商と剰余を同時に求める(C言語)
-
C言語の配列をC++のvectorに高...
-
std::set<int> で、ある値が何...
おすすめ情報