Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Численное решение уравнений.




Приоритеты операций и порядок вычислений.

 

Операция явного преобразования типа

()Операция преобразования (или приведения) типа.Эта бинарная операция в контексте так называемого постфиксного выражения и в контексте выражения приведения обеспечивает изменение типа значения выражения, представляемого вторым операндом. Информация о типе, к которому преобразуется значение второго операнда, кодируется первым выражением, которое является спецификатором типа. Например, (int)d;

Автоматическое преобразование типов

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

Преобразование типов при присваивании

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

Преобразование целых типов данных происходит по следующим правилам:

Если значение попадает в новый диапазон, то новое значение = старому с точностью до типа;

Если значение не попадает в новый диапазон, то результат преобразований не определён (обрабатывается в зависимости от компилятора).

Преобразование вещественных типов:

Значения типа float преобразуются к типу double без потери точности. Значения типа doubleпри преобразовании к типу float представляются с некоторой потерей точности. Е

Если порядок значения типа double слишком велик для представления значением типа float , то происходит потеря значимости.

Преобразование к целым типам значений с плавающей точкой (в 2 приёма):

Сначала производится преобразование к типу long.Дробная часть плавающего значения отбрасывается при преобразовании к типу long.

Затем это значение типа long преобразуется к требуемому типу. Если полученное значение слишком велико для типа long, то результат преобразований не определён.

 

Билет 7

1. Символьные вычисления

Производные

Чтобы вычислить производную в символьном виде, можно использовать оператор производной MathCad.

- Наберите «?», чтобы задать оператор производной или CTRL/?, чтобы задать оператор производной более высокого порядка

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

- Нажмите Shift/F9

Неопределенные интегралы

В MathCad есть символьный оператор вычисления неопределенных интегралов. Чтобы использовать этот оператор:

- Нажмите CTRL+i , чтобы оператор неопределенного интеграла и поля ввода его параметров.

- Заполните поле ввода подинтегрального выражения.

- Поместите переменную интегрирования в поле ввода, следующее за “d” ,

- Заключите выражение в выделяющую рамку.

- Нажмите Shift+F9

Пределы

В MathCad есть три оператора вычисления пределов. Они могут быть вычислены только символьно. Чтобы использовать операторы, вычисляющие пределы, необходимо:

- Нажать CTRL/L, чтобы вызвать оператор нахождения предела.

Левого предела CTRL/B

Правого предела CTRL/A

- Введите выражение в поле ввода справа от lim.

- Введите переменную, по которой вычисляется предел, в левое поле ввода ниже lim.

- Заключите выражение в символьную рамку.

- Нажмите Shift/F9

MathCad возвратит результат нахождения предела. Если предел не существует, MathCad возвратит сообщение «неопределено»

Численные вычисления

Простые вычисления

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

После щелчка левой клавиши мыши в любом месте рабочего документа появится крестик

+

Это начало ввода с клавиатуры. Напечатаем арифметическое выражение :

После набора знака = MathCad вычисляет выражение и выводит результат.

Переменная TOLнастраивает точность результатов, полученных численными методами (по умолчанию TOL = 10-3). Чем меньше ее значение, тем точнее будет результат, но тем дольше будут проводится вычисления, т.к. TOL напрямую влияет на условие прекращения поиска решения численным алгоритмом. Также существует переменная CTOL, влияющая на точность решения систем уравнений, заданных с помощью оператора Given.

Чтобы из приведенной формулы выразить r через А, выделите r и выберите команду Решить относительно переменной

 


Имеет решения                         Для ввода знака равенства нажмите CTRL/=

Решим уравнение x2=9.

Функция root ищет один из корней выражения. Поэтому, для первого способа решения уравнение надо представить в виде f(x)=0, т.е. в нашем случае x2-9=0.

Кроме того, в случае функции root надо задать начальное значение x для поиска. Чем ближе это значение к корню уравнения, тем меньше времени займет поиск. root находит только один из корней, обычно ближайший к начальному значению x для поиска.

2.Программа на языке C состоит из модулей, модуль – из функций, функции – из операторов. Согласно принципам структурного программирования нам известно, что любую программу можно составить из трех структур: линейной (следования), разветвляющейся (развилки) и циклической (повторения).

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

Блок операторов

В описании синтаксиса языка Си всюду, где указан “оператор”, вместо него можно указывать блок операторов. Блок операторов заключается в фигурные скобки {оператор}.

