Цель работы: Научитьсяработать со строками с помощью указателей.
Задание:
Найти самое длинное общееслово двух заданных предложений.
Требования к программе:
1. Ввод и вывод как стерминала (stdio), так и из/в файл ().
2. Работа со строкамитолько через указатели.
Выполнение работы
Описание входных,выходных и промежуточных данных.
Входные данные:
str1,str2: символьный //срока 1 и строка 2
Выходные данные:
p :символьный // хранит в семе максимальное слово
Промежуточные данные:
st1, st2 :символьный // массив скалярных произведений
i,n,j,k : целый // границы слова в первой и во второй строке
ввод
str1,str2
I:=0; N :=0; p := “ ”;
выполнять
если (length(p) 0) то
вывод
иначе
вывод
Алгоритм./> /> /> /> /> /> /> /> /> /> /> /> /> /> /> />
Листинг программы
#include
#include
#include
#include
#include
/*титульный лист*/
voidtit_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 (charchar1){
if( ((char1-33)) || ((char1 -129)) || ((char1 > 96)&&(char1 64)&&(char1
else { return0; }
}
int sravn_char(char c1,char c2){
if (abs(c1)> abs(c2)){
switch(abs(c1 — c2)){
case32: if ( ( (c1 > -129)&&(c1 96)&&(c1
return0;}
else{return -2;} break;
case80: if ((c1 > -113)&&(c1
return0;}
else{return -3;} break;
default:;return -1;break;
}
}
else{
switch(abs(c2 — c1)){
case0: return 0;break;
case32: if ( ( (c2 > -129)&&(c2 96)&&(c2
return0;}
else{return -2;} break;
case80: if ((c2 > -113)&&(c2
return0;}
else{return -3;} break;
default:return -1; break;
}
}
}
int main(void)
{
tit_list();
clrscr();
char*input,*name;
char*p,*bf,*buf,*str1,*str2;
intb=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();
charfstr1[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
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
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
//************************************************************
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 RO R \n В файле не имееться двух предложений!!!\n Введите другое имя файла:”);
fprintf(f,”\t\t E RR 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
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
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
//************************вывод результата прверки
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
}while(l1
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: gotoc;
}
//***********************КОНЕЦ ************************
return 0;
}
Тестовые примеры.
TEST № 1
Данные берем из файла:q.txt
********************************************
Первая строка
I have manygreen apples
Вторая строка:
I have manygreen bananas
********************************************
Общее наибольшее слово :’green’
TEST № 2:
Данные вводятся склавиатуры.
********************************************
Первая строка:
I learn in the Institute of Artificial Intelligence
Вторая строка:
My frienddidn’t learn in the Institute of Artificial Intelligence
********************************************
Общее наибольшее слово:’Intelligence’
Выводы: в ходе даннойлабораторной работы я изучил элементарную работу со строками, создание иоткрытие файлов, а также непосредственное использование указателей длянахождения нужной информации в память.