Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 57 из 87<  1 ... 54  55  56  57  58  59  60 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
спасибо :-)

Добавлено спустя 28 минут 21 секунду:
что-то записываются мягкие знаки :insane:

Добавлено спустя 2 минуты 13 секунд:
"ььььььььььььььььььььььььььььььььььъ"

Добавлено спустя 14 минут 1 секунду:
а без этой упаковки у меня получается МЕГА архиватор)) Размер сжатого файла>>>>>>>исходного :lol:

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все



Партнер
 

Member
Статус: Не в сети
Регистрация: 15.08.2007
manya
приведи весь код


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 256
#pragma pack(1)
struct sym
{
   char ch;
   float freq;     
   char code[255];
   sym *left;
   sym *right;
   int len1;
};
#pragma pack(pop)
#pragma pack(1)
struct read
{
   char ch;
   char code[255];
   int len1;

}sim[256];
#pragma pack(pop)
sym *makeTree(sym *psym[],int k);
void makeCodes(sym *root);
void replace();
void main(void)
{
    FILE *fp,*fp2,*fp3;
   char mode=0;
   char c=0;
        int chh; 
        int k=0;
        int kk=0;
        int fsize2=0;
        int ts;
        int kolvo[256]={0};
        sym simbols[256]={0};
        sym *psym[256];
        float summir=0;
        int mes[8];
        int j=0;
      sym *symbols=(sym*)malloc(k*sizeof(sym));
        sym **psum=(sym**)malloc(k*sizeof(sym*));
   printf("a-code\n");
   printf("d-recode\n");
   printf("Input mode\t");
   scanf("%c",&mode);
   if (mode=='a')
   {
      printf("Input name of input file\t");
      char name_in[N];
      scanf("%s",name_in);
      printf("Input name of output file\t");
      char name_out[N];
      scanf("%s",name_out);
      //fp2=fopen(name_out,"wt");
      fp=fopen(name_in,"rt");
      //fp=fopen("123.txt","rt");
      //fp=fopen("123.jpg","rt");
        fp2=fopen("teemp.txt","wt");
        fp3=fopen("7777.txt","wt");
        if(fp==NULL)
        {
                puts("FILE NOT OPEN!!!!!!!");
        }
      else
      {
        while((chh=fgetc(fp))!=EOF)
        {               
                for(int j=0; j<256; j++)
                {
                        if (chh==simbols[j].ch)
                        {
                                kolvo[j]++;
                                kk++;                           
                                break;
                        }
                        if (simbols[j].ch==0)
                        {
                                simbols[j].ch=(char)chh;
                                kolvo[j]=1;
                                k++;
                        kk++;
                                break;
                        }                       
                }               
        }
        for(int i=0;i<k;i++)
                simbols[i].freq=(float)kolvo[i]/kk;
        for(int i=0;i<k;i++)
                psym[i]=&simbols[i];
        sym tempp;
        for(int i=1;i<k;i++)
                for(int j=0;j<k-1;j++)
                        if(simbols[j].freq<simbols[j+1].freq)
                        {
                                tempp=simbols[j];
                                simbols[j]=simbols[j+1];
                                simbols[j+1]=tempp;
                        }
                  for(int i=0;i<k;i++)
                  {
                     summir+=simbols[i].freq;       
                  }
                  sym *root=makeTree(psym,k);
                  makeCodes(root);
                  rewind(fp);
                  for(int i=0;i<k;i++)
                  {
                     sim[i].len1=strlen(simbols[i].code);
                  }
                  while((chh=fgetc(fp))!=EOF)
                  {
                     for(int i=0;i<k;i++)
                        if(chh==simbols[i].ch)
                        {
                           //fwrite(simbols[i].code,fp2);
                           fwrite(simbols[i].code,sim[i].len1,1,fp2);
                        }

                  }
                  FILE *fp4=fopen(name_out,"wt");
                  char mas[N];
                  int counter=0;
                  chh=0;
                  rewind(fp2);
                  while((chh=fgetc(fp2))!=EOF)
                  {
                     mas[counter]=chh;
                     counter++;
                  }
                  for (int i=0;i<strlen(mas);)
                  {
                     char byte=0;
                     for(int bit = 0;bit<8 && i<strlen(mas);bit++,i++)
                     {
                        byte <<= 1;
                        byte |= mas[i];
                     }
                     fputc(byte,fp4);
                  }
                  fclose(fp2);
                  int i=0;
                  fp2=fopen("teemp.txt","rb");
                  while((chh=fgetc(fp2))!=EOF)
                     fsize2++;
                  ts=fsize2%8;
                  rewind(fp3);
                  rewind(fp2);
                  fprintf(fp3,"%d\n",k);
                  for(i=0;i<k;i++)
                  {
                     //fprintf(fp3,"%c %s\n ",simbols[i].ch,simbols[i].code);
                     fprintf(fp3,"%c\n",simbols[i].ch);
                     fprintf(fp3,"%s\n",simbols[i].code);
                     sim[i].len1=strlen(simbols[i].code);
                            fprintf(fp3,"%d\n",sim[i].len1);
                  }
                  }
     }
   else
   {
      if (mode=='d')
      {
         fp2=fopen("teemp.txt","rt");
            fp3=fopen("7777.txt","rt");
         if(fp3==NULL)
          {
                puts("FILE NOT OPEN!!!!!!!");
          }
            if(fp2==NULL)
           {
                puts("FILE NOT OPEN!!!!!!!");
           }
         //FILE *f_out=fopen("temp.out","wt");
         FILE *res;
         res=fopen("res.txt","wt");
         int count=0;
         char rec[256];
         fscanf(fp3,"%d",&count);
         char r='\n';
            fscanf(fp3,"%c",&r);
         for (int i=0;i<count;i++)
         {
            fscanf(fp3,"%c",&sim[i].ch);
            fscanf(fp3,"%s",sim[i].code);
            fscanf(fp3,"%d",&sim[i].len1);
            fscanf(fp3,"%c",&r);
         }
         fscanf(fp2,"%s",rec);
         int len2=strlen(rec);
         int i=0;
         int k=0;
         int pos=0;
         char result[256];
         int j=0;
         int s=0;
         while (j<count)
         fprintf(f_out,"%d\n",count);
         for (int i=0;i<count;i++)
         {
            //fprintf(f_out,"%s","Letter");
            fprintf(f_out,"%c\n",sim[i].ch);
            //fprintf(f_out,"%s","Code");
            fprintf(f_out,"%s\n",sim[i].code);
            fprintf(f_out,"%d\n",sim[i].len1);
         }
         char r1='\n';
         fprintf(f_out,"%c",r1);
         fprintf(f_out,"%s",rec);*/
         fcloseall();

      }
      else
         printf("You have pressed the wrong key\n");
   }
}
sym *makeTree(sym *psym[],int k)
{
        sym *temp;
        temp=(sym*)malloc(sizeof(sym));
        temp->freq=psym[k-1]->freq+psym[k-2]->freq;
        temp->code[0]=0;
        temp->left=psym[k-1];
        temp->right=psym[k-2];
        if(k==2)
                return temp;
        else
        {
                for(int i=0;i<k;i++)
                        if (temp->freq>psym[i]->freq)
                        {       
                                for(int j=k-1;j>i;j--)
                                        psym[j]=psym[j-1];                                                                     
                               
                                psym[i]=temp;
                                break;
                        }               
        }
return makeTree(psym,k-1);
}
void makeCodes(sym *root)
{
        if(root->left)
        {
                strcpy(root->left->code,root->code);
                strcat(root->left->code,"0");
                makeCodes(root->left);
        }
        if(root->right)
        {
                strcpy(root->right->code,root->code);
                strcat(root->right->code,"1");
                makeCodes(root->right);
        }
}

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


