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

9418
знаков
1
таблица
2
изображения

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

Задание:

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

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

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
Листинг программы

#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’


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


Информация о работе «Найти самое длинное общее слово двух заданных предложений.»
Раздел: Информатика, программирование
Количество знаков с пробелами: 9418
Количество таблиц: 1
Количество изображений: 2

Похожие работы

Скачать
24440
2
0

... , а придаточное (3) называется придаточным II степени. Такое же определение последовательного подчинения дают пособия для подготовки к ЕГЭ: «подчинение, при котором придаточные предложения располагаются цепочкой: придаточное первой степени зависит от главной части сложноподчиненного предложения; придаточное второй степени зависит от придаточного первой степени; придаточное третьей степени – от ...

Скачать
43141
1
6

... надежности, как и валидности, предъявляют определен­ные требования. Надежность и валидность можно оценить с помощью таб­лицы 1.1.[1] 2. РАЗРАБОТКА ПАКЕТА ТЕСТОВЫХ ЗАДАНИЙ ДЛЯ ОПЕРАТИВНОГО КОНТРОЛЯ УРОВНЯ ЗНАНИЙ СТУДЕНТОВ ПО КУРСУ «МЕХАНИКА» Одним из эффективных инструментов при проведении педагогического эксперимента является компьютерная технология оценки качества знаний, умений и навыков. ...

Скачать
795696
13
12

... за собой её гибель, либо требующие подключения к процессу самоуправления суперсистемы иерархически высшего управления. Так соборный интеллект видится индивидуальному интеллекту с точки зрения достаточно общей теории управления; возможно, что кому-то всё это, высказанное о соборных интеллектах, представляется бредом, но обратитесь тогда к любому специалисту по вычислительной технике: примитивная ...

Скачать
131352
5
6

... , лежащими в основе процесса письма, а также с учетом индивидуально-психологических особенностей детей с ОНР по степени риска возникновения дисграфий. Глава 4. Логопедическая работа по профилактике дисграфии у дошкольников с общим недоразвитием речи 4.1 Принципы логопедического воздействия При разработке и проведении профилактической работы с детьми, имеющими ОНР, за основу были положены ...

0 комментариев


Наверх