Язык программирования C++_2

Посмотреть архив целиком
Глава 2. Адресная
арифметика.
«Структурные» типы
данных
МГТУ им. Н.Э. Баумана
Факультет Информатика и системы управления
Кафедра Компьютерные системы и сети
Лектор: д.т.н., проф.
Иванова Галина Сергеевна
1

2.1 Указатели
Формат:
[][][]
[]*[=];

ptrs

Пример:
1) short

a, *ptrs =&a;

2) const

short *ptrs;

3) short

*const ptrs=&a;

a

a

Неизменяемое значение:
можно ptrs = &b; нельзя *ptrs=10;

Неизменяемый указатель
можно *ptrs=10; нельзя ptrs = &b;
2

Операции над указателями
1. Присваивание

2. Разыменование
Примеры:

Примеры:
int a,*ptri,*ptrj; void *b;

int c, a=5,*ptri=&a;

1) ptri=&a;

void *b=&a;

2) ptri=NULL;

1)

c=*ptri;

3) ptri=ptrj;

2)

*ptri=125;

4) b=&a;

3)

*b=6; ? *(int*)b=6;

5) ptri=b; ? ptri=(int *) b;
Явное переопределение
типа указателя

Явное переопределение
типа указателя
3

Основное правило адресной арифметики
+ n ? + n*sizeof()
Пример:
short a, *ptrs =&a;
1) ptrs++;

Значение
указателя
меняется

2)

Значение
указателя
меняется

ptrs+=4;

3) *(ptrs+2)=2;
Значение
указателя
не меняется!!!
4

Ссылки
int a, // переменная
*ptri=&a, // указатель
&b=a; // ссылка

a=3; ? *ptri=3; ? b=3;

ptri
a=b
4

Итак, ссылка тоже физически представляет собой адрес, но в отличие
от указателя при работе со ссылками не используется операция
разыменования.

5

2.2 Управление динамической памятью (С)
1. Размещение в памяти одного значения
Выделение памяти
void * malloc(size_t size);
Освобождение памяти
void free(void *block);
Пример:
int *a;
if ((a = (int *) malloc(sizeof(int))) == NULL){
printf("Not enough memory.");
exit(1);
}
*a=-244;
free(a);

6

Управление динамической памятью (С)
2. Размещение нескольких значений
Выделение памяти
void * сalloc(size_t n, size_t size);
Освобождение памяти
void free(void *block);
Пример:
int *list;
list = (int *) calloc(3,sizeof(int));
*list=-244;
list
*(list+1)=15;
*(list+2)=-45;

free(list);
4
4 7

4

Управление динамической памятью в С++
1. Одно значение
Операция выделения памяти
=new[()];
Операция освобождения памяти
delete ;
Примеры:
а) int *k;
k = new int;
*k = 85;
б) int *a;
if ((a = new int(-244)) == NULL){
printf("Not enough memory.");
exit(1); }
delete a;
8

Управление динамической памятью в С++ (2)
2. Несколько значений
Операция выделения памяти для n значений:
=new[];
Операция освобождения памяти:
delete [ ] ;
Пример:
int *list;
list = new int [3];
*list=-244;
*(list+1)=15;
*(list+2)=-45;
delete[ ] list;
9

2.3 Массивы
Объявление массива:
[] [] ...[=
{}];
Примеры:
1) int a[4][5];
2) short x[3][4] ={{9,6,-56,0}, {10,3,-4,78}, {-6,8,45,7}};
Примечания:
1) индексы массива всегда начинаются с 0;
2) многомерные массивы в памяти расположены построчно;
3) для адресации элементов массива независимо от способа
описания можно использовать адресную арифметику:

(list+i) ? &(list[i])
*(list+i) ? list[i]
10

