小春网

 找回密码
 注册账号
12
返回列表 发新帖
楼主: gmhhp
收起左侧

[IT 交流] 一道。情报理论。ハフマン符号。的C语言的题。欢迎光临。感谢赞助。

[复制链接]
发表于 2009-7-18 10:21:06 | 显示全部楼层
本帖最后由 等待UFO 于 2009-7-18 10:35 编辑

那个 - 号 只是想把数字 变为 负数 而已。。。   
从来没见过这么转换为负数的   无所谓了
程序稍稍修改了一下   这个你编译运行看一下  (注意plist.txt的存放路径需要修改)
tishi.JPG
回复

使用道具 举报

发表于 2009-7-18 10:21:37 | 显示全部楼层
本帖最后由 等待UFO 于 2009-7-18 10:39 编辑

#include <stdio.h>
#include <stdlib.h>
#define N 26  //とりあえず、26固定

//下面这两个应该是 计算那个 哈夫曼码的固定的几个字符
char *s[N];      //={"a1","a2","a3","a4","a5","a6"};     注释掉了   下面从文件读出来
float f[2*N-1];  //={0.35,0.15,0.15,0.20,0.10,0.05};

int size=N, parent[2*N-1], left[2*N-1], right[2*N-1];

//计算
void huff (void){
    int i,j,dat1,dat2;
    float min;
        
    for (i=0;i<2*N;i++)
                left=right=parent=0;
        
    while(1){
       for (i=0;i <size;i++)
                   if (f>=0)
                           break;
            
       if (i==size)
                   break;
            
       dat1=i;
       min=f[dat1];
            
       for (i=0;i<size;i++)
                   if (f<min && f>0)
                   {
                           min=f;
                           dat1=i;
                   }//end if
            
       for (i=0; i<size; i++)
                   if ((f>=0)&&(i!=dat1))
                           break;
            
       if (i==size)
                   break;
            
       dat2=i;
           min=f[dat2];
            
       for (i=0;i<size;i++)
                   if (f<min && f>0 && i!=dat1)
                   {
                           min=f;
                           dat2=i;
                   }//end if
            
       left[size]=dat1;
       right[size]=dat2;
            
       parent[dat1]=size;
       parent[dat2]= -size;
            
       f[size]=f[dat1]+f[dat2];
       f[dat1]=-1;
       f[dat2]=-1;
            
       size ++;
    }//end while
}

//输出结果
void outenc(int huf) {
        if (huf== size-1)   
                return;
        
        if (parent[huf]<0){
                outenc(-parent[huf]);      //这个地方修改了  不知道意思变没变  
                printf("1");
        } else {
        outenc(parent[huf]);
                printf("0");
    }//end if
}


int _tmain(int argc, _TCHAR* argv[])
{

        int i;


        //读文件的操作>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        FILE *fp;

        ファイルを開く
        if( (fp=fopen("E:\\plist.txt","r"))==NULL ){
                printf("The file is not found...");
                return -1;
        }//end if

        char buff[256];
        memset(buff,0x00,sizeof(buff));  //初期化

        int iLnCnt = 0;
        char chTmp[256];
        float floatVal;

        //plist.txtを最後まで読み込む
        while(fgets(buff,sizeof(buff),fp)){  //1行ずつ読み込む

                if(strlen(buff)<=0)  //空行の場合
                        continue;        //次の行を読み込む

                memset(chTmp,0x00,sizeof(chTmp));
                sscanf(buff,"%s %f",chTmp,&floatVal);

                //ファイルのアルファベット文字を格納する一時メモリ確保
                char* pch = (char*)malloc(sizeof(char)*5);  //長さはとりあえず5固定
                memset(pch,0x00,5);
                strncpy(pch,chTmp,strlen(chTmp));

                //读出文件里面的内容  写到s[], f[]数祖里面去。
                s[iLnCnt] = pch;
                f[iLnCnt] = floatVal;

                iLnCnt++;     //件数計数
                if(iLnCnt==N) //26行を読んだらファイル読み込み終了(最大26行しか読み込まない)
                        break;
        }//end while

        if(fp)
                fclose(fp);
        //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

        huff();  //ハフマン符号計算関数
   
        
        for (i=0; i<N; i++)   
        {
                printf("%s ",s);
                outenc(i);            //输出计算后的结果        
                printf("\n");   
        }//end for

        return 0;
}
回复

使用道具 举报

 楼主| 发表于 2009-7-18 17:00:40 | 显示全部楼层
本帖最后由 gmhhp 于 2009-7-18 17:05 编辑
#include
#include
#define N 26  //とりあえず、26固定

//下面这两个应该是 计算那个 哈夫曼码的固定的几个字符
char *s[N];      //={"a1","a2","a3","a4","a5","a6"};     注释掉了   下面从文件读出来
...
等待UFO 发表于 2009-7-18 10:21



报告对长。我原来用cygwin这软件编C语言。后来学校又学JAVA,我不会,就照老师方法弄了个假想LINUX。我是在那里编C和JAVA的。

