Итак, окончательная версия программы. Отладочная печать оставлена, чтобы можно было проследить, как это работает. Поправка, которую необходимо было сделать, чтобы программа работала корректно: в функции поиска оператор p2=psh; нужно поставить перед оператором
if(*p1==*p2){cout<<*p1<<" "<<n1<<endl; (т.к. мы портили указатель p2 и дальнейшее сравнение было некорректным). Под этой версией расписаны отдельные шаги, которые могут повторить те, у кого что-то не получилось (правда, имена переменных несколько другие - это шпаргалка, в которую я не подглядывала).
Окончательная версия программы
Заголовочный файл head.h
#include <iostream>
#include <string.h>
using namespace std;
int vvsh(char sh[]);
int poisk(char* pstr,char* psh,int nsh);
main.cpp
#include "head.h"
void main(){
char str[]="moja mama varit mamalygu na balkone";
char shablon[10];
int nsh=vvsh(shablon);
cout << "dlina= "<< nsh << endl;
puts(shablon);
char* pstr=str;
char* psh=shablon;
int nn=poisk(pstr,psh,nsh);
cout << "mesto shablona= "<< nn << endl;
cout << "biblio function= "<<strstr(str,shablon)-str<< endl;
}
/*
Написать программу с функцией поиска первого вхождения шаблона в текст. В качестве
первого параметра функция принимает указатель на строку, в которой нужно искать шаблон. В
качестве второго параметра указатель на строку-шаблон, которую нужно найти. Функция
возвращает позицию первого вхождения строки-шаблона, если он присутствует в строке
(помните, что в C++ принято считать с 0), и -1, если шаблона в тексте нет. В основной
программе инициализировать строку при описании, строку-шаблон вводить с клавиатуры.
Проверить правильность работы написанной функции с помощью функции strstr(s1,s2) из
библиотеки <string.h>
Контрольный пример:
Строка "moja mama varit mamalygu na balkone"
Шаблоны: "mama" , "mamalygu"
*/
vvod.cpp
#include "head.h"
int vvsh(char sh[])
{
cout<<"vvedite shablon ";
gets(sh);
return strlen(sh);
}
poisk.cpp
#include "head.h"
int poisk(char* pstr,char* psh,int nsh)
{
char* p1=pstr; char* p11;
char* p2=psh;
int n1=0,nn=-1,n2;
if(*p2==0) return n1;
while(*p1!=0)
{
p2=psh;
if(*p1==*p2){cout<<*p1<<" "<<n1<<endl;
p11=p1; n2=0;
while(n2<nsh && *p11==*p2){p11++; p2++; n2++; cout<<*p11<<" "<<*p2<<" | ";} cout<<endl;
if(*p2==0) return n1;
}
p1++;
n1++;
}
return nn;
}
Отладка программы по шагам:
Запустить и проверить оба шаблона.
if(*p1==*p2){cout<<*p1<<" "<<n1<<endl; (т.к. мы портили указатель p2 и дальнейшее сравнение было некорректным). Под этой версией расписаны отдельные шаги, которые могут повторить те, у кого что-то не получилось (правда, имена переменных несколько другие - это шпаргалка, в которую я не подглядывала).
Окончательная версия программы
Заголовочный файл head.h
#include <iostream>
#include <string.h>
using namespace std;
int vvsh(char sh[]);
int poisk(char* pstr,char* psh,int nsh);
main.cpp
#include "head.h"
void main(){
char str[]="moja mama varit mamalygu na balkone";
char shablon[10];
int nsh=vvsh(shablon);
cout << "dlina= "<< nsh << endl;
puts(shablon);
char* pstr=str;
char* psh=shablon;
int nn=poisk(pstr,psh,nsh);
cout << "mesto shablona= "<< nn << endl;
cout << "biblio function= "<<strstr(str,shablon)-str<< endl;
}
/*
Написать программу с функцией поиска первого вхождения шаблона в текст. В качестве
первого параметра функция принимает указатель на строку, в которой нужно искать шаблон. В
качестве второго параметра указатель на строку-шаблон, которую нужно найти. Функция
возвращает позицию первого вхождения строки-шаблона, если он присутствует в строке
(помните, что в C++ принято считать с 0), и -1, если шаблона в тексте нет. В основной
программе инициализировать строку при описании, строку-шаблон вводить с клавиатуры.
Проверить правильность работы написанной функции с помощью функции strstr(s1,s2) из
библиотеки <string.h>
Контрольный пример:
Строка "moja mama varit mamalygu na balkone"
Шаблоны: "mama" , "mamalygu"
*/
vvod.cpp
#include "head.h"
int vvsh(char sh[])
{
cout<<"vvedite shablon ";
gets(sh);
return strlen(sh);
}
poisk.cpp
#include "head.h"
int poisk(char* pstr,char* psh,int nsh)
{
char* p1=pstr; char* p11;
char* p2=psh;
int n1=0,nn=-1,n2;
if(*p2==0) return n1;
while(*p1!=0)
{
p2=psh;
if(*p1==*p2){cout<<*p1<<" "<<n1<<endl;
p11=p1; n2=0;
while(n2<nsh && *p11==*p2){p11++; p2++; n2++; cout<<*p11<<" "<<*p2<<" | ";} cout<<endl;
if(*p2==0) return n1;
}
p1++;
n1++;
}
return nn;
}
Отладка программы по шагам:
1.Организовать проект, функцию main
Вписать
void main()
{
char str[]="moja
mama varit mamalygu na balkone";
}
Запустить
2. Добавить хэдер "head.h"
a) включить в проект
head.h
#include <iostream>
#include <conio.h>
#include <string.h>
using namespace
std;
б) включить в main()
#include
"head.h"
И
puts(str);
Запустить
3. Добавляем функцию vvod
a) вызов
int nsh=vvod(shablon);
cout<<"n="<<nsh<<" ";
puts(shablon);
б) в
хэдер
int vvod(char
sh[]);
в) присоединяем файл с функцией
#include "head.h"
int vvod(char sh[])
{
cout<<"Vvedite shablon ";
gets(sh);
return strlen(sh);
}
Запустить
4.Добавляем функцию poisk
А)Вызов в main:
char* pstr;
char* psh;
pstr=str;
psh=shablon;
int nn=poisk(pstr,psh,nsh);
Б)Объявление в head.h
В) Функцию в новый файл
#include
"head.h"
int poisk(char* pstr,char* psh,int nsh)
{
char* p1=pstr; char* p2=psh; //
чтоб не испортить
int n1=0,n2=0,nn=0; // номера букв в строке, шаблоне,возвращаемый номер
while(*p1!=0)
{
if(*p1==*p2) { cout<<"sovpala
"<<n1<<" "<<*p1<<endl;
nn=*p1;}
p1++;
n1++;
}
return nn;
}
Запустить
5.Уточняем поиск после 1-й буквы
#include "head.h"
int poisk(char* pstr,char* psh,int nsh)
{
nn=-1;
…
if(*p1==*p2) { cout<<"sovpala
"<<n1<<" "<<*p1<<endl;
p2_=p2; n2=0; //здесь введен доп. указатель p2_
// чтобы не портить p2, поэтому ранее
// он описан char* p2_;
while(n2<nsh
&& *p1==*p2_) {p2_++;n2++;p1++; }
if(*p2_==0)return n1;
Запустить и проверить оба шаблона.
Комментариев нет:
Отправить комментарий