Реферат: И математическое моделирование



МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ

ДОНЕЦКИЙ НАЦИОНАЛЬНЫЙ УНИВЕРСИТЕТ


МЕТОДИЧЕСКИЕ УКАЗАНИЯ


к курсу


ПРОГРАММИРОВАНИЕ

И МАТЕМАТИЧЕСКОЕ МОДЕЛИРОВАНИЕ


Часть 1


(для студентов физических специальностей)


Донецк ДонНУ 2008

ББК 3 973.26р30


Методические указания к курсу «Программирование и математическое моделирование» Часть 1 (для студентов физических специальностей) / А.В. Григорьев. – Донецк: ДонНУ, 2008. – 51с.


Методические указания содержат учебные материалы по курсу «Программирование и математическое моделирование» и предназначены для студентов физических специальностей Донецкого национального университета. Учебные материалы включают: рекомендации по выполнению лабораторных работ и критерии оценки при приёме лабораторных работ, краткое описание теоретического материала по каждой из ключевых тем, а также варианты заданий лабораторных работ. В рамках курса предполагается выполнение студентами десяти лабораторных работ. В теоретической части курса излагаются основы алгоритмизации на базе языка Си. Курс опирается на знания учащихся по программе предмета «Информатика» средней школы.

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


Составитель: А.В. Григорьев, доц.


Рецензент: А.А. Каргин, проф.


СОДЕРЖАНИЕ


РЕКОМЕНДАЦИИ К ВЫПОЛНЕНИЮ ЛАБОРАТОРНЫХ РАБОТ 4

1. СИСТЕМЫ СЧИСЛЕНИЯ 5

1. Основные определения 5

Перевод из десятичной системы в двоичную

и шестнадцатеричную 5

Перевод из двоичной и шестнадцатеричной

систем в десятичную 7

ЛР №1 СИСТЕМЫ СЧИСЛЕНИЯ 8

2. ОРГАНИЗАЦИЯ ВВОДА \ ВЫВОДА 10

Структура программы на языке Си 10

Типы данных языка Си 12

Константы и переменные 13

Организация ввода \ вывода 15

ЛР №2 ОРГАНИЗАЦИЯ ВВОДА/ВЫВОДА 17

3. ОРГАНИЗАЦИЯ ВЫЧИСЛЕНИЙ. ОПЕРАЦИИ ЯЗЫКА СИ. МАТЕМАТИЧЕСКИЕ ФУНКЦИИ 19

Операции языка Си 19

Математические функции 21

ЛР №3 ОРГАНИЗАЦИЯ ВЫЧИСЛЕНИЙ 23

4. ОСНОВЫ СТРУКТУРНОГО ПРОГРАММИРОВАНИЯ 24

Основные принципы структурного программирования 24

Операторы языка Си 25

Программирование конструкций с ветвлением 26

Программирование циклических конструкций 27

ЛР №4 ПРОГРАММИРОВАНИЕ СТРУКТУР С ВЕТВЛЕНИЕМ 29

ЛР №5 ПРОГРАММИРОВАНИЕ ЦИКЛИЧЕСКИХ СТРУКТУР 32

5. РАБОТА С МАССИВАМИ 34

ЛР №6 РАБОТА С МАССИВАМИ 37

6. ОПИСАНИЕ ПОЛЬЗОВАТЕЛЬСКИХ ФУНКЦИЙ.

ОСНОВЫ РАБОТЫ СО СТРОКАМИ 38

Описание пользовательских функций 38

Основы работы со строками 39

ЛР №7 ОПИСАНИЕ ПОЛЬЗОВАТЕЛЬСКИХ ФУНКЦИЙ.

ОСНОВЫ РАБОТЫ СО СТРОКАМИ 41

7. РЕКУРСИЯ 42

ЛР № 8 РЕКУРСИЯ 44

8. МЕТОДЫ СОРТИРОВКИ И ПОИСКА 45

Методы поиска 45

Методы сортировки 46

ЛР № 9 МЕТОДЫ СОРТИРОВКИ И ПОИСКА 48

9. РАБОТА С ФАЙЛАМИ 48

ЛР № 10 ОСНОВЫ РАБОТЫ С ФАЙЛАМИ 50

ЛИТЕРАТУРА 52


РЕКОМЕНДАЦИИ К ВЫПОЛНЕНИЮ ЛАБОРАТОРНЫХ РАБОТ


