Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ strcmp()的替代方法是按字母顺序对字符串排序_C++ - Fatal编程技术网

C++ strcmp()的替代方法是按字母顺序对字符串排序

C++ strcmp()的替代方法是按字母顺序对字符串排序,c++,C++,类型类别: #include<iostream> #include<cstring> using namespace std; #ifndef STUTYPE #define STUTYPE class stuType { private: string fname; string lname; string social; float gpa; public: stuType(void) {

类型类别:

#include<iostream>
#include<cstring>

using namespace std;

#ifndef STUTYPE
#define STUTYPE

class stuType {

   private:

   string fname;
   string lname;
   string social;
   float gpa;

   public:

      stuType(void) {

         fname = "no_fname";
         lname = "no_lname";
         social = "no_social";
         gpa = 0.0;
      }

      stuType(string fname_in, string lname_in, string social_in, float gpa_in) {

         fname = fname_in;
         lname = lname_in;
         social = social_in;
         gpa = gpa_in;
      }

     ~stuType() {
        //Nothing needs to be added here.
     }

     void set_fname(string new_fname) {
        fname = new_fname;
     }

     void set_lname(string new_lname) {
        lname = new_lname;
     }

     void set_ssn(string new_ssn) {
        social = new_ssn;
     }

     void set_gpa(float new_gpa) {
        gpa = new_gpa;
     }

     string get_fname(void) {
        return fname;
     }

     string get_lname(void) {
        return lname;
     }

     string get_ssn(void) {
        return social;
     }

     float get_gpa(void) {
        return gpa;
     }

     friend istream & operator>>(istream &in, stuType &stu) {
        in>>stu.fname;
        in>>stu.lname;
        in>>stu.social;
        in>>stu.gpa;

        return in;
     }

};

#endif
#包括
#包括
使用名称空间std;
#ifndef STUTYPE
#定义STUTYPE
类类型{
私人:
字符串fname;
字符串名称;
弦社会;
浮动gpa;
公众:
类型(无效){
fname=“no_fname”;
lname=“no_lname”;
social=“no_social”;
gpa=0.0;
}
stuType(输入字符串fname,输入字符串lname,输入字符串social,输入浮动gpa){
fname=fname_in;
lname=lname_in;
社会的,社会的;
gpa=gpa_英寸;
}
~stuType(){
//这里不需要添加任何内容。
}
无效集\u fname(字符串新\u fname){
fname=新的\u fname;
}
无效集合名称(字符串新名称){
lname=新的\u lname;
}
无效集\u ssn(字符串新\u ssn){
社会=新的;
}
无效设置\u gpa(浮动新\u gpa){
平均绩点=新的平均绩点;
}
字符串get_fname(void){
返回fname;
}
字符串get_lname(void){
返回lname;
}
字符串获取\u ssn(无效){
回归社会;
}
浮动获取gpa(无效){
返回gpa;
}
friend istream和operator>>(istream和in、stuType和stu){
在>>stu.fname中;
在>>stu.lname中;
在>>大学社会学;
在>>stu.gpa;
返回;
}
};
#恩迪夫
Sort.cpp:

#include<iostream>
#include<fstream>
#include<cstdlib>
#include<cstring>

#include"stuType.h"

using namespace std;

/*Loads the elements of the object instance with data from the input file.*/
void load(istream &input, stuType Student[], int *size);

/*Used in combination with the shellSort method to exchange the values of two variables in the class object.*/
void exchange(stuType &a, stuType &b);

/*Sorts the objects in ascending order by comparing the values of the lname strings between object indices.*/
void shellSort(stuType Student[], int size);

int main() {

   stuType Student[10];

   int size;

   char inputFile[200];
   char outputFile[200];

   ifstream input;
   ofstream output;

   cout<<"[INPUT_FILE]: ";
   cin>>inputFile;

   cout<<"[OUTPUT_FILE]: ";
   cin>>outputFile;

   input.open(inputFile);
   output.open(outputFile);

   if (input.fail()) {
      cerr<<"\n[FILE] Error opening '"<<inputFile<<"'"<<endl;
      exit(1);
   }

   if (output.fail()) {
      cerr<<"\n[FILE] Error opening '"<<outputFile<<"'"<<endl;
      exit(1);
   }

   load(input, Student, &size);
   shellSort(Student, size);

   return 0;
}

