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