Подсчитать число вхождений строки t в строке u

Удалить все вхождения подстроки t в строке u

В строке u заменить все вхождения подстроки t на подстроку s

 

//arb2009_string_substring_fun3

#include<iostream.h>

#include<string.h>

//#include<stdio.h>

// get() <stdio.h>

const int n=100;

////////////////////////////////////////////////////////////

void strcpy1(char s[n], char t[n])

{

int i=0;

while((s[i]=t[i])!='\0')i++;

}

/////////////////////////////////////////////

// string s is substring of p;

bool strstr1(char s[n],char p[n])

{

int i,j;

bool t=false;

for (i=0;i<strlen(p)-strlen(s)+1 &&!t;i++)

{

bool r=true;

for (j=0;j<strlen(s)&&r;j++)

if (s[j]!=p[i+j]) r=false;

t=r;

}

return t;

}

 

/////////////////////////////////////////

// position substring s in string p;

int strstr2(char s[n],char p[n])

{

int i,j;

int pos=-1;

bool t=false;

for (i=0;i<strlen(p)-strlen(s)+1&&!t;i++)

{

bool r=true;

for (j=0;j<strlen(s)&&r;j++)

if (s[j]!=p[i+j]) r=false;

t=r;

}

 

if (t) pos=i-1;else pos=-1;

return pos;

}

////////////////////////////////////////////////////

void conc(char x[n], char y[n])

{

 

int i,j;

int p=strlen(x);

int q=strlen(y);

i=p;

j=0;

while ((x[i]=y[j])!='\0'){j++;i++;}

}

 

 

////////////////////////////////////////////////////

void delette(char x[n],int pos,int len )

{

int i,j;

if (pos>strlen(x)-len)

{

cout<<"impossible!"<<endl;

return;

}

 

j=pos; i=pos+len;

while ((x[j]=x[i])!='\0')

{

i++;j++;

}

}

////////////////////////////////////////////////////////////////

// insert string y[n] to string x[n]

// with position pos in x[n]

void insert(char y[n],int pos, char x[n])

{

if (pos==strlen(x))

{

conc(x,y); return;

}

if ((pos>strlen(x))||(pos<0))

{

cout<<" impossible!! ";

return;

}

char z[n],m[n];

int i,j;

i=0;

j=pos;

 

while ((z[i]=x[j])!='\0')

{

i++;j++;

}

strcpy1(m,y);

conc(m,z);

 

i=pos;

j=0;

 

while ((x[i]=m[j])!='\0')

{

i++;j++;

}

}

 

 

///////////////////////////////////////////////

void main()

{

char t[n];

int pos;

char u[n],s[n];

int p;

 

/////////////////////////////////////////

 

cout<<"Task 1"<<endl;

cout<<" calculate number of substr t in str u"<<endl;

cout<<" Enter string u= "<<endl;

cin.getline(u,n);

 

cout<<" Enter substring t t= "<<endl;

cin.getline(t,n);

 

p=0;

while (strstr2(t,u)!=-1)

{

u[strstr2(t,u)]='#';

p++;

}

 

cout<<"u = "<<u<<endl;

 

cout<<"number of input substring t in string u p= "<<p<<endl;

cin.get();

cout<<"reconstruction u"<<endl;

 

int i=0;

while (i<strlen(u))

{

if (u[i]== '#') u[i]=t[0];

i++;

}

cout<<"u = "<<u<<endl;

cin.get();

//////////////////////////////////////////////

cout<<"Task 2"<<endl;

cout<<"delete substring t in string u"<<endl;

 

while (strstr2(t,u)!=-1)

{

delette(u,strstr2(t,u),strlen(t));

}

 

cout<<"new u = "<<u<<endl;

cin.get();

///////////////////////////////////////////////

cout<<"Task3"<<endl;

cout<<"in string u change substring t on substring s"<<endl;

cout<<" Enter string u= "<<endl;

cin.getline(u,n);

 

cout<<" Enter string t= "<<endl;

cin.getline(t,n);

 

cout<<" Enter string s= "<<endl;

cin.getline(s,n);

 

 

if (strstr2(t,u)==-1)

{

cout<<" string t is not substring of string u:

error!!"<<endl;

return ;

}

 

while (strstr2(t,u)!=-1)

{

p=strstr2(t,u);

cout<<"p= "<<p<<endl;

delette(u,p,strlen(t));

cout<<" after delete new string u = "<<u<<endl;

cout<<"length u= "<<strlen(u)<<endl;

cin.get();

 

insert(s,p,u);

cout<<"after insert new u = "<<u<<endl;

cout<<"len u= "<<strlen(u)<<endl;

 

cin.get();

}

cout<<"new u = "<<u<<endl;

cin.get();

 

}

 

Лекция №12

Файловый ввод-вывод

 

Потоки С++

 

Принципиальным для понимания С++-системы ввода-вывода является то что она опирается на понятие потока. Поток (stream)

- это абстракция , которая либо синтезирует информацию, либо потребляет ее и связывается с любым физическим устройством с помощью С++ - системы ввода-вывода. Характер поведения всех потоков одинаков, несмотря на различные физические устройства, с которыми они связываются.Поскольку потоки действуют одинаково, то практически ко всем видам устройствможно применить одни и теже функции и операторы ввода-вывода. Например , методы используемые для записи данных на экран , также можно использовать для вывода на принтер или для записи в дисковый файл.

В самой общей форме поток можно назвать логическим интерфейсом с файлом. С++ -определение термина «файл» можно отнести к дисковому файлу, экрану, клавиатуре, порту, файлу на магнитной ленте и пр. Хотя файлы отличаются по форме и возможностям , все потоки одинаковы.

Поток связывается с файлом при выполнении операции открытия файла и отсоединяется от него с помощбю операции закрытия.

 

Существуют два вида потоков текстовый и двоичный. Текстовый поток используется для ввода-вывода символов. При этом может происходить некоторые преобразования символов. Например, при выводе символ новой строки может быть преобразован в последовательность символов: возврата каретки и перехола на новую строку. Поэтому может не быть взаимно- однозначного соответствия между тем , что посылается в поток и тем что в действительности записывается в файл.

Двоичный поток можно использовать с данными любого типа , причем в этом случае никакого преобразования символов не выполняется.

Говоря о потоках , необходимо понимать , что , что вкладывается в понятие «текущая позиция». Текущая позиция- это место в файле , с которого будет выполняться следующая операция доступа к файлу. Например, если длна файла равна 100 байт, и известно, что уже прочитана половина этого файла, то слежующая операция чтения произойдет на байте 50 , который в данном случае и является текущей позицией.

Встроенные С++-потоки

В С++ содержится ряд встроенных потоков (cin, cout, cerr, clog), которые автоматически открываются , как только программа начинает выполняться. cin – стандартный входной , а cout – стандартный выходной поток. Потоки cerr и clog предназначены для вывода информации об ошибках. По умолчанию стандартные С++- потоки связываются с консолью..