PDA

View Full Version : سوال: مشکل این کد کجاست؟



moh.mon
سه شنبه 27 مهر 1389, 09:55 صبح
سلام.
این کد هافمن هست. ولی نمیدونم کجای کارم ایراد داره؟

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
#define MAX 10

using namespace std;

struct link
{
int freq;
char ch[MAX];
struct link* right;
struct link* left;
};

typedef struct link node;
void sort(node *[], int);
node* create(char[], int);
void sright(node *[], int);
void Assign_Code(node*, int [], int);
void Delete_Tree(node *);

void main()
{
node* ptr, * head;
int i, n=0, j=0, total = 0, u, c[15];
char str[MAX];
char passage[10];
int alphabet[26];
node* a[12];
int freq;

// clrscr();
printf( "Huffman Algorithm\n");
printf("\nEnter the Araye:");


for(int i=0;i<26;i++)
{
alphabet[i]=0;
}
scanf("%s", passage);
for(i=0;i<10;i++)
{
switch(passage[i])
{
case 'a' : alphabet[0]++; break;
case 'b' : alphabet[1]++; break;
case 'c' : alphabet[2]++; break;
case 'd' : alphabet[3]++; break;
case 'e' : alphabet[4]++; break;
case 'f' : alphabet[5]++; break;
case 'g' : alphabet[6]++; break;
case 'h' : alphabet[7]++; break;
case 'i' : alphabet[8]++; break;
case 'j' : alphabet[9]++; break;
case 'k' : alphabet[10]++;break;
case 'l' : alphabet[11]++;break;
case 'm' : alphabet[12]++;break;
case 'n' : alphabet[13]++;break;
case 'o' : alphabet[14]++;break;
case 'p' : alphabet[15]++;break;
case 'q' : alphabet[16]++;break;
case 'r' : alphabet[17]++;break;
case 's' : alphabet[18]++;break;
case 't' : alphabet[19]++;break;
case 'u' : alphabet[20]++;break;
case 'v' : alphabet[21]++;break;
case 'w' : alphabet[22]++;break;
case 'x' : alphabet[23]++;break;
case 'y' : alphabet[24]++;break;
case 'z' : alphabet[25]++;break;
}
}


for(i=0;i<26;i++ )
{
if(alphabet[i]!=0)
{
str[j]=char(i+97);
freq=alphabet[i];
a[j] = create(str, freq);
j++;
n++;
}

}



while (n > 1)
{
sort(a, n);
u = a[0]->freq + a[1]->freq;
strcpy(str,a[0]->ch);
strcat(str,a[1]->ch);
ptr = create(str, u);
ptr->right = a[1];
ptr->left = a[0];
a[0] = ptr;
sright(a, n);
n--;
}
Assign_Code(a[0], c, 0);
getch();
Delete_Tree(a[0]);
}

