2013-10-03 59 views
0

我是一个初学者程序员,并有解决此问题的问题。该任务是要求使用此方法(greaterAlpha()),但我不完全确定目的是什么。有人可以帮助我解决这个问题,并解释这种方法的用途吗?C++排序和二进制搜索与数组问题

我应该修复以前的作业,从文件中读取,然后用点打印名称和数字。 **加载项是排序函数,它应该使用greaterAlpha()方法按字母顺序对姓氏进行排序。毕竟,它应该循环使用一个键来使用相同的greaterAlpha()方法进行二分搜索。 (二进制搜索中的排序为它的比较中使用,如果发现必须返回元素的下标,最后测试元素的下标负,如果不。)

#include <iostream> 
#include <iomanip> 
#include <fstream> 
#include <string> 
using namespace std; 
//********************************************************************* 
class PhoneNumber 
{ 
    private: 
     int areaCode, 
      prefix, 
      lineNumber; 
    public:        // the methods are public 
    void setNumber(int area, int pre, int num) 
    { 
     areaCode = area; 
     prefix = pre; 
     lineNumber = num; 
    } 
    int getAreaCode() const 
    { 
     return areaCode; 
    } 
    int getPrefix() const 
    { 
     return prefix; 
    } 
    int getLineNumber() const 
    { 
     return lineNumber; 
    } 
    istream& readPhone(istream&);   // input/output functions 
    ostream& printPhone(ostream&) const; 
}; 
//********************************************************************* 
// Returns istream& so it can be used to overload the >> operator later 
istream& PhoneNumber::readPhone(istream& fin) 
{ 
    return fin >> areaCode >> prefix >> lineNumber; 
} 
//********************************************************************* 
// Returns ostream& so it can be used to overload the << opeator later 
ostream& PhoneNumber::printPhone(ostream& fout) const 
{ 
    fout << setw(4) << areaCode << "-" << prefix << "-" << lineNumber; 
    return fout; 
} 
//********************************************************************* 
class PhoneEntry 
{ 
    private: 
     string lastName, 
       firstName; 
     PhoneNumber Number; 
    public: 
     void setNames(string last, string first) 
     { 
      lastName = last; 
      firstName= first; 
     } 
     string getLastName() 
     { 
      return lastName; 
     } 
     string getFirstName() 
     { 
      return firstName; 
     } 
     istream& readEntry(istream&); 
     ostream& writeDots(ostream&, int); 
     ostream& printEntry(ostream&); 
     bool greaterAlpha(PhoneEntry&) const; 
     void selectionSort(string, int); 
}; 
//********************************************************************* 
istream& PhoneEntry::readEntry(istream& fin) 
{ 
    fin >> lastName >> firstName; 
    Number.readPhone(fin); 
    return fin; 
} 
//********************************************************************* 
ostream& PhoneEntry::writeDots(ostream& fout, int length) 
{ 
    length = firstName.length(); 
    length += lastName.length(); 
    length += 2; 
    //This line is causing the issue but WHY? 

    if(length % 2 == 1) 
    { 
     fout << "."; 
    } 

    for(length; length <= 28; length++) 
    { 
     fout << " ."; 
     length++; 
    } 

    return fout; 
} 
//********************************************************************* 
ostream& PhoneEntry::printEntry(ostream& fout) 
{ 
    int length = 0; 

    fout << lastName << ", " << firstName; 
    writeDots(fout, length); 
    Number.printPhone(fout); 

    return fout; 
} 
//********************************************************************* 
bool PhoneEntry::greaterAlpha (PhoneEntry& x) const 
{ 
    bool flag; 

    if (lastName > x.lastName) 
     flag = true; 
    else if ((lastName == x.lastName) && (firstName > x.firstName)) 
     flag = true; 
    else 
     flag = false; 

    return flag; 
} 
//********************************************************************* 
void selectionSort(string name[], int elems) 
{ 
    int startScan, minIndex; 
    string strName; 
    for (startScan = 0; startScan < (elems - 1); startScan++) 
    { 
     minIndex = startScan; 
     strName = name[startScan]; 
     for(int index = startScan + 1; index < elems; index++) 
     { 
      if (name[index] < strName) 
      { 
       strName = name[index]; 
       minIndex = index; 
      } 
     } 
     name[minIndex] = name[startScan]; 
     name[startScan] = strName; 
    } 
} 
//********************************************************************* 
int main() 
{ 
    int count; 
    const int MAX_CAPACITY = 500; 
    PhoneEntry Entry[MAX_CAPACITY], 
       EntryIn; 
    bool flag = false; 

    ifstream dataIn("phonenum.txt"); 

    if(!dataIn) 
    { 
     perror("phonenum.txt"); 
     exit(1); 
    } 

    count = 0; 
    while (count < MAX_CAPACITY && EntryIn.readEntry(dataIn)) 
    { 
     Entry[count++] = EntryIn; 
    } 

    dataIn.close(); 

    if (count == MAX_CAPACITY) 
    { 
     cerr << "Reached maximum capacity of " << MAX_CAPACITY << ", can't read anymore Phone Entries currently." << endl; 
    } 

    //EntryIn.greaterAlpha(Entry); 
    selectionSort(Entry, count); 

    if (flag) 
    { 
     for (int i = 0; i < count; i++) 
     { 
      Entry[i].printEntry(cout) << endl; 
     } 
    } 
    else 
     cerr << "Error with sort!" << endl; 

    return 0; 
} 

我知道这是编码可怕的是,这是教练如何想写这个。任何援助或建设性的批评将非常感激。

+2

相当多的代码的问题...你尝试过将它缩小? – LihO

+0

使用一个非常小的数据集(即只有几个数据条目)并在调试器中遍历代码。它会帮助你缩小问题的可能范围。 –

+0

我不清楚问题是什么。 – doctorlove

回答

0

你只是问什么greaterAlpha方法?

如果是的话,你应该在哪里,你曾经使用<的排序和搜索,即

void selectionSort(PhoneEntry[] entries, int elems) 
{ 
// ... 
      PhoneEntry entry = entries[startScan]; 
// ... 
      if (entry.greaterAlpha(entries[index])) 
//... 
} 

二进制搜索也是一个非常简单的变化,如果你已经有了将其用于比较两个PhoneEntry实例它与std::string s一起实施。

边注:许多宁愿凝结比较法

bool PhoneEntry::greaterAlpha (PhoneEntry& x) const 
{ 
    return lastName > x.lastName 
     || (lastName == x.lastName && firstName > x.firstName); 
} 
+0

我在“entries”数组的selectionSort()方法中遇到了一个错误,它不喜欢方法头中的条目,并且它还说入口和元素是未定义的,为什么会这样呢? – Katherine