Технология программирования

Роль вычислительной техники в информационных системах. Компьютеризация учебного процесса. Технологичность программного обеспечения. Особенности отладки и испытания пpогpамм. Операторы языка СИ. Указатели и структуры данных. Основы доступа к файлам.

Рубрика Программирование, компьютеры и кибернетика
Вид тезисы
Язык русский
Дата добавления 10.05.2015
Размер файла 603,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

#endif

Конструкция #else текст2 не обязательна. Текст1 включается в компилируемый текст только при истинности проверяемого условия, в противном случае (при наличии #else) на компиляцию передается текст2. Если директива #else отсутствует, то весь текст от # if до #endif при ложном условии опускается. Например, в результате выполнения директив:

# if 5+4

текст1

#endif

текст1 всегда будет включен в компилируемую программу.

В директиве #ifndef проверяется обратное условие - истинным считается неопределенность идентификатора, т.е. тот случай, когда идентификатор не был использован в команде #define или его определение было отменено командой #undef.

Условную компиляцию удобно применять при отладке программ для включения или исключения контрольных печатей. Например,

#define DE 1

#ifdef DE

printf ("отладочная печать");

#endif

Таких печатей, появляющихся в программе в зависимости от определенности идентификатора DE, может быть несколько и, убрав директиву #define DE 1, сразу же отключаем все отладочные печати.

Файлы, предназначенные для препроцессорного включения в модули программы, обычно снабжают защитой от повторного включения. Такое повторное включение может произойти, если несколько модулей, в каждом из которых запланировано препроцессорное включение одного и того же файла, объединяются в общий текст программы. Например, такими средствами защиты снабжены все заголовочные файлы стандартной библиотеки. Схема защиты от повторного включения может быть такой:

// файл с именем filename

#ifndef FILE_NAME

// включаемый текст файла filename

#define FILE_NAME 1

#endif

Здесь FILE_NAME - зарезервированный для файла filename препроцессорный идентификатор, который не должен встречаться в других текстах программы.

Для организации мультиветвлений во время обработки препроцессором исходного текста программы введена директива

# elif константное выражение

Структура исходного текста с применением этой директивы такова:

#if

текст_ для_if

#elif выражение1

текст1

#elif выражение2

текст2

#else

текст_ для_случая_else

#endif

Препроцессор проверяет вначале условие в директиве #if , если она ложно (равно 0) - вычисляет выражение 1, если выражение 1 равно 0 - вычисляется выражение2 и т.д. Если все выражения ложны, то в компилируемый текст включается текст_для_случая_else. В противном случае, т.е. при появлении хотя бы одного истинного выражения (в #if или в #elif), начинает обрабатываться текст, расположенный непосредственно за этой директивой, а все остальные директивы не рассматриваются.

Основная литература - 1[143-154]. 3[146-153], 3[176-184].

Контрольные вопросы:

1. В чем существенная разница объединения от структуры?

2. В чем цель введения в программу объединения?

3. От чего зависит точный размер переменной объединения?

4. Какие операции применимы к объединениям?

5. Каким образом можно инициализировать переменную r?

6. Что должен содержать любой исходный Си- файл, использующий хотя бы одну функцию библиотеки ввода - вывода?

7. Каковы типичные случаи применения функции printf?

8. Какие два вида объектов содержит форматный стринг?

9. Каково назначение элементов расположенных между % и литерой - спецификатором?

10. Если типом аргумента arg функции printf является void*, то каков вид печати и от чего зависит представление данных?

11. Каким образом происходит продвижение по списку аргументов для функций с переменной длиной списка?

12. Назовите используемые макросы головного файла < stdarg.h> , позволяющие обрабатывать функции с переменными списком аргументов.

13. В каком случае функция scanf прекращает свою работу?

14. Перечислите литеры форматного стринга, соответствующие им вводимые данные и тип аргумента.

15. Какова одна из самых распространенных ошибок при применении функции scanf?

16. Какое полезное свойство несет в себе средство #include с точки зрения технологии разработки программы?

17. Нужно ли писать разные макроподстановки (например, max) для данных разных типов, как это было бы в случае задания с помощью функций?

18. Что случится, если при определении #define square (x) x * x воспользоваться записью типа square (z+1)?

19. Будет ли ошибкой применение директивы #undef к идентификатору, который ранее не был определен ( или действие его определения уже отменено) ?

20. Почему директива #undef обычно используется в паре с директивой # define?

21. Каким образом можно управлять самим ходом препроцессирования?

22. Что нужно сделать, чтобы застраховаться от повторного включения головного файла?

23. Что позволяют исключать из процесса компиляции директивы, которые управляют условной компиляцией?

Лекция 14. Особенности программирования на языке Си++

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

Структура управления

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

Структура управления языка создают каркас программы. Эти структуры включают в себя принятие решений с помощью операторов if и else, организацию циклов с помощью операторов for, do, while, объединение операторов в группы, а также функции. Внимание, которое следует уделять употреблению этих структур в программе, зависит от того, насколько они облегчают понимание программы в целом, в какой последовательности производятся действия и что чем управляет. По возможности программа должна быть написана так, чтобы структуры передачи управления быстро и просто позволяли читателю понять , что , собственно, осуществляется с помощью программы.