node* create(char a[], int x)
{
node* ptr;
ptr = (node *) malloc(sizeof(node));
ptr->freq = x;
strcpy( ptr->ch , a);
ptr->right = ptr->left = NULL;
return(ptr);
}
void sort(node* a[], int n)
{
int i, j;
node* temp;
for (i = 0; i < n - 1; i++)
for (j = i; j < n; j++)
if (a[i]->freq > a[j]->freq)
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
void sright(node* a[], int n)
{
int i;
for (i = 1; i < n - 1; i++)
a[i] = a[i + 1];
}
void Assign_Code(node* tree, int c[], int n)
{
int i;
if ((tree->left == NULL) && (tree->right == NULL))
{
printf("%s code:", tree->ch);
for (i = 0; i < n; i++)
{
printf("%d", c[i]);
}
printf("\n");
}
else
{
c[n] = 1;
n++;
Assign_Code(tree->left, c, n);
c[n - 1] = 0;
Assign_Code(tree->right, c, n);
}
}
void Delete_Tree(node * root)
{
if(root!=NULL)
{
Delete_Tree(root->left);
Delete_Tree(root->right);
free(root);
}
}

moh.mon
سه شنبه 27 مهر 1389, 10:55 صبح
مشکل تو این قسمت از کد هست:

str[j]=char(i+97);
باید str به شکل یه string ذخیره بشه.
کسی میدونه کدش چیه؟ (تبدیل رشته به کاراکتر)

r00tkit
سه شنبه 27 مهر 1389, 12:19 عصر
برنامت کار می کنه

تو کجا مشکل داری، اجرا یا چی ؟

r00tkit
سه شنبه 27 مهر 1389, 12:23 عصر
سعی کن از strcpy استفاده نکنی در عوض

StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyN,


این تابع امکان stackoverflow داره

moh.mon
سه شنبه 27 مهر 1389, 12:27 عصر
چند تا تغییر دادم روش الانداره کار میکنه. یه بار اجرا کنید همه چی مشخص میشه. یه رشته کاراکتر با حرف کوچیک و میگیره و کد مربوط به هر کاراکتر رو میده.
ولی نمیدونم چرا فقط کاراکتر اول رو نمایش میده.!!!!!!!!!!!!!!!!!!!! واقعا گیج شدم.
اینم کد جدید:

#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
#include<iostream>
#include<sstream>
#define MAX 10

using namespace std;
struct link
{
int freq;
char ch[MAX];
struct link* right;
struct link* left;
};
typedef struct link node;
void sort(node *[], int);
node* create(char[], int);

void sright(node *[], int);
void Assign_Code(node*, int [], int);
void Delete_Tree(node *);

void main()
{
node* ptr, * head;
int i, n=0,u, c[15];
char str[MAX];
char b;
stringstream ss;
char passage[100];
int alphabet[26];
node* a[12];
int freq;

// clrscr();
printf( "Huffman Algorithm\n");
printf("\nEnter the Araye:");


for(int i=0;i<26;i++)
{
alphabet[i]=0;
}
scanf("%s", passage);
for(i=0;i<100;i++)
{
switch(passage[i])
{
case 'a' : alphabet[0]++; break;
case 'b' : alphabet[1]++; break;
case 'c' : alphabet[2]++; break;
case 'd' : alphabet[3]++; break;
case 'e' : alphabet[4]++; break;
case 'f' : alphabet[5]++; break;
case 'g' : alphabet[6]++; break;
case 'h' : alphabet[7]++; break;
case 'i' : alphabet[8]++; break;
case 'j' : alphabet[9]++; break;
case 'k' : alphabet[10]++;break;
case 'l' : alphabet[11]++;break;
case 'm' : alphabet[12]++;break;
case 'n' : alphabet[13]++;break;
case 'o' : alphabet[14]++;break;
case 'p' : alphabet[15]++;break;
case 'q' : alphabet[16]++;break;
case 'r' : alphabet[17]++;break;
case 's' : alphabet[18]++;break;
case 't' : alphabet[19]++;break;
case 'u' : alphabet[20]++;break;
case 'v' : alphabet[21]++;break;
case 'w' : alphabet[22]++;break;
case 'x' : alphabet[23]++;break;
case 'y' : alphabet[24]++;break;
case 'z' : alphabet[25]++;break;
}
}


for(i=0;i<26;i++ )
{
if(alphabet[i]!=0)
{
b=char(i+97);
ss<<b;
ss>>str;

freq=alphabet[i];
cout<<str<<" "<<freq<<endl;
a[n] = create(str, freq);

for(int k=0;k<10;k++)
str[k]=NULL;
b=char(0);
n++;
}

}


while (n > 1)
{
sort(a, n);
u = a[0]->freq + a[1]->freq;
strcpy(str,a[0]->ch);
strcat(str,a[1]->ch);
ptr = create(str, u);
ptr->right = a[1];
ptr->left = a[0];
a[0] = ptr;
sright(a, n);
n--;
}
Assign_Code(a[0], c, 0);
getch();
Delete_Tree(a[0]);
}

node* create(char a[], int x)
{
node* ptr;
ptr = (node *) malloc(sizeof(node));
ptr->freq = x;
strcpy( ptr->ch , a);
ptr->right = ptr->left = NULL;
return(ptr);
}
void sort(node* a[], int n)
{
int i, j;
node* temp;
for (i = 0; i < n - 1; i++)
for (j = i; j < n; j++)
if (a[i]->freq > a[j]->freq)
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
void sright(node* a[], int n)
{
int i;
for (i = 1; i < n - 1; i++)
a[i] = a[i + 1];
}
void Assign_Code(node* tree, int c[], int n)
{
int i;
if ((tree->left == NULL) && (tree->right == NULL))
{
printf("%s code:", tree->ch);
for (i = 0; i < n; i++)
{
printf("%d", c[i]);
}
printf("\n");
}
else
{
c[n] = 1;
n++;
Assign_Code(tree->left, c, n);
c[n - 1] = 0;
Assign_Code(tree->right, c, n);
}
}
void Delete_Tree(node * root)
{
if(root!=NULL)
{
Delete_Tree(root->left);
Delete_Tree(root->right);
free(root);
}
}

مشکلشم اینجاس:

for(i=0;i<26;i++ )
{
if(alphabet[i]!=0)
{
b=char(i+97);
ss<<b;
ss>>str;

freq=alphabet[i];
cout<<str<<" "<<freq<<endl;
a[n] = create(str, freq);

for(int k=0;k<10;k++)
str[k]=NULL;
b=char(0);
n++;
}