- •Предисловие
- •Знакомство с языком C
- •Структура программы
- •Пример простой программы
- •Более сложный пример
- •Контрольные вопросы
- •Основные понятия, объявление переменных, типы данных
- •Объявление переменных
- •Примеры описаний переменных:
- •Основные типы данных
- •Производные типы.
- •Контрольные вопросы
- •Ввод/вывод с помощью функций printf() и scanf().
- •Модификаторы спецификаций преобразования используемые в функции printf()
- •Применение функции scanf()
- •Контрольные вопросы
- •Операции
- •Простейшие арифметические операции
- •Операция присваивания
- •Использование в выражениях операндов разных типов
- •Операции преобразования типов
- •Дополнительные арифметические операции
- •Дополнительные операции присваивания
- •Операции отношения
- •Логические операции
- •Приоритеты операций
- •Таблица 3. Таблица приоритетов рассмотренных выше операций
- •Контрольные вопросы
- •Операторы
- •Оператор-выражение
- •Ветвление
- •Условный оператор
- •Оператор switch
- •Оператор break
- •Циклы
- •Цикл while
- •Цикл do…while
- •Цикл for
- •Другие операторы
- •Оператор continue
- •Оператор goto
- •Оператор вызова функции
- •Контрольные вопросы
- •Обработка числовых последовательностей
- •Последовательная обработка
- •Обработка числовых последовательностей
- •Примеры
- •Контрольные вопросы
- •Последовательная обработка символьных данных
- •Символьные данные
- •Последовательная обработка символов
- •Функции getchar( ) и putchar( )
- •Контрольные вопросы
- •Обработка массивов
- •Массивы
- •Объявление массива
- •Использование и обработка массивов
- •Примеры
- •Контрольные вопросы
- •Указатели и динамические массивы
- •Указатели
- •Динамическое выделение памяти
- •Статические и динамические массивы
- •Контрольные вопросы
- •Подпрограммы
- •Описание подпрограмм
- •Параметры подпрограмм
- •Область действия переменных
- •Примеры
- •Контрольные вопросы
- •Рекурсивные функции
- •Понятие рекурсивной функции
- •Контрольные вопросы
- •Символьные строки и функции обработки строк
- •Посимвольная обработка строк
- •Пример программы
- •Контрольные вопросы
- •Структуры
- •Тип данных структура
- •Контрольные вопросы
- •Работа с файлами
- •Примеры
- •Контрольные вопросы
- •Массивы и функции как параметры
- •Указатели на функции
- •Массивы и указатели
- •Указатели и двумерные массивы
- •Пример
- •Технологии программирования
- •Структурное программирование
- •Модульное программирование
- •Объектно-ориентированное программирование
- •Компонентное программирование
- •Структурная декомпозиция задачи и разработка алгоритмов и программ методами сверху вниз и снизу вверх
- •Контрольные вопросы
- •Модульное программирование
- •Работа с графикой на языке C и модуль graphics.h
- •Типы видео мониторов и их режимы
- •Инициализация графики
- •Система координат
- •Основные графические функции
- •Функции рисования
- •Функции изменения параметров рисования
- •Шаблоны линий
- •Шаблоны закраски
- •Задание на расчетно-графическую работу
- •Порядок выполнения работы
- •Задание
- •Задание для вариантов 1-11
- •Задание для вариантов 12-20
- •Задание для вариантов 21-40
- •Пример исходных данных для вариантов 12-16
- •Задание для вариантов 41-60
- •Варианты индивидуальных заданий
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •Вариант 13
- •Вариант 14
- •Вариант 15
- •Вариант 16
- •Вариант 17
- •Вариант 18
- •Вариант 19
- •Вариант 20
- •Вариант 21
- •Вариант 22
- •Вариант 23
- •Вариант 24
- •Вариант 25
- •Вариант 26
- •Вариант 27
- •Вариант 28
- •Вариант 29
- •Вариант 30
- •Вариант 31
- •Вариант 32
- •Вариант33
- •Вариант 34
- •Вариант 35
- •Вариант 36
- •Вариант 37
- •Вариант 38
- •Вариант 39
- •Вариант 40
- •Вариант 41
- •Вариант 42
- •Вариант 43
- •Вариант 44
- •Вариант 45
- •Вариант 46
- •Вариант 47
- •Вариант 48
- •Вариант 49
- •Вариант 50
- •Вариант 51
- •Вариант 52
- •Вариант 53
- •Вариант 54
- •Вариант 55
- •Вариант 56
- •Вариант 57
- •Вариант 58
- •Вариант 59
- •Вариант 60
- •Задания на курсовую работу
- •Требования к курсовой работе
- •Этапы разработки программ
- •Содержание отчета по курсовой работе
- •Задания к курсовой работе
- •Литература
- •Функции консольного ввода/вывода
- •Функции обработки строк
- •Функции преобразования данных
Символьные строки и функции обработки строк
Символьная строка представляет собой последовательность символов, заканчивающуюся нуль-символом (‘\0’ c кодом 0).
Строковые константы заключаются в кавычки. При компиляции программы они автоматически дополняются нуль-символом. Строковые переменные объявляются как массивы символов, например:
char |
str[81]; |
|
char |
error[] = “Ошибка”; |
|
/* массив из |
7 символов, включая ‘\0’ */ |
При работе со строками можно использовать указатели, например:
char |
*s = “Привет”; |
|
… |
= error; |
|
s |
||
|
При |
объявлении указателя s ему присваивается адрес 1-го символа |
строки “Привет”, которая будет размещена в памяти отдельно от указателя.
Последний оператор указателю |
s |
присваивает адрес массива error. |
Обратное присваивание error=s; |
будет неверным, т.к. имя массива – это |
константный указатель, его нельзя изменять.
Для ввода с клавиатуры строки символов служит библиотечная функция gets(), а для вывода – функция puts().
Пример:
char s1[81], s2[81]; char *s3 = “Привет!”; puts (s3);
puts (“Введите две строки”); gets (s1);
gets (s2);
В библиотеках Turbo C, Borland C++ имеется ряд функций обработки строк:
-определения длины строки (strlen),
-сравнения строк (strcmp, strncmp),
-копирования строк (strcpy, strncpy),
-сцепления строк (strcat, strncat),
-поиска символа в строке (strchr, strrchr, strpbrk),
99
- поиска подстроки в строке (strstr).
При их использовании в программу необходимо включить заголовочный файл string.h, содержащий объявления этих функций.
Рассмотрим одну из библиотечных функций - функцию сцепления двух заданных строк strcat(). Определение функции:
char *strcat (char *s1, char *s2);
Функция копирует строку s2 (на которую ссылается указатель s2) в конец строки s1 и возвращает значение s1 - ссылку на сцепленную строку.
Работу функции можно описать так:
char *strcat |
(char *s1, char *s2) |
*/ |
|
{ char *rs; |
/* |
ссылка на результирующую строку |
|
rs=s1; |
/* |
запоминание адреса начала строки s1 */ |
while (*s1!='\0') s1++; /* поиск конца строки s1 */ /* копирование строки s2 в конец s1 */
while (*s2!='\0')
{ *s1=*s2; s1++; s2++; } *s1='\0';
return rs;
}
Как видите, функция не проверяет, достаточно ли памяти для результирующей строки. Вызывающая программа должна позаботиться об этом.
А теперь посмотрите на более компактную (но менее понятную) запись этой функции:
char *strcat (char *s1, char *s2) { char *rs;
rs=s1; /* запоминание |
адреса начала строки |
s1 */ |
|||
while |
(*s1!='\0') s1++; |
/* |
поиск конца |
строки s1 */ |
|
while |
((*s1++ = *s2++) |
!='\0'); /* |
копирование |
s2 в конец s1, |
|
|
|
|
включая |
нуль-символ */ |
return rs;
}
Даже еще можно сократить текст функции, записав второй оператор while короче:
while (*s1++ = *s2++);
100
Непонятно? Каждый раз очередной символ из второй строки копируется в первую, затем значения указателей s1 и s2 увеличиваются на 1, т.e. происходит продвижение указателей к следующим символам строк. Этот процесс повторяется до тех пор , пока не скопируется нуль-символ (т.к. выход из цикла происходит при нулевом значении выражения в скобках).
Ссимвольными строками можно работать как с массивами: обращаться
котдельным символам строки с помощью индекса. Ту же функцию сцепления строк можно написать иначе:
char *strcat (char *s1, char |
*s2) |
|
|
{ |
/* индексы |
символов строк s1 * и s2 */ |
|
int i=0, j=0; |
*/ |
||
while (s1[i]) |
i++; |
/* поиск конца строки s1 |
|
while ((s1[i++] |
= s2[j++])); /* копирование строки s2 |
|
в конец s1, включая нуль-символ */
return s1;
}
Теперь вам предлагается самим написать одну из функций обработки строк из списка библиотечных, указанную преподавателем. Для проверки работы вашей функции напишите драйвер (программу отладки) в виде функции main(). Чтобы понять, какой должен быть результат работы своей функции, протестируйте сначала библиотечную функцию с помощью вашего драйвера (не забудьте включить директиву #include <string.h>).
Пример драйвера для функции сцепления строк strcat():
#include <stdio.h> #include <conio.h>
/*****************************/ |
*/ |
|
/* |
Тестирование ф-ции strcat |
|
/* |
Программа-драйвер |
*/ |
/*****************************/ void main()
{char str1[81],str2[81];
puts ("Введите две строки"); gets (str1);
gets (str2);
if (strlen(str1)+strlen(str2) < 81)
{puts ("Результат:"); puts (strcat(str1,str2));
printf ("Строки после вызова функции сцепления:\n%s\n%s\n", str1,str2);
101