Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_YaVU.docx
Скачиваний:
19
Добавлен:
12.02.2015
Размер:
4.4 Mб
Скачать

Вопрос №1. Классификация языков программирования (машинно-зависимые, машинно-независи­мые). Алгоритм и способы его записи (словесная, графическая, на языке про­граммирования), графическое представле­ние по ГОСТ 19.701-90, диаграмма Нэсси-Шнейдермана. Базовые конструкции структурного программирования: цепочки, ветвления, циклы. Синтез алгоритмов на основе базовых конструкций. Теорема структур.

Машинно-зависимые языки– это те языки, которые можно применять на одной ЭВМ или на ограниченном подмножестве машин с одинаковой подгруппы.

  1. Машинные языки (нулевого уровня);

  2. Ассемблерные языки (первого уровня); 1:1 – одна ассемблерная команда после трансляции порождает одну машинную команду.

  3. Макроассемблеры (второго уровня) 1:n.

Машинно-независимые языки– универсальные, можно использовать на любой ЭВМ.

  1. Процедурноориентированные (третьего уровня); они требуют детальной разработки алгоритма решения.

  2. Проблемноориентированные (четвертого уровня) – языки «заполни бланк»; пользователь решает какую задачу нужно решить и какие ввести начальные данные.

  3. Универсальные языки (пятый уровень) – PL1, Ада и др.

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

ЯВУ – языки проблемных программистов, но эффективность языка ВУ на 2-10% ниже.

Алгоритм – это точные предписания о выполнении в определенном порядке некоторой последовательности действий, приводящих к решению всех задач данного класса.

Свойства:

  1. Определенность предписаний и однозначность результатов;

  2. Массовость (алгоритм должен быть ориентирован на целый класс задач);

  3. Дискретность (дробление на короткие этапы);

  4. Результативность.

Способы записи алгоритма:

словесный, графический (с помощью схем), псевдокод, на языке программирования.

Графический способ:

1) используя схемы по ГОСТ 19.701-90.

Существуют основные обозначения для:

  • Блока ввода-вывода;

  • Операционного блока;

  • Решающего блока;

  • Циклической конструкции;

  • Потока управления.

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

2) Используя диаграммы Нэсси-Шнейдермана, которые были предложены в сочетании со структурным программированием как средство борьбы с проблемой клубка спагетти, присущей схемам алгоритмов. Эта диаграмма заменяет одномерное представление вложенных операторов двумерным. Тем не менее, по мере роста сложности программного кода появляются проблемы отображения, поскольку элементы диаграммы быстро становятся все меньше и меньше.

Существуют основные обозначения для:

  • Заголовок и тело программы;

  • Оператора;

  • Условной конструкции;

  • Цикла

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

Запись алгоритма с помощью псевдокода.

Этот способ записи является промежуточным и используется перед записью алгоритма в терминах выбранного языка программирования.

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

ГОСТ 19.701-90

http://cert.obninsk.ru/gost/282/282.html

Теорема структур:

  • В 1965 г. профессор Дейкстра стал пропагандировать стиль программирования без goto(без оператора безусловного перехода).

  • В течении короткого времени этот стиль широко распространился, и в 1966 г. два математика Байм и Якснима доказали теорему структур: Любую программу можно составить, используя только три структуры.

Вопрос №2. Общие сведения о структуре языка про­граммирования. Понятия алфавита, син­таксиса и семантики языка. Лексемы языка (идентификаторы, константы, ключевые слова, знаки операций, разделители). Вы­ражения и операторы.

В формулировке слово «структура» - базовая конструкция программирования:

  1. Следование – конструкция, которая представляет собой последовательность выполняемых операторов.

  2. Ветвление – эта конструкция задает выполнение либо одного, либо другого оператора в зависимости от выполнения какого-либо условия.

  3. Циклическая – задает многократное выполнение оператора.

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

Пример:.

  • ветвление существует двух видов: на две ветви или на произвольное количество ветвлений

  • циклы существуют трех видов:

  • С предусловием (while).

  • С постусловием (do while), тело цикла будет выполнено хотя бы один раз.

  • С заранее заданным числом повторов тела цикла (for).

Язык С++ определяется заданием:

  • Алфавита(основные неделимые знаки с помощью которых пишутся тексты);

  • Синтаксиса(свод правил, по которым строятся элементы языка);

  • Семантики(правила, по которым определяются смысл и правило использования элементов языка).

В тексте на любом естественном языке можно выделить четыре основных элемента: символы, слова, словосочетания и предложения. Подобные элементы содержит и алгоритмический язык, только слова называют лексемами, словосочетания – выражениями, а предложения – операторами. Лексемы образуются из символов, выражения - из лексем и символов, а операторы – из символов, выражений и лексем (рис.):

Алфавит языка, или его символы – это основные неделимые знаки, с помощью которых пишутся все тексты на языке.

Лексема, или элементарная конструкция, - минимальная единица языка, имеющая самостоятельный смысл.

Выражениезадает правило вычисления некоторого значения.

Операторзадает законченное описание некоторого действия.

