• ベストアンサー

このプログラムの間違いを指摘していただけませんか?

まだ、初めて一ヶ月も経たない者です。それでも、勉強しつつ、組んでみたのですが、うまくいきません。数字の足し算をして、結果を表示させたいのですが、四回足しても四回目の数字が、足されずに結果がでてしまいます。1と2と3と4と入力すると、6と出てきます。一体どのようにしたらよいのでしょうか?教えて頂けませんか?(下に書いてあります。) #include <stdio.h> int sub(int x, int y, int z){ return x + y + z; } int main() { int i; int a[i]; for (i=1; i<=1; ++i){ printf("数字は?\n"); scanf ("%d\n", &a[i]); scanf ("%d\n", &a[i+1]); scanf ("%d\n", &a[i+2]); scanf ("%d\n", &a[i+3]); int result,x,y,z; result = sub(a[i],a[i+1],a[i+2]); printf("結果は%d\n",result); } return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • bulgaris
  • ベストアンサー率50% (8/16)
回答No.7

直接的な原因を挙げると 表示される値はresultの値です resultにはsubの計算結果の値だけが入ります。 そのsubの返す値は3個の変数の全てを足し合わせた値です。 subに渡された変数はa[i]からa[i+2]までの3つです。 そのためsubが返す値はa[i]からa[i+2]までを足し合わせた値になります ところがgatyapin12さんはa[i]からa[i+3]までの4つの変数の全てを足し合わせた値を必要としています。 しかしsub(a[i],a[i+1],a[i+2]) の計算ではa[i+3]の値は考慮されていません。 resultに入る値はa[i]からa[i+2]までを足し合わせた値です。 そのため表示される値はa[i]からa[i+2]までを足し合わせた値です。 しかしgatyapin12さんが想定している結果はa[i]からa[i+3]までを足し合わせた値です。 プログラムの挙動と想定している挙動の相違により、gatyapin12さんの思っている結果が表示されていません。 プログラムの修正案として 1) 必要のないfor文を取り除く 2) 変数iを、自分が意図している定数に置き換える 3) 計算結果にa[i+3]も考慮する の3つを試してみましょう。

その他の回答 (7)

  • keikan
  • ベストアンサー率42% (75/176)
回答No.8

#define NUMBER 10 と、#includeの次の行にでも入れておいてください。 (とりあえずmain()のまえで) でもって int a[i]; を int a[NUMBER]; としてa[]を宣言してください。 これでint型の配列が10個(添え字としては0から9になります) 次に、for文ですが条件式がi<=1だと1回しか実行されません。 配列全部に該当させるにはNo.3さんのような形になります。 for (i=1; i<=NUMBER-3; ++i){ としてください。 なぜNUMBER-3なのか? 今回は配列自体の添え字が9(宣言値-1)までですよね? sub(a[i],a[i+1],a[i+2])で iに2足した値を利用するようなので 宣言値NUMBERから-1、そして-2でー3になります。 宣言した配列より大きな所を参照しないようにしましょう。 また、No3さんしてきのように int result,x,y,z; で、main関数内で宣言されたx,y,zはmain関数内でのみ有効で、関数subとは無関係の変数になります。 これは「スコープが違う」という関係になります 「スコープ」について調べてみてください。 ですので、ここでのx、y、zはなくてもいいです。 mainの返値の方に関しては、処理系(コンパイラの種類や、OSなどの環境)によって違うのでそれぞれで対応するとよいです。 UNIXなどはシステムにint型の返却値をほしがるみたいですし、新しいCなどはVOIDとして値を返さないのを明言したりするのもあります。

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

main の返り値をどうするかは非常に微妙な問題ですね. 規格だと It shall be defined with a return type of int and with no parameters: int main(void) { ... } or with two parameters: int main(int argc, char *argv[]) { ... } or equivalent; or in some other implementation-defined manner. となっています. これで, 「main の返り値は常に int である」と言っていいのかなぁ? 英文解釈には自信がないので.... 「;」のあとまで with a return type of int が係るのかどうかわかりません? もっとも, int を使わない理由もありませんが.

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.5

まあ、皆さんの指摘でほとんど解決されてるかも知れませんが、main関数をわざわざintで宣言するから、returnを入れないとコンパイラでワーニング出ちゃってreturn 0;入れてるんでしょ? void main(void){ } とすれば、訳分らない返却値を返さなくても良くなります。 関数の宣言は、意味考えて正確にしましょう。

  • inetd
  • ベストアンサー率23% (43/184)
回答No.4

main() 最初にある int a[i]; が間違いです。 このような書き方が許されている C99 や C++ (あるいは コンパイラが gcc)だったとしても i が初期化されていませんのでコンパイルが通っても正常に動作しません。int i; によってiが0に初期化されるようになるコンパイラだったとしても int a[0]; と同じになってしまうので駄目です。

noname#244609
質問者

補足

仰ってる意味はわかるのですが、いえ文に書いてある意味は分かるのですが、試してみたのですが、うまくいきません、それをどのようにこのプログラムに生かすのかが、分かりません。お手数ですが、皆様、どうか、再度教えて頂けないでしょうか?

  • Sohjiro-T
  • ベストアンサー率22% (18/79)
回答No.3

sub()にa[i+3]がないからですね あと配列は[0]から使いましょう。 プログラムとしてfor文がいらないです。 for文を使いたいなら for (i=0; i<4; i++){  printf("数字は?\n");  scanf ("%d\n", &a[i]); } ですね。 int result,x,y,z; x,y,zを宣言する必要はないとおもいます。

  • keroro001
  • ベストアンサー率23% (71/304)
回答No.2

4つめの数値a[i+3]がどこでも足されてませんけど・・・

  • gugux
  • ベストアンサー率16% (68/413)
回答No.1

result = sub(a[i],a[i+1],a[i+2]); に、 scanf ("%d\n", &a[i+3]); が 影響してないからじゃないかな?

関連するQ&A

専門家に質問してみよう