Скачать презентацию Сравнение двух строк Сравнение двух символьных переменных c Скачать презентацию Сравнение двух строк Сравнение двух символьных переменных c

308a370b0c1f8f79e2087eedfd2a0805.ppt

  • Количество слайдов: 19

Сравнение двух строк Сравнение двух символьных переменных c 1 и c 2: сравниваются их Сравнение двух строк Сравнение двух символьных переменных c 1 и c 2: сравниваются их коды ord(c 1) и ord(c 2). ______________________ Сравнение двух строк символов производится в лексикографическом порядке: 1) вначале сравниваются между собой первые символы обеих строк, затем вторые и т. д. ; 2) сравнение продолжается до первого несовпадения двух сравниваемых символов, большей считается та строка, код очередного символа у которой больше; 3) если первая строка полностью совпадает с началом более длинной второй строки, то первая строка считается меньшей.

Примеры сравнения двух строк ’ABC’ < ’BBC’, ’ABC’ < ’ABD’ ’ABC’ < ’ABCD’, ’ABC’ Примеры сравнения двух строк ’ABC’ < ’BBC’, ’ABC’ < ’ABD’ ’ABC’ < ’ABCD’, ’ABC’ < ’abc’ ’Abc’ < ’abc’ ’ДОМ’ < ’ДЫМ’ ’ДОМ’ < ’Дом’ ’ДОМ’ < ’ДОМИК’

Сравнение двух строк с перекодировкой Таблица перекодировки: const T: array[0. . 255]of byte= ( Сравнение двух строк с перекодировкой Таблица перекодировки: const T: array[0. . 255]of byte= ( 0, 1, 2, . . . , 65, 66, 67, . . . , 90, . . . , 95, 96, 65, 66, 67, . . . ); {’A’ ’B’ ’C’ ’Z’ ’_’ ’‘’ ’a’ ’b’ ’c’ } Сравнение двух символьных переменных c 1 и c 2: сравниваются их преобразованные коды: T[ord(c 1)] и T[ord(c 2)].

Сравнение двух строк с перекодировкой function scomp(var s 1, s 2: string): integer; var Сравнение двух строк с перекодировкой function scomp(var s 1, s 2: string): integer; var i, r, n 1, n 2: integer; begin n 1: =length(s 1); n 2: =length(s 2); r: =0; i: =1; while (i<=n 1)and(i<=n 2)and (T[ord(s 1[i])]=T[ord(s 2[i])]) do i: =i+1; if (i<=n 1)and(i<=n 2) then begin if T[ord(s 1[i])]s 2} else if (i<=n 2) then r: =-1; {s 1

Контекстный поиск в символьном массиве S длиной n по образцу-строке d длиной m Результат: Контекстный поиск в символьном массиве S длиной n по образцу-строке d длиной m Результат: i – начало образца d в S (первое совпадение). m: =length(d); p: =0; i: =1; while (p=0)and(i<=n-m+1) do if (d[1]<>S[i]) then i: =i+1 else begin j: =1; while (j

Контекстный поиск в символьном массиве S длиной n по образцу-строке d длиной m поиск Контекстный поиск в символьном массиве S длиной n по образцу-строке d длиной m поиск всех совпадений m: =length(d); p: =0; i: =1; while i<=n-m+1 do begin if d[1]=S[i] then begin j: =1; while (j

Поиск слов в символьном массиве. Признак распознавания слова: p=0, если слово еще не началось Поиск слов в символьном массиве. Признак распознавания слова: p=0, если слово еще не началось (или были только разделители) p=1, если слово началось p=2, если слово закончилось и распознано Таблица для проверки разделителей: Y[ord(c)]=1, если символ c - буква Y[ord(c)]=0, если символ c - не буква (разделитель)

Поиск слова d в символьном массиве S длиной n. m: =length(d); p: =0; j: Поиск слова d в символьном массиве S длиной n. m: =length(d); p: =0; j: =1; while (p<2)and(j<=n) do begin c: =S[j]; if p=0 then begin if Y[ord(c)]=1 then {начало слова} begin d 1: =c; p: =1; i: =j end else begin if Y[ord(c)]=1 then d 1: =d 1+c {слово продолжается} else if scomp(d, d 1)=0 then p: =2 {слово закончилось и совпало с образцом} else p: =0 {слово закончилось но не совпало с образцом} end; j: =j+1 end; if p=0 then i: =0 else if (p=1)and(scomp(d, d 1)<>0) then i: =0; Трудоемкость: O(n))

Распознавание группы слов в символьном массиве S длиной n p: =0; j: =0; while Распознавание группы слов в символьном массиве S длиной n p: =0; j: =0; while j<=n do begin j: =j+1; if j<=n then c: =S[j] else c: =' '; if p=0 then begin if Y[ord(c)]=1 then begin d 1: =c; p: =1; i: =j end else begin if Y[ord(c)]=1 then d 1: =d 1+c else begin {слово выделено, поиск совпадения} q: =1; p: =0; while q<=k do {D - массив слов длиной k} if scomp(d 1, D[q])=0 then begin writeln(D[q], i); q: =k+1 end else q: =q+1 end end; Трудоемкость: O(n·k))

Распознавание группы слов в символьном массиве S длиной n p: =0; j: =0; while Распознавание группы слов в символьном массиве S длиной n p: =0; j: =0; while j<=n do begin j: =j+1; if j<=n then c: =S[j] else c: =’ ’; if p=0 then begin if Y[ord(c)]=1 then begin d 1: =c; p: =1; i: =j end else begin if Y[ord(c)]=1 then d 1: =d 1+c else begin p: =0; {слово выделено, поиск совпадения} b: =1; e: =k; while b<=e do {D – упорядоченный массив слов длиной k} begin q: =(b+e)div 2; r: =scomp(d 1, D[q]); if r<0 then b: =q+1 else if r>0 then e: =q-1 else begin writeln(D[q], ’ ’, i); b: =e+1 end end end; {Трудоемкость: O(n·log k))}

