4

誰かがこの配列のソートを手伝ってくれるのではないかと思っていましたが、このプロジェクトで正確に実装する方法について少し迷っています。それはハードウェアであるため、全体の答えを明らかにするわけではありませんが、正しい方向に向けて私を押してください。プロジェクトは次のとおりです。テキスト行を読み取り、テキスト内に出現するすべての文字のリストと、各文字が行内に出現する回数を出力するプログラムを作成します。センチネル値として機能するピリオドで行を終了します。文字は次の順序で使用する必要があります: 高いものから低いものへ。入力にはすべて小文字が使用されていると仮定します。いくつか質問があります。1. 配列の並べ替えは正しいですか? 2. 並べ替え配列をコードに挿入する前に、コードをコンパイルすると空白の画面が表示されます。これを修正する方法はありますか?

これが下手に書かれている場合はお詫びします。助けてくれてありがとう!

inlcude <iostream>
#inlcude <fstream>
using namespace std;
void initialize(int list[]);
void Sort(int list[],int& num);
void characterCount(char ch, int list[]);
void readText(ifstream& intext, char& ch, int list[]);
void totalCount(int list[]);
int main()
{
int index,letterCount[26];
char ch;
ifstream inFile;

infile.open("C:/temp/Data_Chapter_7_8.txt");

if (!inFile)
{
   cout << " Cannot open file." <<endl;
}
initialize(letterCount);
infile.get(ch);

while (inFile)
{
  int index;
  readText(inFile,ch,letterCount)
  index++;
  inFile.get(ch);
  }
  totalCount(index, letterCount);

  inFile.close();

  system("PAUSE");
  return 0;
  }
  //initializes array letterCount to 0
  void initialize(int list[])
  {
 for(int x = 0;x<26;x++)
 list[x] = 0
 }
 //increments the letter count. Makes sure counting letters.
 void characterCount (char ch, int list[])
 {
 int index;
 ch = tolower(ch);
 if(static_cast<int>(ch)>=97&&(static_cast<int>(ch)<=122))
  letterCount[static_cast<int>(ch)-97]++;  
  }
  void readText(ifstream& intext, char& ch, int list[])
  { 
  while (ch != '.')
  {
  characterCount (ch,list);
  intext.get(ch);
  }
  }
  //displays data
  void totalCount(int list[])
  {
 for(int x=0;x<26;x++)
 if(letterCount[x]>0)  
 cout<<static_cast<char>(x+97)<<" "<<letterCount[x]<<endl;
 }
 void Sort(int list[],int& num)
      {
 int i,j,flag = 1;
 int temp;
 int numLength = num.length();
 for (i=1;(i<=numLength)&&flag; i++)
 {
     flag = 0;
     for (j=o; j<(numLength-1);j++0
     {
         if(num[j+1]>num[j])
         {
             temp = num[j];
             num[j] = num[j+1];
             num[j+1]=temp;
             flag = 1;
         }
     }
 }
             return;
             }               
4

2 に答える 2

1

厄介なバブルソートやその他の楽しいものを使用する代わりに、各文字の出現回数を追跡するだけで済みます。可能性は 26 個しかないからです。これにより、少しクリーンな (そしてはるかに高速な) コードが得られるはずです。

int numOccur[26];
...
for (int i = 0; i < numCh; i ++)
    numOccur[letters[i] - 'a'] ++;
for (i = 25; i >= 0; i --)
    if (i > 0)
        cout<<static_cast<char>(i+97)<<" "<<numOccur[i]<<endl;

もちろん、for ループを適切なファイル読み取りループに置き換える必要があります。

于 2012-11-17T02:55:35.880 に答える
0

ほんの少しのコメント。

  1. ここでのキャストのほとんどに正当な理由は見当たりません。
  2. またはを使用して文字をチェックしisalphaisupperまたはを使用して文字を変換します (注: これらの関数を使用することは、キャストを正当化する数少ない理由の 1 つです)。islowertolowertoupper
  3. lettercount`int lettercount[26] ={0}; で配列を初期化するのがおそらく最も簡単です。
  4. 独自のソート ルーチンを作成する必要が絶対にない限り、そのまま使用してくださいstd::sort
  5. 通常、ifstream を定義するときにファイルを開くのが最も簡単です。 std::ifstream infile("whatever");
  6. 使用しないでくださいwhile (infile)。それはほとんど保証されたバグです。次のように読み取りを行い、成功したかどうかを確認します。while (infile.get(ch)) ...
于 2012-11-17T03:01:59.093 に答える