Лабораторные работы курса рекомендуется выполнять в определённом порядке:

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

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

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

Пройти защиту лабораторной работы.


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

объяснить работу программы по исходному коду;

аргументировано ответить на вопросы, подобные контрольным;

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

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


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

оригинальный алгоритм решения задачи;

выполнение и сдача лабораторной работы в опережение графика;

решение дополнительного задания повышенной сложности (данные задания выдаются преподавателем при условии безукоризненной защиты основного задания лабораторной работы).

Штрафные баллы могут быть начислены, если:

студент не ориентируется в коде программы;

студент не владеет теоретическим материалом по теме лабораторной работы;

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


1. СИСТЕМЫ СЧИСЛЕНИЯ


1. Основные определения


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

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

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

Вообще, в k-ричной системе счисления (системе счисления, имеющей основание k) число записывается в виде последовательности цифр: . В том случае, если основание системы k>9, для обозначения цифр больших 9 используют латинские буквы (A=10, B=11, C=12 и т.д.). Цифры называют разрядами числа: an –старший разряд, a0 – младший разряд. Значение самого числа A, представленного разрядами равно:


. (1)


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


^ Перевод из десятичной системы в двоичную и шестнадцатеричную


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


. (2)


Не трудно показать, что представление числа в k-ичной системе счисления есть: . Таким образом, для выделения младшего разряда числа A в k-ичном представлении необходимо разделить число A на основание системы k с остатком, при этом остаток от деления A на k даст нам младший разряд a0, а целая часть деления – число A1, полученное из исходного числа A отбрасыванием младшего разряда.

Введём следующие обозначения: A/k – целая часть деления числа A на k; A%k – остаток от деления A на k. Тогда алгоритм вычисления разрядов числа A в k-ичном представлении можно представить следующими соотношениями:


a0 = A%k; A1 = A/k;

a1 = A1%k; A2 = A1/k;

a2 = A2%k; A3 = A2/k;

………………………………

ak-1=Ak-1%k; Ak = Ak-1/k;

………………………………


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





Рис. 1.1. Графическая схема алгоритма вычисления разрядов числа в k-ичной системе счисления

Продемонстрируем работу данного алгоритма на следующих примерах.

Пример 1.1. Перевести число 2363 из десятичной в двоичную и шестнадцатеричную системы счисления.

Решение.

Переведём число 236310 в двоичную систему счисления. Основание желаемой системы счисления k = 2; исходное число A = 2353. Согласно описанному алгоритму:




a0 = 2363 % 2 = 1; A1 = 2363 / 2 = 1181;

a1 = 1181 % 2 = 1; A2 = 1181 / 2 = 590;

a2 = 590 % 2 = 0; A3 = 590 / 2 = 295;

a3 = 295 % 2 = 1; A4 = 295 / 2 = 147;

a4 = 147 % 2 = 1; A5 = 147 / 2 = 73;

a5 = 73 % 2 = 1; A6 = 73 / 2 = 36;

a6 = 36 % 2 = 0; A7 = 36 / 2 = 18;

a7 = 18 % 2 = 0; A8 = 18 / 2 = 9;

a8 = 9 % 2 = 1; A9 = 9 / 2 = 4;

a9 = 4 % 2 = 0; A10 = 4 / 2 = 2;

a10 = 2 % 2 = 0; A11 = 2 / 2 = 1;

a11 = 1 % 2 = 1; A12 = 1 / 2 = 0;


Поскольку A12 = 0, выполнение алгоритма прекращается. Ответ записываем в виде: A = = 1001001110112.


Переведём число 236310 в шестнадцатеричную систему счисления. Основание желаемой системы счисления k = 16; исходное число A = 2363. Согласно описанному алгоритму:




a0 = 2363 % 16 = 11; A1 = 2363 / 16 = 147;

a1 = 147 % 16 = 3; A2 = 147 / 16 = 9;

a2 = 9 % 16 = 9; A3 = 9 / 16 = 0;


Поскольку A3 = 0, выполнение алгоритма прекращается. В шестнадцатеричном разложении числа присутствуют цифры, превосходящие цифру 9 (a0 = 11). Для записи таких чисел используют латинские буквы (A=10, B=11, C=12, D=13, E=14, F=15). Таким образом, ответ записываем в виде: A = = 93B16.


Перевод из двоичной и шестнадцатеричной систем в десятичную


