Знайти найдовше спільне слово двох заданих пропозицій

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Мета роботи: Навчитися працювати з рядками за допомогою покажчиків.
Завдання:
Знайти найдовше спільне слово двох заданих пропозицій.
Вимоги до програми:
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, in);
n: = i + 1; J: = 0; K: = 0;
виконувати
до (Length (str1) <= I)
J: = K;
поки ((Str2 [i] <> "") і (J <length (str2)))
st2: = copy (str2, K, JK);
K: = J + 1;
якщо (St1 = st2) то
якщо (Length (p) <length (st1)) то
p: = st1;

K: = 0;
до ((Length (str2) <= J) або (k = 0))
I: = I + 1;
J: = J +1;
P
Блок-схема: документ: 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 ERROR \ n У файлі не мається двох пропозицій! \ n Введіть інше ім'я файлу:");
fprintf (f, "\ t \ t ERROR \ 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'

Висновки: в ході даної лабораторної роботи я вивчив елементарну роботу з рядками, створення і відкриття файлів, а також безпосереднє використання покажчиків для знаходження потрібної інформації в пам'ять.
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Лабораторна робота
18.4кб. | скачати


Схожі роботи:
Питання синтаксичного аналізу і пунктуаційних оформлення пропозицій включають слово щоб і
Слово о полку Ігоревім - золоте слово російської літератури
Знайти звук
Слово про жінку слово про матір За творами Фадєєва Айтматова
Знайти Бога і самого себе
Фінансові пастки як їх знайти і знешкодити
Твори на вільну тему - Допоможіть знайти
Аналіз і розрахунок характеру сполучень заданих поверхонь
Про чудесних ліках яких не знайти в аптеці
© Усі права захищені
написати до нас