Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Литерные указатели
Строковая константа, записаная в СИ в виде изображение есть массив литер или символов. Количество байтов=количество литер+1 (для символа ’\ Ф ’) ПРИМЕР 10-6 Char * pstr Pstr=’ С указатели ’ Строка не копируется, а только указатели на массив. ПРИМЕР 10-7 Char s _str[] =” как массив ” Char *p_str=” с указателем” s_str ---Элементы этого массива могут изменяться, но ссылается в оперативную память p_str --- Это указатель инициализированный В Си нет операторов для работы с массивом в целом -> недопустимо
10.5 Литерные указатели.
Строковая константа есть массив литер (символов). Количество байтов равно количеству литер +1 (для символа окончания строки \0).
Пример 10.6 char *pstr; pstr=”с указателем”:
! Различие между декларациями строк как массива и с помощью указателя: Пример 10.7 char s_str[]=”как массив”; /*11dyte*/ char p_str =” с указателем”; / *13byte*/
p_str
s_str
Замечание s_str: - элементы s_str могут изменяться. - s_str всегда ссылается на одно и то же место в памяти.
p_str: - при изменении указателя он будет ссылаться на что либо другое.
!!! В Си нет оператора для работы с массивом в целом (=> недопустимо s_str изменить).
10.6 Массивы указателей.
Удобно в Си текст, представлять массивом указателей.
Пример 10.9 #define KL 100 int n1, n2; char *v[KL]; char *temp; int k; … temp=v[n1]; v[n1]=v[n2]; v[n2]=temp; k=KL; while (k--> 0) printf(“%s\n”, *v++); 10.7 Инициализация массива указателей Пример 10.10: Char*m_name[]= { ”ошибка”, ”январь”, ”февраль”, ”март”, ”апрель”, ”июнь”, ”июль”, ”август”, ”сентябрь”, ”октябрь”, ”ноябрь”, ”декабрь” }; /* обращаемся по номеру месяца */ (n< 1 || n> 12)? m_name[0]: m_name[n]; 10.8 Многомерные массивы Пример 10.11: /* представляется как массив массивов */ int mpr[2][9]= { /* даты */ {1, 7, 8, 1, 2, 9, 24, 7, 8}, /* месяцы */ {1, 1, 3, 5, 5, 5, 8, 11, 11} } Это даты праздничных дней Украины не привязанных к Церковному календарю. Обращение к элементам двумерного массива. …………………………………………………………………………… d_may1=mpr[0][3]; m_may1=mpr[1][3]; 10.9 Указатели вместо многомерных массивов Пример 10.12: int a[3][4] /* массив массивов */ 0 1 2 3
Int*b[3] 0) 1) 2)
Массив а занимает 24 байта (2 байта * количество элементов) Массив b занимает первые 6 байт. У массива b не выделена пока память под собственно элементы. Это выделение может быть выполнено 2 способами: 1) при инициализации; 2) либо явно динамическим захватом памяти (см. 2 семестр); Преимущество 2-го способа состоит в том, что строки в массиве b могут быть различной длины. Это преимущество используется в литерных массивах. Пример 10.13: Берем из примера 10.10 первые 3 Элемента массива и выделяем под них память 2 способами. 1) /* объявление массива строк как массива массивов char
m_name1[][10]={”ошибка”, ”янв.”, ”февр.”}; посчитает компилятор обязательно задается
10 20 30
Количество не использованных байтов: 12 (40%) 2) char*m_name2[]={”ошибка”, ”янв.”, ”фев.”};
0) ошибка\0
1) янв.\0
2) фев.\0
Библиотека для работы со строками string.h 1 strlen(s), где s – строка Определяет длину строки (информационной части, без \0) int l; l=strlen(“пример”); /* l=6 */ 2 strcat(s1, s2) /* s1+=s2 */ s2 конкатенируется к s1(s1 – меняется, s2 – не меняется) char a[]=”Белеет ”, /* a~Белеет */ b[]=”парус ”; /* b~парус */ strcat(a, b); /* a~Белеет парус */
3 strcpy(s1, s2) Копирование строки s2 в s1 (s1 – меняется, s2 – не меняется) char a[]=”Белеет ”, b[]=”парус ”; char *c; strcpy(c, a); /* c~”Белеет ” */ strcat(c, b); /* c~”Белеет парус ” */ 4 strcmp(s1, s2) Сравнение строк (в лексико-графическом порядке) /* Происходит посимвольное вычитание ASCII кодов */
0, если s1=s2 =0, иначе (разница в коде): strcmp= < 0, s1< s2 > 0, s1> s2 Пример: int r1, r2, r3; char a[]=”ПО96а”, b[]=”ПО96б”ж char *c; strcpy(c, a); /* c~”ПО96а” */ r1=strcmp(a, c); /* r1=0 */ r2=strcmp(a, b); /* r2< 0 */ r3=strcmp(b, c); /* r3> 0 */
Библиотека проверки символов ctype.h Тип всех функций - int. Все функции отвечают на вопрос в соответствии с названием функции: ”Являются ли аргумент этой функции тем, что сформулировано в названии? ” Результат: 1 или 0. Тип аргумента – int!!! Хотя все функции анализируют символы, но символьная константа имеет тип int.(т.к. в константе могут быть символы, которые в ASCII кодируются 2 байтами, а char только 1 байт. isdigit(c) – цифра (0..9) (если цифра, то вернет 1, иначе 0) isalpha(c) – буква (латынь) isalnum(c) – буква (латынь) или цифра isupper (c) – прописная буква islower (c) – строчная буква Пример: int c1=’9’, c2=’s’, c3=’G’, c4=’y’, c5=’=’; int r1, r2, r3, r4, r5; r1=isdigit(c1); r1=1 r2=isalpha(c2); r2=1 r3=isalnum(c1); r3=1 r3=isalnum(c5); r3=0 r4=isupper(c3); r4= 1 r5=islower(c4); r5=1 Преобразование символов. 1) atoi(s) - выполняет преобразование строки в int 2) atol(s) - выполняет преобразование строки в длинный int Строка s – это аргумент содержащий изображение этого числа. Результатом является целое или длинное целое число. Пример: int i; long l; i=atoi (”1996”); i=1996 l=atol(”1999000”); l=1999000
11 СТРУКТУРЫ В ЯЗЫКЕ СИ
Структура языка Си- это эквивалент записи. Структура - одна или несколько переменных возможно различных типов, которые сгрупированы под одним именем.
ПР.11.1 /* строка таблицы */
Ф.И.О МАТЕМ ФИЗ Р.ЯЗ
Элементы разных типов
ПР.11.2 Представление /* точка А в пространстве */ можно выполнить с помощью структуры: xa ya za
Элементы массива безликие. Элементы структуры имеют имена.
ПР.11.3 /* окружность на плоскости */
x0 y0 R
11.1 Объявление структурного типа в языке СИ
синтаксис: struct [< имя = тег> ] {< декларация..члена1>; ... < декларация члена N>; }; - Декларация структуры
= тип - Если после слова struct указать имя (tag), то это есть имя типа, кот. можно далее пользоваться как именем любого другого базового типа (как float, int). - Имена тегов и членов могут совпадать с именами других переменных. - Объявление структурного типа – это образец, а не декларация данных (память не выделяется).
- ПР.11.4 /* для 11.2 */
Struct без тега struct point c тегом { int xa; { int xa; int ya; int ya; int za; int za; }; };
ПР.11.5 /* для 11.3 */
Struct Struct circle { float x0; { float x0; float y0; float y0; float r; float r; }; };
11.2. Декларация переменных структурного типа.
I сп < декларация типа структ. > < список переменных>; 1 оператор
II сп struct < тег> < список переменных>; 2 оператора
ПР.11.6 /* прямая: через точки А и В */
Struct struct point a, b; { int xa; см.11.4 int ya; int za; } a, b;
Инициализация:
Переменные структурного типа можно инициализировать как и все другие.
ПР.11.7 /* окружность с центром (2; 3) и радиусом 5.5 */
Без тега Struct { float x0; float y0; float r; } pr = {2.0, 3.0, 5.5}; c тегом struct circle pr = {2.0, 3.0, 5.5}
Доступ к элементам структуры
< имя структуры>.< имя члена>
Пример 11.8 /*расстояние от начала координат до точки pt*/ struct {float x; float y; } pt={20.0, 15.0}; double dist; dist=sqrt((double)pt.x*pt.x+(double)pt.y*py.y); printf(“От начала координат”); printf(“до точки (%f, %f)”, pt.x, pt.y); printf(“расстояние %f”, dist);
|