8个回答
展开全部
汗~不是说C++程序吗?怎么除了输入输出以外全是C风格的?
先说你几句,你这程序写得还真是把看官折腾得够呛,我反正是费了些工夫才弄明白你在干什么。
而且你这并不是排序,只是按字典序输出而已,序其实没变,对吧。。
先是一个语法错误:
else if (replacement[m][n]=temp[n]) //“==”
count1++;
然后是逻辑问题:
for (int n=0;n<compare(ch[m],ch[J]);n++)
if (replacement[m][n]<temp[n])
{ for (int l=0;l<strlen(ch[m]);l++)
temp[l]=replacement[m][l];
J=m;
break;
}
else if (replacement[m][n]=temp[n])
count1++;
这段判断并没有实现字典序的比较,比如adjk,Bdkj作为输入时,判断并没有在a,B的差异上打住,而是继续判断到j,k。
只要再加一句
else
break;
就行了,至少你的这个反例是没什么问题的。
看得出你是初学者,至少是初学者等级,能写到这程度值得称道。
不过给你提几个小建议:
1.
for (int k=0;k<count;k++)
if (exist[k]==true)
break;
int J=k;
不要这样使用k,现在的标准是for(int i;;)中的i是局部变量,出了循环就无效了。虽然vc6可以通过编译。
2.
for (int n=0;n<compare(ch[m],ch[J]);n++)
这里的compare函数用的不好,它会随着每次循环都运行一遍,若是这个值一直不变还好,万一变了,这玩意就是无底洞,想陷多深就多深。。
3.与其映射成双精度数字,全都转化为小写或者大写再比较不也挺好吗?省时省力省空间。
就这些吧,请好好加油~
最后推荐使用C++风格的程序,虽然我写得不一定好,但好歹是真的C++程序……
以下C++程序实现了你的需求:
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <cctype>
using namespace std;
bool comparator(string a, string b){
char c1,c2;
for(int i = 0 ; i < a.length() ; ++i)
{
if((c1 = tolower(a[i])) != (c2 = tolower(b[i]))){
return c1 < c2;
}
}
return true;
}
int main() {
vector<string> vec;
string temp;
cin >> temp;
while(temp != "#") {
vec.push_back(temp);
cin >> temp;
}
sort(vec.begin(),vec.end(),comparator);
for (vector<string>::const_iterator iter = vec.begin() ; iter < vec.end() ; ++iter)
{
cout << *iter << endl;
}
return 0;
}
先说你几句,你这程序写得还真是把看官折腾得够呛,我反正是费了些工夫才弄明白你在干什么。
而且你这并不是排序,只是按字典序输出而已,序其实没变,对吧。。
先是一个语法错误:
else if (replacement[m][n]=temp[n]) //“==”
count1++;
然后是逻辑问题:
for (int n=0;n<compare(ch[m],ch[J]);n++)
if (replacement[m][n]<temp[n])
{ for (int l=0;l<strlen(ch[m]);l++)
temp[l]=replacement[m][l];
J=m;
break;
}
else if (replacement[m][n]=temp[n])
count1++;
这段判断并没有实现字典序的比较,比如adjk,Bdkj作为输入时,判断并没有在a,B的差异上打住,而是继续判断到j,k。
只要再加一句
else
break;
就行了,至少你的这个反例是没什么问题的。
看得出你是初学者,至少是初学者等级,能写到这程度值得称道。
不过给你提几个小建议:
1.
for (int k=0;k<count;k++)
if (exist[k]==true)
break;
int J=k;
不要这样使用k,现在的标准是for(int i;;)中的i是局部变量,出了循环就无效了。虽然vc6可以通过编译。
2.
for (int n=0;n<compare(ch[m],ch[J]);n++)
这里的compare函数用的不好,它会随着每次循环都运行一遍,若是这个值一直不变还好,万一变了,这玩意就是无底洞,想陷多深就多深。。
3.与其映射成双精度数字,全都转化为小写或者大写再比较不也挺好吗?省时省力省空间。
就这些吧,请好好加油~
最后推荐使用C++风格的程序,虽然我写得不一定好,但好歹是真的C++程序……
以下C++程序实现了你的需求:
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <cctype>
using namespace std;
bool comparator(string a, string b){
char c1,c2;
for(int i = 0 ; i < a.length() ; ++i)
{
if((c1 = tolower(a[i])) != (c2 = tolower(b[i]))){
return c1 < c2;
}
}
return true;
}
int main() {
vector<string> vec;
string temp;
cin >> temp;
while(temp != "#") {
vec.push_back(temp);
cin >> temp;
}
sort(vec.begin(),vec.end(),comparator);
for (vector<string>::const_iterator iter = vec.begin() ; iter < vec.end() ; ++iter)
{
cout << *iter << endl;
}
return 0;
}
展开全部
直接比较就可以了,起泡法。
可以自定义n的值
#include<iostream>
#include<string>
#include<iomanip>
using namespace std;
int main()
{
int i,j,n=5;
string dict[10],e;//先用5个意思一下
for(i=0;i<n;i++)
cin>>dict[i];//输入单词
for(j=0;j<n-1;j++)
for(i=0;i<n-j-1;i++)
if(dict[i]>dict[i+1])
{
e=dict[i];
dict[i]=dict[i+1];
dict[i+1]=e;//交换相邻的
}
for(i=0;i<n;i++)
cout<<setw(6)<<dict[i]<<" ";
cout<<endl;
return 0;
}
可以自定义n的值
#include<iostream>
#include<string>
#include<iomanip>
using namespace std;
int main()
{
int i,j,n=5;
string dict[10],e;//先用5个意思一下
for(i=0;i<n;i++)
cin>>dict[i];//输入单词
for(j=0;j<n-1;j++)
for(i=0;i<n-j-1;i++)
if(dict[i]>dict[i+1])
{
e=dict[i];
dict[i]=dict[i+1];
dict[i+1]=e;//交换相邻的
}
for(i=0;i<n;i++)
cout<<setw(6)<<dict[i]<<" ";
cout<<endl;
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <map>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
vector<string> vec;
vec.push_back("This");
vec.push_back("is");
vec.push_back("a");
vec.push_back("key");
vec.push_back("this");
vec.push_back("key");
vec.push_back("A");
vec.push_back("Thas");
vec.push_back("kEy");
map<string,int> words;
vector<string>::iterator it = vec.begin();
for(it; it != vec.end(); ++it)
{
if(words.find(*it) != words.end() )
{
int i = words[*it];
++i;
words[*it] = i;
}
else
{
words.insert(map<string,int>::value_type(*it,1));
}
}
map<string,int>::iterator mapit = words.begin();
for(mapit;mapit != words.end();++mapit)
{
cout<< mapit->first<<" "<<mapit->second<<endl;
}
return 0;
}
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <map>
#include <fstream>
using namespace std;
const int MAX_SIZE = 40;
void GetWords(vector<string> &vec)
{
char str[ MAX_SIZE];
ifstream InFile("E:\\test.txt");
while(!InFile.eof())
{
InFile.getline(str,MAX_SIZE);
const char * split = ",* ;";
char * p;
p = strtok (str,split);
while(p!=NULL)
{
string str = p;
vec.push_back(str);
p = strtok(NULL,split);
}
}
copy (vec.begin(),vec.end(),ostream_iterator<string>(cout," "));
}
void SortWords( vector<string> &vec,map<string,int> &words)
{
vector<string>::iterator it = vec.begin();
for(it; it != vec.end(); ++it)
{
if(words.find(*it) != words.end() )
{
int i = words[*it];
++i;
words[*it] = i;
}
else
{
words.insert(map<string,int>::value_type(*it,1));
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<string> vec;
map<string,int> words;
GetWords(vec);
SortWords( vec,words);
cout<<endl<<"====After sort===="<<endl;
map<string,int>::iterator mapit = words.begin();
for(mapit;mapit != words.end();++mapit)
{
cout<< mapit->first<<" "<<mapit->second<<endl;
}
return 0;
}
2.#include <algorithm>
std::sort(dict, dict+1000)
#include <string>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <map>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
vector<string> vec;
vec.push_back("This");
vec.push_back("is");
vec.push_back("a");
vec.push_back("key");
vec.push_back("this");
vec.push_back("key");
vec.push_back("A");
vec.push_back("Thas");
vec.push_back("kEy");
map<string,int> words;
vector<string>::iterator it = vec.begin();
for(it; it != vec.end(); ++it)
{
if(words.find(*it) != words.end() )
{
int i = words[*it];
++i;
words[*it] = i;
}
else
{
words.insert(map<string,int>::value_type(*it,1));
}
}
map<string,int>::iterator mapit = words.begin();
for(mapit;mapit != words.end();++mapit)
{
cout<< mapit->first<<" "<<mapit->second<<endl;
}
return 0;
}
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <map>
#include <fstream>
using namespace std;
const int MAX_SIZE = 40;
void GetWords(vector<string> &vec)
{
char str[ MAX_SIZE];
ifstream InFile("E:\\test.txt");
while(!InFile.eof())
{
InFile.getline(str,MAX_SIZE);
const char * split = ",* ;";
char * p;
p = strtok (str,split);
while(p!=NULL)
{
string str = p;
vec.push_back(str);
p = strtok(NULL,split);
}
}
copy (vec.begin(),vec.end(),ostream_iterator<string>(cout," "));
}
void SortWords( vector<string> &vec,map<string,int> &words)
{
vector<string>::iterator it = vec.begin();
for(it; it != vec.end(); ++it)
{
if(words.find(*it) != words.end() )
{
int i = words[*it];
++i;
words[*it] = i;
}
else
{
words.insert(map<string,int>::value_type(*it,1));
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<string> vec;
map<string,int> words;
GetWords(vec);
SortWords( vec,words);
cout<<endl<<"====After sort===="<<endl;
map<string,int>::iterator mapit = words.begin();
for(mapit;mapit != words.end();++mapit)
{
cout<< mapit->first<<" "<<mapit->second<<endl;
}
return 0;
}
2.#include <algorithm>
std::sort(dict, dict+1000)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
冒泡排序的话,不管是时效还是空效都会很差得,
#include <iostream>
#include <cstring>
using namespace std;
double replace(char ch)
{
int diff=ch-'a';
if (diff>=0)
return 97+diff;
else
return 32+diff+96.5;
}
int compare(char a[],char b[]) //对数组做比较
{
int length_a=strlen(a);
int length_b=strlen(b);
if (length_a<length_b)
return length_a;
else
return length_b;
}
int main()
{
int count=0;//计算用户输入了多少个字符串;
int count1=0;//看比较数组大小时一组里面有多少是一样的;
int count2=0;//计算输出了多少个字符串;
char ch[100][100];
bool exist[100];
double replacement[100][100];
cout<<"请输入要排序的字符串,以#结束"<<endl;
for (int i=0;cin>>ch[i],ch[i][0]!='#';i++)
{ count++;
int length=strlen(ch[i]);
for (int j=0;j<length;j++)
replacement[i][j]=replace(ch[i][j]);
exist[i]=true;
}
while (count2<count)
{ for (int k=0;k<count;k++)
if (exist[k]==true)
break;
int J=k;
double temp[100];
for (int l=0;l<strlen(ch[k]);l++)
temp[l]=replacement[k][l];
for (int m=k+1;m<count;m++)
{ if (exist[m]==true)
for (int n=0;n<compare(ch[m],ch[J]);n++)
if (replacement[m][n]<temp[n])
{ for (int l=0;l<strlen(ch[m]);l++)
temp[l]=replacement[m][l];
J=m;
break;
}
else if (replacement[m][n]=temp[n])
count1++;
if (count1==compare(ch[m],ch[J]))
if (strlen(ch[J])!=compare(ch[m],ch[J]))
{ for (int l=0;l<strlen(ch[m]);l++)
temp[l]=replacement[m][l];
J=m;
}
}
cout<<ch[J]<<endl;
count2++;
exist[J]=false;
}
return 0;
}
#include <iostream>
#include <cstring>
using namespace std;
double replace(char ch)
{
int diff=ch-'a';
if (diff>=0)
return 97+diff;
else
return 32+diff+96.5;
}
int compare(char a[],char b[]) //对数组做比较
{
int length_a=strlen(a);
int length_b=strlen(b);
if (length_a<length_b)
return length_a;
else
return length_b;
}
int main()
{
int count=0;//计算用户输入了多少个字符串;
int count1=0;//看比较数组大小时一组里面有多少是一样的;
int count2=0;//计算输出了多少个字符串;
char ch[100][100];
bool exist[100];
double replacement[100][100];
cout<<"请输入要排序的字符串,以#结束"<<endl;
for (int i=0;cin>>ch[i],ch[i][0]!='#';i++)
{ count++;
int length=strlen(ch[i]);
for (int j=0;j<length;j++)
replacement[i][j]=replace(ch[i][j]);
exist[i]=true;
}
while (count2<count)
{ for (int k=0;k<count;k++)
if (exist[k]==true)
break;
int J=k;
double temp[100];
for (int l=0;l<strlen(ch[k]);l++)
temp[l]=replacement[k][l];
for (int m=k+1;m<count;m++)
{ if (exist[m]==true)
for (int n=0;n<compare(ch[m],ch[J]);n++)
if (replacement[m][n]<temp[n])
{ for (int l=0;l<strlen(ch[m]);l++)
temp[l]=replacement[m][l];
J=m;
break;
}
else if (replacement[m][n]=temp[n])
count1++;
if (count1==compare(ch[m],ch[J]))
if (strlen(ch[J])!=compare(ch[m],ch[J]))
{ for (int l=0;l<strlen(ch[m]);l++)
temp[l]=replacement[m][l];
J=m;
}
}
cout<<ch[J]<<endl;
count2++;
exist[J]=false;
}
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一楼正解,这才是c++,其他都是浮云。 标准库的sort效率绝对比单纯的冒泡优秀,而且还是智能的,大数据量情况下是快速排序,反之则退化成冒泡排序。
楼上说的也好,其实还有更简单的,直接用std::set<string>就完事了,自动排序。
楼上说的也好,其实还有更简单的,直接用std::set<string>就完事了,自动排序。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询