Найти самое длинное общее слово двух заданных предложений.

Цель работы: Научиться работать со строками с помощью указателей.

Задание:

Найти самое длинное общее слово двух заданных предложений.

Требования к программе:

1. Ввод и вывод как с терминала (stdio), так и из/в файл (< и >).

2. Работа со строками только через указатели.

Выполнение работы

Описание входных, выходных и промежуточных данных.

Входные данные:

str1,str2 : символьный // срока 1 и строка 2

Выходные данные:

p : символьный // хранит в семе максимальное слово

Промежуточные данные:

st1, st2 : символьный // массив скалярных произведений

i,n,j,k : целый // границы слова в первой и во второй строке

ввод

str1,str2

I:=0; N :=0; p := “ ”;

выполнять

если (length(p) <> 0) то

вывод

иначе

вывод


Алгоритм.

I:= N;

пока ((str1[i] <> “ ”) и (I < length(str1)))

st1 := copy(str1,n,i-n);

n := i + 1; J:=0; K :=0;

выполнять

до (length(str1) <= I)

J:= K;

пока ((str2[i] <> “ ”) и (J < length(str2)))

st2 := copy(str2,K,J-K);

K := J + 1;

если (st1 = st2) то

если (length(p) < length(st1)) то

p := st1;

K := 0;

до ((length(str2) <= J) или (k = 0))

I := I + 1;

J := J+1;


Листинг программы

#include <conio.h>

#include <string.h>

#include <stdlib.h>

#include <math.h>

#include <stdio.h>

/*титульный лист*/

void tit_list()

{

clrscr();

gotoxy(20,1);

printf("Министерство образования и науки Украины");

gotoxy(12,2);

printf("Донецкий государственный институт искусственного интеллекта");

gotoxy(31,8);

printf("Лабораторная работа №3 ");

gotoxy(35,9);

printf("по дисциплине:");

gotoxy(17,10);

printf("'Основы программирования и алгоритмические языки'");

gotoxy(50,15);

printf("Выполнил:");

gotoxy(50,16);

gotoxy(50,17);

gotoxy(50,19);

printf("Проверил: ");

gotoxy(50,20);

gotoxy(50,21);

getch();

return;

}

int cha (char char1){

if( ((char1 < -16)&&(char1 >-33)) || ((char1 < -80)&&(char1 > -129)) || ((char1 > 96)&&(char1 < 123)) || ((char1 > 64)&&(char1 < 91))){ return 1;}

else { return 0; }

}

int sravn_char (char c1,char c2){

if (abs(c1) > abs(c2)){

switch (abs(c1 - c2)){

case 32: if ( ( (c1 > -129)&&(c1 < -112) )||( (c1 > 96)&&(c1 < 123) ) ){

return 0;}

else {return -2;} break;

case 80: if ((c1 > -113)&&(c1 < -96)){

return 0;}

else {return -3;} break;

default: ;return -1;break;

}

}

else{

switch (abs(c2 - c1)){

case 0: return 0;break;

case 32: if ( ( (c2 > -129)&&(c2 < -112) )||( (c2 > 96)&&(c2 < 123) ) ){

return 0;}

else {return -2;} break;

case 80: if ((c2 > -113)&&(c2 < -96)){

return 0;}

else {return -3;} break;

default: return -1; break;

}

}

}

int main(void)