void load(istream &input, stuType Student[], int *size) {

   int length = 0, i = 0;

   float gpa;
   string social;
   string fname;
   string lname;

   while(input >> social >> fname >> lname >> gpa) {
      cout<<"[Node::Load] Setting 'social' for index ["<<i<<"] to "<<social<<endl;
      Student[i].set_ssn(social);
      cout<<"[Node::Load] Setting 'fname' for index ["<<i<<"] to "<<fname<<endl; 
      Student[i].set_fname(fname);
      cout<<"[Node::Load] Setting 'lname' for index ["<<i<<"] to "<<lname<<endl;
      Student[i].set_lname(lname);
      cout<<"[Node::Load] Setting 'gpa' for index ["<<i<<"] to "<<gpa<<endl;
      Student[i].set_gpa(gpa);
      cout<<"[Node::Load] Incrementing 'length'..."<<endl;
      length++;
      cout<<"[Node::Load] Incrementing 'i'..."<<endl;
      i++;
   }

   cout<<"==================================="<<endl;
   for (int i = 0; i<length; i++) {
      cout<<"[ENTRY] Index: "<<i<<" | SSN: "<<Student[i].get_ssn()<<" | fname: "<<Student[i].get_fname()<<" | lname: "<<Student[i].get_lname()<<" | gpa: "<<Student[i].get_gpa()<<endl;
   }
   cout<<"==================================="<<endl;

   *size = length;
}

void exchange(stuType &a, stuType &b) {

   stuType *temp;

   *temp = a;
   a = b;
   b = *temp;

   delete temp;
}

void shellSort(stuType Student[], int size) {

   int gap = size/2;
   bool passOK;

   while(gap>0) {
      passOK = true;

      for(int i = 0; i<size-gap; i++) {
            if (strcmp(Student[i].get_lname(), Student[i+gap].get_lname)>0) {
               cout<<"[Node::Sort] Exchanging Index ["<<i<<"] with Index ["<<i+gap<<"]..."<<endl;
               exchange(Student[i], Student[i+gap]);
               passOK = false;
            } else if (strcmp(Student[i].get_lname(), Student[i+gap].get_lname())==0) {
               if (strcmp(Student[i].get_fname(), Student[i+gap].get_fname())>0) {
                  cout<<"[Node::Sort] Exchanging Index ["<<i<<"] with Index ["<<i+gap<<"]..."<<endl;
                  exchange(Student[i], Student[i+gap]);
                  passOK = false;
                }
            }
        }

        if (passOK) {
            gap /= 2;
        }
    }
}
#包括
#包括
#包括
#包括
#包括“stuType.h”
使用名称空间std;
/*使用输入文件中的数据加载对象实例的元素*/
无效荷载(istream&input,Student[],int*尺寸);
/*与shellSort方法结合使用,用于交换类对象中两个变量的值*/
无效交换(stuType&a、stuType&b);
/*通过比较对象索引之间lname字符串的值,按升序对对象进行排序*/
void shell排序(stuType Student[],int size);
int main(){
studype学生[10];
整数大小;
字符输入文件[200];
字符输出文件[200];
ifstream输入;
流量输出;
coutinputFile;
coutoutput文件;
打开(输入文件);
打开(outputFile);
if(input.fail()){
cerrC++字符串提供,因此您可以使用它们而不是strcmp

std::string a = "hello";
std::string b = "world";
if (a < b) {
    cout << a << " is less than " << b << endl;
}
std::string a=“你好”;
std::string b=“世界”;
if(acout strcmp需要用于数组,因为将数组与<或=进行比较只会比较内存位置,而不是内容。std::string overrides<和=可执行一些有用的操作,因此您可以使用<或=进行比较。接受字符串参数的设置程序应采用
常量字符串&
而不是字符串的副本。您定义了n用于阅读学生的输入运算符;为什么不使用它呢?您的
交换
函数相当重,不是吗(至少与
{string t=a;a=b;b=t;}
,而这不是使用C++11
交换
技术-
std::swap(a,b)
),所以如果我不使用strcmp()完全比较两个字符串,然后使用<>或==将它们按字母顺序排列?@AdamChubbuck,实际上是按字典顺序排列的,但足够接近。@AdamChubbuck
以区分大小写的方式按字典顺序比较字符串。由于大写和小写字符是用ASCII表示的,因此任何大写字符实例字符将在小写字符之前排序(例如:代码> z < /代码> <代码> A/COD>).@ DasBLink,假设数据文件传递到程序中包含适当大写的名称(遵循适当的大写规则),我应该没有问题。考虑以下字符串Stry* 1:“低”;字符串α2:“ARME”-当进行比较时,字符串#1将被视为比字符串#2更高的值@AdamChubbuck这非常容易测试-。