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

Вид материалаМетодические указания

Содержание


Перевод из десятичной системы в двоичную и шестнадцатеричную
2. Организация ввода \ вывода
Константы и переменные
Лабораторная работа № 2
Год рождения
3. Организация вычислений. операции языка си. математические функции
Операция преобразования типа.
Операция деления.
Операции «запятая».
Лабораторная работа № 3
4. Основы структурного программирования
2. Операторы языка Си
Составные операторы.
3. Программирование конструкций с ветвлением
Оператор выбора.
4. Программирование циклических конструкций
Цикл с параметром.
Лабораторная работа № 4
Индивидуальные задания
B) Дан номер месяца (1 – январь, 2 – февраль, ...). Вывести число дней в этом месяце для невисокосного года. 15.
...
Полное содержание
Подобный материал:
  1   2   3   4   5


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

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


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


к курсу


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

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


Часть 1


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


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

ББК 3 973.26р30


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


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

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


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


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


СОДЕРЖАНИЕ


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

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

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

и шестнадцатеричную 5
  1. Перевод из двоичной и шестнадцатеричной

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

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

2. ОРГАНИЗАЦИЯ ВВОДА \ ВЫВОДА 10
  1. Структура программы на языке Си 10
  2. Типы данных языка Си 12
  3. Константы и переменные 13
  4. Организация ввода \ вывода 15

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

3. ОРГАНИЗАЦИЯ ВЫЧИСЛЕНИЙ. ОПЕРАЦИИ ЯЗЫКА СИ. МАТЕМАТИЧЕСКИЕ ФУНКЦИИ 19
  1. Операции языка Си 19
  2. Математические функции 21

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

4. ОСНОВЫ СТРУКТУРНОГО ПРОГРАММИРОВАНИЯ 24
  1. Основные принципы структурного программирования 24
  2. Операторы языка Си 25
  3. Программирование конструкций с ветвлением 26
  4. Программирование циклических конструкций 27

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

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

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

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

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

ОСНОВЫ РАБОТЫ СО СТРОКАМИ 38
  1. Описание пользовательских функций 38
  2. Основы работы со строками 39

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

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

7. РЕКУРСИЯ 42

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

8. МЕТОДЫ СОРТИРОВКИ И ПОИСКА 45
  1. Методы поиска 45
  2. Методы сортировки 46

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

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

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

ЛИТЕРАТУРА 52


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


Лабораторные работы курса рекомендуется выполнять в определённом порядке:
    1. Изучить материалы лекций, приведенные перед текстом лабораторной работы. Материалы лекций дают минимальный объём информации, необходимый для выполнения лабораторных работ. Для более детального ознакомления с материалом рекомендуется ознакомиться с соответствующими разделами источников, приведенных в списке рекомендованной литературы.
    2. Ответить на контрольные вопросы, приведенные в начале лабораторной работы. На вопросы, предполагающие анализ исходного кода, рекомендуется ответить устно, и сравнить полученный ответ на персональном компьютере.
    3. Выполнить индивидуальные задания, используя персональный компьютер.
    4. Пройти защиту лабораторной работы.


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


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

Штрафные баллы могут быть начислены, если:
  • студент не ориентируется в коде программы;
  • студент не владеет теоретическим материалом по теме лабораторной работы;
  • лабораторная работа сдана позже назначенного срока (без уважительной причины).


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


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


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

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

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

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


. (1)


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

  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-ичном представлении можно представить следующими соотношениями:

  1. a0 = A%k; A1 = A/k;
  2. a1 = A1%k; A2 = A1/k;
  3. a2 = A2%k; A3 = A2/k;

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

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


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





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

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

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

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



    1. a0 = 2363 % 2 = 1; A1 = 2363 / 2 = 1181;
    2. a1 = 1181 % 2 = 1; A2 = 1181 / 2 = 590;
    3. a2 = 590 % 2 = 0; A3 = 590 / 2 = 295;
    4. a3 = 295 % 2 = 1; A4 = 295 / 2 = 147;
    5. a4 = 147 % 2 = 1; A5 = 147 / 2 = 73;
    6. a5 = 73 % 2 = 1; A6 = 73 / 2 = 36;
    7. a6 = 36 % 2 = 0; A7 = 36 / 2 = 18;
    8. a7 = 18 % 2 = 0; A8 = 18 / 2 = 9;
    9. a8 = 9 % 2 = 1; A9 = 9 / 2 = 4;
    10. a9 = 4 % 2 = 0; A10 = 4 / 2 = 2;
    11. a10 = 2 % 2 = 0; A11 = 2 / 2 = 1;
    12. a11 = 1 % 2 = 1; A12 = 1 / 2 = 0;


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

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



  1. a0 = 2363 % 16 = 11; A1 = 2363 / 16 = 147;
  2. a1 = 147 % 16 = 3; A2 = 147 / 16 = 9;
  3. 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.

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


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


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

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


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

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


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

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


Цель:
  1. Изучение различных систем счисления.
  2. Перевод чисел из одной системы счисления в другую.

Контрольные вопросы:
  1. Что такое система счисления?
  2. Какой арифметической операции эквивалентно приписывание справа «0» к целому числу, записанному в k-ичной системе счисления (например, 1342k → 13420k)?
  3. Какое из двух чисел больше: 1000002 или 2116?
  4. Чему равно число 0.12 ?

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


Таблица 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. ОРГАНИЗАЦИЯ ВВОДА \ ВЫВОДА

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


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


Пример 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));

}


Программа начинается с комментариев, описывающих формулировку задания. В языке Си комментарии оформляются одним из двух способов:
  1. Часть листинга, расположенная между конструкцией // и концом текущей строки являются комментарием;
  2. Часть листинга между конструкциями /* и */ так же являются комментариями.

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

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

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

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

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

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


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


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

Типы языка Си можно разделить на простые и составные. Простые типы можно разделить на целые и действительные (с плавающей точкой). К целым типа относятся: 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]