- •Содержание
- •Глава 1. Описание языка c ......................................................................... 5
- •Глава 2. Описание языка fortran ....................................................... 38
- •Глава 3. Решение задач на языках c и fortran ................................ 70
- •Глава 1. Описание языка c
- •1.1. Структура c-программы
- •1.2. Скалярные типы данных и константы, строковые константы
- •1.3. Описание скалярных переменных. Директива #define
- •1.4. Операции. Выражения
- •1.5. Стандартные математические функции
- •1.6. Ввод-вывод
- •Int printf ( строка формата [ , список вывода ] )
- •Int scanf ( строка формата , список ввода )
- •1.7. Метки, оператор goto, условные конструкции, оператор break, функция exit
- •If ( логическое выражение ) оператор/блок [ else оператор/блок ]
- •1.8. Циклические конструкции
- •1.9. Указатели, адресная арифметика
- •1.10. Массивы
- •1.11. Функции
- •1.12. Классы памяти. Общие правила описания. Оператор typedef
- •1.13. Строковые переменные, ввод-вывод строк, стандартные функции обработки строк. Функции проверки символов
- •Int sprintf(char* s,char* формат [ , список вывода ] )
- •1.14. Макроопределения
- •1.15. Внешние файлы
- •Int fclose(file* указатель на файл )
- •Int feof(file* файл )
- •1.16. Структуры, объединения, битовые поля
- •1.17. Динамическое распределение памяти
- •1.18. Графика
- •Глава 2. Описание языка fortran
- •2.1. Структура fortran-программы
- •2.2. Типы данных. Константы
- •2.3. Описание переменных, правила умолчания, операторы
- •Implicit тип ( буквы ) , ...
- •2.4. Оператор присваивания. Операции
- •2.5. Стандартные математические функции
- •2.6. Ввод-вывод
- •2.7. Оператор соntinue. Операторы перехода. Условные операторы
- •If (логическое выражение)оператор
- •If (арифметическое выражение)метка1,метка2,метка3
- •2.8. Операторы цикла
- •2.9. Функции loc, locfar, locnear
- •2.10. Массивы
- •2.11. Подпрограммы subroutine, function и interface
- •Intrinsic список имен
- •2.12. Общие области, подпрограмма block data. Оператор equivalence
- •2.13. Символьные переменные
- •2.14. Операторные функции
- •2.15. Внешние файлы
- •2.16. Структуры
- •2.17. Динамические массивы
- •2.18. Графика
- •Глава 3. Решение задач на языках c и fortran
- •Задача 1. Вывод натурального числа
- •Задача 2. Сумма ряда
- •Задача 3. Медленная сортировка
- •Задача 4. Быстрая сортировка
- •Задача 5. Слова
- •Задача 6. График
- •Задача 7. Кубическое уравнение
- •Задача 8. Собственное число
- •Комментарии к задачам
1.13. Строковые переменные, ввод-вывод строк, стандартные функции обработки строк. Функции проверки символов
Символьные строки в языке С - это массивы типа char, которые заканчиваются нуль-символом '\0' (отметим, что в языке PASCAL есть полный аналог таких строк - открытые строки или null-terminated strings). Строковые константы (последовательности символов в “”) размещаются в статической памяти и всегда заканчиваются нуль-символом, который явно не задается. Сама строковая константа является константой-указателем типа char* . Строковую переменную можно описать в форме:
сhar имя [ длина ] = “ строка “ ;
При этом длину строки можно опустить, память будет выделена по фактической длине строковой константы + 1 байт для нуль-символа. Поскольку имя строки является указателем, возможен альтернативный вариант описания:
char* имя = “ строка “ ;
Различие между двумя описаниями состоит в том, что имя массива есть константа-указатель, ее значение нельзя изменить, а во втором случае описана переменная-указатель, которая лишь первоначально указывает на место в памяти, занимаемое константой “ строка “, но впоследствии может принять любое другое значение.
Массив символьных строк можно описать в виде :
char* имя [ длина ] = { “ строка1 “ , “ строка2 ” , ... } ;
или
char имя [ длина массива ] [ длина строки ] = { “ строка1 “ , “ строка2 “ ,
... };
Все элементы массива строк в любом случае являются указателями на соответствующую строку, но в первом случае под каждый элемент массива будет отведена память по фактической длине строковой константы, а во втором - количество байт, равное описателю длина строки + 1 байт. Поэтому говорят, что первое описание создает непрямоугольный массив строк, а второе - прямоугольный.
Для ввода и вывод строк служат функции
char* gets(char* строка )
int puts(char* строка )
Функция gets читает строку до символа '\n' и заменяет его нуль-символом. Она возвращает адрес введенной строки или нулевой адрес NULL при возникновении ошибки. Функция puts выводит символы строки до достижения нуль-символа, который заменяется на '\n', возвращает 0 при успешном завершении или EOF ( число, равное -1 ) при возникновении ошибки. Функция gets “не интересуется” размером вводимой переменной и записывает в память, начиная с адреса строка, все введенные символы, так что ввод слишком длинной строки, вероятнее всего, приведет к порче значений других переменных, расположенных в памяти после вводимой переменной; кроме того, в этом случае в переменной не уместится нуль-символ и она будет непригодна для дальнейшего использования. Функция puts также устроена весьма просто и выводит сколь угодно большое количество символов, пока не встретит в памяти нулевой байт или не выйдет за пределы доступной памяти.
Для ввода и вывода строк можно использовать и функции scanf и printf с форматом %s. Функция scanf считывает строку до первого пробела или специального символа. Функция printf в отличие от puts не осуществляет переход на новую строку. Полное описание функций scanf и printf имеет вид:
int scanf(char *format, список ввода );
int printf(char *format [ , список вывода ] );
Эти функции можно использовать не только со строкой формата, заданной строковой константой, но и с любой строковой переменной, что делает форматный вывод весьма гибким.
Для работы со строками существует специальная библиотека функций, прототипы которых описаны в файле string.h . Эта библиотека включает:
1) char* strcat(char* s1,char* s2) - конкатенирует строку s2 в конец строки s1, возвращает s1;
2) char* strncat(char* s1,char* s2,size_t maxlen) - конкатенирует не более maxlen символов строки s2 в конец строки s1, возвращает s1 (здесь и далее size_t - это тип размера объектов в языке С, он определен как typedef unsigned size_t; );
3) size_t strlen(char* s) - возвращает длину строки s не считая нулевого символа;
4) char* strcpy(char* s1,char* s2) - копирует s2 в s1, возвращает s1;
5) char* strncpy(char* s1,char* s2,size_t maxlen) - копирует не более maxlen символов s2 в s1, возвращает s1;
6) int strcmp(char* s1,char* s2) - возвращает разницу в ASCII кодах первой пары несовпадающих символов строк s1 и s2;
7) int strncmp(char* s1,char* s2,size_t maxlen) - strcmp, учитывающая не более maxlen первых символов.
8) int stricmp(char* s1,char* s2) - strcmp, не учитывающая регистр;
9) int strncmpi(char* s1,char* s2,size_t maxlen) - strncmp, не учитывающая регистр;
10) char* strlwr(char* s) - переводит строку s в нижний регистр, возвращает указатель на s;
11) char* strupr(char* s) - переводит строку s в верхний регистр, возвращает указатель на s;
12) char* strchr(char* s,int c) - возвращает указатель на первое вхождение символа c в строку s или NULL;
13) char* strrchr(char* s,int c) - возвращает указатель на последнее вхождение символа c в строку s или NULL;
14) size_t strspn(char* s1,char* s2) - возвращает длину начального сегмента s1, который содержит только символы из строки s2;
15) size_t strcspn(char* s1,char* s2) - возвращает длину начального сегмента s1, который не содержит ни одного символа из s2;
16) char* strdup(char* s) - распределяет память и возвращает указатель на копию строки s;
17) char* strset(char* s,int c) - заполняет строку s символом c, возвращает s;
18) char* strnset(char* s,int c,size_t n) - заполняет не более n первых символов строки s символом c, возвращает s;
19) char* strpbrk(char* s1,char* s2) - возвращает указатель на первое вхождение какого-либо символа строки s2 в строку s1 или NULL;
20) char* strrev(char* s) - переставляет символы строки s в обратном порядке, возвращает s;
21) char* strstr(char* s1,char* s2) - возвращает указатель на первое вхождение подстроки s2 в строку s1 или NULL.
Для преобразования чисел и других данных в строку удобно пользоваться функцией sprintf , описанной в файле stdio.h :
