getline和log2为什么无定义

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define max 200
using namespace std;
struct jcode//求得概率之后的结构体
{
char c;
int x;//概率
int b;//下标
friend bool operator<(jcode a, jcode b ){//优先队列排序
return b.x }
};
typedef jcode jjnum[max];
typedef struct bnode{//存储哈夫曼树的结构体数组
char data;
int x;
int lchild,rchild,parent;
char code[max];//每个字符编码
int len;//编码长度
}bnode;
typedef bnode huffman[max];
//统计输入的字符及各自概率
int getnum(string ss,jjnum str)
{
int i,j;
int temp[max];
for(i = 0;i {
temp[i]=0;
}
for(i = 0;i temp[ss[i]-'!']++;
j=0;
for(i = 0;i {
if(temp[i]!=0)
{
str[j].x= temp[i];
str[j].c = i+'!';
str[j].b = j;
j++;
}
}
return j;
}
void create(priority_queueq,huffman &t,int cnum,jjnum str)//构造哈夫曼树
{
int i,a1,a2;
for(i=0;i<2*cnum-1;i++)//初始化结点
{
t[i].lchild = t[i].parent = t[i].rchild = t[i].x = 0;
t[i].data= '1';

}
for(i=0;i<cnum;i++)//叶子节点
{
    t[i].x = str[i].x;
    t[i].data = str[i].c;
}

for(i=cnum;i<2*cnum-1;i++)//根据哈夫曼编码构造哈夫曼树
{
    a1 = q.top().b;
    t[a1].parent = i;q.pop();
    a2 = q.top().b;
    t[a2].parent = i;q.pop();
    t[i].lchild = a1;//指向孩子
    t[i].rchild = a2;
    t[i].x = t[a1].x+t[a2].x;//概率小的两个相加
    jcode e;
    e.c = '1';e.x = t[i].x;e.b = i;
    q.push(e);//和存到队列中
}
for(i=0;i<cnum;i++)//由0.1进行二元编码,1右0左
{
    int x;
    x=i;
    t[i].len = 0;
    while(t[x].parent!=0)//从叶子节点向根
    {
        if(t[t[x].parent].lchild == x)
        {
            t[i].code[t[i].len]='0';//存下来编码
            t[i].len++;
        }
        else
        {
            t[i].code[t[i].len]='1';
            t[i].len++;
        }
        x = t[x].parent;

    }
}

for(i=0;i<cnum;i++)//输出每个字符编码
{
    if(t[i].data!='1')
    {
      cout<<t[i].data<<"  ===  ";
      for(int j=t[i].len-1;j>=0;j--)
        cout<<t[i].code[j];
      cout<<endl;
    }
}

}
//编码f
void strhttree(jjnum str,int num,huffman &t)
{
int i;
priority_queueq2;
for(i = 0; i < num; i++)//加入优先队列
q2.push(str[i]);
create(q2,t,num,str);
}
void yima(string ss,int i,huffman &t,int num,int cnum)//译码
{
while(num>=cnum)//从根节点开始
{
if(ss[i]=='1')
{
num = t[num].rchild;
i++;
}
else
{
num = t[num].lchild;
i++;
}
}
if(i<=ss.length())//得到一个叶子节点,即译出一个字符
{
cout< yima(ss,i,t,2*cnum-2,cnum);//继续译码
}
}
int main()
{
string s;//输入字符串
huffman t;//哈夫曼树
getline(cin,s);
jcode str[max];
int cnum = getnum(s,str);//字符的种类个数
strhttree(str,cnum,t);//构造哈夫曼树
for(int k = 0;k for(int i=0;i {
if(s[k]==t[i].data){
for(int j=t[i].len-1;j>=0;j--)
cout<<t[i].code[j];
}
}
cout<<endl;
double sum1 =0.0,sum2 = 0.0;
for(int i = 0;i<cnum;i++)//求编码效率
{
sum1+=((t[i].x*1.0/s.size())*(-log2(t[i].x*1.0/s.size())));
sum2+=(t[i].x*1.0/s.size())*t[i].len;

}
cout<<"n=="<<(sum1/sum2)<<endl;
string l;
getline(cin,l);//输入码
int x= 2*cnum -2;//根节点、
yima(l,0,t,x,cnum);//译码
return 0;

}

1个回答

你没有getline()函数的实现啊,在main函数里直接使用肯定是不可以的。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问