Разделы презентаций


Адресная арифметика. «Структурные» типы данных

Содержание

2.1 УказателиФормат:[][][] []*[=];Пример: 1) short a, *ptrs =&a;2) const short *ptrs; 3) short

Слайды и текст этой презентации

Слайд 1Глава 2. Адресная арифметика. «Структурные» типы данных
МГТУ им. Н.Э.

Баумана
Факультет Информатика и системы управления
Кафедра Компьютерные системы и сети
Лектор: д.т.н.,

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

Слайд 22.1 Указатели
Формат:
[][][]

[<Изменяемость указателя>]*<Имя>[=<Значение>];

Пример:
1) short a, *ptrs =&a;


2) const short *ptrs;



3) short *const ptrs=&a;

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

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

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

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

Примеры:

int a,*ptri,*ptrj; void

*b;
1) ptri=&a;
2) ptri=NULL;
3) ptri=ptrj;
4) b=&a;
5) ptri=b; ⇒

ptri=(int *) b;

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

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

Примеры:

int c, a=5,*ptri=&a;
void *b=&a;
1) c=*ptri;
2) *ptri=125;
3) *b=6; ⇒ *(int*)b=6;

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

Операции над указателями1. Присваивание  Примеры: int a,*ptri,*ptrj; void *b;1) ptri=&a;   2) ptri=NULL;3) ptri=ptrj;4) b=&a;5)

Слайд 4
Основное правило адресной арифметики
Значение
указателя
меняется
Значение
указателя
не меняется!!!
Значение
указателя
меняется
+ n ⇔ +

n*sizeof()

Пример: short a, *ptrs =&a;
1)

ptrs++;




2) ptrs+=4;



3) *(ptrs+2)=2;
Основное правило адресной арифметикиЗначениеуказателяменяетсяЗначениеуказателяне меняется!!!Значениеуказателяменяется + n ⇔ + n*sizeof()Пример:   short a, *ptrs =&a; 1)

Слайд 5Ссылки
int a, // переменная

*ptri=&a, // указатель
&b=a; // ссылка


a=3; ⇔ *ptri=3; ⇔ b=3;

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

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

Слайд 62.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);
2.2 Управление динамической памятью (С)1. Размещение в памяти одного значенияВыделение памятиvoid * malloc(size_t size); Освобождение памятиvoid free(void

Слайд 7Управление динамической памятью (С)
2. Размещение нескольких значений
Выделение памяти
void * сalloc(size_t

n, size_t size);
Освобождение памяти
void free(void *block);

Пример:

int *list;


list = (int *) calloc(3,sizeof(int));
*list=-244;
*(list+1)=15;
*(list+2)=-45;

free(list);
Управление динамической памятью (С)2. Размещение нескольких значенийВыделение памятиvoid * сalloc(size_t n, size_t size); Освобождение памятиvoid free(void *block);

Слайд 8Управление динамической памятью в С++
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;
Управление динамической памятью в С++1. Одно значениеОперация выделения памяти =new[()];Операция освобождения памятиdelete ;Примеры:а) int *k; k =

Слайд 9Управление динамической памятью в С++ (2)
2. Несколько значений
Операция выделения памяти

для n значений:
=new[];
Операция освобождения памяти:
delete [ ]

указатель>;

Пример:

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

Слайд 102.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]
2.3 МассивыОбъявление массива: [] [] ...[=

Слайд 11Пример программы обработки массива (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

i++){
printf("Input numbers of %2d string:\n",i);
for (j=0; j }
for(i=0;i for (j=0,s[i]=0;j for(i=0; i for (j=0; j printf("sum=%4d\n",s[i]);
}
getch();
}
Пример программы обработки массива (Ex2_01)#include

Слайд 12Многоуровневые ссылки (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)
m[1],*(m+1)
или
mp[0][-2],
*(mp[0]-2),
*(*mp-2),
mp[1][-1],
*(mp[1]-1),
*(*(mp+1)-1)

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

Многоуровневые ссылки (Ex2_02)int m[]={1,2,3,4};int *mp[]={m+3,m+2,m+1,m};mp[0],*mpmp[1],*(mp+1)mp[2],*(mp+2)mp[3],*(mp+3)m[1],*(m+1)илиmp[0][-2],*(mp[0]-2),*(*mp-2),mp[1][-1],*(mp[1]-1),*(*(mp+1)-1)(list+i) ⇔ &(list[i])*(list+i) ⇔ list[i]

Слайд 132.4 Строки
Строка Паскаля

Строка С (С++)
Длина
Признак конца
Строка в С и С++–

последовательность символов, завершающаяся нулем.
2.4 СтрокиСтрока Паскаля          Строка С (С++)ДлинаПризнак концаСтрока в

Слайд 14Объявление строки
Объявление строки
char [] [= ];
Объявление указателя на

строку
char *[= ];

Примеры:
а) char str[6];

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





в) char str1[5] = {‘A’,’B’,’C’,’D’,’\0’};
г) char str1[ ] = “ABCD”;
д) char *str2 = “ABCD”;
Объявление строкиОбъявление строкиchar [] [= ]; Объявление указателя на строкуchar *[= ]; Примеры:а) char str[6];