{

tit_list();

clrscr();

char *input,*name;

char *p,*bf,*buf,*str1,*str2;

int b=0,k,lev1,lev2,l1,l2,prv1,prv2;

int l,bb,v,n;

//************* ВВОД ДАННЫХ *****************************************

FILE *f = fopen("Отчет.zen","w+");

c:

clrscr();

printf("[1] Ввод с клавиатуры\n");

printf("[2] Ввод с файла\n");

printf("[0] Выход\n");

switch (getch()){

case 49:

//************* ввод с клавиатуры ***********************

clrscr();

char fstr1[10000],fstr2[10000];

printf("\t\t\t Введите первую строку: \n");

gets(fstr1);

printf("\t\t\t Введите вторую строку: \n");

gets(fstr2);

//***************************************************************

fprintf(f,"Данные вводяться с клавиатуры \n");

printf("\n********************************************\n");

fprintf(f,"\n********************************************\n");

printf("\n Первая строка:\n");

fprintf(f,"\n Первая строка:\n");

printf("%s \n\n",fstr1);

fprintf(f,"%s \n\n",fstr1);

printf(" Вторая строка:\n");

fprintf(f," Вторая строка:\n");

printf("%s \n",fstr2);

fprintf(f,"%s \n",fstr2);

printf("\n********************************************\n");

fprintf(f,"\n********************************************\n");

//************************************************************

p[0] = '\0';

//************************************************************

b = strlen(fstr1);

buf = strdup(fstr1);

buf += b;

//************************************************************

for (k=0;k<=b;k++){

buf--;

if ((*buf == ' ')||(k == b)){

buf++;

while ((cha(buf[strlen(buf)-1]) == 0)&&(strlen(buf) != 0)){

buf[strlen(buf)-1] = '\0';

}

//**************************

v = strlen(fstr2);

bf = strdup(fstr2);

bf += v;

for (n=0;n<=v;n++){

bf--;

if ((*bf == ' ')||(n == v)){

bf++;

while ((cha(bf[strlen(bf)-1]) == 0)&&(strlen(bf) != 0)){

bf[strlen(bf)-1] = '\0';

}

//************************************************************

if (strlen(buf) == strlen(bf)){

//********************* проверка отдельно каждого символа

l=-1;

do { l++;

bb = sravn_char (buf[l],bf[l]);

}while((bb == 0)&&(l < strlen(buf)-1));

//************************************************************

if ((bb == 0)&&( strlen(buf) == strlen(p))){

printf("Общее найбольшое слово :'%s'\n",buf);

fprintf(f,"Общее найбольшое слово :'%s'\n",buf);

}

if ((bb == 0)&&( strlen(buf) > strlen(p))){

p = strdup(buf);

}

}

//************************************************************

bf--;

*bf = '\0';

}

}

buf--;

*buf = '\0';

}

}

if (strlen(p) != 0){

printf("Общее найбольшое слово :'%s'\n",p);

fprintf(f,"Общее найбольшое слово :'%s'\n",p);

}

else{

printf("Общих слов в предложений нету\n");

fprintf(f,"Общих слов в предложений нету\n");

}

getch();

break;

//******************** Ввод с файла

case 50:

FILE *ff;

clrscr();

printf("Введите имя файла:");

do{

k=0;

lev1 = 0;

b=0;

scanf("%s",name);

printf("name = {%s}\n",name);getch();

fprintf(f,"Данные читаем из файла: %s\n",name);

if ((ff = fopen(name,"rt")) == NULL){printf("Cannot open output file.\n");}

clrscr();

b=1;

do{

if (b == 3){b = 2; lev2 = prv1+1;}

input[0] = '\0';

fscanf(ff,"%s",input);

if (strlen(input) == 0){ b = 0;}

//************** Первая строка ****************************

if ((b == -1)||(b == 1)){

if (b == 1){ str1 = strdup(input);b = -1;}

else {strcat(str1," ");strcat(str1,input);}

if (input[strlen(input)-1] == '.'){b = 3;prv1 = ftell(ff);}

}

//*************** Вторая строка ***************************

if ((b == 2)||(b == -2)){

if (b == 2){ str2 = strdup(input);b = -2;}

else {strcat(str2," ");strcat(str2,input);}

if (input[strlen(input)-1] == '.'){b = -3;prv2 = ftell(ff);}

}

//*********************************************************

}while((b != -3)&&(b != 0));

if (b == 0){

clrscr();

printf("\t\t E R R O R \n В файле не имееться двух предложений!!!\n Введите другое имя файла: ");

fprintf(f,"\t\t E R R O R \n В файле не имееться двух предложений!!!\n Введите другое имя файла.\n ");

fclose(ff);

}

}while(b == 0);

//************************ Исходные данные

fseek(ff, 0, SEEK_SET);

clrscr();

printf("********************************************\n");

fprintf(f,"\n********************************************\n");

printf("\n Первая строка:\n");

fprintf(f,"\n Первая строка:\n");

b=0; l1 = lev1;

do{

fseek(ff, l1, SEEK_SET);

fscanf(ff,"%s",input);

printf("%s ",input);

fprintf(f,"%s ",input);

l1= ftell(ff);

}while(l1 < prv1);

printf("\n\n");

fprintf(f,"\n\n");

printf(" Вторая строка:\n");

fprintf(f," Вторая строка:\n");

l2 = lev2;

do{

fseek(ff, l2, SEEK_SET);

fscanf(ff,"%s",input);

printf("%s ",input);

fprintf(f,"%s ",input);

l2= ftell(ff);

}while(l2 < prv2);

printf("\n\n");

fprintf(f,"\n\n");

getch();

//************************ алгоритм сравнения слов

fseek(ff, 0, SEEK_SET);

l1 = lev1;

//****************************************

b = 0;

p[0] = '\0';

//****************************************

k=0;

printf("********************************************\n");

fprintf(f,"********************************************\n");

do{

fseek(ff, l1, SEEK_SET);

fscanf(ff,"%s",buf);

l1 = ftell(ff);

l2 = lev2;

while ((cha(buf[strlen(buf)-1]) == 0)&&(strlen(buf) != 0)){

buf[strlen(buf)-1] = '\0';

}

do{

fseek(ff, l2, SEEK_SET);

fscanf(ff,"%s",bf);

l2= ftell(ff);

while ((cha(bf[strlen(bf)-1]) == 0)&&(strlen(bf) != 0)){

bf[strlen(bf)-1] = '\0';

}

if (strlen(buf) == strlen(bf)){

//********************* проверка отдельно каждого символа

l=-1;

do{ l++;

b=-1;

b = sravn_char(buf[l],bf[l]);

}while((b == 0)&&(l < strlen(buf)-1));

//************************ вывод результата прверки

if ((b == 0)&&( strlen(buf) == strlen(p))){

printf("Общее найбольшое слово :'%s'\n",buf);

fprintf(f,"Общее найбольшое слово :'%s'\n",buf);

}

if ((b == 0)&&( strlen(buf) > strlen(p))){

p = strdup(buf);

}

}

}while(l2 < prv2);

}while(l1 < prv1);

if (strlen(p) != 0){

printf("Общее найбольшое слово :'%s'\n",p);

fprintf(f,"Общее найбольшое слово :'%s'\n",p);

}

else{

printf("Общих слов в предложениях нет\n");

fprintf(f,"Общих слов в предложениях нет\n");

}

fclose(f);

getch();

break;

//************************************************************

case 48: clrscr(); exit(1);

default: goto c;

}

//*********************** КОНЕЦ ************************

return 0;

}

Тестовые примеры.

TEST № 1

Данные берем из файла: q.txt

********************************************

Первая строка

I have many green apples

Вторая строка:

I have many green bananas

********************************************

Общее наибольшее слово :' green'

TEST № 2:

Данные вводятся с клавиатуры.

********************************************

Первая строка:

I learn in the Institute of Artificial Intelligence

Вторая строка:

My friend didn’t learn in the Institute of Artificial Intelligence

********************************************

Общее наибольшее слово:' Intelligence’

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

1