//头文件
#define MAXSIZE 30 //最大叶子数
#define MAXCODE 10000 //编码最大长度
#define OK 1
#define ERROR0
#define OVERLOW -2
//赫夫曼树和赫夫曼编码的存储表示
typedef struct
{
char ch
unsigned int weight
unsigned int parent, lchild, rchild
}HTNode,*HuffmanTree //动态分配数组存储赫夫曼树
typedef char **HuffmanCode//动态分配数组存储赫夫曼编码表
int js(char s[],int cnt[],char str[])
{
//统计字符串中各种字母的个数
int i,j,k
int temp1[27],temp2[27],temp3[11]
for(i=1i<=26i++)
{
temp1[i]=0
temp2[i]=0
}
for(i=1i<=10i++)
temp3[i]=0
for(i=1s[i]!='渗敬乱#'i++)
{ //统计各种字符的个数丛档
if(s[i]>='A'&&s[i]<='Z'){
k=s[i]-64
temp1[k]++
}
if(s[i]>='a'&&s[i]<='z'){
k=s[i]-96
temp2[k]++
}
if(s[i]>='0'&&s[i]<='9'){
k=s[i]-47
temp3[k]++
}
}
i=1
if(s[i]>='A'&&s[i]<='Z')
{
for(k=1,j=0k<=26k++)
{
if(temp1[k]!=0)
{
j++ //j保存字符的个数
str[j]=k+64//送对应的字母稿颤到数组str[]中
cnt[j]=temp1[k] //存入对应字母的权值到数组cnt[]中
}
}
i++
}
if(s[i]>='a'&&s[i]<='z')
{
for(k=1,j=0k<=26k++)
{
if(temp2[k]!=0)
{
j++
str[j]=k+96
cnt[j]=temp2[k]
}
}
i++
}
if(s[i]>='0'&&s[i]<='9')
{
for(k=1,j=0k<=10k++)
{
if(temp3[k]!=0)
{
j++
str[j]=k+47
cnt[j]=temp3[k]
}
}
i++
}
return j
}
void Select(HuffmanTree HT, int n, int *s1, int *s2)
//选择parent为0且weight最小的两个结点,其序号分别为s1和s2。
{
unsigned int minsum = 10000
int i,j
for(i=1i<=ni++)
{
if(HT[i].parent)
continue
for(j=i+1j<=nj++)
{
if(HT[j].parent)
continue
if(HT[i].weight + HT[j].weight<minsum)
{
minsum = HT[i].weight + HT[j].weight
*s1 = i
*s2 = j
}
}
}
}
void CreateHuffmanTree(HuffmanTree &HT, int cnt[], char t[],int n)
{//建立赫夫曼树叶
int m, s1, s2, i
if(n <= 1)
return
m = 2*n-1
HT = (HuffmanTree)malloc((m+1) * sizeof(HTNode))//0号单元未用
for( i = 1i <= ni++)
{
HT[i].ch=t[i]
HT[i].weight = cnt[i]
HT[i].parent = 0
HT[i].lchild = 0
HT[i].rchild = 0
}
for( i <= m++i)
{
HT[i].ch=0
HT[i].weight = 0
HT[i].parent = 0
HT[i].lchild = 0
HT[i].rchild = 0
}
for(i = n+1i <= mi++)
{//在HT[1..i-1]选择parent为0且weight最小的两个结点,其序号分别为s1和s2
Select(HT, i-1, &s1, &s2)
HT[i].weight = HT[s1].weight + HT[s2].weight
HT[i].lchild = s1
HT[i].rchild = s2
HT[s1].parent = i
HT[s2].parent = i
}
}
void HuffmanCoding(HuffmanTree HT,HuffmanCode &HC,int n)
{//从叶子到根逆向求每个字符的赫夫曼编码
int start, f,i
unsigned int c
char *cd
cd = (char *)malloc(n * sizeof(char))//分配求编码的工作空间
HC = (HuffmanCode)malloc((n+1)*sizeof(char *))//分配n个字符编码的头指针向量
cd[n-1] = '\0'
for(i=1i<=n++i)
{
start = n-1 //初始化编码起始指针
for(c=i,f=HT[i].parentf!=0c=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 print(HuffmanTree &HT, int i)
{//输出构造的树
int k
printf("\n构造出来的赫夫曼树是:\n")
printf(" weight parent lchild rchild")
for(k = 1k <= 2*i -1++k)
{
printf("\n%2d*%7d%7d%7d%7d",k,HT[k].weight,HT[k].parent,HT[k].lchild,HT[k].rchild)
}
}
void printcode(HuffmanTree HT,HuffmanCode HC,int n,char str[])
{//输出得到的各权Huffman编码
int j
printf("\n得到的各权Huffman编码是:\n")
printf("\t weightcode\n")
for(j=1j <= nj++)
{
printf("%7c%7d%10s\n",str[j],HT[j].weight,HC[j])
}
}
char printcoding(HuffmanTree HT,HuffmanCode HC,int x1,int x,char str[])
{
FILE *fp
if((fp=fopen("coding.txt","w"))==NULL)
printf("The file coding.txt can not open!")
int i,j
for(i=1i<=x1i++)
{
for(j=1j<=xj++)
if(str[i]==HT[j].ch)
{
fputs(HC[j],fp)
printf("%s",HC[j])
break
}
}
printf("\n")
fclose(fp)
return 1
}
//主函数
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"hfm.h"
void main()
{
char ch
char t[100]
char str[100]
int cnt[100]
FILE *fp
if((fp=fopen("code.txt","r"))==NULL)
{
printf("The file can not be read!")
exit(0)
}
ch=fgetc(fp)
int i=1
t[i]=ch
printf("原码为:\n")
while(ch!='#')
{
putchar(ch)
ch=fgetc(fp)
i++
t[i]=ch
}
int x1=i-1
printf("\n\n")
int x=js(t,cnt,str)
//printf("字符个数为j=%d\n",j)
fclose(fp)
HuffmanTree HT
HuffmanCode HC
for(i=1i<=xi++)
{
printf("%7c的权值=%d\n",str[i],cnt[i])
}
cnt[i] ='\0'
CreateHuffmanTree(HT, cnt, t,i-1)
print(HT,i-1)
printf("\n")
HuffmanCoding(HT, HC, i-1)
printcode(HT,HC,i-1,str)
printf("\n译码后的字符串:\n")
printcoding(HT,HC,x1,x,t)
}
Sub Y02()On Error GoTo Err: '有错跳至err子过程脊答饥
Dim Varian As Variant '定义Varian 类型
Dim Pti(0 To 2) As Double '定义Pti为数组,内容限0-2行,或列
Dim PtH As String'定义为文本
Dim TextH As Double'为双精度
Dim Po(0 To 2) As Double'为双精度数组
Dim Texta As AcadText'定义为cad单行文本
Dim Tsc As Double
Dim BlocobjA As AcadBlockReference'定义为cad块
Tsc = 1 '比例
PtH = "C:\螺钉标准件\螺钉标准件\六角螺栓.dwg"
'此路径你自定义,必须有;没有会报错
If Dir(PtH) <举厅>"" Then'用dir判断有没有pth文件,没有=""
Varian = ThisDrawing.Utility.GetPoint(, vbCr &"放置点:")'在cad上选择一个坐标,或位置
Po(0) = Varian(0): Po(1) = Varian(1): Po(2) = Varian(2)'取出坐标的xyz值
Set BlocobjA = ThisDrawing.ModelSpace.InsertBlock(Po, PtH, Tsc, Tsc, Tsc, 0)'在po位置插入块pth
BlocobjA.Explode'块分解?
BlocobjA.Delete'块删除
Else
MsgBox "<" + PtH + " >文件不存在!!!", vbCritical, "读取文件错误" '文件樱返报错
End If
Err: '错误停止运行
End Sub
大至是这个意思了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)