Состав алфавита языка С/С++:

  • арабские цифры от 0 до 9;

  • прописные и строчные латинские буквы и знак подчеркивания;

  • специальные знаки:

“ { } , ¦ [ ] ( ) + - / % * . \

‘ : ? < = > ! & # ~ ; ^

  • пробельные символы: пробел, символы табуляции, перехода на новую строку.

Из символов алфавита формируются лексемыязыка:

  • идентификаторы;

  • ключевые (зарезервированные) слова;

  • знаки операций;

  • константы;

  • разделители (скобки, точка, запятая, пробельные символы);

  • комментарии.

Границы лексем определяются другими лексемами, такими, как разделители или знаки операций.

Идентификатор – это имя программного объекта.

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

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

  • Пробелы внутри имен не допускаются.

  • Длина идентификатора не ограничена.

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

Правила:

  • идентификатор не должен совпадать с ключевыми словами и менами используемых стандартных объектов языка;

  • не рекомендуется начинать идентификатор с символа подчеркивания, поскольку они могут совпасть с именами системных функций или переменных;

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

Ключевые слова– это зарезервированные идентификаторы, которые имеют специальное значение для компилятора. Их можно использовать только в том смысле, в котором они определены.

Знак операции– это один или более символов, определяющих действие над операндами.

  • Внутри знака операции пробелы не допускаются.

  • Операции делятся на унарные, бинарные и тернарную по количеству участвующих в них операндов.

  • Большинство стандартных операций может быть переопределено.

Константаминазывают неизменяемые величины.

  • Различаются целые, вещественные, символьные и строковые константы.

  • Компилятор, выделив константу в качестве лексемы, относит ее к одному из типов по ее внешнему виду.

Форматы констант, соответствующие каждому типу, приведены в таблице.

  • Если требуется сформировать отрицательнуюцелую или вещественную константу, то перед константой ставится знак унарной операции изменения знака (-).

  • Вещественная константа в экспоненциальном формате представляется в виде мантиссыипорядка.

  • Символьные константы, состоящие из одного символа, занимают в памяти 1 байт и имеют стандартный тип char. Двухсимвольные – 2 байта и имеют типint.

Вопрос №3. Понятие типа данных. Ос­новные типы данных. Представление объ­ектов различных типов данных в памяти ЭВМ. Описание переменных основных типов. Преобразование типов.

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

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

Тип данных определяет:

  • внутреннее представлениеданных в памяти компьютера;

  • множество значений, которые могут принимать величины этого типа;

  • операции и функции, которые можно применять к величинам этого типа.

Все типы языка С++ можно разделить на основныеисоставные.

  • Шесть основных типов данных для представления целых, вещественных, символьных и логических величин.

  • На основе этих типов программист может вводить описание составных типов. К ним относятся массивы, перечисления, функции, структуры, ссылки, указатели, объединения и классы.

Свойства основных типов данных определяется компилятором.

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

  • int (целый);

  • char (символьный);

  • wchar_t (расширенный символьный);

  • bool (логический);

  • float (вещественный);

  • double(вещественный с двойной точностью).

Первые четыре типа называют целочисленными, последние два –типами с плавающей точкой. Код, который формирует компилятор для обработки целых величин, отличается от кода для величин с плавающей точкой.

Существует четыре спецификатора типа, уточняющих внутреннее представление и диапазон значений стандартных типов:short(короткий),long(длинный),signed(знаковый),unsigned(беззнаковый).

В С++ введен тип void, множество значений его пусто.

Вопрос №4. Понятие перемен­ной, область видимости идентификатора, область действия переменной. Понятие программного объекта. Класс памяти, время жизни программного объекта.

Переменная – это именованная область памяти, в которой хранятся данные определенного типа.

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

Структура описания переменных:

[класс памяти] [const] тип имя [инициализатор];

  • Класс памяти может принимать одно из значений: auto, extern, static, register.

  • Модификатор const показывает, что значение переменной изменять нельзя. Такую переменную называют константой.

  • При описании переменной можно присвоить начальное значение, это называется инициализацией.

int a=1;

float x(0.3);

Константа инициализируется при объявлении.

Если переменная объявлена внутри блока, то это переменная локальная и область ее действия от точки описания до конца блока, включая все вложенные блоки.

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

Область видимости идентификатора – это часть текста программы, из которой допустим обычный доступ к связанной с идентификатором областью памяти.

Как правило область видимости совпадает с областью действия. Исключение: когда во вложенном блоке описана переменная с таким же именем. В этом случае внешняя переменная во вложенном блоке невидима, хотя он входит в ее область действия. К внешней переменной, елси она глобальная, можно обратиться, используя операцию доступа к области видимости ::.

Время жизни переменной может быть постоянным (в течение выполнения программы) и временным (в течение выполнения блока).

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

Для задания класса памяти используются следующие спецификаторы:

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

  • extern – означает, что переменная определяется в другом месте программы.

  • static – статическая переменная. Время жизни – постоянное. Инициализируется один раз при первом выполнении оператора, содержащего определение переменной.

  • register – аналогично auto, но память выделяется по возможности в регистрах процессора.

