2016-10-03 3 views
4

Ich habe versucht, ein Programm in C++ zu erstellen, das eine Zeichenfolge in alphabetischer Reihenfolge sortiert, wobei die Großbuchstaben ihrem Kleinbuchstaben entsprechen. Beispiel: DCBAdcba Sortiert string: aabbccddAnordnen einer Zeichenfolge in Großbuchstaben - erste alphabetische Reihenfolge C++

Da unten ist der Code.

#include <iostream> 
#include <string> 
#include <cctype> 
struct char_ { 
    char c; 
    char diff; 
    char_(); 
    char_(char x); 
}; 
char_::char_() { 
    c = 0; 
    diff = 0; 
} 
char_::char_(char x) { 
    c = std::tolower(x); 
    diff = c - x; 
} 

void charswap(char_& x, char_& y) { 
    char_ temp; 
    temp = x; 
    x = y; 
    y = temp; 
} 

int main() { 
    std::string str; 
    getline(std::cin, str); 
    char_* str2 = new char_[str.length()]; 
    for (int i = 0; i < str.length(); i++) { 
     str2[i] = char_(str[i]); 
    } 

    /* 
    for (int i = 0; i < str.length(); i++) { 
     std::cout << str2[i].c << std::endl; 
    } 
    */ 
    for (int i = 0; i < str.length(); i++) { 
     for (int j = i; j < str.length(); j++) { 
      if (str2[i].c > str2[j].c) 
       charswap(str2[i], str2[j]); 
     } 
    } 


    for (int k = 0; k < str.length(); k++) { 
    std::cout << str2[k].c << "\t" << (int)str2[k].diff << std::endl; 
    } 

    for (int i = 0; i < str.length(); i++) { 

    str2[i].c = str2[i].c - str2[i].diff; 
    } 




    for (int i = 0; i < str.length(); i++) std::cout << str2[i].c; 
    std::cout << "\n"; 
    return 0; 
} 

A char_ struct die einzelnen Zeichen zu speichern, erzeugt wird (umgewandelt in Kleinbuchstaben) und deren Differenz von der entsprechenden Großbuchstaben (0 oder 32, je nachdem, ob der ursprüngliche char Klein- oder Groß war, jeweils). Anschließend sortiert er die char_-Zeichen auf der Basis ihrer Kleinbuchstaben. Und nach der Sortierung fügen wir den Unterschied zum Zeichen zurück, um die Großbuchstabenform zu erhalten.

Aber wenn ich versuche, diese Zeichenfolge zu geben, gibt es das folgende Ergebnis.

DCBAdcba

aabbccdd

Ich kann nicht verstehen, was hier passiert.

+1

Es klingt wie Sie müssen lernen, wie Sie einen Debugger verwenden, um durch Ihren Code zu gehen. Mit einem guten Debugger können Sie Ihr Programm Zeile für Zeile ausführen und sehen, wo es von dem, was Sie erwarten, abweicht.Dies ist ein essentielles Werkzeug, wenn Sie programmieren wollen. Weiterführende Literatur: ** [Wie kleine Programme zu debuggen] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver

+2

Sie erstellten einen Sortierungsalgorithmus ohne Berücksichtigung der Groß- und Kleinschreibung. Ich sehe keinen Code, der den Hauptstädten Priorität einräumt. –

+0

Tipp - Suchen Sie nach 'Ascii-Tabelle' und notieren Sie die Werte, die den einzelnen Zeichen zugewiesen sind. – UKMonkey

Antwort

4

Das Problem ist auf dieser Linie:

if (str2[i].c > str2[j].c) 
    charswap(str2[i], str2[j]); 

Es vergleicht Zeichen in Groß- und Kleinschreibung Art und Weise, ohne Rückstellung für Bruch Bindung, wenn Kleinbuchstaben gleich sind.

Sie müssen dies ändern Zeichen zu tauschen, wenn Klein auf der rechten Seite auf der linken Seite größer ist als Klein ist, oder wenn Klein Darstellungen sind die gleichen, aber die rechte Seite ursprünglichen Charakter ist in Großbuchstaben an:

if ((str2[i].c > str2[j].c) || (str2[i].c == str2[j].c && str2[j].diff)) 
    charswap(str2[i], str2[j]); 
4

sortiert eine gegebene Zeichenfolge in alphabetischer Reihenfolge, wobei die Großbuchstaben dem Kleinbuchstaben entsprechen.

Sie können nur einen Vergleich Funktor reflektieren Ihre Absicht

#include <cctype> 
#include <iostream> 
#include <vector> 
#include <algorithm> 

struct case_cmp { 
    bool operator()(char lhs, char rhs) const { 
     return (std::isupper(lhs) && std::tolower(lhs) == rhs) || std::tolower(lhs) < std::tolower(rhs); 
    } 
}; 

Dann std::sort verwenden definieren:

int main() { 
    std::string s("DCBAdcba"); 
    std::sort(std::begin(s), std::end(s), case_cmp()); 
    // Outputs "AaBbCcDd" 
    std::cout << s << std::endl; 
} 
0

std::string kann als Behälter von char s, und als solche betrachtet werden Sie können STLs Algorithmen auf seinen Inhalt anwenden einschließlich std::sort() (genauso wie Sie einen STL-Algorithmus auf z. std::vector).

Sie können Ihre speziellen benutzerdefinierte Sortierkriterien mit einem Lambda, geben Sie als dritten Parameter zu std::sort() weitergegeben werden, z.B. (live on Ideone):

#include <algorithm> // for std::sort 
#include <cctype>  // for std::isupper, std::tolower 
#include <iostream>  // for std::cout 
#include <string>  // for std::string 
using namespace std; 

int main() { 
    string s{"DCBAdcba"}; 

    sort(s.begin(), s.end(), [](char x, char y) { 
     // Custom sorting criteria. 
     // Return true if x precedes y. 

     // This may work, but requires more testing... 
     if (isupper(x)) { 
      if (tolower(x) == y) { 
       return true;  
      } 
     } 
     return tolower(x) < tolower(y); 
    }); 

    cout << s << '\n'; 
} 
Verwandte Themen