2016-07-08 13 views
-1

すべて! firstnameには3-nest forループ、middle nameには3-nested whileループ、3つの再帰関数(繰り返しを置き換えるために再帰を使用する)を使用しているときは、次のようなプログラムを書く必要があります。C++ recursion&read infile trouble

"指定された の行数と列数で示されているように、それぞれ長方形の形をした「名字、あなたのミドルネーム、姓を表示する」また、同じ行にある の名前を繰り返した後、入力ファイルに各人の名前を 同じ形で繰り返します。最後に同じ名前の フォーメーションを繰り返してください。

入力ファイルには、名、ミドルネーム、および前回の3行が含まれています。私はファイルを一度に1行ずつ読み込んで、名前をスペースにしてから次の部分をミドルネームにし、最後の名前を最後まで自分の名前にする必要があることを知っています文字列。その後、ファイルの終わりに達するまで、すべての行について繰り返します。その後、基本的に私のコードをコピーしてファイル入力を適用します。

私が全く理解していないのは、私が姓のためにしなければならない再帰です。誰かが私を見せたり、私のためにいくつかのコードを始めることができますか?私は再帰に関する例を読んだことがありますが、私はこの文脈への移行方法を知らないのですか?
ありがとうございます!

私がこれまで持っているコードは次のとおりです。

`#include <iostream> 
#include <string> 
#include <fstream> 
using namespace std; 

//void lnameFunction(int j) 
//{ while (c = 1) 



int main() 
{ 
string fname, mname, lname; //declare name 
fname = "John; 
mname = "Bob"; 
lname = "Doe";  

int rows = 2; int column= 5; 
    for (int i= 0; i < rows ; i++) // for loop for fname 
    { cout << ".";   // first period of line 

    for ( int j= 1; j <=column; j++) //name after each period series 
    { cout << fname; 

     for (int k= 0 ; k <= j ; k++) //increasing periods 
     { cout << "."; 
     } 
    }  
    cout << endl; 

    } 
cout << endl; 
    int i = 0, j = 0, k = 0, c = 0;  // declare var. for while loop 

    while (i < 2)   // while loop for lname 
    { cout << "."; 
     while (j < 5) 
     { cout << mname; 
      j++; 
      while (k < j+1) 
      { cout << "."; 
      k++; 
      } 
      k=0; 
     } 
     i++; 
     j=0; 
     cout << endl; 
    } 
    c++;   // increase C for lnamefunction 

return 0; 
    }`  

EDIT:混乱したため、出力はとても好きでなければならない:

.john..johnを...ジョン....ジョン.. ...ジョン.........
.john..john ...ジョン... ....ジョン... .....ジョン.........

.bob..bob ...ボブ....ボブ.....ボブ......
""

.doe .. ""
"
入力ファイルは、3行の名前、中間名、および姓の3つの行を読み取り、3行すべてが完了するまで上記のように繰り返します。上記のように私の名前を繰り返します。私は数の増加と、あなたは再帰的に最後の名前をプリントアウトしたいものを見ているから .inputfirstname ..「」
「」だから

など

+1

このすべては再帰と何が関係していますか? – user463035818

+0

一般に、whileとforのループの使用は*反復*ではなく*再帰*を意味します。再帰は、関数がそれ自身を呼び出すときです。 C++では 'main'関数を再帰的に使うことはできません。 –

+0

私たちの先生は、再帰を使用して姓の出力を、最初の名前と中間名の出力のように表示させたいと考えています。 – itzfran

答えて

0

「」間に

C++では、関数自体を内部で呼び出すことができます。例:FOOを呼び出すことと同等になるように

void foo(){ foo();} 

がそれを行います。同様

for(;;) 
     foo(); 

、あなたは、このように関数パラメータを渡すことができます。私たちは期間の数を増やすとの最後の名前をプリントアウトしたいのであれば、我々はこれを行うだろう:

void printLastNames(int howMany, string name, int currentIteration){ 
     for (int i = 0; i < currentIteration; i++) 
      cout << '.'; 

     cout << name; 

     currentIteration++; 

     if (currentIteration <= howMany) 
      printLastNames(howMany, name, currentIteration); 

} 

お知らせをどのように各反復、currentIterationが増加し、それがどのように継続するhowManyが照合されますと。

for (int currentIterations = 1; currentIterations <= howMany; currentIterations++){ 
//Print the stuff normally 
} 

本の最も重要な部分は、あなたが反復的に行うことは不可能/難しいだろうパラメータ値を探索するために再帰関数の一部としてパラメータを渡すことができる方法を理解である。換言すれば、これはと同じように動作します(言い換えれば再帰はありません)。

クラスが与えるような再帰適用の有用な例は、迷路のパスを見つけることです:​​。

+1

';' sは関数宣言のパラメータの間にありますか? – kfsone

+0

よろしくお願いします。長い一日でした。 –

+0

大丈夫、ありがとう!私は今約1時間それを理解しようとしていました。私は混乱しています。私のコードにはどこにこれを置くのですか?そして私の姓を吐き出すためにそれをどう呼びますか? – itzfran