Язык программирования C++_2 (Лекции по С++)

2013-10-10СтудИзба

Описание презентации

Файл "Язык программирования C++_2" внутри архива находится в следующих папках: Лекции по С++, Лекции. Презентация из архива "Лекции по С++", который расположен в категории "". Всё это находится в предмете "информатика" из 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
4
7

Управление динамической памятью в С++
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>] [<Размер2>] ...[=
{<Список значений >}];
Примеры:
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; iprintf("Input numbers of %2d string:n",i);
for (j=0; j}
for(i=0;ifor (j=0,s[i]=0;jfor(i=0; ifor (j=0; jprintf("sum=%4dn",s[i]);
}
getch();
}
11

Многоуровневые ссылки (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

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

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

Объявление и инициализация массивов строк
Массив указателей на строки
char * <Имя>[<Размер 1>] [= <Значение>];
Массив строк указанной длины
char <Имя>[<Размер 1>][Размер 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:
%dn",
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 stringtof ,,tokensnand some
more tokens";
char seps[] = " ,tn", *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,' ');
*(ptr1+2)='.';
20

Пример использования функций обработки строк (2)
ptr2=strchr(st,' ');
ptr2=strchr(ptr2+1,' ');
strncpy(ptr1+3,ptr2+1,1);
strncpy(ptr1+4,". ",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<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.2fn",
stud[n].family,avarstud/3);
avarage+=avarstud;
n++; }
printf("Group average mark=%5.2fn",avarage/n/3);
getch();
return 0;}
25

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 %fn",r->det,&r->diam);
diam
p
r
det
Гайка
diam
10
p

27

Динамические структуры данных (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
Гайка
diam
10
p

p
28

Динамические структуры данных (3)
q=r;
do
{ if(q->diam<1)
{ if(q==r) {
r=r->p;
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.1fn",q->det,q->diam);
q=q->p; }
while (q!=NULL);
return 0;
}
30

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5224
Авторов
на СтудИзбе
429
Средний доход
с одного платного файла
Обучение Подробнее