2016-07-30 7 views
1

私のプログラムで行うべき最終作業に問題があります。 出力文字を辞書順に並べる。例えば多次元配列での辞書順C++

、誰が助けることができます私の入力bbbaaaはそれが

Frequencies: a 3 b 3

ない

Frequencies: b 3 a 3

の出力を持っている必要がある場合私はこの問題を解決する?ここ は私のコードです:

#include <iostream> 
#include <string> 
#include <stdio.h> 
#include <ctype.h> 

using namespace std; 

void sort(char letters[], int integers[], int size); 
void swap_letters(char& first, char& second, int& int1, int& int2); 
int index_of_largest(const int integers[], int start_index, int number_used); 

int main(){ 
    const int MAX_CHARS = 200; 
    char letters[MAX_CHARS] = {'\0'}; 
    int integers[MAX_CHARS] = {'\0'}; 
    int index, size = 0; 
    char character; 

    cout << "Enter text:" << endl; 
    cin.get(character); 
    character = tolower(character); 
    while (character!= '.' && size < MAX_CHARS){ 
    if(isalpha(character)){ 
     index = 0; 
     while (index < size){ 
     if(letters[index] == character) 
      break; 
     else 
      index++; 
     } 
     if (index < size){ 
     integers[index] = integers[index] + 1; 
     } 
     else{ 
     letters[index] = character; 
     integers[index] = 1; 
     size++; 
     } 
    } 
    cin.get(character); 
    character = tolower(character); 
    } 
    letters[index] = tolower(letters[index]); 
    sort(letters, integers, size); 

    cout << "Frequencies:"<< endl; 

    for(int i = 0; i < size; i++){ 
    cout << letters[i] << " " << integers[i] << endl; 
    } 
    return 0; 
} 

void sort(char letters[], int integers[], int size){ 
    for (int i = 0; i < size -1; i++){ 
     int j = index_of_largest(integers, i, size); 
     swap_letters(letters[i], letters[j], integers[i], integers[j]); 
    } 
} 
void swap_letters(char& first, char& second, int& int1, int& int2){ 
    char temp_char = first; 
    first = second; 
    second = temp_char; 
    int temp_int = int1; 
    int1 = int2; 
    int2 = temp_int; 
} 
int index_of_largest(const int integers[], int start_index, int number_used){ 
    int max_int = integers[start_index]; 
    int max_int_index = start_index; 
    for (int index = start_index + 1; index < number_used; index++){ 
    if (integers[index] > max_int){ 
     max_int = integers[index]; 
     max_int_index = index; 
    } 
    } 
    return max_int_index; 
} 
+0

あなたの実装はSTLコンテナ/アルゴリズムを使用していないので(これはむしろ些細な作業になります)、C++ 11ではなく、Cスタイルのすべてを実行しています。 – Jack

答えて

0

問題は、あなたが最も大きいだけintegersをチェックしlettersを無視しての指標を検出する機能index_of_largest()です。

すべての文字が異なる周波数である場合はすべてうまくいくが、2つまたは2つの文字が同じ周波数である場合は機能しません。この場合、カウントlettersも必要です。

私はあなたがこのよう

int index_of_largest(const int integers[], const char letters[], int start_index, int number_used){ 
    int max_int = integers[start_index]; 
    int max_int_index = start_index; 
    for (int index = start_index + 1; index < number_used; index++){ 
    if ( (integers[index] > max_int) 
     || ( (integers[index] == max_int) 
      && (letters[index] < letters[max_int_index]))){ 
     max_int = integers[index]; 
     max_int_index = index; 
    } 
    } 
    return max_int_index; 
} 

に機能を修正することができたとしかし、私はあなたがジャックの提案に従うことをお勧め:可能であるときにすることができSTLコンテナ/アルゴリズムを使用/

PS:申し訳ありません私の悪い英語のために。