Для перевода чисел из k-ичной системы счисления в десятичную будем пользоваться формулой (1).


Пример 1.2. Переведите из двоичной системы счисления в десятичную число A = 101000102.

Решение. Число A записано в виде = 101000102. Воспользуемся формулой (1): .


Пример 1.3. Переведите из шестнадцатеричной системы счисления в десятичную число A = 3FA16.

Решение. Число A записано в виде = 3FA16. Воспользуемся формулой (1): .


ЛАБОРАТОРНАЯ РАБОТА №1

СИСТЕМЫ СЧИСЛЕНИЯ


Цель:

Изучение различных систем счисления.

Перевод чисел из одной системы счисления в другую.

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

Что такое система счисления?

Какой арифметической операции эквивалентно приписывание справа «0» к целому числу, записанному в k-ичной системе счисления (например, 1342k → 13420k)?

Какое из двух чисел больше: 1000002 или 2116?

Чему равно число 0.12 ?

Задание:

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

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


Таблица 1.1

№ варианта

10-чная

16-ричная

Двоичная

1

16531

7263

8720

B1F2

13C0

3A8E

101111001011101

101011011010111

100101110110001

2

12992

9011

8921

F12E

C320

ED01

101100101001111

111010011000010

101111100000011

3

21001

9128

8201

EA01

43AA

B012

100001010111101

111011110001110

101001001111010

4

29017

8991

6733

1A93

A0EF

FF13

100100110101101

110010010001101

111101000000101

5

17829

9821

3821

783E

A0B5

53FE

101011010111011

111101001110001

101011100100011

6

12891

1928

9918

8E2F

3FF1

45EA

100010111111101

101111101010111

111010011010111

7

16661

7212

3829

4FE2

AABB

F4A7

101001110010111

100101011011001

100111001010111

8

17721

7283

6549

5EF8

384C

D57F

101011111001011

100010111000010

100100111001111

9

12999

2399

8294

8ECD

471D

7F8E

101011110011110

101011111101110

100011010111001

10

19273

5628

9881

28F9

FF90

E09A

110000011110101

101010010110101

100001111111100

11

19211

2954

9882

ABEF

348A

7809

101001111100100

110111101100000

100101110001111

12

16488

7540

5012

1F2E

EF82

92F1

101110001110011

101001110001001

101000100001110

13

13022

2391

8927

12CE

F2CF

A043

101111111000000

100111000111011

101011110001110

14

12991

4939

9028

8EF1

6D77

901F

100001111111111

101010101100011

111110000010000

15

12903

3498

8209

2E87

93FE

EF93

100011111011101

111100001111001

100010110110100



^ 2. ОРГАНИЗАЦИЯ ВВОДА \ ВЫВОДА


Структура программы на языке Си


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


Пример 2.1.


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



// Лабораторная работа N

// Выполнил Иванов П.В., ФОИ-1, В-2

// Реализовать программно вычисление

// функции f(x) = 2*x+1

#
Подключение файла с декларацией функций стандартного ввода \ вывода
include




float f(float x)

{
Описание пользовательской функции


return 2*x+1;

}


void main()

{

float x;


Основная часть программы
printf(“Введите число x: ”);

scanf(“%f”, &x);

printf(“f(%f) = %f\n”, x, f(x));

}


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

Часть листинга, расположенная между конструкцией // и концом текущей строки являются комментарием;

Часть листинга между конструкциями /* и */ так же являются комментариями.

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

Вообще, на практике, использование комментариев – один из важнейших аспектов программирования. Грамотно написанные комментарии значительно облегчают процесс написания, сопровождения, отладки и восприятия программного кода. С другой стороны, отсутствие комментариев либо их избыток усложняют данные процессы. В связи с этим, рекомендуется комментарии делать лаконичными. Комментированию подлежат: отдельные смысловые фрагменты кода, дающие на словесном уровне понятие об алгоритме решения задачи; вводимые переменные и константы, смысл которых может быть не понятен на интуитивном уровне. Не рекомендуется комментировать переменные или программные структуры, имеющие интуитивно понятный или обще принятый, традиционный смысл. Также при написании комментариев следует пользоваться правилом: «комментарий не должен переводить с языка программирования на русский язык – комментарий описывает идею, реализованную автором программы в виде кода на языке Си». При решении алгоритмически сложных задач рекомендуется начать процесс программирования с написания комментариев, поскольку формулировка решения на естественном языке в форме коротких комментариев позволит, с одной стороны, более чётко представить ход решения, и, с другой стороны, разбить одну большую сложную задачу на несколько маленьких или не сложных (провести декомпозицию задачи).