Полезным способом записи программ на любом языке, является первоначальное ее кодирование на достаточно удобном выразительном псевдоязыке, а затем, после того как выясняется ее правильность, перевод на язык программирования (в данном случае - Си).

Следующий шаг состоит во внесении некоторых деталей, этот процесс иногда называют "проектирование сверху-вниз" или "последовательная декомпозиция". Основные управляющие структуры совершенно точно соответствуют нашим потребностям и легко понимаемы при чтении. Такой язык читабелен и точен, семантически близок к обычным языкам программирования, мы можем применить к нему принципы стиля программирования, считая, что он реализуем. Можно даже проверить его работоспособность, т.е. проверить, правильны ли осуществляемые с помощью программы действия в нужные моменты.

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

Структура программы

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

Это - единственный путь повысить надежность программ, а также единственный способ прочитать и понять их. Функции и процедуры являются "модулями" или строительными блоками больших программ. Во многих языках они могут транслироваться по отдельности и эксплуатироваться независимо друг от друга. Большие модули, если они выполняют слишком многочисленные или слишком разные функции, становятся слишком специализированными для широкого применения и их сложно эксплуатировать.

Нередко организация программы, определяющая, что и где должно выполняться, является следствием недостаточного анализа задачи и форматов ввода и вывода данных.

Дисциплину разбиения большой задачи на подходящие малые части называют "структурным проектированием". В рамках этой дисциплины:

- единственный способ написания и сопровождения больших программ - представление их в виде совокупности небольших функций, организованных в виде модулей;

- в модуле должна быть локализована информация о том, как он решает свою задачу;

- каждый модуль должен взаимодействовать только с небольшой группой непосредственных соседей;

- в структуре программы должны находить отражение обрабатываемые данные.

Операции распределения памяти

В языке C++ для управления динамической памятью введены операции new и delete (для массивов new [ ] и delete [ ]). В С для этого применялись в C++, однако новые операции имеют некоторые преимущества.

Переопределение операций new и delete

Стандартные (глобальные) версии операций new и delete можно переопределить или перегрузить, чтобы придать им некоторые дополнительные свойства или обеспечить возможность передачи им дополнительных аргументов. Это бывает полезно при отладке, когда требуется проследить все выделения и освобождения динамической памяти:

#include <stdlib.h>

#include <stdio.h>

////////////////////////////////////////////////////

/ / Переопределение операций new и delete.

//

void* operator new(size_t size)

{

printf("%u bytes requested.\n", size);

return malloc(size);

void operator delete(void *ptr)

{

printf("Delete performed.\n") ;

free(ptr) ;

}

/////////////////////////////////////////////////////////////

// Перегрузка new для выдачи дополнительной информации.

//

void* operator new (size t size, char *file, int line)

printf("%u bytes requested in file %s line %d.\n", size, file, line) ;

return malloc(size);

}

int main(void) {

double *dptr = new double; // Вызывает новую new.

*dptr = 3.14159265;

delete dptr; // Вызывает новую delete.

// Вызов перегруженной new.

dptr = new(_FILE_, _LINE_) double;

*dptr = 1.0;

delete dptr;

return 0;

}

Примечание

Здесь используется механизм определения функций-операций C++. В этом языке можно переопределить или перегрузить практически любое обозначение операции, чтобы, например, можно было применять стандартные знаки арифметических операций к объектам созданных пользователем типов. Об этом мы будем говорить в следующих главах.

Обратите внимание на синтаксис определения и вызова функций-операций new и delete.

Операция new должна возвращать пустой указатель, а ее первым параметром всегда является число затребованных байтов. Компилятор автоматически вычисляет это число в соответствии с типом создаваемого объекта. Возвращаемый указатель приводится к этому типу.

Примечание

Перегруженная версия new может быть, кстати, определена таким образом, что она не будет выделять никакой новой памяти, а будет использовать уже существующий объект. Адрес, где нужно разместить "новый" объект, должен быть одним из дополнительных параметров функции-операции. Эта форма new известна как синтаксис размещения (placement syntax).

Размещающая форма new полезна, если требуется вызвать конструктор класса для уже существующего объекта или организовать какую-то специальную схему управления памятью.

Операция delete имеет тип void, а ее параметр -- void*.

Обработка ошибок

В C++ имеется библиотечная функция 5et_new_handler().Он будет вызываться при любой ошибке выделения памяти.

#include <stdlib.h>

#include <stdio.h>

#include <new.h>

void MyHandler(void)

{

prir-tf("No memory!\n");

exit(l) ;

}

int main(void) {

set_new_handler (MyHandler) ; //Установка обработчика.

return 0;

}

Обработчик ошибок new должен:

· либо возвратить управление, освободив память;

· либо вызвать abort () или exit ();

· либо выбросить исключение bad_alloc или производного класса

