1

重複の可能性:
C++ はファイル内の文字列に一致し、行番号を取得します

私は HW の割り当てを与えられているので、コードの完全なセットを求めているわけではありませんが、私が何をすべきかについてのヒントを求めているのかもしれません。割り当ては次のとおりです。テキスト ファイル babynames2004.txt が含まれます。米国で最も人気のある 1000 の名前のリストが含まれています。これは、ランクが最初にリストされ、その後に対応する男の子の名前と女の子の名前が続く、1000 エントリのスペース区切りのファイルです。最も人気のある名前が最初にリストされ、最も人気のない名前が最後にリストされます。ユーザーが名前を入力できるようにするプログラムを作成します。次に、プログラムはファイルから読み取り、女の子と男の子の間で一致する名前を検索し、この情報を配列に格納する必要があります。一致が見つかった場合は、名前のランクを出力する必要があります。プログラムは、一致がないかどうかも示す必要があります。

#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;
//function prototypes
void input(int search(const int name[][Max_Girl_Name], int, int, int );
void display(


int main()
{
  const int Max_Girl_Name = 1000, Max_Boy_Name = 1000;     //array sizes
  int name[][Max_Girl_Name], count(0);

  ifstream inputfile; //open stored file
  inputFile.open("c:/temp/babynames2004.txt")
  if (inputFile.fail())
  {
     cout<<"Error opening File\n";
  }
  else 
  {
     while(!inputFile.eof())
     inputFile>>name[count];
     count++
  }

  input(
  searchname = (
  display(

  inputFile.close();

  cout << count " is ranked " << Rank <<  

}

system("PAUSE");
return 0;
}

int search(const int name[][Max_Girl_Name], int name_input, int targetname, int size_Dimension_1)
{
  for(int i = 0;i<size_Dimension_1;i++)
  {
    int index = 0;
    bool found = false;
    while ((!found) && (index < number_used))
      if (target == name[index])
         found = true
      else 
           index++;

      if(found)
               return index;
      else -1;
    }
}

また、いくつかの考えがあります。

  1. これは多次元配列を使用して解決されnames[boy_name][girl_name]ますか?
  2. このプログラムの機能は、、、search(value)ですか?input(void)output(void)
  3. 配列の両方のインデックスをどのように反復処理しますか?

私は十分に明確であることを願っています。

4

3 に答える 3

1

いくつかのヒントの前に、物事へのアプローチ方法についての提案です。コーディングが第二の性質のようになるまでは、最終的なコードで実行したいことを疑似コードで書き出すことに時間を費やす必要があります。次に、行をコメントに変更し、要件を満たすために必要な変数やループなどの肉付けを開始します。そうすることで、(a) より几帳面になり、(b) アプローチを文書化できるようになります。

//The text file babynames2004.txt is included. 

//Contains a list of the 1000 most popular names in the US. It is a space-delimited file of //1000 entries in which the rank is listed first, followed by the corresponding boy name //and girl name. 
const int Max_Name = 1000

//The most popular names are listed first and the least popular names are listed last. 
int rankArray[Max_Name];//a given index in all three corespondss to the row in the file
char boyArray[Max_Name][SomeConstantMaxLengthValue];
char girlArray[Max_Name][SomeConstantMaxLengthValue];

//write a program that allows the user to input a name. 
int main(unsigned int argc, const char** argv )
{
    std::cin >> searchName;

    //The program should then read from the file and search for a matching name among the   
    //girls and boys then store this information in an array. If a match is found, it 
    //should output the rank of the name. The program should also indicate if there is no 
    //match.
    if ( readNameFromFile( searchName , rank, girlName, boyName ) )
    {
        Store( rank,girlName,boyName );
        std::cout << .... //details retireved...
    }
    else
    {
         //Not found - do something helpful
    }
}

readFromFile関数内で引数を操作できるように、Store引数を参照(google/c++ の教科書)で渡すことを検討してください。ファイルの読み取りに関する Ians のヒントを参照してください。

あなたの質問は、ユーザーが選択したものだけを保存することを望んでいるようです。それ以外の場合は、ファイルを検索して正しい行を選択する必要があります。確かに、すべてを読み取ってから保存する方が効率的ですが、それはあなたの決定です。すべてを読み取った場合は、名前が一致するまで 2 つの名前配列を移動するだけです。次に、ランク、女の子、男の子の配列から詳細を引き出します...ヒント strncmp(...)、または名前に使用できる場合std::stringは、たとえば

std::string boyNames[Max_Name];
std::string girlNames[Max_Name];

簡単かもしれませんが、使用する必要があると思いますchar

名前は任意の長さであるため、実際の配列は慎重に選択する必要があります。そのため、詳細を記録する方法を検討することをお勧めします。char 配列にする場合は、保存時に長さを確認する必要があります。 . 乗り方を確認し、質問があれば戻ってきてください。

于 2012-11-08T09:47:58.113 に答える
1

あなたの知識レベルによると、あなたは配列にこだわっています。すでに定義したように、3 つの 1 次元配列が必要です。(実際のプログラムでは、boysname、girlsname、rank の 3 つの項目を含むクラスを定義します)

1.次のようになります。

int maxLines=1000;
int maNameLength=100; // This would go away later coz you would use std::string when you learnt them
char boysName[maxLines][maxNameLength];
char girlsName[maxLines][maxNameLength];
int rank[maxLines];

(だからここにあなたの「多次元配列」があります、それは女の子と男の子の名前です)

2.その通りです。そのような 3 つの機能で十分です。入力関数は、たとえば、ファイルを 1 行ずつ読み取り、それを 3 つのフィールドに分割して、これらの配列に格納する必要があります。これは、std:: ライブラリの高レベルの構成を使用してさまざまな方法で行うことができます。また、初心者として手動で行うこともできます。(配列サイズよりも多くの行を持つファイル、または maxNameLength よりも長い名前に注意してください)。検索関数は配列を調べて名前が等しいかどうかをチェックし、見つかった場合は配列インデックスを返します。そうでない場合は -1 など

次に、出力関数はこの配列インデックスを取得し、最初にその有効性 (>=0 および lt maxLines) をチェックしてから、ランクを出力するか、見つからないかのいずれかを出力します)。

イライラしないでください。このプログラムを起動して実行するには、初心者としてやるべきことがたくさんあります...

于 2012-11-08T09:41:11.177 に答える
0

ヒント

ifstreamには、必要な区切り文字を指定できるメソッドがgetlineあります。

男の子の名前と女の子の名前は特に関係がないので、完全に別のリストに保存できますが、両方のリストに含まれる名前がある場合はどうなるでしょうか。

それぞれの名前にはランクが付いているため、2 つのデータが関連付けられるように情報を格納する必要があります。

于 2012-11-08T09:35:32.127 に答える