Введение в программирование
Примеры символьной обработки
Примеры символьной обработки
Самое длинное слово
Самое длинное слово
Самое длинное слово
Примеры символьной обработки
Самое длинное слово
Самое длинное слово
Самое длинное слово
Подпрограмма «Ввод числа»
Подпрограмма «Ввод числа»
Подпрограмма «Ввод числа»
224.50K
Category: programmingprogramming

Примеры символьной обработки (язык C, лекция 9)

1. Введение в программирование

Программирование и структуры данных
2007 г.
Введение в программирование
Лекция 9.
Примеры символьной
обработки
Бикмурзина А.Р., Захарова З.Х., Хохлов Д.Г.
КГТУ (КАИ), кафедра АСОИУ
1

2. Примеры символьной обработки

Программирование и структуры данных
2007 г.
Примеры символьной обработки
• Задача 8.1. Самое длинное слово текста.
• Входной текст состоит из слов, разделенных
пробелами и/или символами "новая строка". Составить
программу определения самого длинного слова.
Тест. Вход:
Я снова тут,
Я собран весь <Ctrl-z> <Enter>
Выход:
Самое длинное слово: собран.
Алгоритм символьной обработки разрабатываетcя, исходя из
структуры читаемого им текста, которую удобно описать в виде
синтаксических правил - грамматик. Разным грамматикам
соответствуют разные варианты алгоритма.
Бикмурзина А.Р., Захарова З.Х., Хохлов Д.Г.
КГТУ (КАИ), кафедра АСОИУ
2

3. Примеры символьной обработки

Программирование и структуры данных
2007 г.
Примеры символьной обработки
Решение А. Грамматика текста имеет вид:
текст
::= [слово]...
слово ::= [разделитель]... [символ-слова]...
разделитель ::= пробел | новая-строка
• Каждому знаку повторения "..." синтаксического
правила в алгоритме чтения и анализа текста
соответствует цикл, знаку "|" (или) – ветвление.
• Структура
алгоритма
повторяет
структуру
читаемого текста.
• Алгоритм 8.1а содержит цикл чтения слов,
который включает цикл пропуска разделителей и цикл
чтения символов слова.
Бикмурзина А.Р., Захарова З.Х., Хохлов Д.Г.
КГТУ (КАИ), кафедра АСОИУ
3

4. Самое длинное слово

Программирование и структуры данных
2007 г.
• Обозначим:
sl
- текущее слово,
dsl
- длина текущего слова,
maxsl
- максимальное слово,
dmaxsl - длина максимального слова.
• Алгоритм 8.1а на псевдокоде:
dmaxsl = 0;
while (не конец файла)
{ Пропуск пробелов и "новых строк";
dsl = 0;
Чтение текущего слова sl;
if (dsl > dmaxsl)
Копирование sl в maxsl; dmaxsl = dsl;
}
if (dmaxsl > 0) Вывод maxsl;
else
Вывод "В тексте нет слов";
Бикмурзина А.Р., Захарова З.Х., Хохлов Д.Г.
Самое длинное слово
КГТУ (КАИ), кафедра АСОИУ
4

5. Самое длинное слово

Программирование и структуры данных
2007 г.
Самое длинное слово
/* Программа 8.1а. Слово максимальной длины
*/
#include <stdio.h>
#define DSLMAX 20
/* Максимальная длина слова
*/
main ()
{ char sl [DSLMAX];
int
dsl;
/* Текущее слово
/* Длина текущего слова
*/
*/
char maxsl [DSLMAX];
int
dmaxsl;
/* Максимальное слово
/* Длина максимального слова
*/
*/
int
int
/* Текущий символ
*/
/* Текущий индекс копирования*/
sim;
i;
dmaxsl = 0;
Бикмурзина А.Р., Захарова З.Х., Хохлов Д.Г.
КГТУ (КАИ), кафедра АСОИУ
5

6. Самое длинное слово

Программирование и структуры данных
2007 г.
while ((sim = getchar()) != EOF)
{
while (sim==' ' || sim=='\n') sim=getchar();
dsl = 0;
while (sim!=' ' && sim!='\n' && sim!=EOF)
{sl [dsl++] = sim;
sim = getchar();}
Самое длинное слово
sl [dsl] = '\0';
if (dsl > dmaxsl)
{for (i = 0; maxsl [i] = sl [i]; i++);
dmaxsl = dsl;
}
}
}
if (dmaxsl > 0)
printf ("\nСамое длинное слово: %s\n", maxsl);
else
printf ("\nВ тексте нет слов\n");
return 0;
Бикмурзина А.Р., Захарова З.Х., Хохлов Д.Г.
КГТУ (КАИ), кафедра АСОИУ
6

7. Примеры символьной обработки

Программирование и структуры данных
2007 г.
Примеры символьной обработки
Решение Б. Грамматика текста имеет вид:
текст ::= символ...
символ ::= разделитель | символ-слова
разделитель ::= пробел | новая-строка | конецфайла
символ-слова
разделителей
-
любой
символ,
кроме
Алгоритм 8.1б содержит один цикл с постусловием
для чтения символов, так как текст содержит хотя бы
один символ. В цикле выполняется проверка символа.
Бикмурзина А.Р., Захарова З.Х., Хохлов Д.Г.
КГТУ (КАИ), кафедра АСОИУ
7

