Найти самое длинное общее слово двух заданных предложений.
Цель работы: Научиться работать со строками с помощью указателей.
Задание:
Найти самое длинное общее слово двух заданных предложений.
Требования к программе:
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