0

プログラムは、引数の数を計算し、引数のリストを反復処理し、引数ごとに引数を整数に変換して配列にコピーし、配列の要素を反復処理し、それぞれの値を変数 (これは要素の合計を計算します)、および合計を出力します。15 を超える引数はありません。これまでのところ、私は持っています:

int sumofA (int sizeofA, int x, int y){  
  int i = sizeofA;  
   if (i <= 15){  
      int z = x + y;  
      return z;  
   }  
}  

int main (int argc, char*argv[]){    
   int sizeofA = argc - 1;  
   int i = 1;  
   while (i <= sizeofA){  
      int x = GetInt (argc, argv, i);  
      i = i + 1;  
      int y = GetInt (argc, argv, i);     
      printf ("%d\n", sumofA (sizeofA, x, y));
   }  
   return 0;  
}  

さて、(./a 以外の 3 つの引数が指定された場合)、最初の引数と 2 番目の引数の合計、次に 2 番目と 3 番目の引数、そして 3 番目の引数の値が出力されます。なんで?

GetInt のコードは次のとおりです (これを使用する必要があります)。

int GetInt (int argc, char * argv[], int i) {  
   if (i < 0 || i >= argc) return 0;  
   return atoi(argv[i]);  
}  

各引数を調べて整数に割り当てる必要がありますか (例: int z = GetInt (argc, argv, i + 2))?

4

5 に答える 5

5

ここで間違っていることがいくつかあります。

  • i は sumofA で定義されていないため、それと比較すると未定義の動作が発生します。
  • i >= 15 の場合、sumofA が何を返すかは不明です。
  • ループ内に戻ります。確かにそれはあなたが望むものではありません。
  • コードは実際には配列 A に何も格納していません。

すべての警告フラグ (gcc: -Wall -Werror -pedantic) をオンにしてコードをコンパイルし、コードのコンパイル時に警告がないことを確認してください。

変数サイズは不要であることに注意してください: while (i < argc) を使用してください。

編集: GetIntのコードを追加したので、置き換えます

GetInt (argc, argv, i);

atoi(argv[i]);

GetIntは使用しないので、完全に削除できます。

最後に:あなたの質問では、数値を配列に格納してから合計することに言及しています。あなたはそれをしたいですか、それともそれをする必要がありますか (何らかの代入のためですか?) 必要がないからです: 単純にすべての呼び出しの結果をatoiに追加してください。その場合、配列Aは余分です。

編集 2:いくつかの場所でコードを修正したようです。あなたのコードは現在 (23:31 CEST) 最初の引数を各引数に個別に追加し、それらを出力します。あなたはまだそこにいません。幸運を!

于 2009-03-30T21:03:17.083 に答える
2

あなたの問題はここにあります:

 int x = GetInt (argc, argv, 1);
 int y = GetInt (argc, argv, i);

初めてループを通過するとき、i とは何ですか? また、何を出力するのでしょうか? ループを2回通過するのはどうですか?

于 2009-03-30T20:59:52.597 に答える
2

まず、ループの最初の繰り返しの後に 0 を返しています。

于 2009-03-30T21:00:18.790 に答える
1

フォーマットのヘルプが必要なので...

まず、C には だけでなく、より多くの代入演算子があり=、これらは のようなものに最適ですx = x + 1。C を含むほとんどの言語は、+=次のような演算子を提供しますx += 1。これは , と同じことをx = x + 1行い、より優れています。構文糖ですが、砂糖はおいしいです。

私たちが取り組んでいる間、C および他の多くの言語は、 C++ がその名前を取得+= 1する演算子の特別なケースを提供します。++本当に、まったく同じ効果を持つx = x + 1ように書き換えることができます。ただし、 と の間には大きな違いがありますが、現時点では問題ありません。との違いがわかるまでは、とりあえず、どちらか好きな方を使ってください。x++x++++xx++++x

一度使用した変数がある場合は、使用しないでください。これの代わりに:

int sizeofA = argc - 1;
...
while (i <= sizeofA){
  ...
  printf ("%d\n", sumofA (sizeofA, x, y));
}

これを試して:

...
while (i <= argc - 1){
  ...
  printf ("%d\n", sumofA (argc - 1, x, y));
}

または(おそらくより良い):

...
while (i < argc){
  ...
  printf ("%d\n", sumofA (argc - 1, x, y));
}

第三に、引数リスト全体をやみくもに渡すのではなく、現時点で変換したい引数だけを渡す必要がありますが、それは別の問題であり、変更できないと思いますGetInt()。これはもう一日の戦いのようです。

(4 つ目、なぜこれが Community Wiki の質問なのですか?)

第 5 に、あなたの論理は間違っていると思います。1 から開始する場合、リストの最後まで 1 を停止したくないと思います。しかし、これは単純なオフバイワンエラーであり、実際にそれがエラーであることが確実にわかったら、後で修正できます。

最後に、変数 を定義し、リストのすべての要素をing するint answer代わりに、単純にリストを調べて、それぞれの数値を に追加し、最後に を出力することをお勧めします。しかし、多分私は課題の要点を逃しています。または、ループを反復するたびに を出力すると、毎回値が正しく増加することがわかります。これが課題で実際にやりたいことに近いと思いますが、行く授業があるので確認する時間が取れません。printf()answeransweranswer

于 2009-03-30T22:59:49.080 に答える
0

最初のループで x と y の両方に同じ値が割り当てられ (i=1 であるため)、それらの合計が出力され、関数が返されてプログラムが終了します。したがって、最初の値がそれ自体に追加されます。

于 2009-03-30T21:05:00.493 に答える