После условия задачи, оформленного в виде комментариев, следуют директивы #include, которые служат для подключения так называемых заголовочных файлов, содержащих декларации (заголовки) ряда библиотечных функций. В частности, в примере 2.1. в основной программе используются функции ввода \ вывода scanf и printf, задекларированные в заголовочном файле stdio.h.

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

Последняя часть программы содержит основной код, оформленный в виде пользовательской функцией, имеющей специальное, зарезервированное имя main. После запуска программы управление передаётся непосредственно этой функции. В связи с этим, каждая программа на языке Си должна содержать функцию main1.

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



Типы данных языка Си


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

Типы языка Си можно разделить на простые и составные. Простые типы можно разделить на целые и действительные (с плавающей точкой). К целым типа относятся: char (символьный), int (целый), short (короткий) и long (длинный). Для целых типов данных также применимы модификаторы signed и unsigned, указывающие на особенность использования знакового бита. По умолчанию (без указания модификатора) используется signed. Размеры целых типов в байтах для 32-битных ОС, а также диапазоны значений с модификаторами signed и unsigned приведены в таблице 2.1.


Таблица 2.1

Тип данных

Размер

(байт)

Диапазон

signed

Unsigned

char

1

-128 – 127

0 – 255

short

2

-32768 – 32767

0 – 65535

int

4

-2147483648 – 2147483647

0 – 4294967295

long

4

-2147483648 – 2147483647

0 – 4294967295


К действительным типам относятся: float (числа с плавающей точкой одинарной точности), double (с плавающей точкой двойной точности) и long double (длинное действительное). Все действительные типы позволяют представлять как положительные, так и отрицательные значения. Размеры действительных типов в байтах и диапазоны положительных значений, представимых каждым из типов, приведены в таблице 2.2.


Таблица 2.2

Тип данных

Размер (байт)

Диапазон

float

4



double

8



long double

10




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

Перечисления позволяют использовать имена вместо числовых значений. Например, для обозначения времени года можно использовать целый тип и помнить, что 0 – зима, 1 – весна, 2 – лето, 3 – осень. Альтернативным путём является использование перечисления со значениями winter, spring, summer, autumn. Выглядеть это будет следующим образом:


enum season{winter, spring, summer, autumn};


Указатели являются ссылками на объекты какого-либо (простого или составного) типа, а значения типа указатель представляют собой физический адреса соответствующих объектов. Для обозначения указателя используется символ * после типа объекта. Например, char * – указатель на символ (как правило, используются для ссылки на первый символ строки), int * – ссылка на целое.

Массивы используют для обозначения векторов значений некоторого типа. Так, символьная строка является массивом одиночных символов; координаты точки в трёхмерном пространстве – массивом, состоящим из трёх элементов типа float. Для объявления массива используется конструкция типа: <тип > <название переменной>[<количество элементов>]. Например, координата может быть объявлена в виде: float coord[3].

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


struct _coord{

float x, y, z;

};


В языке Си также существует возможность введения своих типов данных. Для этого используется ключевое слово typedef. Например:


typedef count int; // задан пользовательский тип count,

// совпадающий с int

typedef char str[50]; // пользовательский тип str == char[50]


^ Константы и переменные


Под константой будем понимать значение, имеющее некоторый тип, и которое не может быть изменено. Например: 2, 321, 15 – константы целого типа; 3.1416, 2.71 – константы вещественного типа; «абабагаламага» – строковая константа.

Константы будем разделять на числовые, символьные, строковые и перечислимые. Числовые константы, в свою очередь, можно разделить на целые и вещественные.

Целые константы соответствуют типам: char, int, short, long, и могут быть записаны в десятичной, восьмеричной или шестнадцатеричной системах счисления. Так, последовательность цифр, начинающихся не с нуля, обозначает десятичную запись числа (например: 12, 64, 321); начинающаяся с 0 (ноль) – восьмеричную (например: 045, 0123, 0231) и с 0x или 0X (ноль-икс) – шестнадцатеричную запись числа (например: 0x12, 0x3F, 0x4d). Для обозначения длинных целых констант (типа long) в конце записи дописывается малая или большая английская буква L или l. Например: 1234L, 0x1223l. Для того, чтобы подчеркнуть, что константа является беззнаковой, дописывается U или u: 123u, 13244U, 145UL.