8. Самое длинное слово

Программирование и структуры данных
2007 г.
Самое длинное слово
• Алгоритм на псевдокоде:
dmaxsl = 0; dsl = 0;
do
{ if (текущий символ s - не разделитель)
текущий символ s в слово sl;
else
/* разделитель - конец слова */
{if (dsl > dmaxsl)
{Копирование sl в maxsl; dmaxsl = dsl; }
dsl = 0;
}
}
while (не конец файла);
if (dmaxsl > 0) Вывод maxsl;
else Вывод "В тексте нет слов";
Бикмурзина А.Р., Захарова З.Х., Хохлов Д.Г.
КГТУ (КАИ), кафедра АСОИУ
8

9. Самое длинное слово

Программирование и структуры данных
2007 г.
Самое длинное слово
/* Программа 8.1б. Слово максимальной длины
*/
#include <stdio.h>
/* Максимальная длина слова
*/
/* Текущее слово
*/
/* Длина текущего слова
*/
char maxsl [DSLMAX];
/* Максимальное слово
*/
int
dmaxsl;
/* Длина максимального слова
*/
int
sim;
/* Текущий символ
*/
int
i;
/* Текущий индекс копирования
*/
#define DSLMAX 20
void main (void)
{ char sl [DSLMAX];
int
dsl;
dmaxsl = 0; dsl = 0;
Бикмурзина А.Р., Захарова З.Х., Хохлов Д.Г.
КГТУ (КАИ), кафедра АСОИУ
9

10. Самое длинное слово

Программирование и структуры данных
2007 г.
Самое длинное слово
do
{ if ((sim=getchar()) != ' ' && sim!='\n' && sim!=EOF)
sl [dsl++] = sim;
else
{ if (dsl > dmaxsl)
{ sl [dsl] = '\0';
for (i = 0; maxsl [i] = sl [i]; i++);
dmaxsl = dsl;
}
dsl = 0;
}
}
while (sim != EOF);
if (dmaxsl > 0) printf ("\nСамое длинное слово: %s\n", maxsl);
else printf ("\nВ тексте нет слов\n");
}
Бикмурзина А.Р., Захарова З.Х., Хохлов Д.Г.
КГТУ (КАИ), кафедра АСОИУ
10

11.

Программирование и структуры данных
2007 г.
В этом примере отразились весьма характерные и важные
закономерности программирования.
1. Существует много решений даже очень простой задачи.
2. По разным критериям лучшими оказываются разные
программы, необходим поиск компромиссных вариантов.
3. Выиграешь время - проиграешь память и наоборот:
экономя память, увеличишь время решения задачи.
4. Структурное программирование сверху вниз облегчает
поиск вариантов алгоритма.
5. Неструктурный алгоритм может оказаться компактнее
структурного, но он обычно более запутанный и менее
надежный.
Бикмурзина А.Р., Захарова З.Х., Хохлов Д.Г.
КГТУ (КАИ), кафедра АСОИУ
11

12.

Программирование и структуры данных
2007 г.
Основные критерии качества программы
1. Надежность.
2. Эффективность по времени.
3. Эффективность по памяти.
4. Удобство эксплуатации.
5. Затраты на разработку программы.
Для уменьшения затрат на разработку важна
мобильность программы.
Критерии часто противоречат друг другу.
Особенно характерна закономерность
время-память.
Бикмурзина А.Р., Захарова З.Х., Хохлов Д.Г.
КГТУ (КАИ), кафедра АСОИУ
12

13. Подпрограмма «Ввод числа»

Программирование и структуры данных
2007 г.
Подпрограмма «Ввод числа»
Пример 9.2. Составить подпрограмму ввода
целого числа, перед которым возможны пробелы,
символы "новой строки" и знак (подобным образом
вводится число по формату %d функции scanf).
Тест. Вход:
12
-5 +234<Ctrl-z><Enter>
Бикмурзина А.Р., Захарова З.Х., Хохлов Д.Г.
КГТУ (КАИ), кафедра АСОИУ
13

14. Подпрограмма «Ввод числа»

Программирование и структуры данных
2007 г.
Подпрограмма «Ввод числа»
/* Программа 9.2. Ввод целого числа znach
*/
void vvod_chisla (int * znach)
{ int sim, znak;
*znach = 0; znak = 1;
Пропуск пробелов и "новых строк" до числа
/*
*/
while ((sim=getchar()) == ' ' || sim=='\n');
Чтение знака
/*
*/
if (sim == '-' || sim == '+')
{ if (sim == '-') znak = -1;
sim = getchar();
}
Бикмурзина А.Р., Захарова З.Х., Хохлов Д.Г.
КГТУ (КАИ), кафедра АСОИУ
14

15. Подпрограмма «Ввод числа»

Программирование и структуры данных
2007 г.
Подпрограмма «Ввод числа»
/*
Чтение цифр
while (sim>='0' && sim<='9')
{ *znach = *znach * 10 + sim - '0';
sim = getchar();
}
*znach = *znach * znak;
}
Бикмурзина А.Р., Захарова З.Х., Хохлов Д.Г.
*/
КГТУ (КАИ), кафедра АСОИУ
15
English     Русский Rules