Последний раз редактировалось manya 21.11.2009 23:52, всего редактировалось 2 раз(а).

 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
Цитата:
через битовые операции лучше делать

все равно не очень эффективно получается. ИМХО. Моя реализация не лучше в любом случае (умножение на N-ную степень двойки = сдвиг на N {битов})
Цитата:
char arr[] = {1,0,1,1,1,1,1,1,0};

а я думал, что имеется в виду строчка вида "010101110100000111100"
Цитата:
i < sizeof(arr);

криво - если, например, память под arr выделяется динамически.
Цитата:
А если не кратно восьми, то что делать?

разбить задачу на две части:
- отделить от массива кусок, который кратен 8. Сделать этот кусок
- сделать остаток.
Или сразу сделать цикл как у progn

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
именно строчка и имеется ввиду

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
ну, если строчка то нужно заменить на

cur_byte |= arr[i] - '0';

у меня же написан в примере массив значений 1 и 0 не символов '1' и '0'

Root

Цитата:
все равно не очень эффективно получается


чем не эффективно?

Цитата:
криво - если, например, память под arr выделяется динамически.


дык это просто пример. если arr динамический массив, то конечно заменить на arr.size() (если arr это std::vector<char>)


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
да все равно в выходном файле "ьььььььььььььььььььььььььььььььь" :(

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
manya
ты пишешь в текстовый файл байты, что ты ожидаешь там увидеть?


 

Member
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
я убьюсь с этими байтами)) Спасибо :-)

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Member
Статус: Не в сети
Регистрация: 11.01.2009
Каким образом функции передавать массив по ЗНАЧЕНИЮ? Как выглядит прототип такой функции?


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
manya
На чём пишешь? Если BC 3.1 и ниже, то там есть "глюк", опция для fopen(...,"wb+") - не поможет (под виндой и досом), надо ещё и глобальную переменную выставлять:
Код:
#ifdef   __BORLANDC__
   _fmode = O_BINARY; /* Исправить глюк Borland`а с fopen(,"wb+")*/
