1

可能重复:
文件中的 C++ 匹配字符串并获取行号

我被分配了一个硬件任务,所以我不是要求一整套代码,但也许是一些关于我应该做什么的提示。分配如下: 包含文本文件 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 个名称数组,直到名称匹配。然后从 rank、girl 和 boy 数组中提取详细信息...提示 strncmp(...)或可能您是否可以std::string用于名称

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

它可能更容易,但我猜你需要使用char

需要谨慎选择实际的数组,因为名称是任意长度,因此您可能需要考虑如何记录详细信息 - 如果它将是 char 数组,那么您需要在存储等时确保长度... . 看看你是怎么上去的,如果有任何问题就回来。

于 2012-11-08T09:47:58.113 回答
1

根据您的知识水平,您被困在数组中。您应该有 3 个一维数组,就像您已经定义的那样。(在实际程序中,您将定义一个包含三个项目boysname、girlsname 和rank 的类)

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个这样的功能就可以了。输入函数应该例如逐行读取文件,将其分成三个字段并将它们存储在这些数组中。这可以通过各种方式完成,使用 std:: 库中的高级构造,或者作为初学者,您可能想手动完成。(注意文件的行数超过数组大小,或者名称长于 maxNameLength)。搜索功能应该通过您的数组并检查名称是否相等,如果找到则返回数组索引,否则例如 -1

然后输出函数获取这个数组索引,首先检查它是否有效(>=0 和 lt maxLines),然后输出排名或未找到)。

不要沮丧,作为初学者,您有很多工作要做才能启动和运行这个程序......

于 2012-11-08T09:41:11.177 回答
0

提示

ifstream有一个名为的方法getline,允许您指定所需的分隔符。

由于男孩名和女孩名彼此之间没有任何特定关系,您可以将它们存储在完全独立的列表中,但是如果两个列表中都出现了一个名字会发生什么?

每个名称都有一个等级,因此信息确实需要以这样一种方式存储,即 2 条数据可以相互关联。

于 2012-11-08T09:35:32.127 回答