вторник, 8 декабря 2015 г.

Задача о поиске шаблона

Итак, окончательная версия программы. Отладочная печать оставлена, чтобы можно было проследить, как это работает. Поправка, которую необходимо было сделать, чтобы программа работала корректно: в функции поиска оператор     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;
}

Отладка программы по шагам:




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;
        
Запустить и проверить оба шаблона.               

Комментариев нет:

Отправить комментарий