И математическое моделирование
Вид материала | Методические указания |
- Математическое моделирование управляемого движения космических аппаратов, 213.72kb.
- Программа дисциплины имитационное моделирование в экономике для направления 080100., 228.47kb.
- Математическое моделирование многомерных квазистационарных электромагнитных полей, 380.28kb.
- Правительстве Российской Федерации» (Финансовый университет) Кафедра «Математическое, 246.23kb.
- Математическое моделирование термомеханических процессов в системах армированных стержней, 259.01kb.
- Вестник Брянского государственного технического университета. 2007. №4(16) математическое, 61.09kb.
- Программа вступительного испытания собеседования для магистерской программы «математическое, 67.11kb.
- Cols=2 gutter=66> Математическое моделирование и процесс создания математической модели, 130.19kb.
- Математическое моделирование процессов самоорганизации в широкополосных системах 05., 181.86kb.
- Программа дисциплины «Математическое моделирование в менеджменте», 242.16kb.
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ
ДОНЕЦКИЙ НАЦИОНАЛЬНЫЙ УНИВЕРСИТЕТ
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
к курсу
ПРОГРАММИРОВАНИЕ
И МАТЕМАТИЧЕСКОЕ МОДЕЛИРОВАНИЕ
Часть 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]