- •1.Основные компоненты программного обеспечения и их связь с аппаратурой. Ретроспектива развития программирования.
- •2 Этапы решения задач на эвм
- •3 Основные типы данных и структуры данных в программировании
- •3.1.1 Арифметические типы
- •3.1.2 Логический тип
- •3.1.3 Символьный тип
- •4 Методы решения задач программирования
- •5 Разработка алгоритмов Пример 5.8
- •Пример 5.9
- •Пример 5.10
- •6 Кодирование алгоритмов на языке си
- •- Семантические;
- •Тело директивы
- •Имя аргумента
- •Оператор
- •6.4.1 Имена переменных Имена переменных могут состоять из букв (только из латинского алфавита), цифр и символа подчеркивания, приравненного к букве. Начинаться имя должно с буквы.
- •Пример 6.3:
- •6.4.2 Типы и размеры данных
- •6.4.3 Константы
- •Пример 6.4:
- •Пример 6.5:
- •Пример 6.6:
- •Пример 6.7:
- •Пример 6.8:
- •7 Декларации в си
- •8 Операторы в языке си
- •9 Управление в си
- •10 Указатели и массивы
- •Литерные указатели
- •11 Структуры в языке си
- •Структуры, вложенные друг в друга
- •Пример 11.10
- •12 Функции и структура программы
- •Аппарат формальних і фактичних аргументів Приклад 12.4
- •Опис прототипу функції
- •Приклад 12.5
- •13 Передача аргументов
Литерные указатели
Строковая константа, записаная в СИ в виде изображение есть массив литер или символов.
Количество байтов=количество литер+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 |
к |
а |
к |
|
м |
а |
с |
с |
и |
в |
\0 |
Замечание
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
0 1 2 |
|
|
|
|
|
|
|
| |
|
|
|
|
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
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~”Белеет парус ” */
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 только
байт.
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