程序执行了一下。
出现。

[gmhhp@localhost ~]$ gcc jf.c -o jf
jf.c: 関数`huff' 内:
jf.c:16: error: incompatible types in 代入
jf.c:30: error: invalid operands to binary <
jf.c:32: error: incompatible types in 代入
jf.c:47: error: invalid operands to binary <
jf.c:49: error: incompatible types in 代入
jf.c: トップレベル:
jf.c:81: error: 文法エラー before "_TCHAR"

然后。是对长原来说的那个出了问题。
我按对长第一次的那个left=right=parent=0;
改为。。。。。。。left左框i右框=right左框i右框=parent左框i右框=0;(小春好像显不出[]里放个i。)
然后后面的适当的f,那里,也加了f
左框i右框。然后再运行。
这次,只出现
[gmhhp@localhost ~]$ gcc jf.c -o jfjf.c:
トップレベル:
jf.c:81: error: 文法エラー before "_TCHAR"
对长运行成功了吗?这题应该是算出什么样的答案呀。

嘻。。。

对不起哈!老麻烦你。真过意不去。
回复

使用道具 举报

发表于 2009-7-18 19:26:40 | 显示全部楼层
[gmhhp@localhost ~]$ gcc jf.c -o jfjf.c:     
トップレベル:
jf.c:81: error: 文法エラー before "_TCHAR"

看样子 是编译出错了  81行   你改了程序  我这里根你那里不一样  81行是什么语句?   你把75 ~ 85行贴上来看看。   _TCHAR  问题   又是字符串的问题  这个有可能跟环境有关系  我这里是windows  vs2008编译通过  

你先把程序贴上来   然后看看是哪个语句  然后再让我考虑吧    我这里linux也没有  无法具体的调试了
回复

使用道具 举报

发表于 2009-7-18 19:30:53 | 显示全部楼层
cygwin 是windows上的C语言编辑器   还有吗?  为什么不用了呢?  不过, 最终要是想在linux上运行  肯定就得用linux编译 (虽然说c语言通用  但是 windows跟linux好像还是有点不一样的)    如果说  单纯只是编c程序   以后都是在windows上运行   那么也不必麻烦得非要在linux上编译呀    用windows上的C编译器更方便(现在的学校里都用linux了吗?)
回复

使用道具 举报

发表于 2009-7-18 19:45:03 | 显示全部楼层
本帖最后由 等待UFO 于 2009-7-18 19:46 编辑

不好意思  我疏忽了   你的程序里做如下修改:

int _tmain(int argc, _TCHAR* argv[])  
  把这一行改成
int main(int argc, char** argv) 这样估计就能编译通过了


_TCHAR 是vs里 C++的定义    c语言里面没有  没想到你是在linux下运行 就更没有了
回复

使用道具 举报

发表于 2009-7-18 19:48:27 | 显示全部楼层
然后。是对长原来说的那个出了问题。
我按对长第一次的那个left=right=parent=0;
改为。。。。。。。left左框i右框=right左框i右框=parent左框i右框=0;(小春好像显不出[]里放个i。)
然后后面的适当的f,那里,也加了f左框i右框。然后再运行。

这个做的对  挺聪明阿
回复

使用道具 举报

发表于 2009-7-18 20:04:25 | 显示全部楼层
运行结果 如下: 也不知道对不对  输出就那样了   把上面我说的mian的地方改一下  然后在linux上编译看看

tishi3.JPG
回复

使用道具 举报

 楼主| 发表于 2009-7-18 21:39:26 | 显示全部楼层
运行结果 如下: 也不知道对不对  输出就那样了   把上面我说的mian的地方改一下  然后在linux上编译看看

782387
等待UFO 发表于 2009-7-18 20:04



有时用些软件,不可以显示カタカナ。原来的cygwin我不知道怎么用它翻译JAVA。在LINUX里,都用那个emacs。

别的学校我不知道,反正我们学校做プログラム的时候,老师推荐用LINUX。在那里用GCC。
他说WINDOWS也行。可是我每次弄WINDOWS老是出现乱码情况。

对长。我做好了。情报理论这课,这次最后一次作业了。哇哈哈 。在您的おかげ之下。我得到了解救。谢谢

不知道怎么报答你。请你吃饭吧!
回复

使用道具 举报

发表于 2009-7-19 09:50:13 | 显示全部楼层
其实 java也一样  我们都是用windows开发的  到最后才上传到unix(linux都一样)下编译, 运行。  主要是因为unix下的编辑器用起来肯定没有windows方便啦。。。  你直接在linux下工作   挺厉害的嘛   反正我是不行   受不了那里的操作

做好就好了   我都是做C++的   C只是大二时候学的那些  unix下的C++做过   可是还真没做过那里的C  不了解  还担心这次帮不了了呢。。。

吃饭就不用了   希望有机会还能帮到你
我是以助人为乐为己任的  特别是美女      娃哈哈哈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小春网
常务客服微信
微信订阅号
手机客户端
扫一扫,查看更方便! 快速回复 返回顶部 返回列表