Вещественные константы обозначают в виде целой части, десятичной точки, дробной части, символа e или E и экспоненты со знаком или без. При этом, запись может не содержать целой или дробной части, а также экспоненты. Например: 3.12E-2 (представление числа 0.0312), 15E-2, 123., .321, 12.2. По умолчанию вещественные константы имеют тип double. Если необходимо указать, что константа имеет тип float, в конце записи добавляют F или f. Для обозначения констант типа long double – дописывают L или l.

Символьные константы – это один или два символа, заключенные в апострофы (‘ ‘). Последовательности, начинающиеся со знака \ , называются управляющими. Некоторые наиболее часто используемые управляющие символы приведены в таб. 2.3.


Таблица 2.3

Символьная константа

Символ

Символьная константа

Символ

\b

возврат на один шаг

\r

Возврат каретки

\n

новая строка

\t

Табуляция

\\

\

\0ddd

Символ с кодом ddd в восьмеричной системе

\%

%

\‘



\0xdd

Символ с кодом dd в шестнадцатеричной системе

\?

?

\"

"


Строковая константа – это последовательность символов, заключенная в кавычки. Внутри строк также могут использоваться управляющие символы. Например:


"\nНовая строка",

"\n\"Алгоритмические языки программирования\"".


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


enum {ten=10, three=3, four, five, six};

enum {Sun, Mon, Tue, Wed, Thu, Fri, Sat};


Переменная – именованная область памяти, в которой хранятся данные определенного типа. У переменной есть имя и значение. Имя служит для обращения к области памяти, в которой хранится значение. Перед использованием любая переменная должна быть описана. Описание переменной может быть выполнено в любом месте программы. Общий вид оператора описания: <тип переменной> <имя переменной>. При описании переменной также может быть присвоено начальное значение (инициализация переменной). Если вводится несколько переменных одного типа, можно перечислить их имена через запятую. Перед типом переменной возможно использование ключевого слова const (переменные, объявленные таким образом не могут менять своего значения после инициализации). Например:


int a = 10;

float b = 20.5f;

double c, d, e;

char d[50] = “первая строка\nвторая строка”;

const double ___my_pi = 3.1416;


4. Организация ввода \ вывода


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

Для ввода с клавиатуры и вывода на экран в Си используются функции scanf и printf, имеющие следующий формат:


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

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


Форматная строка – это строка символов (включая управляющие символы, приведенные в таб. 2.3), а также спецификации преобразования. Каждому аргументу из списка аргументов соответствует своя спецификация преобразования. Для функции printf аргументы из списка аргументов представляют собой некоторые значения, представленные константой, выражением либо переменной. Для функции scanf аргументы представляют собой адреса переменных, в которые осуществляется ввод соответствующих значений. К примеру, если задана переменная a типа int, то для вывода её значения на экран при помощи функции printf в списке аргументов необходимо указать a, а для ввода при помощи функции scanf – адрес этой переменной &a (& – операция взятия адреса).

Основная задача спецификации преобразования – указать тип и формат выводимого значения. Общий вид спецификации преобразования:


%<модификатор><спецификация формата>


Спецификация формата (обязательная часть спецификации преобразования) – буква, указывающая, в каком формате будет введено или выведено соответствующее значение. Наиболее часто используемые спецификации приведены в таб. 2.4.

Таблица 2.4

Спецификация

Тип аргумента

Описание

%d, %i

Знаковое целое

Десятичное целое

%u

Беззнаковое целое

Десятичное целое

%x, %X

16-ричное целое

%o

8-ричное целое

%f

Действительное

В форме [-]dddd.ddd

%e, %E

Действительное

В экспоненциальной форме

%g, %G

Действительное

В форме %e или %f (зависит от числа)

%c

char

Одиночный символ

%s

char [], char *

Символьная строка


Модификатор (необязательная часть) – может содержать:

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

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

модификатор типа (существенно при вводе значений типа short, long, double, long double). Задаётся в виде одной буквы: h – для short, l – для long и double, L – для long double. Например, для ввода параметра типа double, то вместо “%f” необходимо писать “%lf”.


// пример программы ввода и вывода


#include


void main()

{

int a; long b; // целые типы

float c; double d; // действительные

char e; // символ

char f[200]; // строка


printf("a="); scanf("%i", &a); // запрос и ввод a

printf("b="); scanf("%li", &b); // запрос и ввод b

printf("c="); scanf("%f", &c); // запрос и ввод c

printf("d="); scanf("%lf", &d); // запрос и ввод d

printf("e="); scanf("%c", &e); // запрос и ввод e

printf("f="); scanf("%s", &f); // запрос и ввод f


// вывод всех введенных переменных на экран

printf("a=%5i\nb=%5i\nc=%5.2f=%7e\nd=%5.2f=%7e\ne=%3c\nf=%10s\n",

a, b, c, c, d, d, e, f);

}


^ ЛАБОРАТОРНАЯ РАБОТА № 2

ОРГАНИЗАЦИЯ ВВОДА / ВЫВОДА

Цель:

Изучение основных типов данных языка Си.

Приобретение навыков работы с функциями ввода / вывода.

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

Что такое тип данных?

Равны ли строки: «01» и «\0x30\0x31»?

Сформируйте текстовую константу, которая при выводе формирует на экране следующую запись:


ФАМИЛИЯ: <Ваша фамилия>

ИМЯ: <Ваше имя>

ОТЧЕСТВО: <Ваше отчество>

^ ГОД РОЖДЕНИЯ: <Ваш год рождения>


Выравнивания значений добейтесь за счёт использования табуляции.


Значение какой из переменных (a или b) больше?


unsigned int a = 23;

unsigned int b = -1;


Чему будет равно значение переменной a после выполнения следующего фрагмента кода?


int b = 1;

int &a = b;

a = 2;

b = 5;


В чём разница между ссылкой и указателем?

Найдите ошибку в следующем фрагменте кода:


#include


void main()

{

int a, b, c;

scanf(“%i %i”, a, b);

c = a+b;

printf(“\n a+b=%i+%i=%i”, a, b, c);

}

В чём заключается различие в работе следующих команд:


scanf(“%i %i %i”, &a, &b, &c);

scanf(“%i,%i,%i”, &a, &b, &c);


Задание:

1) Организовать ввод переменных:

целых int a, long b;

действительных float c, double d;

символьной char e;

строковой char f[].

2) Организовать вывод:

целых переменных с шириной поля L;

действительных переменных в форме ddd.ddd с шириной поля вывода M и количеством разрядов дробной части N, а также в экспоненциальной форме шириной поля вывода P;

символьной переменной с шириной поля Q;

строковой переменной с шириной поля R.

Значения L, M, N, P, Q, R для каждого варианта приведены в таб. 2.5.


Таблица 2.5

Вариант

L

M

N

P

Q

R

1

7

12

5

10

2

10

2

8

12

4

11

3

11

3

9

12

3

12

4

12

4

10

13

2

10

5

13

5

11

13

2

11

2

14

6

7

13

3

12

3

15

7

8

14

4

10

4

15

8

9

14

5

11

5

14

9

10

14

5

12

2

13

10

11

11

4

10

3

12

11

7

11

3

11

4

11

12

8

11

2

12

5

10

13

9

10

2

10

2

10

14

10

10

3

11

3

11

15

11

10

4

12

4

12



^ 3. ОРГАНИЗАЦИЯ ВЫЧИСЛЕНИЙ. ОПЕРАЦИИ ЯЗЫКА СИ. МАТЕМАТИЧЕСКИЕ ФУНКЦИИ


Операции языка Си


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


Таблица 3.1

Операция

Назначение

Пример использования

::

Обращениеие к глоб. перем.

::a

[]

()

sizeof

sizeof

Индексация массива

Вызов функции

Размер объекта

Размер типа

a[12]

func(a, s)

sizeof(a)

sizeof(int)

++

++

--

--

~

!

-

&

()

Приращение после

Приращение до

Уменьшение после

Уменьшение до

Дополнение (побитовое «не»)

Логическое «не»

Унарный минус

Взятие адреса объекта

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

a++

++a

a--

--a

~a

!a

-a

&a

(int)a

*

/

%

Умножение

Деление

Остаток от деления

a*b

a/b

a%b

+

-

Сложение

Вычитание

a+b

a-b

<<

>>

Сдвиг битов влево

Сдвиг битов вправо

a<
a>>b

<

<=

>

>=

Меньше

Меньше или равно

Больше

Больше или равно

a
a<=b

a>b

a>=b

==

!=

Равно

Не равно

a==b

a!=b

&

Побитовое «И»

a&b

^

Побитовое «исключающее или»

a^b

|

Побитовое «ИЛИ»

a|b

&&

Логическое «И»

a&&b

||

Логическое «ИЛИ»

a||b

?:

Условная операция

a?b:c

=

*=

/=

%=

+=

-=

<<=

>>=

&=

|=

^=

Присваивание

Умножить и присвоить

Разделить и присвоить

Присвоить остаток от деления

Сложить и присвоить

Отнять и присвоить

Сдвиг влево – присвоить

Сдвиг вправо – присвоить

Побитовое «И» – присвоить

Побитовое «ИЛИ» – присвоить

«исключающее или» – присвоить

a=b

a*=b

a/=b

a%=b

a+=b

a-=b

a<<=b

a>>=b

a&=b

a|=b

a^=b

,

Операция «запятая»

a+b, c*d


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


^ Операция преобразования типа. Язык Си не относится к так называемым языкам с жесткой типизацией. Это проявляется в так называемом неявном преобразовании типов. Для демонстрации данного принципа рассмотрим следующий пример:


void main()

{

int c;

float a = 5.1f, b = 3.1f;

c = a+b;

}


Прокомментируем данный пример. Очевидно, результатом операции a+b будет число 8.2 типа float. Однако результат операции сложения необходимо присвоить переменной с, имеющей тип int. В языках с жесткой типизацией подобное действие просто невозможно. В Си же выше приведенный фрагмент кода не является ошибочным – значение 8.2 типа float будет неявно преобразовано в значение 8 типа int. Очевидно, при подобном преобразовании типов возможна потеря данных (в нашем случае – потеряна дробная часть 0.2). Для того, чтобы объяснить компилятору, что мы не ошибочно, а намеренно делаем подобное преобразование типов, используется операция преобразования типов. В данном случае вместо строки: c = a+b – можно было записать: c = (int) (a+b).


^ Операция деления. При использовании этой операции следует обратить внимание на следующий момент. Кроме привычного для нас деления, согласно которому, скажем, 5/2 = 2.5, существует ещё и так называемое целое деление, при котором 5/2 = 2 (учитывается только целая часть). При этом, «обычное» (традиционное) деление применяется, если хотя бы один из аргументов является действительным числом, а «целое» – если оба аргумента являются целыми. Рассмотрим следующий пример.


void main()

{

float a = 5/2; // вопреки ожиданиям, a равно не 2.5, а 2.

float b = 5.0f/2; // b = 2.5, поскольку один из

// аргументов типа float

int c = 4, d = 3;

float e = c/d; // e = 1

float f = (float)c/d; // f = 1.3333, т.к. перед делением к c

// применено преобразование типа к float

float g = 1.0f*c/d // g = 1.3333, т.к. 1.0f*c = 4.0f (float)

}

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


^ Операции «запятая». Используется в том случае, если необходимо произвести вычисление нескольких выражений, а по синтаксису предполагается только один. При этом, возвращаемое значение соответствует последнему выражению в списке. Например, после выполнения команды: a=(3+2,4,0), значение переменной a будет равняться 0.


2. Математические функции


При организации вычислений зачастую бывает недостаточно операций, перечисленных в таб.3.1, например, если на каком-то шаге необходимо организовать вычисление функций sin(x), ex, и т.д. Для подобных вычислений необходимо воспользоваться библиотечными математическими функциями. Для этого, прежде всего, необходимо подключить библиотечный файл math.h при помощи директивы #include.

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


Таблица 3.2

Сигнатура функции

Назначение

int abs (int x)

long labs (long x)

double fabs (double x)

long double fabsl (long double x)



double cos (double x)

long double cosl (long double x)



double sin (double x)

long double sinl (long double x)



double tan (double x)

long double tanl (long double x)



double cosh (double x)

long double coshl (long double x)



double sinh (double x)

long double sinhl (long double x)



double tanh (double x)

long double tanhl (long double x)



double acos (double x)

long double acosl (long double x)



double asin (double x)

long double asinl (long double x)



double atan (double x)

long double atanl (long double x)



double sqrt (double x)

long
еще рефераты
Еще работы по разное