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("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("Общее найбольшое слово :%sn",buf);
fprintf(f,"Общее найбольшое слово :%sn",buf);
}
if ((bb == 0)&&( strlen(buf) > strlen(p))){
p = strdup(buf);
}
}
//************************************************************
bf--;
*bf = ;
}
}
buf--;
*buf = ;
}
}
if (strlen(p) != 0){
printf("Общее найбольшое слово :%sn",p);
fprintf(f,"Общее найбольшое слово :%sn",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("Общее найбольшое слово :%sn",buf);
fprintf(f,"Общее найбольшое слово :%sn",buf);
}
if ((b == 0)&&( strlen(buf) > strlen(p))){
p = strdup(buf);
}
}
}while(l2 < prv2);
}while(l1 < prv1);
if (strlen(p) != 0){
printf("Общее найбольшое слово :%sn",p);
fprintf(f,"Общее найбольшое слово :%sn",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 didnt learn in the Institute of Artificial Intelligence
********************************************
Общее наибольшее слово: Intelligence
Выводы: в ходе данной лабораторной работы я изучил элементарную работу со строками, создание и открытие файлов, а также непосредственное использование указателей для нахождения нужной информации в память.
|