-2

この C++ プログラムを使用して、5 つの名前をアルファベット順に並べ替えようとしています。

#include <iostream>
#include <cstring>
#include <conio.h>
using namespace std;

int main()
{
char names[5][100];
int x,y,z;

char exchange[100];

cout << "Enter five names...\n";

for(x=1;x<=5;x++)
{
    cout << x << ". ";
    cin >> names[x-1];
}
getch();

for(x=0;x<=5-2;x++)
{
    for(y=0;y<=5-2;y++)
    {
        for(z=0;z<=99;z++)
        {
            if(int(names[y][z])>int(names[y+1][z]))
            {   
                strcpy(exchange,names[y]);
                strcpy(names[y],names[y+1]);
                strcpy(names[y+1],exchange);
                break;
            }
        }   
    }
}   

for(x=0;x<=5-1;x++)
    cout << names[x];

return 0;
}

Earl、Don、Chris、Bill、Andy をそれぞれ入力すると、次のようになります。

AndyEarlDonChrisBill

誰かが私のプログラムの何が問題なのか教えてもらえますか?

4

6 に答える 6

9

文字列の std::set または std::multiset (アイテムの繰り返しを許可する場合) を使用すると、アイテムが自動的に並べ替えられます (必要に応じて、並べ替え基準を変更することもできます)。

#include <iostream>
#include <set>
#include <algorithm>

void print(const std::string& item)
{
    std::cout << item << std::endl;
}

int main()
{
    std::set<std::string> sortedItems;

    for(int i = 1; i <= 5; ++i)
    {
        std::string name;
        std::cout << i << ". ";
        std::cin >> name;

        sortedItems.insert(name);
    }

    std::for_each(sortedItems.begin(), sortedItems.end(), &print);
    return 0;
}

入力:

  1. ジェラルド
  2. カルロス
  3. カミロ
  4. 天使
  5. ボスコ

出力:

Angel
Bosco
Carlos
Gerardo
Kamilo
于 2013-09-03T01:46:14.483 に答える
1

不必要なループを使いすぎています。このシンプルで効率的なものを試してみてください。文字列がアルファベット順で他の文字列よりも遅い場合は、交換する必要があります。

Input
5
Ashadullah
Shawon
Shakib
Aaaakash
Ideone

Output
Aaaakash
Ashadullah
Ideone
Shakib
Shawon


#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s[200],x[200],ct,dt;
    int i,j,n;
    cin>>n;
    for(i=0;i<n;i++)
    {
        cin>>s[i];
    }

    for(i=0;i<n;i++)
    {
        for(j=i+1;j<n;j++)
        {

            if(s[i]>s[j])
            {

                ct=s[i];
                s[i]=s[j];
                s[j]=ct;

            }

        }

    }
    cout<<"Sorted Name in Dictionary Order"<<endl;
    for(i=0;i<n;i++)
    {
        cout<<s[i]<<endl;
    }
    return 0;


}
于 2016-11-15T20:31:39.907 に答える
0

あなたのコードは、バブル ソートのシングルパスを実装しています。基本的に、外側の「配列に変更が加えられなくなるまで繰り返す」ループがありません。

于 2013-08-31T22:35:01.263 に答える
0

名前がすでに整っている場合、コードは気にしません。以下を追加

else if(int(names[y][z])<int(names[y+1][z]))
            break;  

if ステートメントに。

于 2013-09-03T01:10:12.743 に答える