Дополнительная литература - 12[10-153],13[60-76].

Контрольные вопросы:

1. Каким образом правильно записывать отдельные операторы?

2. Каковы управляющие структуры программы и как передача управления определяется с помощью циклов и операторов принятия решения?

3. Каким образом необходимо представить данные, чтобы упростить программу?

4. Каким образом структура данных может быть использована для того , чтобы сделать схему управления наиболее ясной?

5. Как сделать программы менее уязвимыми к ошибкам во вводимых данных и что надо выводить для того, чтобы получить максимальный выигрыш от каждого прогона?

Лекция 15. Объектно-ориентированное программирование: основы

Объектно-ориентированный подход включает в себя все стилевые усовершенствования, базирующиеся на понятии "объект". Всякий объект характеризуется своими свойствами и поведением. Объектно-ориентированный подход можно применять как к программированию, так и анализу и дизайну (проектированию программ).

Основное влияние на развитие объектно-ориентированного подхода (ООП) оказали процедурные языки, в том числе и Си. Структурная парадигма была прогрессивной по сравнению с парадигмой программирования на машинном языке, но с другой стороны имела ряд недостатков.

Следующим шагом в развитии технологии программирования стало модульное программирование.

ООП занимает следующую логическую ступень после модульного программирования добавляя к модулю наследование и полиморфизм. Применяя ООП, программист структурирует программу, разделяя ее на ряд высокоуровневых объектов. Каждый объект моделирует определенный аспект решаемой проблемы. Объектно-ориентированное программирование не концентрирует внимание программиста на составлении последовательного списка вызовов процедур для управления процессом выполнения программы. Вместо этого объекты взаимодействуют между собой. Программа, разработанная с помощью объектно-ориентированного подхода, представляет собой действующую модель решаемой проблемы!

Основная литература - 5[387-432].

Дополнительная литература - 14[27-194].

Контрольные вопросы:

1. Три основных принципа ООП?

2. Каким образом в ООП происходит управление работой программы?

3. Что такое объект, его свойства?

4. Каким образом в ООП происходит организация и обработка данных?

5. Чем отличается язык Си от объектно-ориентированного С + +?

Размещено на Allbest.ru


Подобные документы

  • Проектирование программного обеспечения для классифицирования выпускников высшего учебного заведения. Выбор системы управления базами данных и языка программирования. Разработка структуры данных, схема базы данных. Реализация программного комплекса.

    дипломная работа [2,4 M], добавлен 27.03.2013

  • Цели и задачи дисциплины "Технология программирования". Программные средства ПК. Состав системы программирования и элементы языка. Введение в систему программирования и операторы языка Си. Организация работы с файлами. Особенности программирования на С++.

    методичка [126,3 K], добавлен 07.12.2011

  • Проблема надежности программного обеспечения, ее показатели и факторы обеспечения. Методы контроля процесса разработки программ и документации, предупреждение ошибок. Этапы процесса отладки ПО, приемы структурного программирования и принцип модульности.

    презентация [379,5 K], добавлен 30.04.2014

  • Постановка задачи автоматизации учебного процесса колледжа и описание предметной области. Работа с базами данных в Delphi: способы, компоненты доступа к данным и работы с ними. Язык запросов SQL. База данных в Microsoft Access и результаты исследований.

    дипломная работа [55,6 K], добавлен 16.07.2008

  • Изучение общей структуры языка программирования Delphi: главные и дополнительные составные части среды программирования. Синтаксис и семантика языка программирования Delphi: алфавит языка, элементарные конструкции, переменные, константы и операторы.

    курсовая работа [738,1 K], добавлен 17.05.2010

  • Использование средств вычислительной техники в информационных системах. Программно-аппаратные средства, обеспечивающие сбор, обработку и выдачу информации. Модели данных - списки (таблицы), реляционные базы данных, иерархические и сетевые структуры.

    реферат [105,1 K], добавлен 08.11.2010

  • Диагностический анализ системы управления предприятия, его организационной и функциональной структуры. Разработка проекта подсистемы учёта средств вычислительной техники, описание технического обеспечения базы данных. Характеристика программного продукта.

    дипломная работа [7,2 M], добавлен 28.06.2011

  • История развития языков программирования; создание и распространение языка С++; новый подход к разработке объектно-ориентированного программного обеспечения. Применение моделирования предметных областей для структуризации их информационных отражений.

    реферат [29,1 K], добавлен 06.12.2010

  • Анализ методов и средств контроля доступа к файлам. Проблемы безопасности работы с файлами, средства контроля доступа ним. Идеология построения интерфейса, требования к архитектуре. Работа классов системы. Оценка себестоимости программного продукта.

    дипломная работа [2,5 M], добавлен 21.12.2012

  • Сущность языка программирования, идентификатора, структуры данных. Хранение информации, алгоритмы их обработки и особенности запоминающих устройств. Классификация структур данных и алгоритмов. Операции над структурами данных и технология программирования.

    контрольная работа [19,6 K], добавлен 11.12.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.