Практика программирования (Бейсик, Си, Паскаль)



Задачи, советы и ответы - часть 21


Совет 1 (общий)

Идея поиска довольно проста. Обозначим через h шаг по индексу в строке S1, с которым выбираются символы, сравниваемые с символами S2. Для нулевой разрядки h=l, для выборки через символ h=2 и т. д. Очевидно, что начинать

сравнение надо с символа S1[I], совпадающего с первым символом S2. Однако реализация этой идеи может быть разной. Например, из строки si можно извлечь с заданной разрядкой нужное число символов и результат сравнить с S2. Более эффективно совместить эти две операции и сравнивать извлекаемый из S1 символ с очередным символом S2, прекращая выборку при первом несовпадении. Указанный подход был реализован победителем областной студенческой олимпиады В. Мартьяновым (апрель 2000 г.), на базе программы которого и построены приведенные ниже примеры. Наиболее оригинальной, на наш взгляд, является проверка условия (h=l) или (L2>1). Здесь L2—длина второй строки.

Программа 3_13.bas

RЕМ Поиск вхождения S2 в S1 с разрядкой

CLS

INPUT "Введите S1: ", Sl$: L1=LEN(S1$)

INPUT "Введите S2: ", 32$: L2=LEN(S2$)

FOR H=l TO L1

IF (H=l) OR (L2>1) THEN

FOR I=1 TO Ll-(L2-l)*H

IF MID$(S1$,I,1)=MID$(S2$,l,l) THEN

FOR J=2 TO L2,

IF MID$(S1$,I+(J-1)*H,1)<>MID$(32$,J,1) THEN GOTO ml

NEXT J

PRINT "Шаг: ";Н-1,"Позиции: ";I;

FOR К = 1 TO L2 - 1: PRINT "-"; I + К * H; : NEXT K: PRINT

К = 1 ml:

END IF

NEXT I

END IF

NEXT H

IF К = 0 THEN PRINT "Строка S2 не входит в S1"

END

Программа 3_13.с

/* Поиск вхождения S2 в S1 с разрядкой */

#include <stdio.h>

#include <conio.h>

#include <string.h> main{)

{

char s1 [80],s2[80];

int i,j,k=0,h,Ll,L2;

clrscr();

printf("Введите S1: ");

scanf("%s",s1);

Ll=strlen(s1);

printf("Введите S2: ");

scanf("%s",s2);

L2=strlen(s2);

for(h=l; h<=Ll; h++)

{

if(h==l || L2>1

}

{

for(i=0; i<Ll-(L2-l)*h; i++)

{

if (sl[i]=s2[0])

{

for(j=l; j<L2; j++)




Содержание  Назад  Вперед