Пример программы обработки массива
(Ex2_01)
#include "stdafx.h"
#include
#include
#define N 5
void main(int argc, char* argv[])
{
int a[N][N],i,j,s[N];
for(i=0; i
Многоуровневые ссылки (Ex2_02)
int m[]={1,2,3,4};
int *mp[]={m+3,m+2,m+1,m};

mp[0],*mp
mp[1],*(mp+1)
mp[2],*(mp+2)
mp[3],*(mp+3)

mp

m
1
2
3
4

(list+i) ? &(list[i])
*(list+i) ? list[i]

m[1],*(m+1)
или
mp[0][-2],
*(mp[0]-2),
*(*mp-2),
mp[1][-1],
*(mp[1]-1),
*(*(mp+1)-1)
12

2.4 Строки
Строка Паскаля

4

А

B

C

D

Длина

Строка С (С++)

А

B

C

D

\0

Признак
конца

Строка в С и С++– последовательность символов, завершающаяся
нулем.

13

Объявление строки
Объявление строки
char [] [= ];
Объявление указателя на строку
char *[= ];
Примеры:
а) char str[6];

б) char *ptrstr;
ptrstr=new char[6];

ptrstr
str

в) char str1[5] = {‘A’,’B’,’C’,’D’,’\0’};
г) char str1[ ] = “ABCD”;
д) char *str2 = “ABCD”;

14

Объявление и инициализация массивов строк
Массив указателей на строки
char * [] [= ];
Массив строк указанной длины
char [][Размер 2] [= ];
Примеры:
а) char * mn[4] = {“весна”, “лето”,”осень”,”зима”};
б) char ms[4][7] = {“весна”, “лето”,”осень”,”зима”};

15

Функции, работающие со строками

Библиотеки: string.h, stdlib.h
1) определение длины строки: size_t strlen(char *s);
2) конкатенация строк:
char *strcat(char *dest,const char *src);
3) сравнение строк:
int strcmp(const char *s1,const char *s2);
4) копирование строки src в dest:
char *strcpy(char *dest,const char *src);
5) копирование фрагмента dest строки src:
char *strncpy(char *dest,const char *src,size_t maxlen);
6) поиск символа c в строке s:
сhar *strchr(const char *s, int c);
7) поиск подстроки s2 в строке s1:
char *strstr(const char *s1, const char *s2);
8) поиск токенов в строке:
char *strtok(char *strToken,const char *strDelimit);
16

Функции, работающие со строками (2)
9) преобразование строки в целое число:
int atoi(const char *s);
10) преобразование строки в вещественное число:
double atof(const char *s);
11) преобразование числа в строку:
char *itoa(int value,char *s,int radix);
12) преобразование числа в строку:
char *_gcvt( double value, int digits,
char *buffer );
13) преобразование числа в строку:
char *_ecvt(double value,int count,int *dec,
int *sign);
count - количество цифр, dec,sign – позиции точки и знака
14) преобразование числа в строку:
char *_fcvt(double value,int count,int *dec,int *sign);
17
count - количество десятичных цифр

Пример преобразования числа в строку
#include "stdafx.h"
#include
#include
void main(
{ int
char
int
double

void )
decimal,
sign; // позиция точки и знака
*buffer;
precision = 10;
// точность
source = 3.1415926535;

buffer =_ecvt( source, precision, &decimal, &sign );
printf
("source: %12.10f buffer: '%s' decimal: %d sign:
%d\n",
source, buffer, decimal, sign );
}
source: 3.1415926535 buffer: '3141592654' decimal: 1 sign: 0
18

Пример использования функции strtok (Ex2_03)
#include "stdafx.h"
#include
#include
char string[] = "A string\tof ,,tokens\nand some
more tokens";
char seps[] = " ,\t\n", *token;
void main( void )
{ token = strtok( string, seps );
while( token != NULL )
{ printf( "%s ", token );
token = strtok( NULL, seps );
}
}
Результаты:
A string of tokens and some more tokens
19

Пример использования функций обработки строк
Петров Петр Петрович 1956 => Петров П.П. 50
#include
#include
#include
#include
#include

"stdafx.h"





(Ex2_04)

st

