- •Оглавление
- •6. Ввод-вывод 52
- •11. Операторы. Дополнение 93
- •12. Передача данных потоком 100
- •13. Файлы 103
- •14. Структура программы 109
- •15. Указатели, массивы, строки 118
- •16. Работа с экраhом 137
- •17. Управление программой с помощью клавиатуры 151
- •Введение
- •1. Основные понятия и определения
- •1.1. Компьютер
- •Процессор
- •Периферия
- •1.2. Алгоритмы
- •1.3. Программы и языки
- •Основные понятия языка программирования
- •Выполнение программы
- •Машинный и алгоритмический языки
- •Метаобозначения
- •Этапы обработки программы на компьютере
- •Терминология
- •Трансляция
- •Редактирование связей (компоновка)
- •Загрузка
- •1.4. Данные
- •Системы счисления
- •Типы и совокупности данных.
- •Вещественные
- •Логические
- •Совокупности данных
- •2. Элементы языка
- •2.1. История языков с и Basic
- •2.2. Алфавит
- •2.3. Идентификаторы
- •2.4. Знаки разрядки
- •2.5. Комментарии
- •2.6. Запись текста программы
- •3.1.1. Целые
- •3.1.2. Данные с плавающей точкой
- •3.1.3. Логический тип
- •3.1.4. Символьные данные
- •3.1.5. Дополнительные типы данных
- •3.2. Совокупности данных
- •3.2.1. Массивы
- •Объявления массивов
- •Обращение к элементу массива
- •3.2.2. Структуры
- •4.1. Арифметические операторы Основные
- •Дополнительные
- •Приоритет
- •4.2. Операторы конкатенации
- •4.3. Операторы сравнения
- •4.4. Логические операторы
- •4.5. Обращение к функции
- •4.6. Встроенные функции
- •4.7. Заключительные замечания
- •5.1. Объявления
- •5.2. Присваивание
- •5.3. Безусловный переход
- •5.4. Инструкция If. Пустая инструкция
- •5.5. Составная инструкция
- •5.6. Циклы
- •5.6.1. Циклы с предусловием
- •Циклы while
- •Циклы for
- •5.6.2. Циклы с постусловием
- •5.6.3. Вложенные циклы
- •5.7. Управляемые переходы
- •5.7.1. Инструкция break
- •5.7.2. Инструкция continue
- •5.7.3. Инструкции exit
- •5.8. Многоальтернативный выбор
- •5.8.1. Инструкция switch (язык с)
- •5.8.2. Инструкция select case (язык Basic)
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •6. Ввод-вывод
- •6.1. Управляющая строка
- •6.1.1. Спецификация d (целые десятичные числа)
- •6.1.2. Спецификация f (десятичные числа с плавающей точкой)
- •6.1.3. Спецификация e (десятичные числа с плавающей точкой)
- •6.1.4. Спецификация g (универсальная спецификация)
- •6.1.5. Вывод символьной информации
- •6.2. Инструкции printf и scanf. Схема ввода-вывода
- •7.1.1. Распределение скаляров
- •7.1.2. Распределение массивов
- •7.1.3. Статическое и динамическое распределение памяти
- •7.2. Блоки
- •7.3. Процедуры
- •7.3.1. Определения процедур
- •7.3.2. Связь между вызывающей и вызываемой функциями
- •Механизмы передачи данных
- •Прототипы функций (c)
- •Передача скаляров Возвращаемое значение
- •Входные данные
- •Выходные данные
- •Передача массивов
- •Передача функций
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •8. Препроцессор
- •8.1. Определение символических констант
- •8.2. Включение файлов в текст программы
- •9.1. Формирование листинга
- •Перенос:
- •9.2. Комментарии
- •9.3. Имена Имена объектов программы должны быть осмысленными.
- •3. Литералы.
- •10.5. Подмассивы (сечения) (c)
- •10.6. Динамические массивы (b)
- •10.7. Структуры и объединения (c)
- •10.7.1. Структуры
- •10.7.2. Рекурсивные структуры
- •10.7.3. Поля битов
- •10.7.4. Объединения (смеси)
- •10.7.5. Переменные структуры
- •10.9. Пользовательские типы данных
- •10.9.1. Инструкция type (b)
- •10.9.2. Инструкция typedef (c)
- •10.10. Преобразование типов
- •10.10.1. Автоматические преобразования
- •10.10.2. Явные преобразования
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •11. Операторы. Дополнение
- •11.1. Уровень 1
- •11.2. Уровень 2 (унарные или одноместные операторы)
- •11.3. Уровень 3 (мультипликативные операторы)
- •11.4. Уровень 4 (аддитивные операторы)
- •11.5. Уровень 5 (сдвиги)
- •11.6. Уровень 6 (отношения)
- •11.7. Уровень 7 (равенство и неравенство)
- •11.8. Поразрядные операторы
- •11.9. Логические операторы
- •11.10. Уровень 13 (условное выражение)
- •11.11. Уровень 14 (операторы присваивания)
- •11.12. Уровень 15 (оператор ',' - запятая)
- •11.13. Некоторые замечания
- •11.14. Постоянные выражения
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •12. Передача данных потоком
- •12.1. Спецификация "s" управляющей строки функций scanf и printf
- •12.2. Функции getchar и putchar
- •12.3. Функции gets и puts
- •12.4. Внутренняя передача данных (функции sscanf и sprintf)
- •13.2. Описание файла
- •13.3. Открытие и закрытие файлов
- •13.4. Средства языка с
- •13.4.1. Открытие и закрытие файла
- •13.4.2. Основные функции обмена
- •13.5. Средства языка Basic
- •13.5.1. Открытие и закрытие файла Инструкция open
- •Инструкция close
- •13.5.2. Работа с файлами Инструкция input
- •Функция input
- •Инструкция line input
- •Инструкция write
- •Инструкция print
- •Инструкция width
- •Длина файла
- •Функция MsgBox
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •14. Структура программы
- •14.1. Элементы структуры программы.
- •14.1.1. Язык c
- •14.1.2. Язык Basic
- •14.2. Область видимости (действия) и время жизни переменных
- •14.2.1. Язык c
- •14.2.2. Язык Basic
- •14.3. Проект программы
- •14.3.1. Использование директивы препроцессора #include
- •14.3.2. Средства управления проектом
- •14.4. Инициализация данных
- •2. Массивы.
- •15.1. Указатели
- •Определение указателей
- •Задание значений
- •Вывод значений
- •15.2. Указатели и массивы
- •15.3. Работа со строками
- •15.3.1. Литералы
- •15.3.2. Переменные
- •15.3.3. Операторы и функции
- •15.4. Динамические объекты
- •15.5. Типичные ошибки, связанные с указателями Отсутствие инициализации указателя
- •Двойное указание
- •Hе выполнено освобождение выделенной памяти
- •Задание адреса локальной (auto) переменной
- •15.6. Примеры использования указателей. Структуры данных
- •15.6.1. Стек
- •15.6.2. Однонаправленный список
- •15.7. Ссылки и многомерные массивы
- •15.8. Рекурсивные процедуры
- •15.8.1. Рекурсивное решение
- •15.8.2. Нерекурсивное решение. Стек в виде массива
- •15.8.3. Нерекурсивное решение. Стек в виде списка
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •16. Работа с экраhом
- •16.1. Текстовый режим(textmode)
- •16.1.2. Управление режимом и окном
- •16.1.3. Управление атрибутом(цветами символа и фона в окне)
- •16.1.4. Информация о текстовом режиме
- •16.1.5. Пример
- •16.1.6. Пример(продолжение)
- •16.2. Графический режим
- •16.2.1. Установка и закрытие
- •16.2.2. Форматирование Цвета
- •Битовые образы(pattern)
- •Текстовые фонты
- •Восстановление установок по умолчанию
- •16.2.3. Размещение на экране Окна
- •Координаты курсора и перемещения
- •16.2.4. Вывод на экран Текст
- •Прямоугольники
- •Эллипсы
- •Многоугольники
- •Пиксели
- •16.2.5. Дополнительные функции
- •Простые циклы
- •Вложенные циклы
- •Процедуры
- •Работа со строками
- •Приложения
- •П1.1. Меню File (Файл)
- •П1.2. Меню Options (Установки среды)
- •П1.3. Разное
- •П1.4. Редактирование текста
- •П1.5. Сообщения
- •Трансляция
- •Компоновка (редактирование связей)
- •Ошибки времени выполнения
- •П1.6. Отладка
- •Прогон до точки прерывания
- •Пошаговое выполнение программы
- •Установка точек прерывания
- •Получение значений объектов программы
- •П1.7. Окна
- •Управление окнами
- •Приложение 2. Среда разработки Visual Basic Express
- •П2.1. Запуск среды
- •П 2.2. Подготовка к работе с новым проектом
- •П2.3. Окна и режимы работы
- •П2.4. Главное меню
- •П2.5. Меню File (Файл)
- •П2.6. Редактирование текста
- •П2.7. Меню View (Обзор)
- •П2.8. Меню Project (Проект)
- •П2.9. Отладка
- •Точки прерывания
- •Определение значений объектов программы в момент прерывания
- •Продолжение работы
- •П2.10. Меню Tools (Средства)
- •П2.11. Меню Window (Окно)
- •Приложение 3. Ответы на вопросы для самопроверки
- •2. Элементы языка
- •3. Элементы данных
- •4. Выражения
- •5. Основные инструкции
- •6. Ввод-вывод
- •7. Процедуры
- •8. Препроцессор
- •9. Стиль программирования
- •10. Данные. Дополнение
- •11. Операторы. Дополнение
- •12. Передача данных потоком
- •13. Файлы
- •14. Структура программы
- •15. Указатели, массивы, строки
- •16. Работа с экраном
- •17. Управление программой с помощью клавиатуры
- •Приложение 4. Темы для курсовой работы
- •Библиографический список
15.3. Работа со строками
Здесь будут рассмотрены средства манипулирования со строковыми данными как в языке C, так и в языке Basic. Эти средства группируются по функциональному признаку с тем, чтобы получить представление об общих чертах и отличиях в их реализации на каждом языке. Наряду с новыми средствами будут приведены и описанные ранее. Цель такого изложения материала заключается в том, чтобы свести в одном разделе практически все аспекты обработки символьных данных.
15.3.1. Литералы
Правило записи строковых литералов в языках C и Basic одинаково:
строковый литерал := "<текст>"
Пример.
"Это строковый литерал"
В языке Basic литерал типа string относится к виду строк переменной длины и занимает в памяти (10 + длина строки) байтов.
В языке C любой строковый литерал есть массив символов, заканчивающийся символом '\0', который добавляет транслятор, т.е. его длина в памяти на 1 символ (байт) больше числа символов между кавычками.
Пример.
"Это строка!" (11 знаков) в памяти будет: Это строка!\0 (12 знаков)
15.3.2. Переменные
Basic
Тип данных string.
2 вида: строки переменной и фиксированной длины.
Объявление:
<имя> as string [*<длина>]
C
Типа данных string нет.
Вместо строковых переменных используются массивы типа char. Следовательно, они аналогичны строкам фиксированной длины языка Basic.
Объявление:
char <имя>[<длина>]
15.3.3. Операторы и функции
Basic
C
Ввод - вывод
Ввод строки в окно – InputBox (поясняющий текст[, заголовок окна] [,значение по умолчанию][,xнач] [, yнач]).
Возвращаемое значение: строка, введенная с клавиатуры в поле ввода.
Аргументы:
- если заголовок окна опущен, то в окно помещается имя приложения;
- значение по умолчанию – значение, появляющееся в поле ввода; если пользователь согласен с
этим значением, то, не вводя значение с клавиатуры, нужно щелкнуть по кнопке ОК;
- xнач, yнач – координаты левого верхнего угла окна; если xнач опущено, то окно центрируется по горизонтали; если yнач опущено, то окно располагается примерно на уровне 1/3 от верха экрана.
Файл прототипов stdio.h.
Ввод с клавиатуры:
- функция scanf(спецификация %s);
- функция gets(char*).
Введенное значение заносится
в символьный массив. Обе функции добавляют конечный символ '\0'.
Можно заполнять символьный массив с клавиатуры в цикле с помощью функции getchar (char). В этом случае, конечный нуль не добавляется.
Пример. Поэлементное присваивание.
char str1[20], str2[20];
...................................
gets(str1);
for(i=0; str2[ I ]=str1[ I ]; i++);
Пример. InputBox("Число людей в кругу:")
П
оясняющий
текст: Число людей в кругу.
Заголовок окна: Flavii.
Вывод строки в окно – MsgBox (сообщение[, кнопки][, заголовок]).
Возвращаемое значение: код нажатой кнопки. Используется для организации диалога. Изучить самостоятельно.
Аргументы:
- кнопки – целое выражение, кодирующее число и названия выводимых в окно кнопок; если опущено, выводится одна кнопка ОК;
- заголовок – см.функцию InputBox.
Пример.
MsgBox("Остался
жив №" & nomer)
В
ывод
на экран:
- функция printf (спецификация %s);
- функция puts(char*).
Также в цикле можно выводить строки с помощью функции putchar (char).
Конкатенация (сцепление)
Оператор &
Файл прототипов для после-дующих функций string.h.
char* strcat(левая строка, правая строка)
Копирование (присваивание)
Оператор =
char* strcpy(копия, оригинал)
Сравнение
Оператор =
Пример.
dim str1 as string, str2 as string
str1="Привет " : str2="семье!"
str1 & str2 "Привет семье!"
if str1 = str2 then ' Результатfalse
Есть 3 режима сравнения строк, которые задаются инструкцией вида:
option compare <режим>
Режимы:
- binary – с учетом регистра (по умолчанию);
- text – без учета регистра;
- database – для MS Access.
int strcmp(строка 1, строка 2)
Возвращаемое значение равно:
- < 0, если строка 1 < строки 2;
- ==0, если строка 1 == строке 2;
- > 0, если строка 1 > строки 2.
Пример.
char str1[20], str[20];
strcpy(str1, "Привет ");
strcpy(str2, "семье!");
strcat(str1, str2); "Привет семье!"
if(strcmp(str1, str2)) str1 != str2
Длина строки
Len(строка)
unsigned strlen(char *);
Возвращает число символов в строке без конечного нуля.
Первое вхождение строки s2 в s1
InStr([начальная позиция,] где ищем, что ищем[, режим сравнения])
Возвращаемое значение: позиция, с которой строка что ищем входит в строку где ищем; если вхождения нет, возвращается 0.
Аргументы:
- начальная позиция – позиция, с которой начинается поиск; если опущена, то поиск с первой позиции;
- режим сравнения := {binary | text | database}; если опущен, то определя-ется инструкцией option compare; если задан, то начальная позиция обязательна.
Пример.
s1="0123456789" : s2="345"
k=InStr(5, s1, s2) ' k=0
char* strstr(где ищем, что ищем);
Возвращаемое значение: указатель на символ, с которого начинается вхождение s2 в s1; если вхождения нет, возвращается NULL.
Пример.
strcpy(s1, "0123456789");
strcpy(s2, "345");
p=strstr(s1, s2);
Формирование строки из повторяющихся символов
Строка из пробелов:
space(число пробелов)
Строка из произвольных повторяющихся символов:
string(число, строка)
Строка строится из первого символа строки.
char* strset(строка, символ)
Другие возможности
Выделение подстрок:
- left(строка, n) – n первых символов строки;
- right(строка, n) – n последних символов строки;
- mid(строка, начало[, n]) – n символов строки с позиции начало.
- trim(строка) – удалить пробелы с двух концов строки.
Выравнивание:
Инструкция lset строка1 = строка2
Присваивает строке1 значение строки2 и, если длина строки1 больше длины строки2, лишние "правые" символы заменяются пробелами.
Инструкция rset строка1 = строка2
Делает то же самое, но "прижимает" строку2 к "правой" границы строки1.
Инициализация символьного массива.
char mes[ ]="Это строка!";
Длину массива можно не указывать, транслятор сам определит ее по числу символов инициализирующей строки.
Пример. Определить, являются ли 2 строки анаграммой.
function anagr(str1 as string, str2 as _ string) as boolean
dim len1 as integer, _
len2 as integer, _
i as integer, _
j as integer, _
fl1 as boolean, _
fl2 as boolean, _
sled( ) as boolean
len1=len(str1) : len2=len(str2)
if len1<>len2 then
anagr=false
exit function
end if
redim sled(1 to len1)
for i=1 to len1
sled( i )=false
next
i=1 : fl1=true
do while i<=len1 and fl1
j=1 : fl2=true
do while j<=len2 and fl2
if not sled( j ) and _
mid(str1, i, 1)= _
mid(str2, j, 1) then
sled(j)=true : fl2=false
end if
j=j+1
loop
if fl2 then fl1=false
i=i+1
loop
anagr=fl1
end function
short anagr(char *str1, char *str2){
short len1,
len2,
i, j,
fl1=1,// 1 - анаграмма, 0 - нет
fl2, // 1 - символ в str2 найден,
// 0 - нет
sled[20]; /* 1 - j-й символ в str2
использован, 0 – нет */
len1=strlen(str1); len2=strlen(str2);
if(len1 != len2)return 0;
for(i=0; i<len2; i++)sled[ i ]=0;
for(i=0; i<len1 && fl1; i++){
fl2=1;
for(j=0; j<len2 && fl2; j++){
if(!sled[ j ] && str1[ i ]==str2[ j ]){
sled[ j ]=1;
fl2=0;
}
}
if(fl2)fl1=0;
}
return fl1;
}
