none
if文について RRS feed

  • 質問

  • はじめまして

    大変簡単な質問で、申し訳ありません。

     

    現在Windows XP SP2の環境で、Visula C++ 6.0でプログラムを作っています。

    そこで"if"文について教えて下さい。

     

    プログラムの流れとして

    for(nn=1; nn<10; nn++){

      anum[nn]=random(k);

      ppp[nn]=3*anum[nn];

      qqq[nn]=2*anum[nn];

      //あくまでも例ですのであまり細かいことは気にしないで下さい。

    }

     

    aa=0;

    for(n1=1, n1<9; n1++){

      for(n2=2; n2<10; n2++){

        aa=aa+1;

        ddd[aa]=ppp[n2]-qqq[n1];

     

    ここで”if”文を用いてもしddd[aa]がマイナスならもう一度始めからというようにしたいのです。

    つまり、Basicで言えばgoto文で始めのfor文に戻ってもらって、もう一度ランダムで数値を出しなおしにしたいのですが、どのような書式にしたらよろしいでしょうか?

     

      }

    }

     

    大変読みにくく、配列などの宣言は無視させていただいています。

    よろしくお願いいたします。

    2008年6月4日 14:44

回答

  • C++ にも goto はあります。

    goto は嫌われていますが、適切に使えば無理に頑張るよりも見やすくなると思います。

     

    あるいは、この処理全体を関数にしてしまい、ddd[aa] がマイナスなら return false, 最後までいけば return true という手もあります。

    この関数が true を返すまで何回も繰り返すわけです。

    # 私ならコッチかな?

    2008年6月4日 15:04
  • 一例。

     

    Code Snippet

    bool CreateArray(int a[5], int b[5], int c[6])

    {

      for(/* for 文の式 */)

      {

        if ( /* 配列を作り直す条件 */ ) return false;

      }

      // 成功したのでtrue

      return true;

    }

     

    int main()

    {

      int aaa[5] = {0};

      int bbb[5] = {0};

      int ccc[5] = {0};

      // trueが帰ってくるまで繰り返す

      while(!CreateArray(aaa, bbb, ccc)) ;
      // 後処理

    }

     

     

     

    ・関数は呼び出す位置より前方に宣言されている必要があります。

    ・宣言と定義は分けることができます。この辺はC++の入門書を見て下さい。

    ・forやwhileループは直後のブロック { } を繰り返すものですが、 ブロックではなく、一行のみ繰り返すことができます。

    ・while ( )の後の ; は空の一行を表しています。 ; の代わりに { }と書くこともできます。

    2008年6月4日 16:57
    モデレータ
  •  さりゅー さんからの引用

    自分の中でC++の関数って結局、メインプログラムに書く事になるので、プログラム自体長くなってしまい結局普通に書いても同じかなと思っています。そして、作った関数も他のプログラムに応用したくても、出来ないような気がしています。

    ソースレベルの話。

    hに関数の宣言を書き、cppに実装(定義)を書きます。

    別のcppでは関数の宣言だけ利用するため、hをインクルードします。

    これらをコンパイルし、リンク(結合)すると、同じ関数を別のcppファイルから利用できます。

    関数の宣言がなければそんな識別子は見つからないとしてコンパイルエラーになり、実装が見つからなければリンカエラーになります。

     

    バイナリレベルの話。

    libファイルやdllファイルとして関数を公開すれば、他のdllやexeからも利用できます。

     

     

    もちろん、全て場合にうまくいくとは限りません。詳細は省略します。

    2008年6月4日 17:05
    モデレータ

すべての返信

  • C++ にも goto はあります。

    goto は嫌われていますが、適切に使えば無理に頑張るよりも見やすくなると思います。

     

    あるいは、この処理全体を関数にしてしまい、ddd[aa] がマイナスなら return false, 最後までいけば return true という手もあります。

    この関数が true を返すまで何回も繰り返すわけです。

    # 私ならコッチかな?

    2008年6月4日 15:04
  • zakioさん

    ありがとうございます。

     

    あまりgoto文を見たことがないので知りませんでした。(勉強不足です)

     

    僕もzakioさんのようにtrueで返す方がスマートな感じがするのですが、そうなると処理全体が関数になると言う指摘ですが、どのようにしたら良いのでしょうか?

    お手数おかけしますが、簡単な例でよいので教えていただければ幸いです。

     

    以前はFortranを使用していたので、多分C++での関数は、Fortranのサブルーチンに当たると思います。

    今のところ引数の関係とか、関数をどのように何処に組み込んだらいいのかも定かではありません。

     

    Fortranの場合でしたら、サブリーチンを別のファイルとして沢山作って、それをコンパイル後にメインのプログラムにリンクさせる方法でプログラムを作成し、かなり簡単にサブルーチンを作っていました。

    そうなるとメインプログラム自体も短くてすむし、サブルーチンも自分の必要な計算プログラムを作成して、保存しておけば他のプログラムにもくっつけることが出来て、楽チンなんです。

     

    しかし、C++となると、サブルーチンの概念が使えそうになく、関数の概念もいまいちぱっとしません。

     

    自分の中でC++の関数って結局、メインプログラムに書く事になるので、プログラム自体長くなってしまい結局普通に書いても同じかなと思っています。そして、作った関数も他のプログラムに応用したくても、出来ないような気がしています。

     

    ちょっと脱線して申し訳ないのですが、色々勉強させて下さい。

    2008年6月4日 16:17
  • 一例。

     

    Code Snippet

    bool CreateArray(int a[5], int b[5], int c[6])

    {

      for(/* for 文の式 */)

      {

        if ( /* 配列を作り直す条件 */ ) return false;

      }

      // 成功したのでtrue

      return true;

    }

     

    int main()

    {

      int aaa[5] = {0};

      int bbb[5] = {0};

      int ccc[5] = {0};

      // trueが帰ってくるまで繰り返す

      while(!CreateArray(aaa, bbb, ccc)) ;
      // 後処理

    }

     

     

     

    ・関数は呼び出す位置より前方に宣言されている必要があります。

    ・宣言と定義は分けることができます。この辺はC++の入門書を見て下さい。

    ・forやwhileループは直後のブロック { } を繰り返すものですが、 ブロックではなく、一行のみ繰り返すことができます。

    ・while ( )の後の ; は空の一行を表しています。 ; の代わりに { }と書くこともできます。

    2008年6月4日 16:57
    モデレータ
  •  さりゅー さんからの引用

    自分の中でC++の関数って結局、メインプログラムに書く事になるので、プログラム自体長くなってしまい結局普通に書いても同じかなと思っています。そして、作った関数も他のプログラムに応用したくても、出来ないような気がしています。

    ソースレベルの話。

    hに関数の宣言を書き、cppに実装(定義)を書きます。

    別のcppでは関数の宣言だけ利用するため、hをインクルードします。

    これらをコンパイルし、リンク(結合)すると、同じ関数を別のcppファイルから利用できます。

    関数の宣言がなければそんな識別子は見つからないとしてコンパイルエラーになり、実装が見つからなければリンカエラーになります。

     

    バイナリレベルの話。

    libファイルやdllファイルとして関数を公開すれば、他のdllやexeからも利用できます。

     

     

    もちろん、全て場合にうまくいくとは限りません。詳細は省略します。

    2008年6月4日 17:05
    モデレータ
  •  

    Azuleanさん

    ありがとうございます。

     

    大変参考になりました。

    試してみたいと思います。

    2008年6月4日 19:29