Петров Петр Петрович 1956
stres
.
Петров Петр
Петрович 1956

ptr1

int main(int argc, char* argv[])
{ char st[80],stres[80],strab[80],
*ptr1,*ptr2,*ptr3;
int old;
while ((puts("Input string or Ctrl_Z:"),
gets(st))!=NULL) {
strcpy(stres,st);
ptr1=strchr(stres,' ');
20
*(ptr1+2)='.';

Пример использования функций обработки строк (2)
ptr2=strchr(st,' ');
ptr2=strchr(ptr2+1,' ');
strncpy(ptr1+3,ptr2+1,1);
strncpy(ptr1+4,". \0",3);
ptr3=strchr(ptr2+1,' ');
old=2006-atoi(ptr3+1);
strcat(stres,itoa(old,strab,10));
puts(stres); }
getch(); return 0;
}

st

Петров Петр Петрович 1956
ptr2

ptr2

ptr3

stres
.П . 50
Петров Петр
Петрович 1956

ptr1

21

2.5 Структуры

1. Объявление (Си)
struct [] {}
[]];
Примеры:
а) struct student { char name[22]; char family[22]; int old; };
struct student stud1={“Петр”, “Петров”, 19}, stud[10], *ptrstud;
б) struct { char name[22]; char family[22]; int old; } stud1, stud[10], *ptrstud;
2. Объявление (С++)
typedef struct {} ;
;
Пример:
typedef struct { char name[22]; char family[22]; int old; } student;
struct student stud1={“Петр”, “Петров”, 19}, stud[10], *ptrstud;
Имя переменной типа «структура» не является ее адресом
!
22

Обращение к полям структуры
.
[].
(*). или
->
Примеры:
stud1.name
stud[i].name
(*ptrstud).name ? ptrstud -> name

23

Пример использования структуры (Ex2_05)

Программа определения среднего балла каждого студента и группы в
целом
#include "stdafx.h"
#include
#include
#include
typedef struct {
char name[10];
test
int ball;
} test;
name ball
typedef struct {
char family[22];
test results[5];
}student;
student

family

results[1]
results[3]
results[0]
results[2]
results[4]
24

Пример использования структуры (2)
int main(int argc, char* argv[])
{student stud[10]; int i,n=0; float avarstud,avarage=0;
while (puts("Input names, subjects and marks or end"),
scanf("\n%s",stud[n].family),
strcmp(stud[n].family,"end")!=0) {
for (avarstud=0,i=0; i
2.6 Объединения
union {
}
[];
Пример:
union mem
{
double d;
long l;
int k[2];
};

k[0]

k[1]

l
d

26

2.7 Динамические структуры данных (Ex2_06)
Пример. Стек записей.

#include "stdafx.h"
#include
#include
struct zap {char det[10];

float diam; zap *p; };

int main(int argc, char* argv[])
{
zap a,*r,*q,*f;
a det
r=new zap;
r->p=NULL;
puts("Input strings");
scanf("%s %f\n",r->det,&r->diam);

diam

r
det
Гайка

diam
10

p
?

27

p

Динамические структуры данных (2)
while((scanf("\n%s",a.det)),strcmp(a.det,"end")!=0)
{ scanf("%f",&a.diam);
q=r;
r=new zap;
strcpy(r->det,a.det);
r->diam=a.diam;
r->p=q;
}

r

r
det

a

det

diam

diam

p

q
det
Гайка

p
28

diam
10

p
?

Динамические структуры данных (3)
q=r;
do
{ if(q->diamp;
delete q;
q=r;}
else {
q=q->p;
delete f->p;
f->p=q;}
}
else {
f=q;
q=q->p;}
}
while(q!=NULL);

r

r

f

q

q

29

Динамические структуры данных (4)
q=r;
puts("Result");
if(q==NULL) puts("No information");
else do { printf("%s %5.1f\n",q->det,q->diam);
q=q->p; }
while (q!=NULL);
return 0;
}

30






Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.