Кодировщик

Рассмотрим способ кодирования текста, в котором в каче­стве базового используется двумерный символьный массив - массив текстовых строк. Кодируются не символы, как в предыдущем примере, а целые слова. Слово кодируется с помощью двух чисел: номера строки и номера слова в этой строке. Например, воспользуемся четверостишьем Омара Хайяма:
Зачем копить добро в пустыне бытия?
Кто вечно жил средь нас? Таких не видел я!
Ведь жизнь нам в долг дана, и то на срок недолгий,
А то, что в долг дано - не собственность твоя.
На основе этого текста составим числовой код
2 1283237231415.
При этом знаки препинания мы полностью игнорируем. Что означает этот числовой код? Например, числа 2 и 1, с которых он начинается, свидетель­ствуют о том, что первое закодированное слово размещено во второй строке и является первым по порядку. Следующее слово (код 2 8) также размеще­но во второй строке и является восьмым по порядку и так далее. В результа­те раскодирования получаем фразу
Кто видел жизнь и жил в пустыне.
Для выполнения описанных несложных операций по кодированию текстов составляем программный код со специальной функцией, которой и выполняется кодирование - для удобства восприятия выполняется кодирование русского текста, способы поддержки русского текста необхо­димо выяснить в справке используемого читателем компилятора).
#include 
#include 
#include 
using namespace std;
void getWord(char *s1,char *s2,int n){
int i=0,j=0;
int s=1;
while( s < n){
 if(s1[i]==' '){
 s++;}
 i++;
}
for(;(s1[i]!='\0')&&(s1[i]!=' ')&&(s1[i]!=',')
&&(s1[i]!='.')&&(s1[i]!='!')&&(s1[i]!='?');i++,j++)
 s2[j]=s1[i];
s2[j]='\0';
}
//Подсчет слов в строке s:
int countWords(char *s){
int i,res=1;
for(i=0;s[i];i++) if(s[i]==' ') res++;
return res;
}
//Позиция слова s2 в строке s1:
int findWord(char *s1,char *s2){
int i,n;
char s[30];
n=countWords(s1);
for(i=1; i <= n; i++){
 getWord(s1,s,i);
 if(strcmp(s2,s)==0) return i;
}
return 0;
}
//Кодирование строки s2 на основе текста s1:
void encoding(char s1[4][100],char *s2,int *p,int n){
int pos;
char s[50];
int i,j;
for(i=1; i < = n/2;i++){
 getWord(s2,s,i);
 for(j=0;j<4;j++){
 pos=findWord(s1[j],s);
 if(pos){
 p[2*i-2]=j+1;
 p[2*i-1]=pos;
 break;
 }
 }
}
}
int main(){
int n,i;
int *p;
char s1[4][100]={"Зачем копить добро в пустыне бытия?",
"Кто вечно жил средь нас? Таких не видел я!",
"Ведь жизнь нам в долг дана, и то на срок не долгий,",
"А то, что в долг дано- не собственность твоя!"};
char s2[50]="Кто видел жизнь и жил в пустыне?";
n=2*countWords(s2);
p=new int[n];
encoding(s1,s2,p,n);
for(i=0; i < n; i++)
 cout << p[i] << " ";
cout << endl;
delete [] p;
return 0;
}
Онлайн всего: 1
Гостей: 1
Пользователей: 0

STUDLAB Сообщить про опечатку на сайте