1 / 49

Программирование на языке высокого уровня

Программирование на языке высокого уровня. Для студентов очно-заочной формы обучения. Лекцию читает. Шумова Елена Олеговна доцент кафедры автоматизированных систем обработки информации и управления (АСОИ и У) shumovaeo@list.ru. Лекция № 3. Динамические структуры данных.

carney
Download Presentation

Программирование на языке высокого уровня

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Программирование на языке высокого уровня Для студентов очно-заочной формы обучения

  2. Лекцию читает Шумова Елена Олеговна доцент кафедры автоматизированных систем обработки информации и управления (АСОИ и У) shumovaeo@list.ru

  3. Лекция № 3 Динамические структуры данных

  4. Операция распределения динамической памяти new int a,b; float c, *d; int *p; p = &a; a = 10; *p += 5; cout << “ a = “ << a << “ *p = “ << *p;

  5. Формат операции: указатель = new имя_типа [инициализ-р]; где: имя_типа - имя базового типа или имя типа, определенного пользователем; инициализатор - значение, которое заносится в выделенную память; указатель - содержит возвращаемое значение адреса.

  6. Для выделения памяти под массив используется форма: указатель = new тип_массива; где: тип_массива- тип элементов массива с указанием его размера; указатель - содержит возвращаемое значение адреса первого элемента массива при успешном завершении.

  7. Пример: int *i; // переменная i типа указатель на целое i = new int(0); // операция new выделяет в динамической // памяти участок длиной sizeof (int), заносит в // него значение 0 (ноль);адрес, выделенного // участка, заносит в i.

  8. Пример выделения памяти под массив, заполнения его данными и вывода на экран. #include <iostream.h> #define n 5 void main(void) {int *p, i; if (p = new int[n]) { cout<<"\nВведите данные в массив" for (i=0; i<n; i++) { cout<<"\n p["<<i<<"]="; cin>>*(p+i); }

  9. cout<<"\nВывод значений массива“; for (i=0; i<n; i++) cout<<" p["<<i<<"]="<<*(p+i); } else cout<<"\nПамять не выделена"; }

  10. Операция освобождения динамической памяти delete Операция delete освобождает память в динами-ческой области, распределенную ранее операцией new. Формат операции: delete указатель; для массивов delete [] указатель;

  11. Список Список – это совокупность объектов, называемых далее элементами списка, в которой каждый объект содержит информацию о местоположении связанного с ним объекта.

  12. Например: struct STUD { char fio[25]; char shifr[10]; int matem; int prog; STUD *adr; };

  13. Односвязный (однонаправленный) список Указатель на начало Указ-ль на след.эл-т Данные Указ-ль на след.эл-т Данные Указ-ль на след.эл-т Данные

  14. Кольцевой список Указ-ль на след.эл-т Данные Указ-ль на след.эл-т Данные Указ-ль на след.эл-т Данные

  15. Двусвязный (двунаправленный) список Указ-ль на начало Указ-ль на след.эл-т Данные Указ-ль на пред.эл-т Указ-ль на след.эл-т Данные Указ-ль на пред.эл-т Указ-ль на след.эл-т Данные Указ-ль на пред.эл-т Ука Указ-ль на конец

  16. Пример программы работы со списком #include <iostream.h> #include <stdlib.h> #include <iomanip.h> struct CH { int k; CH *ptr; };

  17. // прототипы функций CH * aadd_sp( CH *); void output ( CH *); CH * del_sp ( CH *); void main() { CH *beg=NULL; char c; while(1) { cout << "\n\n1. Добавление эл-та в список\n"; cout << "2. Вывод списка на экран\n";

  18. cout << "3. Удаление элемента из списка\n"; cout << "4. Выход из программы\n"; cout << "Ваш выбор:"; cin >> c; switch(c) { case '1': beg=aadd_sp(beg); break; case '2': output(beg); break;

  19. case '3': beg=del_sp(beg); break; case '4': return; } } }

  20. // определение ф-ции добавл. эл-та в список CH * aadd_sp( CH *first) { CH *r, *r1; int m; cout << "Введите целое число="; cin >> m; // выделяем динамическую память r = new (CH); if ( r == NULL) { cerr << "Ошибка выделения дин.памяти\n"; exit(1); }

  21. // заносим в дин. память введенное число r->k = m; r->ptr = NULL; if (first == NULL)// список пустой first = r; else { r1 = first; while ( r1->ptr != NULL) r1 = r1->ptr; r1->ptr = r; } return first; }

  22. 1-е обращение к функции r 5 NULL 5 NULL r 5 NULL first

  23. 2-е обращение к функции r first 5 NULL NULL 3 r first NULL 5 3 r1

  24. 3-е обращение к функции first 5 NULL 3 7 NULL r first 7 NULL 5 3

  25. // определение ф-ции вывода сод. списка void output ( CH * first) { CH * r; r = first; if ( r == NULL) cout << "Список пуст\n"; else { cout << "Элементы списка:\n"; while (r != NULL) { cout << setw(5) << r->k; r = r->ptr; } }}

  26. first 7 NULL 5 3 r

  27. // определение функции удаления // последнего элемента в списке CH * del_sp ( CH *first) { CH *p, *p1; p = p1= first; if (p == NULL) cout << "Список пуст. Удалять нечего.\n"; else { while (p->ptr != NULL) // ищем последний эл-т { p1 = p; p = p->ptr; }

  28. // теперь p содержит последний эл-т, // p1 - предпоследний delete p; // удалили последний элемент p1->ptr = NULL; } return first; }

  29. first 5 3 7 NULL p, p1 first 5 3 7 NULL p1 p 5 3 7 NULL first p1 p first 5 3 NULL p1

  30. Стек #include <iostream.h> #include <stdlib.h> #include <iomanip.h> struct CH { int k; CH *ptr; }; CH * aadd_stek( CH *); CH * del_stek ( CH *);

  31. void main() { CH *beg=NULL; char c; while(1) { cout << "\n1. Добавление элемента вcтек\n"; cout << "2. Выборка элемента из стека\n"; cout << "3. Выход из программы\n"; cout << "Ваш выбор:"; cin >> c;

  32. switch(c) { case '1': beg=aadd_stek(beg); break; case '2': beg=del_stek(beg); break; case '3': return; } } }

  33. // определение ф-ции добавления эл-та в стек CH * aadd_stek( CH *first) { CH *r; int m; cout << "Введите целое число="; cin >> m; r = new (CH); if ( r == NULL) {cerr << "Ошибка выделения дин. памяти"; exit(1); } r->k = m; r->ptr = first; return r; }

  34. r 3 r first 2 2 r first 1 1 1 NULL NULL NULL

  35. // определение ф-ции выборки эл-та из стека CH * del_stek ( CH *first) { CH *r; if (first == NULL) cout << "Стек пуст. Выбирать нечего.\n"; else { r=first; first = first->ptr; cout << "Из стека выбран эл-т = " << r->k << endl; delete r; } return first; }

  36. first r 3 3 first first 2 2 2 1 1 1 NULL NULL NULL

  37. Очередь #include <iostream.h> #include <stdlib.h> #include <iomanip.h> struct CH { int k; CH *ptr; }; void aadd_och( CH **, CH **); void del_och ( CH **, CH **);

  38. void main() { CH *pbeg=NULL, *pend=NULL; char c; while(1) { cout << "1. Добавление эл-та в очередь\n"; cout << "2. Выборка эл-та из очереди\n"; cout << "3. Выход из программы\n"; cout << "Ваш выбор:"; cin >> c;

  39. switch(c) { case '1': aadd_och(&pbeg, &pend); break; case '2': del_och(&pbeg, &pend); break; case '3': return; } } }

  40. // определение ф-ции добавления эл-та // в очередь void aadd_och ( CH **pn, CH **pk) { CH *r; int m; cout << "Введите целое число="; cin >> m; r = new (CH); if ( r == NULL) { cerr << "Ошибка выделения дин.памяти\n"; exit(1); }

  41. r->k = m; r->ptr = NULL; if (*pn == NULL) { *pn = r; *pk = r; } else { (*pk)->ptr = r; *pk = r; } }

  42. r NULL 1 *pn *pk *pn r 2 1 NULL NULL *pk r *pn 1 2 NULL *pk r *pn 1 NULL 2 3 *pk

  43. // определение ф-ции выборки эл-та из очереди void del_och ( CH **pn, CH **pk) { CH *p; if (*pn == NULL) cout << "Очередь пуста. Выбирать нечего.\n"; else { p = *pn; cout << "Из очереди выбран эл-т = " << p->k << endl; *pn = p->ptr; // 2-ой эл-т стал 1-ым delete p; // удалили первый эл-т }}

  44. *pn 1 2 NULL 3 *pk *pn 1 2 3 NULL p *pk *pn 2 3 NULL *pk

  45. Тестовые задания Определите результаты работы программ. Пусть в файле prim.txt записаны такие данные: ****1****2****3****4****5 #include <fstream.h> // Задание 1 void main() {char c;int i; ifstream fl("prim.txt"); for (i=1; i <=5; i++) { fl.seekg(4L,ios::cur); fl.get(c); cout << c; } fl.close(); }

  46. Пусть в файле prim.txt записаны такие данные 12345*12345*12345*12345*12345* #include <fstream.h> // Задание 2 void main() {char c;int i; ifstream fl("prim.txt"); while(fl) {fl.seekg(5L,ios::cur); fl.get(c); cout << c; } fl.close(); }

  47. Пусть в файле prim.txt записан такой текст Разработка программного обеспечения #include <fstream.h> // Задание 3 void main() {char st[50]; ifstream fl("prim.txt"); fl.get(st,12,'\n'); cout << st << endl; fl.seekg(0L,ios::beg); fl.getline(st,50,'\n'); cout << st << " "; fl.close(); }

  48. Пусть в файле prim.txt записан такой текст Изучаем программирование #include <fstream.h> // Задание 4 void main() { char st[50]; ifstream fl("prim.txt"); fl.seekg(8L,ios::beg); fl.get(st,30,'\n'); cout << st << endl; fl.clear(!ios::end); fl.seekg(0L,ios::beg); fl.getline(st,50,'\n'); cout << st << " "; fl.close(); }

  49. Пусть в файле prim.txt записаны такие данные *********1*********2*********3 #include <fstream.h> // Задание 5 void main() {char st[10]; ifstream fl("prim.txt"); while(fl) { fl.seekg(6L,ios::cur); fl.get(st,5,'\n'); cout << st << endl; } fl.close(); }

More Related