Если при определении начальное значение переменных явным образом не задается, компилятор присваивает глобальным и статическим переменным нулевое значение соответствующего типа. Автоматические переменные не инициализируются.

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

Вопрос №6. 6. Основные операции языка С++ (унарные, бинарные, тренарная).

Операции выполняются в соответствии с приоритетами.

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

Преобразования бывают двух типов:

  • изменяющие внутреннее представление величин (с потерей точности или без);

  • изменяющие только интерпретацию внутреннего представления.

Например, к первому типу относится преобразование целого числа в вещественное (без потери точности) и наоборот (возможно, с потерей точности), ко второму – преобразование знакового целого в безнаковое.

Величины типов char,signedchar,unsignedchar,shortintиunsignedshortintпреобразуются в типint,если он может представить все значения, или вunsignedintв противном случае.

Вопрос №7. Операторы ветвления (if, switch), цикла (while, do while, for), передачи управления (goto, break, continue, return).

Операторы ветвления

1. Условный оператор ifиспользуется для разветвления процесса вычислений на два направления. Формат записи:

If (выражение) оператор_1; [else оператор_2;]

Сначала вычисляется выражение, которое может иметь арифметический тип или тип указателя. Если оно не равно нулю (имеет значение true), выполняется первый оператор, иначе – второй. После этого управление передается на оператор, следующий за условным.

Возможно опускать вторую ветвь вместе с ключевым словом else.

Если в какой-либо ветви требуется выполнить несколько операторов, их необходимо заключить в блок из фигурных скобок.

Внутри блока можно объявлять только одну переменную. Область ее видимости начинается в точке определения и включает ветвление.

2. Оператор switch (переключатель) предназначен для разветвления вычислений на несколько направлений.

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

Выход из переключателя обычно выполняется с помощью операторов breakилиreturn.

  • Оператор breakвыполняет выход из самого внутреннего из объемлющих его операторовswitch,for,whileиdo.

  • Оператор returnвыполняет выход из функции, в теле которой он записан.

Все константные выражения должны иметь разные значения, но быть одного и того же целочисленного типа. Если совпадения не произошло, выполняются операторы, расположенные после слова default(а при его отсутствии управление передается следующему заswitchоператору).

Операторы цикла

Операторы цикла используются для организации многократно повторяющихся вычислений.

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

Один проход цикла называется итерацией.Проверка условия выполняется на каждой итерации либо до тела цикла (цикл с предусловием), либо после тела цикла (цикл с постусловием выполняется один раз).

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

Цикл завершается, если условие его продолжения не выполняется. Возможно принудительное завершение как текущей итерации, так и цикла в целом с помощью операторов break,continue,returnиgoto.

Для удобства в С++ их три:

1. Цикл с предусловием

while (выражение) оператор

2. Цикл с постусловием

do оператор while выражение;

3. Цикл с параметром

for (инициализация; выражение; модификации) оператор;

Операторы передачи управления

В С++ есть четыре оператора, изменяющих естественный порядок выполнения вычислений:

  • Оператор безусловного перехода goto;

  • Оператор выхода из цикла break;

  • Оператор перехода к следующей итерации цикла continue;

  • Оператор возврата из функции return.

1. Оператор gotoимеет формат:goto метка;

В теле той же функции должна присутствовать ровно одна конструкция вида: метка: оператор;

Оператор gotoпередает управление на помеченный оператор.Метка– это обычный идентификатор, областью видимости которого является функция, в теле которой он задан.

Использование оператора безусловного перехода оправдано в двух случаях:

  • принудительный выход вниз по тексту программы из нескольких вложенных циклов или переключателей;

  • переход из нескольких мест функции в одно.

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

Не следует предавать управление внутрь операторов if,switchи циклов.

2. Оператор break используется внутри операторов цикла илиswitchдля обеспечения перехода в точку программы, находящуюся непосредственно за оператором, внутри которого находитсяbreak.

3. Оператор перехода к следующей итерации цикла continueпропускает все операторы, оставшиеся до конца тела цикла, и передает управление на начало следующей итерации.

4. Оператор возврата из функции returnзавершает выполнение функции и передает управление в точку ее вызова. Вид оператора:

return [выражение];

Выражение должно иметь скалярный тип. Если тип возвращаемого функцией значения описан как void, выражение должно отсутствовать.

Вопрос №8. Описание указателей, виды указателей (на функцию, на объект, на void). Инициализация указателей. Интерпретация сложных описаний (правило «изнутри наружу»).

Указатели предназначены для хранения адресов областей памяти.

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

Адрес– это номер ячейки.

Указатель- это переменная в которой хранится адрес некоторого объекта.

Всегда необходимо указывать тип объекта на который построен указатель.

Указатель на объект содержит адрес области памяти, в которой хранятся данные определенного типа. тип *имя; int *a, b, *c; В качестве объекта может быть указатель.

Указатель на функцию содержит адрес в сегменте кода, по которому располагается исполняемый код функции, то есть адрес, по которому передается управление при вызове функции. Указатель функции имеет тип «указатель функции, возвращающей значение заданного типа и имеющий аргументы заданного типа»: тип (*имя) (список_типов_аргументов); int (*fun) (double, double);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]