Работа с массивами и со строками в Си Лекция 2
Массивы Массив состоит из элементов одного и того же типа. Ко всему массиву целиком можно обращаться по имени. Можно выбирать любой элемент массива. Число элементов массива назначается при его определении и в дальнейшем не изменяется. Если массив объявлен, то к любому его элементу можно обратиться следующим образом: указать имя массива и индекс элемента в квадратных скобках. Массивы определяются так же, как и переменные: int a[100]; char b[20]; float d[50]; Индексация всегда начинается с нуля.
Двумерный массив представляется как одномерный, элементами которого так же являются массивы. Например, определение char а[10][20]; задает такой массив. По аналогии можно установить и большее число измерений. Элементы двумерного массива хранятся по строкам, т. е. если проходить по ним в порядке их расположения в памяти, то быстрее всего изменяется самый правый индекс. Например, обращение к девятому элементу пятой строки запишется так: а[5][9] Пусть задан массив int a[2][3]; Тогда элементы массива а будут размещаться в памяти следующим образом: a[0][0], a[0][1], a[0][2], a[1][0], a[1][1], a[1][2].
Имя массива это константа, которая содержит адрес его первого элемента (в примере выше а содержит адрес элемента а[0][0]). Предположим, что a = 1000. Тогда адрес элемента а[0][1] будет равен 1004 (если элемент типа int занимает в памяти 4 байта), адрес следующего элемента а[0][2] 1008 и т. д. Что же произойдет, если выбрать элемент, для которого не выделена память? К сожалению, компилятор не отслеживает данной ситуации. В результате возникнет ошибка и программа будет работать неправильно. В языке Си существует сильная взаимосвязь между указателями и массивами. Любое действие, которое достигается индексированием массива, можно выполнить и с помощью указателей, причем последний вариант будет работать быстрее, но об этом – позже.
Инициализация массива Язык Си позволяет инициализировать массив при его определении. Для этого используется следующая форма: <тип> <имя массива>[. . . ]. . . [. . . ] = {<список значений>}; Примеры: int a[5] = {0, 1, 2, 3, 4}; char ch[3] = {'d', 'e', '9'}; int b[2][3] = {{1, 2, 3}, {4, 5, 6}}; /*{1, 2, 3, 4, 5, 6}*/ В последнем случае: b[0][0] = 1, b[0][1] = 2, b[0][2] = 3, b[1][0] = 4, b[1][1] = 5, b[1][2] = 6.
Символьная информация Символьная константа – это лексема, которая состоит из изображения символов и ограничивающих апострофов. ’A’, ’a’, ’b’, ’ 9’, ’+’, … Специальные символы – управляющие последовательности: ’n’ – перевод строки; ’t’ – горизонтальная табуляция; ’r’ – возврат каретки (курсора) к началу строки; ’\’ – обратная косая черта ; ’’’ – апостроф (одиночная кавычка); ’”’ – кавычка (символ двойной кавычки); ’ ’ – нулевой символ; ’a’ – сигнал-звонок; ’b’ – возврат на одну позицию; ’f’ – перевод (прогон) страницы; ’v’ – вертикальная табуляция; ’? ’ – знак вопроса.
Символьные переменные Описание символьных переменных: char список_имен_переменных; char c, b, l; Для ввода и вывода символьных значений в форматных строках библиотечных функций printf и scanf используется спецификация преобразования %c.
Пример: необходимо вывести предложение, слова в котором разделены одним пробелом, и в конце которого стоит точка. Лишние пробелы необходимо убрать Текст программы : #include <stdio. h> int main() { char z, s; /*z - текущий вводимый символ*/ printf (″n Input the sentence: n″); for (z = s = ′ ′; z != ′. ′; s = z) { /* s – предыдущий символ */ scanf(″%c″, &z); if (z==′ ′ && s==′ ′) continue; printf (″%c″, z); } return 0; }
Внутренние коды и упорядоченность символов В языке принято соглашение, что везде, где синтаксис позволяет использовать целые числа, можно использовать и символы, т. е. данные типа char, которые при этом представляются числовыми значениями своих внутренних кодов. Такое соглашение позволяет сравнительно просто упорядочивать символы, обращаясь с ними как с целочисленными величинами. Таблица ASCII (American Standard Code for Information Interchange) – американский стандартный код для обмена информацией.
Таблица ASCII
Коды управляющих символов (0– 8) Код Обозначение Клавиша Значение 0 nul ^@ Ноль 1 soh ^A Начало заголовка 2 stx ^B Начало текста 3 etx ^C Конец текста 4 eot ^D Конец передачи 5 enq ^E Запрос 6 ack ^F Подтверждение 7 bel ^G Сигнал (звонок) 8 bs ^H Забой (шаг назад)
Пример: Печать десятичных цифр и их шестнадцатеричных кодов #include <stdio. h> int main () { char z; for (z='0'; z<='9'; z++) { if (z =='0' || z=='5') printf("n"); printf(" %c-%x ", z, z); } return 0; } Результат выполнения программы: 0 -30 1 -31 2 -32 3 -33 4 -34 5 -35 6 -36 7 -37 8 -38 9 -39
Пример: Печать латинского алфавита #include <stdio. h> int main () { char z; for (z='A'; z<='Z'; z++) printf("%c", z); return 0; } Результат выполнения программы: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Пример: посчитать сумму десятичных цифр в введенной последовательности символов, заканчивающейся точкой #include <stdio. h> int main () { char z; int s = 0; do { scanf("%c", &z); if ((z>='0')&& (z<='9')) s += z -'0'; } while (z!='. '); printf("%dn", s); return 0; }
Строки и строковые константы В программе строковые константы представляются последовательностью изображений символов, заключенной в двойные кавычки. Примеры: "1234567890" "t List of users" " The string start n and the string finishn " Размещая строку в памяти, транслятор автоматически добавляет в ее конец символ '