- •Напишите программу реализации системной функции CreateConsoleScreenBuffer
- •Классификация:
- •Система контекстной помощи
- •По модели данных[править | править вики-текст]
- •По степени распределённости[править | править вики-текст]
- •Основные сведения[править | править вики-текст]
- •Ассоциации[править | править вики-текст]
- •Агрегация[править | править вики-текст]
- •Композиция[править | править вики-текст]
- •Обобщение (наследование)[править | править вики-текст]
- •Реализация[править | править вики-текст]
- •Зависимость[править | править вики-текст]
- •Уточнения отношений[править | править вики-текст]
- •Уровни схемы базы данных[править | править вики-текст]
- •Иды требований по характеру[править | править вики-текст]
- •Источники требований[править | править вики-текст]
- •Вид и состав требований тз[править | править вики-текст]
- •Напишите программу реализации системной функции CreateConsoleScreenBuffer
- •9. Экономическая часть проекта
- •9.1. Технико-экономический анализ и оценка показателей экономической эффективности проекта.
- •9.2. Расчёт себестоимости электроэнергии
- •Развитие языков программирования и средств разработки
- •Напишите программу реализации системной функции CreateConsoleScreenBuffer
- •Анализ требований к проекту
- •Проектирование
- •Реализация
- •Тестирование продукта
- •Внедрение и поддержка
- •По целям исследований
- •По особенностям представления
- •Свойства парадигм программирования
- •Инициализация объектов данных[править | править вики-текст]
- •Программирование арифметических операций[править | править вики-текст]
- •Циклы[править | править вики-текст]
- •Инвариантные фрагменты кода[править | править вики-текст]
Инициализация объектов данных[править | править вики-текст]
Во многих программах какую-то часть объектов данных необходимо инициализировать, то есть присвоить им начальные значения. Такое присваивание выполняется либо в самом начале программы, либо, например, в конце цикла. Правильная инициализация объектов позволяет сэкономить драгоценное процессорное время. Так, например, если речь идет об инициализации массивов, использование цикла, скорее всего, будет менее эффективным, чем объявление этого массива прямым присвоением.
Программирование арифметических операций[править | править вики-текст]
В
том случае, когда значительная часть
времени работы программы отводится
арифметическим вычислениям, немалые
резервы повышения скорости работы
программы таятся в правильном
программировании арифметических (и
логических) выражений. Важно, что
различные арифметические операции
значительно различаются по быстродействию.
В большинстве архитектур, самыми быстрыми
являются операции сложения и вычитания.
Более медленным является умножение,
затем идёт деление. Например, вычисление
значения выражения
,
где
—
константа, для аргументов с плавающей
точкой производится быстрее в виде
,
где
—
константа, вычисляемая на этапе компиляции
программы (фактически медленная операция
деления заменяется быстрой операцией
умножения). Для целочисленного
аргумента
вычисление
выражения
быстрее
произвести в виде
(операция
умножения заменяется операцией сложения)
или с использованием операции сдвига
влево (что обеспечивает выигрыш не на
всех процессорах). Подобные оптимизации
называются понижением
силы операций.
Умножение целочисленных аргументов на
константу на процессорах семейства x86 может
быть эффективно выполнено с
использованием ассемблерных команд LEA, SHL и ADD вместо
использования команд MUL/IMUL:
; Исходный операнд в регистре EAX
ADD EAX, EAX ; умножение на 2
LEA EAX, [EAX + 2*EAX] ; умножение на 3
SHL EAX, 2 ; умножение на 4
LEA EAX, [4*EAX] ; другой вариант реализации умножения на 4
LEA EAX, [EAX + 4*EAX] ; умножение на 5
LEA EAX, [EAX + 2*EAX] ; умножение на 6
ADD EAX, EAX
; и т.д.
Циклы[править | править вики-текст]
Различается и время выполнения циклов разного типа. Время выполнения цикла со счетчиком и цикла с постусловием при всех прочих равных условиях совпадает, цикл с предусловием выполняется несколько дольше (примерно на 20-30 %).
При использовании вложенных циклов следует иметь в виду, что затраты процессорного времени на обработку такой конструкции могут зависеть от порядка следования вложенных циклов. Например, вложенный цикл со счетчиком на языке Turbo Pascal:
for j := 1 to 100000 do for k := 1 to 1000 do a := 1;
|
for j := 1 to 1000 do for k := 1 to 100000 do a := 1;
|
Цикл в левой колонке выполняется примерно на 10 % дольше, чем в правой.
Инвариантные фрагменты кода[править | править вики-текст]
Оптимизация инвариантных фрагментов кода тесно связана с проблемой оптимального программирования циклов. Внутри цикла могут встречаться выражения, фрагменты которых никак не зависят от управляющей переменной цикла. Их называют инвариантными фрагментами кода. Современные компиляторы часто определяют наличие таких фрагментов и выполняют их автоматическую оптимизацию. Такое возможно не всегда, и иногда производительность программы зависит целиком от того, как запрограммирован цикл. В качестве примера рассмотрим следующий фрагмент программы (язык Turbo Pascal):
for i := 1 to n do
begin
...
for k := 1 to p do
for m := 1 to q do
begin
a[k, m] := Sqrt(x * k * m - i) + Abs(u * i - x * m + k);
b[k, m] := Sin(x * k * i) + Abs(u * i * m + k);
end;
...
am := 0;
bm := 0;
for k := 1 to p do
for m := 1 to q do
begin
am := am + a[k, m] / c[k];
bm := bm + b[k, m] / c[k];
end;
end;
Здесь инвариантными фрагментами кода являются слагаемое Sin(x * k * i) в первом цикле по переменной m и операция деления на элемент массива c[k] во втором цикле по m. Значения синуса и элемента массива не изменяются в цикле по переменной m, следовательно, в первом случае можно вычислить значение синуса и присвоить его вспомогательной переменной, которая будет использоваться в выражении, находящемся внутри цикла. Во втором случае можно выполнить деление после завершения цикла по m. Таким образом, можно существенно сократить количество трудоёмких арифметических операций.
АЛМАТИНСКИЙ УНИВЕРСИТЕТ ЭНЕРГЕТИКИ И СВЯЗИ
ФАКУЛЬТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ
КАФЕДРА КОМПЬЮТЕРНЫХ ТЕХНОЛОГИЙ
АТТЕСТАЦИОННЫЙ ЭКЗАМЕНАЦИОННЫЙ БИЛЕТ №79
по специальности 5B0704 - Вычислительная техника и программное обеспечение
Многочлен P (x) задан массивом своих коэффициентов A[n+1]. Найти массив коэффициентов производной этого многочлена.
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int b[n], a;
for (int i = n; i >= 0; --i)
{
cin >> a;
b[i] = a * i;
}
for (int i = n; i >= 0; --i)
{
cout << b[i] << ' ';
}
cout << endl;
}
Напишите программу реализации системной функции MoveFile
Теперь разберем функцию MoveFile, которая служит для перемещения
файлов. Перемещение файла отличается от копирования файла только тем, что
старый файл после его перемещения удаляется.
Функция MoveFile имеет следующий прототип:
BOOL MoveFile(
LPCTSTR IpExistingFiieName, // имя существующего файла
LPCTSTR lpNewFileName // имя нового файла );
В случае успешного завершения функция возвращает ненулевое значение, а в случае неудачи — значение false. Отметим, что функция MoveFile сохраняет все атрибуты перемещаемого файла. Параметры этой функции имеют следующее назначение.
Параметр IpExistingFiieName должен указывать на строку, содержащую имя перемещаемого файла.
Ставить студентам оценки за различные виды работ(практика, контрольная, семестровая, курсовой проект, экзамен) по различным предметам и найти неуспевающих студентов.
CREATE OR REPLACE FUNCTION get_count
(v_id students.group_id%TYPE) RETURN NUMBER IS
v_count number;
BEGIN
SELECT count(student_id)
INTO v_count
FROM students
WHERE group_id = v_id;
RETURN v_count;
END get_count;
begin
get_count(150);
end;
execute dbms_output.put_line(get_count(10));
Описать состав и режимы работы представленной микросхемы, назначение и характер ее входных и выходных сигналов.
Микросхема 7493 состоит из четырех триггеров, внутренне связанных между собой таким образом, что образуются два счетчика-делителя: один на 2 и другой на 8.
Все триггеры микросхемы 7493 имеют один общий вход сброса, с помощью которого показания счетчиков могут устанавливаться на О в любое время (на выводы 2 и 3 подается высокий уровень напряжения).
Первый триггер микросхемы 7493 внутренне не связан с остальными ступенями, благодаря чему возможны следующие варианты использования:
счет до 16. Выход QO соединяется с входом тактовых импульсов Clock 1. Входной сигнал подается на вход Clock О, а выходной сигнал снимается с выхода Q3. Эта схема считает в двоичном коде до 16 (О — 15) и на 16-м импульсе возвращается в нулевое состояние;
счет до 2 и счет до 8. В этом случае первый триггер используется в качестве делителя на 2, а второй, третий и четвертый триггеры — как делитель на 8.
Переключение микросхемы 7493 всегда происходит по отрицательному фронту тактового импульса. В нормальном режиме работы по крайней мере на один из двух входов сброса MR1 или MR2 должно подаваться напряжение низкого уровня.
Сравнения возможностей объектных языков программирования.
Объе́ктно-ориенти́рованное программи́рование (ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов иклассов. В случае языков с прототипированием вместо классов используются объекты-прототипы.
В центре ООП находится понятие объекта. Объект — это сущность, которой можно посылать сообщения и которая может на них реагировать, используя свои данные. Объект — это экземпляр класса. Данные объекта скрыты от остальной программы. Сокрытие данных называется инкапсуляцией.
Наличие инкапсуляции достаточно для объектности языка программирования, но ещё не означает его объектной ориентированности — для этого требуется наличие наследования.
Но даже наличие инкапсуляции и наследования не делает язык программирования в полной мере объектным с точки зрения ООП. Основные преимущества ООП проявляются только в том случае, когда в языке программирования реализован полиморфизм подтипов — возможность единообразно обрабатывать объекты с различной реализацией при условии наличия общего интерфейса.
Как правило, объектно-ориентированный язык (ООЯ) содержит следующий набор элементов:
Объявление классов с полями (данными — членами класса) и методами (функциями — членами класса).
Механизм расширения класса (наследования) — порождение нового класса от существующего с автоматическим включением всех особенностей реализации класса-предка в состав класса-потомка. Большинство ООЯ поддерживают только единичное наследование.
Полиморфные переменные и параметры функций (методов), позволяющие присваивать одной и той же переменной экземпляры различных классов.
Полиморфное поведение экземпляров классов за счёт использования виртуальных методов. В некоторых ООЯ все методы классов являются виртуальными.
Некоторые языки добавляют к указанному минимальному набору те или иные дополнительные средства. В их числе:
Конструкторы, деструкторы, финализаторы.
Свойства (аксессоры).
Индексаторы.
Средства управления видимостью компонентов классов (интерфейсы или модификаторы доступа, такие как public, private, protected, feature и др.)
Объектно-ориентированные возможности[править | править вики-текст]
Возможность |
Язык |
|||||||||||||
Active Oberon |
C |
C++ |
C# |
Erlang |
Groovy |
Java |
JavaScript |
Common Lisp |
Perl |
PHP |
Python |
Ruby |
Delphi |
|
Интерфейсы |
+ |
+/-[152] |
+ [153] |
+ |
N/A |
+ |
+ |
? |
N/A[154] |
+/-[155] |
+ |
+ |
? |
+ |
Мультиметоды |
- |
- |
-/+[156] |
-/+[157] |
N/A |
? |
- [158] |
- |
+ |
- [158][159] |
- |
- [158] |
- [158] |
- |
Mixins |
- |
- |
-/+[160] |
- |
N/A |
+ [161] |
+ |
? |
+ |
? |
+ [162] |
+ [163] |
+ |
-/+[164] |
Переименование членов при наследовании |
- |
N/A |
-/+[165] |
- |
N/A |
- |
- |
? |
- |
-/+ |
- |
- |
? |
- |
Множественное наследование |
- |
N/A |
+ |
- |
N/A |
- |
- |
? |
+ |
+ |
- |
+ |
- |
- |
Решение конфликта имен при множественном наследовании |
N/A |
N/A |
-/+ [166] |
N/A |
N/A |
? |
N/A |
? |
+[168] |
+ |
N/A |
+ |
N/A |
N/A |
АЛМАТИНСКИЙ УНИВЕРСИТЕТ ЭНЕРГЕТИКИ И СВЯЗИ
ФАКУЛЬТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ
КАФЕДРА КОМПЬЮТЕРНЫХ ТЕХНОЛОГИЙ
АТТЕСТАЦИОННЫЙ ЭКЗАМЕНАЦИОННЫЙ БИЛЕТ №80
по специальности 5B0704 - Вычислительная техника и программное обеспечение
Найти два самых маленьких элемента в массиве. Указать их значения и индексы.
# include <stdio.h>
# include <stdlib.h>
int mas[10];
int min1,min2,ind1,ind2;
void main()
{ randomize();
for (int i=0;i<10;mas[i]=1+random(30),i++);
min1=(mas[0]<mas[1])?mas[0]:mas[1];
min2=(mas[0]>mas[1])?mas[0]:mas[1];
ind1=(mas[0]<mas[1])?0:1;
ind2=(mas[0]>mas[1])?0:1;
for (i=2;i<10;i++)
if (min1>=mas[i])
{ min2=min1;
ind2=ind1;
min1=mas[i];
ind1=i;
}
else if (min2>=mas[i])
{ min2=mas[i];
ind2=i;
}
}
Напишите программу реализации системной функции MoveMemory
Для копирования перекрывающихся блоков памяти используется функция MoveMemory, которая имеет следующий прототип:
VOID MoveMemory (
PVOID Destination, // адрес области назначения
CONST VOID *Source, // адрес исходной области
SIZE_T Length // длина блока памяти );
Параметры этой функции полностью совпадают с параметрами функции CopyMemory.
Для копирования блока виртуальной памяти используется функция соруMemory, которая имеет следующий прототип:
VOID CopyMemory (
PVOID Destination, // адрес области назначения
CONST VOID *Source, // адрес исходной области
SIZE_T Length // длина блока памяти
Эта функция копирует блок памяти, длина в байтах и базовый адрес которого задаются соответственно параметрами Length и source в область памяти по адресу Destination. Отметим, что результат выполнения функции соруметогу непредсказуем, если исходный и результирующий блоки памяти перекрываются.
Листинг. Инициализаций и копирование блоков виртуальной памяти
#include <windows.h>
#include <iostream.h>
int mainO
{BYTE *a, *b; // указатели на блоки памяти
const int size = 1000; // размерность массива // распределяем виртуальную память
а = (BYTE*)VirtualAlloc (NULL, size, MEM_COMMIT, PAGE_READWRITE) ;
if(!a)
{cout « "Virtual allocation failed." << endl;
return GetLastError(); }
b= (BYTE*)VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
if(!b)
{ cout « "Virtual allocation failed." « endl;
return GetLastError(); } // инициализируем символом X
FillMemory(a, size, 'X'); // копируем блок А в блок В
CopyMemory(b, a, size); // распечатываем результат
cout « **b[10] = " « b[10] « endl;
// освобождаем виртуальную память
if (!VirtualFree(a, 0, MEM_RELEASE))
{ cout « "Memory release failed." « endl;
return GetLastError(); }
return 0; }
Выведите сведения о тех сотрудниках (номер сотрудника, фамилию и номер отдела), кто проживает в городах, начинающихся на T.
select employee_id, last_name, department_id
FROM employees
WHERE department_id IN (SELECT department_id
FROM departments
WHERE location_id IN
(SELECT location_id
FROM locations
WHERE city LIKE 'T%'));
Описать режимы работы представленной микросхемы, назначение и характер ее входных и выходных сигналов.
Если на вход сброса Clear микросхемы 74194 поступает напряжение низкого уровня, то на всех выходах Q0 — Q3 устанавливается напряжение низкого уровня независимо от логического состояния всех остальных входов.
Если на вход сброса Clear микросхемы 74194 подается напряжение высокого уровня, то режим работы определяется состояниями входов S0 и S1. Сдвиг данных влево происходит, когда такое напряжение подастся на входы S0 и S1. При этом данные последовательно поступают на вход D.
Сдвиг данных вправо происходит в микросхеме 74194, когда на вход S0 подается напряжение высокого, а на вход S1 — низкого уровня, при этом данные последовательно поступают на вход D.
Если на оба входа S0 и S1 микросхемы 74194 подается напряжение высокого уровня, то возможна последовательная загрузка данных с входов P0 — P3. Во время параллельного ввода данных последовательные входы заперты.
Последовательно и параллельно введенные данные поступают в регистр сдвига синхронно с перепадом напряжения тактового импульса на входе Clock (вход тактовых импульсовмикросхемы 74194) с низкого уровня на высокий (положительный фронт). При этом данные должны находиться на информационных входах до начала формирования положительного фронта тактового импульса.
Напряжение низкого уровня на входах S0 и S1 микросхемы 74194 запирает вход тактовых импульсов. Логическое состояние на обоих этих входах изменяеется лишь тогда, когда на вход тактовых импульсов поступает напряжение высокого уровня.
Rational Rose – инструмент логического проектирования программ.
Rational Rose - CASE-средство фирмы Rational Software Corporation (США) - предназначено для автоматизации этапов анализа и проектирования ПО, а также для генерации кодов на различных языках и выпуска проектной документации.
Rational Rose использует синтез-методологию объектно-ориентированного анализа и проектирования, основанную на подходах трех ведущих специалистов в данной области: Буча, Рамбо и Джекобсона.
Rational Rose/C++ - позволяет разрабатывать проектную документацию в виде диаграмм и спецификаций, а также генерировать программные коды на С++. Кроме того, Rational Rose содержит средства реинжиниринга программ, обеспечивающие повторное использование программных компонент в новых проектах.
В основе работы Rational Rose лежит построение различного рода диаграмм и спецификаций, определяющих логическую и физическую структуры модели, ее статические и динамические аспекты. В их число входят диаграммы классов, состояний, сценариев, модулей, процессов [21].
В составе Rational Rose можно выделить 6 основных структурных компонент: репозиторий, графический интерфейс пользователя, средства просмотра проекта (browser), средства контроля проекта, средства сбора статистики и генератор документов. К ним добавляются генератор кодов (индивидуальный для каждого языка) и анализатор для С++, обеспечивающий реинжиниринг - восстановление модели проекта по исходным текстам программ.
В результате разработки проекта с помощью CASE-средства Rational Rose формируются следующие документы:
диаграммы классов;
диаграммы состояний;
диаграммы сценариев;
диаграммы модулей;
диаграммы процессов;
спецификации классов, объектов, атрибутов и операций
заготовки текстов программ;
модель разрабатываемой программной системы.
· Rational Rose интегрируется со средством PVCS для организации групповой работы и управления проектом и со средством SoDA - для документирования проектов. Интеграция Rational Rose и SoDA обеспечивается средствами SoDA.
· Для организации групповой работы в Rational Rose возможно разбиение модели на управляемые подмодели. Каждая из них независимо сохраняется на диске или загружается в модель. В качестве подмодели может выступать категория классов или подсистема.
