書式設定のどこに重点を置くべきかについてヒントを得ることができますか?[閉まっている]

StackOverflow https://stackoverflow.com/questions/698973

  •  22-08-2019
  •  | 
  •  

質問

プログラムは、引数の数を計算し、引数のリストを反復処理し、引数ごとに引数を整数に変換して配列にコピーし、配列の要素を反復処理して、各要素の値を加算することになっています。変数 (これは要素の合計を計算します) を入力し、合計を出力します。引数は 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) )?

役に立ちましたか?

解決

ここでいくつか問題が発生します。

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

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

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

編集: コードを追加したので、 GetInt, 、 交換する

GetInt (argc, argv, i);

atoi(argv[i]);

用はない GetInt, 完全に削除できます。

最後に:あなたの質問では、数値を配列に保存してからそれらを合計すると述べています。あなたは 欲しい それをするか、 必要 (何らかの割り当てのため?) それは必要ないので、次のようにします。すべての呼び出しの結果を単に追加するだけです アトイ. 。配列 それなら余計です。

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

他のヒント

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

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

あなたはループを介して第1の時間に行くと、私は何であり、それは何をプリントアウトしていますか?あなたがループを通過する第二の時間についてはどうですか?

まず第一に、あなたは、ループの最初の反復の後に0を返すされます。

あなたが助けをフォーマットしたいので...

まず第一に、Cはちょうど=以上の代入演算子を持っており、これらはx = x + 1のようなもののために素晴らしいです。 +=:ほとんどの言語は、Cは次のようになりますx += 1演算子を、提供し、含まれています。それはx = x + 1と同じことをして、よりよいです。 Syntaxtic砂糖が、砂糖はおいしいです。

C ++は、その名前を取得し、そこから+= 1演算子 - 私たちがそれに取り組んでいる一方で、

、Cおよび他の多くの言語は++のための特別なケースを提供しています。だから、本当に、x = x + 1のとまったく同じ効果のでx++ように書き換えることができます。 x++++xの間に大きな差があること、しかし、注意してください、それは現在は問題ではありません。今のところ、あなたが欲しい方いずれかを使用して、あなたがx++++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オフ、なぜこのコミュニティのWikiの質問です?)

第五に、私はあなたのロジックがオフになっていると思います - あなたは1で開始した場合、私はあなたがリストの最後の前に1を停止したいとは思いません。しかし、これは簡単なoff-by-oneエラーであり、あなたはそれが、実際には、誤りであることを確かに知ったときは、その後で修正することができます。

最後に、私の代わりにint answeringの<全角>すべてののリストの要素は、単にリストを通過し、それぞれの数値が、printf()に追加、あなたが変数、answerを定義示唆し、そして、最後に、answerをプリントアウト。しかし、多分私は割り当てのポイントを逃しています。また、あなたはループを繰り返すたびに、answerをプリントアウトし、あなたは値が正しくたびに育てる見ることができます。私は、これはあなたが実際に割り当てに何をしたいのかに近いと思いますが、私はに行くためのクラスを持っているので、私はチェックする時間を取ることができない。

は、ループのxおよびyを介して第一時間の両方(I = 1以降)と同じ値が割り当てられ、それらの和はプリントアウト、及びプログラムを終了、関数リターンします。だから、あなただけの自分自身に最初に追加された値を取得することがあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top