关于getchar在while中没有起作用的问题

bluefish625 2008-11-15 09:45:40
请前辈帮帮忙啊,我是新手啊,好像没有分啊



// Huffman.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;
#include<stdio.h>
#include"stdlib.h"
#include"string.h"
typedef struct
{
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char * * HuffmanCode;

void InitHuffmanTree(int a[],char b[],int &n)
{
int i;
cout<<"请输入叶子结点的个数:";
cin>>n;
cout<<"请输入第一个叶子结点存储的数据:";
for(i=0;i<n;i++)
{
cin>>b[i];
if(i!=(n-1))
cout<<"请输入下一个叶子结点存储的数据:";
}

cout<<"请输入第一个结点的权重:";
for(i=0;i<n;i++)
{
cin>>a[i];
if(i!=(n-1))
cout<<"请输入下一个结点的权重:";
}
}
void Select(HuffmanTree &HT,int n,int &s1,int &s2)
{
int i;
s1=s2=0;
for(i=1;i<=n;i++)
{
if(HT[i].parent!=0)
continue;
s1=HT[s1].weight>HT[i].weight ?i:s1;
}
for(i=1;i<=n;i++)
{
if(HT[i].parent!=0||i==s1)
continue;
s2=HT[s2].weight>HT[i].weight ? i: s2;
}
}


void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n)
{
int i,m,start,c,s1,s2;
char *cd;
unsigned int f;
m=2*n-1;
HT=(HuffmanTree)malloc((m+1) * sizeof(HTNode));
for(i=1;i<=n;++i,++w)
{
HT[i].weight=*w;
HT[i].parent=HT[i].lchild=HT[i].rchild=0;
}
for(;i<=m;++i)
{
HT[i].weight=HT[i].parent=HT[i].lchild=HT[i].rchild=0;
}
for(i=n+1;i<=m;++i)
{
Select(HT,i-1,s1,s2);
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
HC=(HuffmanCode)malloc((n+1) * sizeof(char *));
cd=(char *)malloc(n*sizeof(char));
cd[n-1]='\0';
for(i=1;i<=n;++i)
{
start=n-1;
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
{
if(HT[f].lchild==c)
cd[--start]='0';
else
cd[--start]='1';
}
HC[i]=(char *)malloc((n-start)* sizeof(char));
strcpy(HC[i],&cd[start]);
}
free(cd);
}

void Coding_HuffmanCode(HuffmanTree &HT,HuffmanCode &HC,char b[],int n)
{
int i;
char *temp;
unsigned int f,c;
for(i=1;i<=n;i++)
{
temp=HC[i];
cout<<b[i-1]<<"的Huffman编码为:";
for(f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
{
cout<<*temp;
temp++;
}
cout<<endl;
}
}
void Sending(HuffmanCode &HC)
{
int j;
char x,*p;
cout<<"请输入要发送的消息,以#表示结束"<<endl;
while((x=getchar())!='#')//////////////////////////////////////////////////////////////////////就是这里啦,总是不能调用啊
{
if(x==32)
j=1;
if(x>=65&&x<=90)
j=x-63;
p=HC[j];
cout<<*p;
}
cout<<" 前面的输出为该消息的HuffmanCode序列"<<endl;
}

void Translate_HuffmanCode(HuffmanTree &HT,char b[])
{
unsigned int f;
int i;
char ch,code[30];
cout<<"请输入要翻译的HuffmanCode,以#表示结束:"<<endl;
while((ch=getchar())!='#')
{
if(ch!=0||ch!=1)
{
cout<<"输入的HuffmanCode有误,请从新输入:"<<endl;
i=0;
continue;
}
code[i]=ch;
i++;
}
code[i]='\0';
i=0;
for(f=0;code[i]!='\0';)
{
if(code[i]==0)
{
if(HT[f].lchild==0)
{
cout<<b[HT[f].lchild-1];
f=0;
}
f=HT[f].lchild;
}
else
{
if(HT[f].rchild==0)
{
cout<<b[HT[f].rchild-1];
f=0;
}
f=HT[f].rchild;
}
i++;
}
}
void Switch(HuffmanTree &HT,HuffmanCode &HC,char b[],int n)
{
int i;
cout<<"请选择您的操作:"<<endl;
cout<<"如果要输出Huffman编码请输入1:"<<endl;
cout<<"如果要发送消息请输入2:"<<endl;
cout<<"如果要接收消息请输入3:"<<endl;
cout<<"如果要结束本程序请输入0:"<<endl;
cout<<"您的选择是 ——>";
cin>>i;
while(i)
{
switch(i)
{
case 1:
{
Coding_HuffmanCode(HT,HC,b,n);
break;
}
case 2:
{
Sending(HC);
break;
}
case 3:
{
Translate_HuffmanCode(HT,b);
break;
}
default:
cout<<"您输入的选择操作有误,请从新输入(在0-3间选择):"<<endl;
}
cout<<"请选择您的操作:"<<endl;
cout<<"如果要输出Huffman编码请输入1:"<<endl;
cout<<"如果要发送消息请输入2:"<<endl;
cout<<"如果要接收消息请输入3:"<<endl;
cout<<"如果要结束本程序请输入0:"<<endl;
cout<<"您的选择是 ——>";
cin>>i;
}

}
int _tmain(int argc, _TCHAR* argv[])
{
int i,n,a[30],*w;
char b[30];
HuffmanTree HT;
HuffmanCode HC;
w=a;
InitHuffmanTree(a,b,n);
HuffmanCoding(HT,HC,w,n);
Switch(HT,HC,b,n);
return 0;
}

...全文
113 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