回 帖 发 新 帖 刷新版面

主题:纠结!!!

我想从文件输出一段字符串,并对这些字符串进行处理,统计这段字符串有多少种字符,并且每种字符有多少个,输出时按字符的个数从小到大输出!
我写的程序的输出让我无语
·······纠结纠结啊
我是把a[26]存放a~~z,b[26]存放每种字母的个数,当然有的元素有可能为0,
然后我打标记的那一段代码是想把b数组中0的元素去掉。

#include<iostream>
#include<fstream>
#include <cstdlib>
#include<iomanip>
using namespace std;
void main()
{char a[26];
int b[26];
int i;
ifstream fin;
fin.open("file.dat");
 if(fin.fail())
 {cout<<"Input file opening failed.\n";
  exit(1);
  }
 char next,v;
  fin.get(next);
 while(next!='.')
{
     cout<<next;
 if(next==' ')
    {   cout<<" ";
        fin.get(next);
        continue;
    }

    v=next;
    i=int(next-'0');
    i=i-97;
   
    a[i]=v;
    b[i]++;
    fin.get(next);
}
 fin.close();
 int n=0;
 [color=FF00FF]for(i=0;(b[i]!=0)&&(i<26);i++)
 {a[n]=a[i];
 b[n]=b[i];
 n++;
 }[/color] int j,k,t;
 char d;
 for(j=0;j<25;j++)
     for(k=0;k<25-j;k++)
         if(b[k]<b[k+1])
         {
         d=a[k];a[k]=a[k+1];a[k+1]=d;
t=b[k];b[k]=b[k+1];b[k+1]=t;
         }
         cout<<"\nLetter Number of Ouccorance"<<endl;
         for(i=0;i<n-1;i++)
             cout<<setw(10)<<a[i]<<setw(10)<<b[i]<<endl;
}

回复列表 (共5个回复)

沙发

不用纠结:

#include<iostream>
#include<fstream>
#include<cstdlib>
#include<iomanip>

using std::ifstream;
using std::cout;
using std::setw;
using std::endl;

class Counters
{
    char keys[26];
    int  values[26];

public:
    Counters() : keys(), values()
    {
    }

    void countLetter(int theLetter)
    {
        if (theLetter < 'A' || theLetter > 'Z') 
        {
            return;
        }
        int index = theLetter - 'A';
        keys[index] = theLetter;
        ++values[index];
    }

    void uniq()
    {
        int  result[26];
        int  j = 0;
        for(int i=0;i<sizeof(keys)/sizeof(keys[0]);++i)
        {
            if (keys[i] != 0)
            {
                keys[j] = keys[i];
                values[j] = values[i];
                ++j;
            }
        }
        //setup an ending flag
        keys[j] = 0;
    }

    void print()
    {
        for(int i=0;i<sizeof(keys)/sizeof(keys[0]);++i)
        {
            if (keys[i] == 0)
            {
                cout << "has " << i << " letters\n";
                break;
            }
            cout<<setw(3)<<keys[i]<<" :"<<setw(6)<<values[i]<<"\n";
        }
    }
};

int main()
{
    ifstream fin;
    fin.open("file.dat");

    if(!fin)
    {
        cout << "Input file opening failed.\n";
        exit(1);
    }
    
    Counters counter;
    while (fin)
    {
        counter.countLetter(fin.get());
    }
    fin.close();

    counter.uniq();
    counter.print();

    return 0;
}

板凳


[em12]呵呵,不纠结不纠结~~

3 楼


额,刚运行了,还是不对呢。。。。。

4 楼

两个map:
第一个以字符为key,以个数为value,循环一次到eof为止;
第二个以个数为key,以字符为value, 循环一次到第一个map的end为止。
顺序输出第二个map的key和value就行了:)
代码我就不写了,自个儿看着来:)

5 楼


#include<iostream>
#include<fstream>
#include <cstdlib>
#include<iomanip>
using namespace std;
void main()
{
    int b[26];
int i,j,k,temp;
ifstream fin;
fin.open("file.dat");
 if(fin.fail())
 {cout<<"Input file opening failed.\n";
  exit(1);
  }
 char next;
  fin.get(next);
  for(i=0;i<26;i++)
      b[i]=0;
while(next!='.')
{
if(next!=' ')
    {   cout<<next;
       
  k=int(next);
    k=k-97;
    b[k]++; 
    fin.get(next);
 }     
 if(next==' ')
    {   cout<<" ";
        fin.get(next);
    }
 
}
cout<<"."<<endl;
 fin.close();
 for(j=0;j<25;j++)
     for(k=0;k>25-j;k++)
         if(b[k]<b[k+1])
         {temp=b[k];b[k]=b[k+1];b[k+1]=temp;}
 for(i=0;i<26;i++)
 {     if(b[i]!=0)
 cout<<char(i+97)<<"  "<<b[i]<<endl;}

}嗯,这一题我昨晚已经解决了,呵呵,鼓掌~~~

我来回复

您尚未登录,请登录后再回复。点此登录或注册