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

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



Задание:

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



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

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

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

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

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

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

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

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

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

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

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

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








 

	ввод

					str1,str2



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

 	выполнять

 











 

 	





















 

			











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

	 вывод

			 





иначе

	 вывод



Алгоритм.



Общих слов нет

 P

	J := J+1;

		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;

		I:= N;

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





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

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

	выполнять





























до (length(str1) <= I) 
Листинг программы

#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