| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 943 人关注过本帖
标题:为实现按“赵、钱、孙、李”顺序排序,可将这四个姓氏对应4个从小到大的整数 ...
只看楼主 加入收藏
中华鲟的泪
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-6-25
结帖率:0
收藏
已结贴  问题点数:20 回复次数:7 
为实现按“赵、钱、孙、李”顺序排序,可将这四个姓氏对应4个从小到大的整数,将输入的姓名中的姓查找到其对应的整数,按照这个整数进行排序;当该数相同时,再比较名进行
#include
#include
#include
#include
using namespace std;
string first_name[]={"赵","钱","孙","李"};
struct node
{
 int id;
 string name;
 void operator = (const node &a);
 node():id(0),name(""){};
};
void node::operator =(const node &a)
{
 this->id = a.id;
 this->name = a.name;
}

bool cmp(const node &a, const node &b)
{
 if (a.name.substr(0, 2) == b.name.substr(0, 2))
  return a.name < b.name;
 else
  return a.id < b.id;
}
int main()
{
 //freopen("d:\\1.txt", "r",stdin);
 size_t n, i;
 int id;
 string str;
 node names[30];

 cout<<"输入多少个姓名?"<<ENDL;
 cin>>n;
 cout<<"请输入"<<N<<"个姓名"<<ENDL;
 /*读入数据 赵钱孙李姓氏的,设置id为0,1,2,3*/
 for (i = 0; i < n; ++i) {
  cin>>str;
  names[i].name = str;
  for (id = 0; id < 4; ++id) {
   if (first_name[id] == str.substr(0, 2)) {
    names[i].id = id;
   }
  }
 }
 /*for (i = 0; i < n; ++i)
  cout<<NAMES[I].NAME<<" "<<NAMES[I].ID<<ENDL;*
 /*排序*/
 sort(names, names + n, cmp);
 for (i = 0; i < n; ++i)
  cout<<NAMES[I].NAME<<ENDL;
   
 return 0;
}
绿色部分看不懂??谁来解释一下??
 
 
搜索更多相关主题的帖子: include return 姓名 
2012-06-26 14:29
中华鲟的泪
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-6-25
收藏
得分:0 
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
前面是这个,粘贴的时候少了。好多代码都没学过。希望有人帮忙解释一下。。非常感谢
#include <algorithm>
#include <vector>
这两个头文件就不知道是什么意思。也不知道去哪学。帮帮忙呀

[ 本帖最后由 中华鲟的泪 于 2012-6-26 14:44 编辑 ]
2012-06-26 14:42
lonmaor
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:75
帖 子:2637
专家分:6423
注 册:2007-11-27
收藏
得分:0 
程序代码:
#include <string>
#include <iostream>
#include <algorithm>
#include <vector> //这个没用到
using namespace std;

string first_name[]= {"","","",""};
//感觉你可以用枚举类型定义,然后在node定义中将name拆分为fname和lname,以后方便比较
// enum first_name {zhao,qian,sun,li}

struct node //struct声明,成员默认public访问权限
{
    int id;
    string name;
    void operator = (const node &a); //重载'='操作符
    node():id(0),name("") {}; //构造函数
};

void node::operator =(const node &a) //感觉不用重载'=',默认的拷贝构造函数就能完成形如 a=b的赋值
{
    this->id = a.id;
    this->name = a.name;
}

bool cmp(const node &a, const node &b) //比较两个node类的成员
{
    if (a.name.substr(0, 2) == b.name.substr(0, 2)) //如果a和b的姓相同时,比较二者的全名
        return a.name < b.name;
    else    //否则比较a和b的id
        return a.id < b.id;
}
int main()
{
//freopen("d:\\1.txt", "r",stdin);
    size_t n, i;
    int id;
    string str;
    node names[30];

    cout<<"输入多少个姓名?"<<endl;
    cin>>n;
    cout<<"请输入"<<n<<"个姓名"<<endl;
    /*读入数据 赵钱孙李姓氏的,设置id为0,1,2,3*/
    for (i = 0; i < n; ++i)
    {
        cin>>str;
        names[i].name = str;
        for (id = 0; id < 4; ++id)
        {
            //按赵钱孙李分别对应0~3的值给names[]各个成员的id赋值
            if (first_name[id] == str.substr(0, 2))
            {
                names[i].id = id;
            }
        }
    }
    /*for (i = 0; i < n; ++i)
      cout<<NAMES[I].NAME<<" "<<NAMES[I].ID<<ENDL;*
    /*排序*/
    sort(names, names + n, cmp);
    for (i = 0; i < n; ++i)
        cout<<names[i].name<<endl;

    return 0;
}

从不知道到知道,到知道自己不知道,成长的道路上脚步深深浅浅
2012-06-26 15:03
lonmaor
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:75
帖 子:2637
专家分:6423
注 册:2007-11-27
收藏
得分:0 
回复 2楼 中华鲟的泪
vector是c++标准容器,属于一种数据结构,algorithm是算法库,属于STL的范畴了。C++ Primer这本书里有详细介绍

从不知道到知道,到知道自己不知道,成长的道路上脚步深深浅浅
2012-06-26 15:05
guzenghui
Rank: 2
等 级:论坛游民
帖 子:8
专家分:10
注 册:2012-6-26
收藏
得分:10 
坐等讲解
2012-06-27 12:27
中华鲟的泪
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-6-25
收藏
得分:0 
回复 3楼 lonmaor
这个都是c++的吗??里面不含c语言吧?
2012-06-27 14:06
lonmaor
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:75
帖 子:2637
专家分:6423
注 册:2007-11-27
收藏
得分:10 
回复 6楼 中华鲟的泪
典型的C++语法

从不知道到知道,到知道自己不知道,成长的道路上脚步深深浅浅
2012-06-27 14:27
中华鲟的泪
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-6-25
收藏
得分:0 
void Sort(string * str,int n)
 {
 int i=0,j=0,k=0;
 string temp;
 for(i=0;i<n-1;i++)
  {
  k=i;
  for(j=i+1;j<n;j++)
   if(str[k]>str[j])
    k=j;
  if(k!=i)
   {
   temp=str[k];
   str[k]=str[i];
   str[i]=temp;
   }
  }
 for(i=0;i<n-1;i++)
  {
  k=i;
  for(j=i+1;j<n;j++)
   if(analyze(str[k].substr(0,2))>analyze(str[j].substr(0,2)))
    k=j;
  if(k!=i)
   {
   temp=str[k];
   str[k]=str[i];
   str[i]=temp;
   }
  }
 }
string::size_type analyze(string str)
 {
 string name="赵钱孙李周吴郑王冯陈楚魏蒋沈韩杨朱秦尤许";
 return name.find(str,0)/2+1;
 }
 
 
这段代码有点问题。。按姓排名运行可以,但是当姓相同时,排序就乱了。。可以帮忙改改吧?
2012-06-27 21:01
快速回复:为实现按“赵、钱、孙、李”顺序排序,可将这四个姓氏对应4个从小到大 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018757 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved