Реферат: Найти самое длинное общее слово двух заданных предложений - Refy.ru - Сайт рефератов, докладов, сочинений, дипломных и курсовых работ

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

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

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


Задание:

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


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

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("ttt Введите первую строку: n");

gets(fstr1);

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

gets(fstr2);

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

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

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

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

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

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

printf("%s nn",fstr1);

fprintf(f,"%s nn",fstr1);

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

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

printf("%s n",fstr2);

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

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

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

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

p[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] = '';

}

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

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] = '';

}

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

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 = '';

}

}

buf--;

*buf = '';

}

}

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,"Данные читаем из файла: %sn",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] = '';

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("tt E R R O R n В файле не имееться двух предложений!!!n Введите другое имя файла: ");

fprintf(f,"tt 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("nn");

fprintf(f,"nn");

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("nn");

fprintf(f,"nn");

getch();

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

fseek(ff, 0, SEEK_SET);

l1 = lev1;

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

b = 0;

p[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] = '';

}

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] = '';

}

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’

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

14