Общий вид:{ Внутренние объявления и определения данных Операторы}

Условный оператор if (условие) {блок из одного или более операторов}

Если условие верно, то выполняется блок из одного или более операторов

Второй вариант:

if (условие) {блок 1 из одного или более операторов} else {блок 2 из одного или более операторов}

Если условие верно, то выполняется блок 1 из одного или более операторов, а если не верно, то блок 2. 

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

1) Оператор цикла while

Описание: while (выражение) оператор;

Действие: Выполняется оператор до тех пор, пока значение выражения в скобках истинно. Проверка значения выражения происходит перед каждым выполнением оператора. Когда значение выражения ложно, цикл while заканчивается. Если выражение ложно с самого начала, оператор не выполняется ни разу.

2) В общем виде цикл do…while записывается следующим образом:

 do                        

 оператор;

 while (выражение);

Это единственная в C конструкция цикла с постусловием. Эта конструкция полностью идентична циклу while за исключением того, что проверка условия осуществляется в конце цикла. Поэтому тело цикла do…while всегда выполняется, по крайней мере, один раз. Использовать цикл do…while лучше всего в тех случаях, когда должна быть выполнена, по крайней мере, одна итерация, например:

int item;

do

item=ReadItem(); // Последовательно считываем элементы

while(item!=0);   // пока не получим нулевой элемент

3) for(выражение1;выражение2;выражение 3 ) оператор;                             где

выражение 1 – выполняется в начале цикла (инициализация переменной-счётчика);

выражение 2 – проверяет условие продолжения цикла;

выражение 3 – выполняется в конце итерации (модифицирует переменную-счётчик).

В круглых скобках содержится три выражения. Первое из них служит для инициализации счетчика. Она осуществляется только один раз – когда цикл for начинает выполняться. Второе выражение необходимо для проверки условия, которая осуществляется перед каждым возможным выполнением тела цикла. Когда выражение становится ложным, цикл завершается. Третье выражение вычисляется в конце каждого выполнения тела цикла, происходит приращение числа на шаг.

Оператор return

Этот оператор имеет две основные формы записи:

return; return (выражение); Например, return(5+i);

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

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

 

 

Билет 8+

1. Символьное решение уравнений

Для введения знака равенства в уравнениях используется комбинация клавиш CTRL+=.Это очень важно, т.к. с точки зрения Mathcad такой знак равенства – совершенно другая операция, чем просто = (показать результат).

Решать уравнение символьно гораздо труднее, чем численно. Может оказаться, что в символьном виде решение не существует.

Чтобы символьно решить уравнение существует команда Решить относительно переменной из меню Символика.

Для этого:

- напечатать уравнение.

- Убедитесь, что для введения знака равенства была использована комбинация клавиш CTRL+=

- Выделите переменную, относительно которой нужно решить уравнение, щелкнув на ней мышью.

- Выберите Решить относительно переменной из меню Символика.

MathCad решит уравнение относительно выделенной переменной и вставит результат в рабочий документ.

Численное решение уравнений.

Решать уравнения численным методом можно следующими способами:

· С помощью функции root, polyroot, lsolve

· С помощью блока Given и функций Find и Minerr.

Решим уравнение x2=9.

Функция root ищет один из корней выражения. Поэтому, для первого способа решения уравнение надо представить в виде f(x)=0, т.е. в нашем случае x2-9=0.

Кроме того, в случае функции root надо задать начальное значение x для поиска. Чем ближе это значение к корню уравнения, тем меньше времени займет поиск. root находит только один из корней, обычно ближайший к начальному значению x для поиска.

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

Корни полинома также можно найти функцией polyroots, в ней перечисляем коэффициенты полинома в виде вектора:

 

Второй вариант решения уравнений – использование блока Given:

Точно так же как и в случае с root надо задавать начальные значения. В блоке Given можно задать систему уравнений. Функция Find найдет только одно их возможных решений. Если решение не может быть найдено (численный метод не дает решения с точностью до TOL), то можно найти минимальное по ошибке решение, заменив Find() на MinErr().

Поскольку во всех этих способах используются численные методы, то на точность решения будут влиять значения переменных TOL и CTOL.

 

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

Оператор goto обеспечивает безусловный переход на указанную метку в переделах функции.

Синтаксис: goto m1;

Метка с программе записывается в начале строки и отделяется от операторов двоеточием. Например:

{func1();

goto m1;

func2(); // Никогда не выполняется

m1: func3();}

В сочетании с оператором if (рассмотренным ниже) оператор goto может осуществлять условный переход на определённую метку:

if(a==5) goto m2;

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

                   Операторы break и continue позволяют управлять работой цикла внутри его тела.

· break прерывает выполнение всего цикла и передаёт управление на следующий после цикла оператор

· continue прерывает выполнение текущей итерации цикла и передаёт управление на начало следующей итерации.

Например, пусть программа последовательно считывает 200 элементов из какого-либо буфера с помощью вызова функции ReadItem(i); Считается, что все элементы должны быть положительными, если встречается отрицательный элемент, то обработка должна быть прекращена. В то же время, даольнейшую обработку элементов нужно производить только если они больше числа 32. Эту процедуру можно реализовать с помощью следующей функции:

void process()

{ int i,item;

for(i=0;i<200;i++) { item=Readitem(i);

       if(item<0)

{printf("ОШИБКА: неправильный элемент." "Процедура обработки прервана.\n");break;}

//Если элемент <=32, то обработка ему не требуется.

//В этом случае переходим к следующей итерации.

if(item<=32) continue; ProcessItem(item);…} …}

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

Синтаксис:

switch (целое выражение)

{case метка1:

[Операторы;] (необязат.)

case метка2:

[Операторы;] (необязат.)

… . . . . [default: операторы;] }

Оператор switch вычисляет целое выражение в круглых скобках и сравнивает это значение со всеми значениями (метками), перечисленными с помощью ключевых слов case. Каждая метка должна быть либо целой константой, либо символьной константой, либо константным выражением. Как только значение вычисляемого выражения совпадает с какой-либо меткой, управление передаётся на оператор, следующий за меткой.

Если ни одна из меток не подходит, то управление передается оператору с меткой default (если такой имеется). В противном случае управление передается оператору, следующему за оператором switch.

Как выражения, так и метки должны иметь значения целого типа (включая тип char).

Пример:

switch (letter)

{case ‘a’:

case ‘A’: printf (“Это буква a (большая или маленькая)”, letter);

         break;

case 66:       // 66 – код буквы B

         printf (“Это буква B (большая)”, letter);

         break;

case 0x30+2:          //0x30+2 – код цифры 2

         printf (“Это цифра 2”, letter); 

         break;

default: printf (“А вот не знаю я что это за символ”);}

 

Билет 9+

1. Ди­намический обмен данными (DDE – Dynamic Date Exchange) -  Создание связей между файлами). При любом изменении данных в файле-источнике данные в файле-приемнике будут обновлены автоматически.

OLE (англ. Object Linking and Embedding, произносится как oh-lay [олэй]) —технология связывания и внедрения объектов в другие документы и объекты. В последствие версия OLE 2.0 была переименована в ActiveX.

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

Связывание

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

Для этого можно воспользоваться командой

Главная ®Вставить ® Специальная вставка 

Для того, чтобы создать связь, вы должны скопировать документ источник (или часть его) в буфер обмена, а затем выбрать в меню Правка пункт Специальная вставка, пометить имеющуюся в диалоговом окне опцию "Вставить связь"(Cвязать). В диалоговом окне "Специальная вставка" можно также указать тип формата, в котором будет представлена копируемая информация.

Внедрение данных в документы

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

Для внедрения информации вы можете воспользоваться любым из следующих способов.

Скопируйте информацию в буфер обмена, выберите команду "Правка- Специальная Вставка" и выберите формат объекта; Используйте технологию Drag’n’Drop;

Например, в редакторе Word при выборе команд "Вставка->Объект" на экран выводится диалоговое окно Объект.

В нем перечислены различные типы объектов в формате OLE, которые можно вставлять в документ этого редактора.(в данном случае Microsoft Equation 3.0)

Таким образом, механизм связи и внедрения (OLE) расширяет возможности Windows-программ. Пользователю при этом кажется, что в документ вставляются не только данные, но и обрабатывающие их программы (конечно, на самом деле внедрения программ не происходит).

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

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

Внедряемая же информация хранится в файле-приемнике в виде копии.

2. Функция - это самостоятельная единица программы, созданная для решения конкретной задачи. Функция в языке С играет ту же роль, что и подпрограммы или процедуры в других языках. Функциями удобно пользоваться, например, если необходимо обработать один и тот же код программы. Как и переменные, функции надо объявлять (declare). Функцию необходимо объявить до её использования. Запомните это простое правило - сначала объяви, а потом используй.

тип <имя функции>(список параметров)

{   тело функции}

/* Описание функции */

void function1(void)      // Заголовок функции

{                                 // Начало тела функции

printf("Вызвали функцию\n");

}                                 // Конец тела функции

Объявление (прототип) функции имеет вид:

тип <имя функции>(список параметров);

Обратите внимание на то, что при описании функции после заголовка функции

тип <имя функции>(список параметров)

точка с запятой не ставиться, а при объявлении функции точка с запятой ставиться.

                   Функции с параметрами.

Функции языка С могут иметь параметры. Эти параметры передаются в функцию и там обрабатываются. Ещё раз покажем основную форму описания функции

тип <имя функции>(список параметров)

{   тело функции}

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

Пример правильного списка параметров:

   function(int x, char a, float z)

Пример неправильного списка параметров:

   function(int x, a, float z)

Давайте рассмотрим все это на примере. Пусть у нас будет функция у которой присутствует один параметр x. Функция будет возвращать квадрат значения x.

int square(int x)

{

x = x * x;     // Символ * это операция умножения

return x;}

Теперь давайте рассмотри пример функции, которая будет выводить значение переменной z типа float на экран.

void myout(float z)  // Переменная z является формальным параметром.

{ printf("Z=%f", z); // %f - означает, что выводится число с плавающей точкой

}

Формальные и фактические параметры

Формальные параметры - это параметры которые мы объявляем в заголовке функции при описании.

Фактические параметры - это параметры которые мы подставляем при вызове функции.

void myfunc(int x);    // Объявление функции

void main(void)

{ int a;

a=5;

myfunc(a);           // a- фактический параметр

}

// Описание функции

void myfunc(int x)     // x - формальный параметр

{ x = x + 10;

printf("Вывод x = %d",x);}

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

 

Билет 10+

1. Архитектура фон Неймана (von Neumann) — система принципов построения и функционирования компьютера, предложенная американским математиком Джоном фон Нейманом в 1945 году в статье «Предварительное рассмотрение логической конструкции электронно-вычислительного устройства». В соответствии с принципами фон Неймана компьютер состоит из арифметического логического устройства — АЛУ (англ. ALU, Arithmetic and Logic Unit), выполняющего арифметические и логические операции; устройства управления, предназначенного для организации выполнения программ; запоминающих устройств (ЗУ), в т.ч. оперативного запоминающего устройства (ОЗУ) и внешнего запоминающего устройства (ВЗУ); внешних устройств для ввода-вывода данных. Фон-неймановская архитектура компьютера считается классической, на ней построено большинство компьютеров. В общем случае, когда говорят об архитектуре фон Неймана, подразумевают физическое отделение процессорного модуля от устройств хранения программ и данных.

Конвейерная обработка. Что необходимо для сложения двух вещественных чисел,

представленных в форме с плавающей запятой? Целое множество мелких операций таких,как сравнение порядков, выравнивание порядков, сложение мантисс, нормализация и т.п. Процессоры первых компьютеров выполняли все эти "микрооперации" для каждой пары

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

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

Суперскалярность. Как и в предыдущем примере, только при построении конвейера используют несколько программно-аппаратных реализаций функциональных устройств, например два или три АЛУ, три или четыре устройства выборки.

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

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

Hyper Threading. Перспективное направление развитие современных

микропроцессоров, основанное на многонитевой архитектуре. Основное препятствие на пути повышения производительности за счет увеличения функциональных устройств – это организация эффективной загрузки этих устройств. Если сегодняшние программные коды не в состоянии загрузить работой все функциональные устройства, то можно разрешить процессору выполнять более чем одну задачу (нить), чтобы дополнительные нити загрузили – таки все ФУ (очень похоже на многозадачность).

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

 

2. Структура программы: 32 ключевых слова, определенные стандартом С89. Они же являются ключевыми словами языка С как подмножества C++. Приведены ключевые слова, добавленные стандартом С99. Bool        _Imaginary restrict _Complex inline

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

Любая программа на С состоит из одной или нескольких функций. Обязательно должна быть определена единственная главная функция main(), именно с нее всегда начинается выполнение программы. В хорошем исходном тексте программы главная функция всегда содержит операторы, отражающие сущность решаемой задачи, чаще всего это вызовы функций. Хотя main() и не является ключевым словом, относиться к нему следует как к ключевому. Например, не следует использовать main как имя переменной, так как это может нарушить работу транслятора.

           Заголовочный файл (иногда головной файл, англ. header file), или подключаемый файл — в языках программирования файл, механически «вставляемый» компилятором в исходный текст в том месте, где располагается некоторая директива ({$I file.inc} в Паскале, #include <file.h> в Си).

В языках программирования Си и C++, с их зачаточной модульностью, заголовочные файлы — основной способ подключить к программе типы данных, структуры, прототипы функций, перечислимые типы, и макросы, используемые в другом модуле. Имеет по умолчанию расширение .h

Чтобы на неё можно было ссылаться из других единиц компиляции, требуется объявить её при помощи прототипа функции, то есть:

 int add(int, int);

int triple(int x)

 {return add(x, add(x, x));}

Тем не менее, такое объявление требует, чтобы программист обеспечил объявление функции для add в двух местах — в файле, содержащем её выполнение, и в файле, в котором она используется. В случае изменения определения функции программист должен не забыть обновить все прототипы, использованные в программе.

Заголовочный файл является одним из решений этой проблемы. В заголовочном файле модуля объявляется каждая функция, объект и тип данных, являющиеся частью интерфейса вызова модуля — например, в этом случае заголовочный файл может содержать только объявление функции add. Каждый исходный файл, ссылающийся на функцию add, должен использовать директиву #include для подключения заголовочного файла:

 /* File triple.c */

 #include "add.h"

int triple(int x)

 {return add(x, add(x, x));}

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

Объявление переменной имеет следующий формат:

[модификаторы] спецификатор_типа идентификатор [, идентификатор] ...

Модификаторы - ключевые слова signed, unsigned, short, long.

Спецификатор типа - ключевое слово char или int, определяющее тип объявляемой переменной.

Идентификатор - имя переменной.

 Пример:

char x;

int a, b, c;

unsigned long long y;

 Таким образом, будут объявлены переменные x, a, b, c, y. В переменную x можно будет записывать значения от -128 до 127. В переменные a, b, c - от -32768 до +32767. В переменную y - от 0 до 18446744073709551615.

Инициализация значения переменной при объявлении

 При объявлении переменную можно проинициализировать, то есть присвоить ей начальное значение. Сделать это можно следующим образом. int x = 100;

 Таким образом, в переменную x при объявлении сразу же будет записано число 100.

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

               

 

 

Билет 11

1. Высокоскоростная шина процессора(Front Side Bus,FSB) – служит для обмена данными между процессором, памятью, а также контроллерами остальных шин.

Шины расширения – служат для подключения дополнительных модулей компьютера

Внешние шины – служат для подключения внешних устройств.

 

2. Все переменные в программе характеризуются не только типом, но и классом памяти. В языке Си существует четыре класса памяти: автоматический (automatic), регистровый(register), статический(static) и внешний(external)

Автоматические переменные в программе можно описать так: auto A; auto char c1; auto int x= 125;

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

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

 #include <stdio.h>

 int x=145;/*Описание внешней переменной*/

 main()

 { extern int x,y; printf("x=%d y=%d \n",x,y); }

 int y=541; /*Описание внешней переменной*/

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

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

static char c; static int a=1;

Регистровые переменные объявляются в программе с помощью ключевого слова register и по замыслу автора языка Си должны хранится в сверх быстрой памяти ЭВМ - регистрах. Используются аналогично автоматическим переменным. Целесообразность их применения для увелечения быстродействия программы представляется в большинстве случаев сомнительной.

Время жизни объектов программы определяется по следующим правилам:

· переменная, объявленная глобально, т. е. вне всех блоков, существует на протяжении всего времени выполнения программы;

· локальные переменные, т. е. объявленные внутри блока, а также переменные с классом памяти register или auto, имеют время жизни только на период выполнения того блока, в котором они объявлены. Если переменная объявлена внутри блока с классом памяти static или extern, то она имеет время жизни на период выполнения всей программы;

Видимость переменных и функций в программе определяется следующими правилами:

· переменная, объявленная или определенная глобально, видима от точки объявления или определения до конца исходного файла. Можно сделать переменную видимой и в других исходных файлах, для чего в этих файлах следует ее объявить с классом памяти extern;

· переменная, объявленная или определенная локально, видима от точки объявления или определения до конца текущего блока;

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

· функции с классом памяти static видимы только в том файле, в котором они определены. Остальные функции видимы во всей программе;

· метки в функции видимы в пределах данной функции;

· имена формальных параметров, объявленные в списке параметров прототипа функции, видимы только от точки объявления параметра до конца объявления функции.

При инициализации необходимо придерживаться следующих правил:

o объявления, содержащие спецификатор класса памяти extern, не могут содержать инициаторов;

o глобальные переменные всегда инициализируются, и если это не сделано явно, то они инициализируются нулевым значением;

o переменная с классом памяти static может быть инициализирована константным выражением. Инициализация для них выполняется один раз при создании переменной. Если явная инициализация отсутствует, то переменная инициализируется нулевым значением;

o явная инициализация переменных с классом памяти auto или register выполняется всякий раз при входе в блок, в котором они объявлены. Если инициализация переменных в объявлении отсутствует, то их начальное значение не определено;

o начальными значениями для глобальных переменных и переменных с классом памяти static должны быть константные выражения. Адреса таких переменных являются константами, которые можно использовать для инициализации объявленных глобально указателей. Адреса переменных с классом памяти auto или register не являются константами и их нельзя использовать в инициаторах.

 

Билет 12

· 1. Процессор - Занимается обработкой информации. Характеризуется разрядностью (16-, 32-, 64-разрядные)и частотой (измеряется в мегагерцах или гигагерцах). В настоящее время очень популярны Intel Pentium IV и AMD Athlon.            

· ОЗУ - Оперативное запоминающее устройство. Хранит текущую информацию. При отключении питания вся информация из ОЗУ теряется. Характеризуется объемом в мегабайтах. Типичные значения: 64, 128, 256,512, 1024Мбайт.       

· ПЗУ - Постоянное запоминающее устройство. Хранит информацию о различных устройствах, а также программу для тестирования оборудования и загрузки операционной системы.             

· Монитор - Показывает информацию на экране. Бывают нескольких видов – LCD (плоские и компактные, к тому же более дорогие) и электронно-лучевые (имеют большие размеры и вес, более вредны для здоровья, но при этом довольно дёшевы). Характеризуются размерами (14, 15, 17 и более дюймов по диагонали) и максимальным разрешением (800x600, 1024x768, 1280x1024 и более). Некоторые мониторы имеют встроенные колонки, микрофон, USB-концентратор и ТВ-тюнер.        

· Видеокарта - Служит посредником между процессором и монитором. Характеризуется объемом оперативной памяти (1, 2, 4, 8, 16, 32, 64, 128 Мб) и поддерживаемыми разрешениями экрана (640x480, 800x600, 1024x768 и выше). Некоторые видеокарты могут иметь встроенные ТВ-тюнер или 3D-ускоритель. Отдельные устройства поддерживают вывод на телевизор или два монитора одновременно.   

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

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

· Жесткий диск    - Хранит данные пользователя, прикладные программы, а также операционную систему. Необходим для сохранения информации после отключения компьютера. Характеризуется объёмом хранимой информации (от сотен мегабайт до сотен гигабайт) и скоростью передачи данных. Более надёжные и скоростные диски имеют интерфейс SCSI. Для дома и офиса дешевле использование дисков с интерфейсом EIDE .

 

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

Микропроцессоры отличаются друг от друга двумя характеристиками: типом (моделью) и тактовой частотой.

Одинаковые модели микропроцессоров могут иметь разную тактовую частоту. Тактовая частота указывает, сколько элементарных операций (тактов) микропроцессор выполняет в одну секунду. Тактовая частота измеряется в мегагерцах (Мгц).

Кэш процессора — довольно важный параметр. Чем он больше, тем больше данных хранится в особой памяти, которая ускоряет работу процессора. В кэше процессора находятся данные, которые могут понадобится в работе в самое ближайшее время. Чтобы вы не путались в уровнях кэша — запомните одно свойство: кэш первого уровня самый быстрый, но самый маленький, второго — помедленней, но побольше и кэш третьего уровня самый медленный и самый большой(если он есть).

Сейчас всё больше процессоров 64 разрядные. В общем виде — разрядность означает, сколько оперативной памяти вы можете максимум установить в свой компьютер. В принципе сейчас для домашнего компьютера вполне достаточно 4 гигабайт оперативной памяти и следовательно 32 разрядного процессора.

Количество ядер — этот параметр показывает количество одновременно работающих программ. Но не думайте, что если вы запустите Word и Winamp на компютере с одним ядром, что у вас программы работают одновременно. Они работают последовательно переключаясь с одной на другую, но делают это так быстро, если у вас быстрый компьютер, что мы этого не замечаем.Количество ядер в последнее время прочно вошло в основные характеристики процессора, что многие ошибочно полагают, что если ядер больше, то всегда будет прирост производительности. К сожалению если программа не оптимизирована под 4 ядра, то вы хоть убейтесь она 4 ядра использовать не будет.

 

2)      Директива препроцессора include у нас находится буквально в каждом примере. Она создает копию файла, который мы в ней указываем, и добавляет его в нашу программу #include <имя файла> - Поиск этого файла будет вестись в каталоге, где расположены библиотечные файлы.

#include "имя файла" - Поиск будет осуществляться в каталоге, где расположена наша программа.

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

Директива препроцессора define используется, что бы создать константы. Вот ее синтаксис:

#define идентификатор значение

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

#define SIZE 5

 for (int i=0; i < SIZE; i++){

   for (int j=0; j < SIZE;j++){

     printf("*"); } printf("\n"); }

Эта программа будет выводить квадрат размеров SIZExSIZE. Она хороша тем, что если нам понадобится изменить размеры нашего квадрата, то достаточно будет только изменить значение нашей заданной константы SIZE на необходимое.

 

 

Билет 13+

1.

2. Транслятор - обслуживающая программа, преобразующая исходную программу, предоставленную на входном языке программирования, в рабочую программу, представленную на объектном языке.В настоящее время трансляторы разделяются на три основные группы: ассемблеры, компиляторы и интерпретаторы.

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

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

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

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

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

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

 

 

Билет 14

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

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

 

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

-Сжатие без потерь (англ. Lossless data compression) — метод сжатия данных: видео, аудио, графики, документов представленных в цифровом виде, при использовании которого закодированные данные могут быть восстановлены с точностью до бита. При этом оригинальные данные полностью восстанавливаются из сжатого состояния. Этот тип сжатия принципиально отличается от сжатия данных с потерями. Для каждого из типов цифровой информации, как правило, существуют свои оптимальные алгоритмы сжатия без потерь.

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

Сжатие без потерь используется, когда важна идентичность сжатых данных оригиналу. Обычный пример — исполняемые файлы и исходный код. Некоторые графические файловые форматы, такие как PNG, используют только сжатие без потерь; тогда как другие (TIFF, MNG) или GIF могут использовать сжатие как с потерями, так и без.

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

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

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

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

Звуковые данные, прошедшие сжатие с потерями, не принимаются судами как вещественные доказательства (и даже не берутся во внимание)[источник не указан 592 дня]. по причине того, что информация, прошедшая сжатие, приобретает артефакты сжатия и теряет естественные шумы среды, из которой производилась запись, в связи с чем невозможно установить подлинная ли запись или синтезированная. Поэтому важные записи рекомендуется производить в формате ИКМ (PCM) или использовать плёночный диктофон.

Фотографии, записанные в формате JPEG, могут быть приняты судом (несмотря на то, что данные прошли сжатие с потерями).

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

Если же объявить переменную вне всяких функций (такие переменные называются глобальными), то её можно использовать во всех функциях без объявления

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

При инициализации необходимо придерживаться следующих правил:

1. Объявления содержащие спецификатор класса памяти extern не могут содержать инициаторов.

2. Глобальные переменные всегда инициализируются, и если это не сделано явно, то они инициализируются нулевым значением.

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

4. Инициализация переменных с классом памяти auto или register выполняется всякий раз при входе в блок, в котором они объявлены. Если инициализация переменных в объявлении отсутствует, то их начальное значение не определено.

5. Начальными значениями для глобальных переменных и для переменных с классом памяти static должны быть константные выражения. Адреса таких переменных являются константами и эти константы можно использовать для инициализации объявленных глобально указателей. Адреса переменных с классом памяти auto или register не являются константами и их нельзя использовать в инициаторах.

 

 










Последнее изменение этой страницы: 2018-05-29; просмотров: 139.

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