Формирование словаря D из символьного массива S длиной n p: =0; j: =0; k: Формирование словаря D из символьного массива S длиной n p: =0; j: =0; k: =0; while j<=n do begin j: =j+1; if j<=n then c: =S[j] else c: =' '; if p=0 then begin if Y[ord(c)]=1 then begin d 1: =c; p: =1; i: =j end else begin if Y[ord(c)]=1 then d 1: =d 1+c else begin {слово выделено, поиск совпадения} q: =1; p: =0; while q<=k do {D - массив слов длиной k} if scomp(d 1, D[q])=0 then q: =k+2 else q: =q+1; if q=k+1 then begin {добавление в массив D еще одного слова} k: =k+1; D[k]: =d 1 end end; Трудоемкость: O(n·k))

Косвенная сортировка массива строк с учетом перекодировки (метод пузырька) for i: =1 to k Косвенная сортировка массива строк с учетом перекодировки (метод пузырька) for i: =1 to k do In[i]: =i; __________________ for i: =k dowto 2 to for j: =1 to i-1 do if scomp(D[In[j]], D[In[j+1]])>0 then begin z: =In[j+1]; In[j+1]: =In[j]; In[j]: =z end; {Трудоемкость: O(k 2· l))}

Таблицы Таблица – набор объектов одинаковой структуры Структура объекта – набор разнотипных полей, каждое Таблицы Таблица – набор объектов одинаковой структуры Структура объекта – набор разнотипных полей, каждое принадлежит какомулибо типу (целому, вещественному, строковому) Представление в программе: 1) набор массивов, для каждого поля – отдельный массив; 2) массив или список записей, для каждого объекта – своя запись. Пример. Структура объекта – 3 поля: A (целый тип), B (строковый тип), C (целый тип). 1. Набор массивов: var A, C: array[1. . 1000]of integer; B: array[1. . 1000]of string[20]; i-я запись в таблице: (A[i], B[i], C[i]) 2. Массив записей: var T: array[1. . 1000]of record A: integer; B: string[20]; C: integer end; i-я запись в таблице: (T[i]. A, T[i]. B, T[i]. C)