#endif


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
tolikrog
:spy: :spy: :spy: а зачем??? :spy: :spy: :spy:

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
Честно говоря вопрос не понятен...

tolikrog
В С в функцию переменные передаются только тремя (реально двумя) путями:

1. непосредственно значение
Код:
float i=32.45;
...
void foo(float);
...
void foo(float var)
{
...
}

При этом через стек передаётся само значение переменной...

2. По указателю
Код:
float i=32.45;
...
void foo(float*);
...
void foo(float *var)
{
...
}

При этом через стек передаётся только адрес переменной, а функция могёт делать с самим указателем всё, что угодно, но к переменной она "void foo()" можетдобраться только через указатель...
3. По ссылке
Код:
float i=32.45;
...
void foo(float&);
...
void foo(float &var)
{
...
}

При этом через стек передаётся только адрес переменной, а функция могёт делать с переменной всё, что угодно, но до значения ссылки добраться не может.

Между пунктами 2 и 3 различие только в синктасисе и интерпретации кода компилятором - суть одна.

Массив в языке С является УКАЗАТЕЛЕМ на начальный элемент. Это не Паскаль. Нет контроля над границами массива, нет контроля над типом указателя.


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
tolikrog

в С++ в STL есть vector его можно передовать по значению


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
Цитата:
в С++ в STL есть vector его можно передовать по значению

это не массив в прямом смысле. И к тому же это STL...

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
progn писал(а):
tolikrog
в С++ в STL есть vector его можно передовать по значению


Ну-ну - попробуй целый класс передать по значению, а не по ссылке или указателю :lol:


 

Member
Статус: Не в сети
Регистрация: 11.01.2009
Root, например, для решения такой задачи -
Есть двухмерный массив типа int, нужно написать функцию, которая выводит на экран этот массив в сортированном виде, но при этом этот массив не меняется. Для этого надо передавать функцию по значению, но так как в C нет контроля за границами массива, то разрешено передавать границы массива как параметры этой функции.


oxy, я читал книгу, и там написано было, что передача по ссылкам стала доступна только в С++, а С ее не было. Но, если вопрос не понятен, то выше я подробно все описал.


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
Возможно препод ошибся, говоря слово "значение". Такое возможно только на АСМе, если писать на С, то нужно очень тонко знать что делает компилятор и икак на это реагирует ОС...
Сохранить массив в целостности помогут локальные переменные, но если это "чистый С", то стандартными методами можно передать только указатель на массив (первый элемент массива).


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
oxy
Цитата:
Ну-ну - попробуй целый класс передать по значению, а не по ссылке или указателю


а что тут пробовать? это элементарно:

void foo(SomeClass cl)
{
...
}

у класса должен быть адекватный конструктор копии

для тебя это откровение? :D

Добавлено спустя 3 минуты 1 секунду:
tolikrog
Цитата:
передача по ссылкам стала доступна только в С++, а С ее не было

в современном C ссылки имеются


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
tolikrog
Мы сейчас о чем говорим - о плюсатом Си или классическом Си?
Я бы вообще обошелся const * :-)
Цитата:
попробуй целый класс передать по значению

ага. И огрести кучу траблов, в частности, если класс содержит указатели. Потому что класс передается, но вызывается не дефолтный конструктор, а конструктор копирования!!!
А vector - это хорошо, но тогда пользуешься в одном месте - пользуйся везде...

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


Последний раз редактировалось Root 21.11.2009 17:08, всего редактировалось 1 раз.

Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 57 из 87<  1 ... 54  55  56  57  58  59  60 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan