Найти самое длинное общее слово двух заданных предложений
СОДЕРЖАНИЕ: Цель работы: Научиться работать со строками с помощью указателей. Задание: Найти самое длинное общее слово двух заданных предложений. Требования к программе:Цель работы: Научиться работать со строками с помощью указателей.
Задание:
Найти самое длинное общее слово двух заданных предложений.
Требования к программе:
1. Ввод и вывод как с терминала (stdio), так и из/в файл ( и ).
2. Работа со строками только через указатели.
Выполнение работы
Описание входных, выходных и промежуточных данных.
Входные данные:
str1,str2 : символьный // срока 1 и строка 2
Выходные данные:
p : символьный // хранит в семе максимальное слово
Промежуточные данные:
st1, st2 : символьный // массив скалярных произведений
i,n,j,k : целый // границы слова в первой и во второй строке
|
Алгоритм.
Листинг программы
#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’
Выводы: в ходе данной лабораторной работы я изучил элементарную работу со строками, создание и открытие файлов, а также непосредственное использование указателей для нахождения нужной информации в память.