спортивное двоеборье Результаты соревнований спортсменов по двум видам в таблице: Фамилия Результат по 1 спортивное двоеборье Результаты соревнований спортсменов по двум видам в таблице: Фамилия Результат по 1 -му виду Результат по 2 -му виду F R 1 R 2 Вычисление общего места в двоеборье по минимуму суммы мест в двух видах: Фамилия F Результат Место по Сумма по 1 -му по 2 -му 1 -му виду 2 -му виду мест виду R 1 R 2 M 1 M 2 MS Общее место в двоеборье M 2

 спортивное двоеборье __________________________ place(R 1, M 1, n); {вычисление мест M 1 по спортивное двоеборье __________________________ place(R 1, M 1, n); {вычисление мест M 1 по по 1 -му виду} place(R 2, M 2, n); {вычисление мест M 2 по по 2 -му виду} for i: =1 to n do {вычисление суммы мест M 0} MS[i]: =M 1[i]+M 2[i]; place(MS, M 0, n); {вычисление мест M 0 по по обоим видам} __________________________ procedure place(R, M: mas; n: integer); var i, ib, j: integer; begin {косвенная сортировка} ssort(R, In, n); {по возрастанию (убыванию)} ib: =1; for i: =1 to n do if (i=n)or(R[In[i]]<>R[In[i+1]]) then begin for j: =ib to i do M[In[j]]: =(ib+b)/2; ib: =i end;

Соединение отдельных таблиц результатов по двум видам в общую таблицу Результаты соревнований спортсменов по Соединение отдельных таблиц результатов по двум видам в общую таблицу Результаты соревнований спортсменов по двум видам представлены в двух таблицах: Фамилия Результат по 1 -му виду F 1 R 01 Фамилия Результат по 2 -му виду F 2 R 02 Общая таблица: Фамилия Результат по 1 -му виду Результат по 2 -му виду F R 1 R 2

Соединение отдельных таблиц результатов в общую таблицу sort 2(F 1, R 01, n 1); Соединение отдельных таблиц результатов в общую таблицу sort 2(F 1, R 01, n 1); {упорядочение 1 -й входной таблицы} sort 2(F 2, R 02, n 2); {упорядочение 2 -й входной таблицы} {Пересечение множеств строк из 1 -й и 2 -й таблиц по фамилиям: } i 1: =1; i 2: =1; n: =0; while (i 1<=n 1)and(i 2<=n 2) do if F 1[i 1]F 2[i 2] then i 2: =i 2+1 else begin n: =n+1; F[n]: =F 1[i 1]; R 1[n]: =R 01[i 1]; R 2[n]: =R 02[i 1]; i 2: =i 2+1; i 1: =i 1+1 end;

Вычисление средних оценок Оценки по предмету, у одного ученика могут быть несколько текущих оценок: Вычисление средних оценок Оценки по предмету, у одного ученика могут быть несколько текущих оценок: Фамилия Оценка F R Средние оценки учеников: Фамилия Средняя оценка Количество текущих оценок FS RS KS

Вычисление средних оценок sort 2(F, R, n); {упорядочение входной таблицы} {Выделение групп записей с Вычисление средних оценок sort 2(F, R, n); {упорядочение входной таблицы} {Выделение групп записей с одинаковыми фамилиями и вычисление для них среднего значения: } S: =0; k: =0; m: =0; for i: =1 to n do begin S: =S+R[i]; k: =k+1; if (i=n)or(F[i]<>F[i+1]) then begin m: =m+1; FS[m]: =F[i]; KS[m]: =k; RS[m]: =S/k S: =0; k: =0 end;