Слайд 15Объявление и инициализация массивов строк
Массив указателей на строки
char * [

1>] [= ];
Массив строк указанной длины
char [][Размер 2] [=

<Значение>];

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

Слайд 16Функции, работающие со строками
Библиотеки: 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);
Функции, работающие со строкамиБиблиотеки: string.h, stdlib.h1) определение длины строки: size_t strlen(char *s); 2) конкатенация строк: 		char *strcat(char

Слайд 17Функции, работающие со строками (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);
count - количество десятичных цифр
Функции, работающие со строками (2)9) преобразование строки в целое число:		int atoi(const char *s); 10) преобразование строки в

Слайд 18Пример преобразования числа в строку
#include "stdafx.h"
#include
#include

void main( void

)
{ int decimal, sign; // позиция точки

и знака
char *buffer;
int precision = 10; // точность
double 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

Пример преобразования числа в строку#include

Слайд 19Пример использования функции 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
Пример использования функции strtok (Ex2_03)#include

Слайд 20Пример использования функций обработки строк
Петров Петр Петрович 1956 => Петров

П.П. 50

(Ex2_04)

#include "stdafx.h"
#include
#include
#include
#include

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,' ');
*(ptr1+2)='.';

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

stres

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

st

ptr1

.

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

Слайд 21Пример использования функций обработки строк (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;
}

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

stres

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

st

ptr1

.

ptr2

ptr2

П

.


ptr3

50


Пример использования функций обработки строк (2)	 ptr2=strchr(st,' ');    	 ptr2=strchr(ptr2+1,' ');	 strncpy(ptr1+3,ptr2+1,1); 	 strncpy(ptr1+4,

Слайд 222.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;

Имя переменной типа «структура» не является ее адресом !

2.5 Структуры1. Объявление (Си)struct [] {}

Слайд 23Обращение к полям структуры
.
[].
(*).

или

<Имя указателя> -> <Имя поля>

Примеры:

stud1.name
stud[i].name
(*ptrstud).name ⇔ ptrstud -> name

Обращение к полям структуры.[].(*). или

Слайд 24Пример использования структуры (Ex2_05)
Программа определения среднего балла каждого студента и

группы в целом
#include "stdafx.h"
#include
#include
#include
typedef struct {

char name[10];
int ball;
} test;
typedef struct {
char family[22];
test results[5];
}student;



test

student

















name ball

family

results[0]

results[1]

results[2]

results[3]

results[4]

Пример использования структуры (Ex2_05)Программа определения среднего балла каждого студента и группы в целом#include

Слайд 25Пример использования структуры (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<3; i++)
{ scanf("\n%s %d",stud[n].results[i].name,
&stud[n].results[i].ball);
avarstud+=stud[n].results[i].ball;}
printf("Average:%s=%5.2f\n",
stud[n].family,avarstud/3);
avarage+=avarstud;
n++; }
printf("Group average mark=%5.2f\n",avarage/n/3);
getch();
return 0;}
Пример использования структуры (2)int main(int argc, char* argv[]){student stud[10]; int i,n=0; float avarstud,avarage=0; while (puts(

Слайд 262.6 Объединения
union {

}

[<Список переменных [и значений]>];

Пример:

union mem
{
double d;
long l;
int k[2];
};






d

l

k[0]

k[1]

2.6 Объединенияunion {      }

Слайд 272.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;
r=new zap;
r->p=NULL;
puts("Input strings");
scanf("%s %f\n",r->det,&r->diam);





r

det diam p


Гайка

10




det diam p

a


Слайд 28Динамические структуры данных (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

det diam p




det diam p

a


Гайка

10


r

det diam p

q




Слайд 29Динамические структуры данных (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

q





r

q



f

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

Слайд 30Динамические структуры данных (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;
}


Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика