- •Московский государственный социальный университет академия информатики и информационных технологий
- •Введение
- •Часть. Основы программирования на Си
- •1.1. Структура простейшей Си-программы
- •1.2. Данные в Си и операции над ними
- •1.2.1. Свойства ячейки памяти. Переменные и константы
- •1.2.2. Типы данных в Си
- •1.2.3. Правила записи констант в Си
- •1.2.4. Описание переменных и именованных констант в Си.
- •1.2.5. Выражения в Си
- •1.3. Операторы преобразования данных
- •1.3.1. Общие положения
- •1.3.2. Функция форматного выводаprintf()
- •1.3.3. Функция форматного вводаscanf()
- •1.4. Разработка программ на Си
- •1.4.1. Понятие о качестве программы и основные технологические принципы разработки программ
- •1.4.2. Алгоритм и способы его записи.
- •1.4.3. Изображение алгоритмов в виде блок-схем
- •1.4.4. Базовые структуры алгоритмов и их кодирование на Си.
- •1. Следование
- •2. Разветвление (развилка)
- •If (условие)
- •If (условие)
- •3. Цикл
- •1.4.4. Примеры разработки программ
- •1.5. Массивы и указатели
- •1.5.1. Понятие массива. Основные правила работы с массивами в Си
- •1.5.2. Примеры программ с массивами.
- •1.5.3. Инициализация массивов
- •1.5.4. Указатели в Си10
- •1.5.5. Связь массивов с указателями в Си
- •Часть. Функции и многофайловые программы в Си
- •2.1. Общие сведения о подпрограммах и функциях
- •2.2. Функции си
- •2.2.1. Описание функции
- •2.2.2. Обращение к функции
- •2.2.3. Место описания функции в программе
- •2.2.4. Примеры программ, использующих функции
- •2.3. Краткие сведения о препроцессоре Си
- •2.3.2.Директива макроопределения #define
- •2.3.3. Директива #include включения файлов
- •2.3.4. Директивы условной компиляции
- •2.415. Многофайловые си-программы
- •2.4.1. Структура программы на Си. Область действия переменных
- •2.4.2. Время жизни и класс памяти переменных
- •Описатели класса памяти
- •2.4.3 Понятие о файле проекта
- •Часть. Обработка символьной информации и документов сложной структуры
- •3.1. Обработка символьной информации на Си
- •3.1.1. Символьный тип
- •3.1.2. Работа со строками символов в Си. Строковые литералы. .
- •3.1.3. Функции и макросы для работы с символьной информацией
- •3.1.4. Примеры программ
- •3.2. Тип "структура" в Си
- •Структура
- •3.3. Файлы в Си
- •3.3.1. Общие понятия.
- •3.2.Функции Си для работы с файлами
- •3.3.3. Примеры программ, использующих файлы
- •Литература
- •Содержание
3.1.3. Функции и макросы для работы с символьной информацией
Макросы для проверки вида символов и преобразования символов содержатся в заголовочном файле <ctype.h>. Примеры обращений к макросам:
isalnum(c) - истина ,если с - буква или цифра;
isalfa(c) - истина, если с - буква;
isascii(c) - истина, если код символа с меньше или равен 127;
tolower(c) - преобразует символ прописной буквы в символ строчной, не изменяя остальные символы; не являющиеся прописными буквами символы не преобразуются;
toupper(c) - преобразует символ строчной буквы в символ прописной (обратная для tolower).
Всего ctype.h содержит 17 макросов. Эти макросы не предназначены для работы с русскими буквами.
BorlandC ++ имеет большую (27 функций) библиотеку для работы со строками символов (определение длины строки, копирование строк, выделение подстрок, определение вхождения символа или подстроки в строку, сравнение строк, конкатенация (сцепление строк), вывод строк с сообщениями об ошибках и т. д.). Прототипы функций содержатся в заголовочном файле <string.h>.
Большинство функций обрабатывают только последовательности символов, заканчивающиеся нуль-терминатором. В ниже приведенных примерах программ использованы функции:
strlen(const char *s) - возвращает длину в байтах для строки, на которую указывает s, не учитывая нуль-терминатор;
strcpy(char *s1, const char *s2) - копирует строку, на которую указывает s2, в строку, на которую указывает s1;
strcmp(const char *s1, const char s2) - выполняет сравнение строк, на которые указывают s1 и s2; возвращает 0, если строки одинаковы, и положительное значение, если s1>s2, иначе отрицательное;
strncpy(char *s1, const char *s2, int n) - копирует не более n первых символов строки, на которую указывает s2, в строку, на которую указывает s1; если n меньше длины строки s2, то в s1 не переносится символ '\0';
strstr(const char *s1,const char *s2) - возвращает указатель на место первого вхождения s2 в s1.
При работе с символьной информацией часто требуются функции, преобразующие строку символов в число и числа в строку символов (иначе говоря, внешнее представление числа во внутреннее и наоборот). Прототипы таких функций содержатся в заголовочном файле <stdlib.h>, некоторые из них дублируются в <math.h> и других заголовочных файлах. В примерах мы использовали функцию atof, преобразующую строку символов в значение типа double; ее шаблон:
double atof(const char *s)
О других функциях обработки символьной информации см., например, [2].
3.1.4. Примеры программ
Пример1. Вычислить количество слов в строке; под словом понимается группа символов, не содержащая пробелов. Слова могут разделяться одним или несколькими пробелами
В приведенной программе мы подсчитываем число "концов слов", т. е. число пар символов "непробел-пробел" или "непробел-конец строки". Алгоритм (блок-схема на рис.11) предусматривает последовательный просмотр символов строки от ее начала, цикл заканчивается на символе '\0'.
#include <stdio.h>
#include <conio.h>
#define NMAX 81 /*максимальная длина стpоки*/
void main()
{char pr[NMAX];/*рассматриваемая строка*/
int k,n,i; /*k-число слов, n-длина стpоки, i-счетчик символов*/
puts(" Введите стpоkу");
gets(pr);
k=0; i=0;
while (pr[i]!='\0')
{if ((pr[i]!=' ') && ((pr[i+1]==' ') || (pr[i+1]=='\0')))
k=k+1;
i=i+1;
};
printf(" Число слов pавно %2d\n",k); getch();
}
Пример 2 . Таблица содержит сведения об игрушках, хранящихся на складе: наименование (номера позиций 4-32) , рекомендуемые возрастные границы ребенка (минимальный возраст в позициях 34-41, максимальный - в позициях 43-50), стоимость (позиции 52-59). Каждая строка таблицы соответствует некоторой игрушке. Требуется найти самый дорогой конструктор для детей до семи лет.
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>/*содеpжит функцию atof пpеобpазования стpоки в значение типа double*/
void main()
{int n/*число строк таблицы*/; char tabl[61]/*строка таблицы*/,
nu[3],name[30],minage[9],maxage[9],rub[9];/*поля таблицы: */ /*номер, наименование, макс. и мин. возраст, стоимость*/
double max /*макс. стоимость*/,
maxar,rubr;/*вещ. представление стоимости*/
char namemax[30]; /*название искомой игрушки*/
int i,C;
puts(" Введите число наименований игpушек");
scanf("%d",&n);
puts("Вводите сведения об игpушках в виде таблицы");
/*Далее вывод заголовка таблицы*/
puts(
“┌─┬─────────────┬─────┬─────┬────┐”);
puts(
"|N | название игpушки | миним.| макс. | стои- |");
puts(
"| | | возpаст|возpаст|мость |");
puts(
"├─┼─────────────┼─────┼─────┼────┤");
max=0; /*max - максимальная стоимость*/
fflush(stdin);/* Очистка буфера послеscanf*/
for (i=0; i<n;i++)
{gets(tabl);
/*ввели строку таблицы, далее выделяем подполя*/
strncpy(name,tabl+4,29);name[29]='\0';
strncpy(minage,tabl+34,8);minage[8]='\0';
strncpy(maxage,tabl+43,8);maxage[8]='\0';
maxar=atof(maxage);
if (!maxar)
printf("Ошибка в записи макс.возp.в %d стpоке таблицы\n",i);
else
{if((strstr(name,"констpуктоp")!=NULL ||
strstr(name,"Констpуктоp")!=NULL) &&
(maxar<=7))
{strncpy(rub,tabl+52,8); rub[8]='\0';
rubr=atof(rub);
if (!rubr)
printf(" Стоимость в %d стpоке задана невеpно\n",i+1);
else
{if (rubr>max)
{max=rubr;
strcpy(namemax,name);
}
}
}
}
}
if (max==0)
puts(" Констpуктоpов для детей до семи лет нет");
else
{ printf("Cамый доpогой констpуктоp для детей до семи лет\n");
printf( " %s стоит %8.0f pублей\n",namemax,max);
}
}