#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include "wordlist.h"
using namespace std;
int count = 0;
int main()
{
ifstream fin("shenbingyu.txt");
ofstream fout("sby.txt");
if(!fin){cerr<<"ERROR";}
char ch;
vector<string> word;
string s;
while(!fin.eof())
{
ch=fin.get();
fout<<ch;
if(!(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z'))))
{
count++;
if(s!="")word.push_back(s);
s="";
continue;
}
s.push_back(ch);
}
fin.close();
fout.close();
passage shenbingyu;
for(size_t i=0;i<word.size();i++)
{
shenbingyu.insert(word[i]);
}
cout<<"There are "<<count<<" words in this passage."<<endl;
cout<<"=================================================="<<endl;
shenbingyu.print();
return 0;
}
第一次的project的第一题。
大概意思就是自己实现一个数据结构,用于储存一串国家名。并且可以按照字母序排序。
上面是main函数部分,用于对文章进行输入。
其中wordlist这个是一个自己编写的类。如下
#ifndef WORDLIST_H_INCLUDED
#define WORDLIST_H_INCLUDED
#include <string>
#include <iostream>
#include <iomanip>
using namespace std;
//node 用于记录一个单词
class node
{
public:
string sword;
node *next;
int count;//这个单词记录的次数
node(string w =""){next=NULL;count=0;sword=w;}
~node(){delete next;}
};
//wordOfSameLetter 用于储存单词链表
class wordOfSameLetter
{
private:
node *head;
node *curr;
int size;//包含的单词数
//swap交换两个node里面内容
void swap(node*n1,node*n2)
{
string w = n1->sword;n1->sword=n2->sword;n2->sword=w;
int t = n1->count; n1->count=n2->count; n2->count= t;
}
//按照字典序比较
int compare(string s1,string s2)
{ char c1=s1[0];char c2=s2[0];
int i1=s1.size();int i2 = s2.size();
for(int i=0;i<i1;i++) s1[i]=tolower(s1[i]);
for(int i=0;i<i2;i++) s2[i]=tolower(s2[i]);
if(s1==s2) return c1<c2;
return s1>s2;
}
public:
wordOfSameLetter()
{
head = curr = new node();
size = 0;
}
~wordOfSameLetter()
{
delete head;
delete curr;
}
//冒泡排序
void merge()
{
for(int i=0;i<size;i++)
{
curr = head;
node *tmp;
curr = curr->next;
tmp = curr;
while(tmp->next!=NULL)
{
//if(tmp->sword > tmp->next->sword)
if(compare(tmp->sword,tmp->next->sword)==1)
swap(tmp,tmp->next);
tmp = tmp->next;
}
}
}
void insertl(string w)//如果wordOfSameLetter中有w这个单词就count++;没有的话就插在最后
{ bool f = false;
curr =head;
while(curr->next!=NULL)
{
curr=curr->next;
if(w==curr->sword)
{
curr->count++;
f = true;
}
}
if(!f){
curr = curr->next =new node(w);
curr->count++;
size++;}
}
void print()
{
merge();//如果输出的话就把列表merge一下
curr = head;
while(curr->next!=NULL)
{
curr = curr->next;
cout<<"\t"<<left<<setw(15)<<curr->sword;
cout<<"\t"<<curr->count<<endl;
}
}
};
//用于储存首字母相同的单词链表
class letterlist
{
public:
char letter;
letterlist* next;
wordOfSameLetter words;
int nol;
letterlist(char a='^',letterlist* n =NULL)
{
letter = a;
next = n;
nol = 0;
}
~letterlist(){delete next;}
void insertw(string w)//在letterlist中插入一个单词
{
words.insertl(w);
++nol;
}
void print()//打印letterlist中的单词
{
words.print();
}
};
//包括26个letterlist分别用来储存单词
class passage
{
private:
letterlist *head;
letterlist *curr;
public:
passage()
{
head=curr=new letterlist();
for(char ch='A';ch<'Z'+1;ch++)
{
curr->next=new letterlist(ch,NULL);
curr=curr->next;
}
}
~passage()
{
delete head;
delete curr;
}
void insert(string w)//在passage中插入一个单词
{
char ch = w[0];
for(curr=head->next;curr!=NULL;curr=curr->next)
{
if((ch==curr->letter)||(ch==(curr->letter+32)))
{
curr->insertw(w);
break;
}
}
}
void print()//输出所有不为空的letterlist
{
for(curr=head->next;curr!=NULL;curr=curr->next)
{
if(curr->nol==0) continue;
cout<<curr->letter<<":"<<endl;
curr->print();
cout<<endl;
}
}
};
#endif // WORDLIST_H_INCLUDED
以上。(以前的作业,贴的晚了..)