Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Литерные указатели






Строковая константа, записаная в СИ в виде изображение есть массив литер или символов.

Количество байтов=количество литер+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*/

 

с   у к а з а т е л е м \0

p_str

 

к а к   м а с с и в \0

s_str

 

Замечание

s_str:

- элементы s_str могут изменяться.

- s_str всегда ссылается на одно и то же место в памяти.

 

p_str:

- при изменении указателя он будет ссылаться на что либо другое.

 

 

!!! В Си нет оператора для работы с массивом в целом (=> недопустимо s_str изменить).

 

10.6 Массивы указателей.

       
 
. . . рис.4     схема . . .
 
. . . схема     рис.4 . . .


 

 
 
 

 

 
 
 

схема
Рис.4

 

 

 
 
схема


Рис.4

 

 

Удобно в Си текст, представлять массивом указателей.

 

 

Пример 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]={”ошибка”, ”янв.”, ”февр.”};

посчитает

компилятор обязательно задается

 

 

о ш и б к а \0     я н в . \0           ф е в . \0            

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);

 

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.031 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал