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

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

Содержание


B) Дан номер месяца (1 – январь, 2 – февраль, ...). Вывести число дней в этом месяце для невисокосного года. 15.
Лабораторная работа № 5
Индивидуальные задания
5. Работа с массивами
Лабораторная работа № 6
6. Описание пользовательских функций.
Фактические параметры функции
2. Основы работы со строками
Подобный материал:
1   2   3   4   5

B) Даны два целых числа: D (день) и M (месяц), определяющие правильную дату невисокосного года. Вывести значения D и M для даты, следующей за указанной. 


5.

A) Перераспределить значения переменных X и Y так, чтобы в X оказалось меньшее из этих значений, а в Y — большее. 

B) Даны два целых числа: D (день) и M (месяц), определяющие правильную дату невисокосного года. Вывести значения D и M для даты, предшествующей указанной. 


6.

A) Значения переменных X, Y, Z поменять местами так, чтобы они оказались упорядоченными по возрастанию. 

B) Элементы равностороннего треугольника пронумерованы следующим образом: 1 – сторона (a), 2 – радиус вписанной окружности (R1), 3 – радиус описанной окружности (R2), 4 – площадь (S). Дан номер одного из этих элементов и его значение. Вывести значения остальных элементов данного треугольника (в том же порядке). 


7.

A) Значения переменных X, Y, Z поменять местами так, чтобы они оказались упорядоченными по убыванию. 

B) Элементы равнобедренного прямоугольного треугольника пронумерованы следующим образом: 1 – катет (a), 2 – гипотенуза (c), 3 – высота, опущенная на гипотенузу (h), 4 – площадь (S). Дан номер одного из этих элементов и его значение. Вывести значения остальных элементов данного треугольника (в том же порядке). 


8.

A) Даны две переменные целого типа: A и B. Если их значения не равны, то присвоить каждой переменной сумму этих значений, а если равны, то присвоить переменным нулевые значения. 

B) Элементы окружности пронумерованы следующим образом: 1 – радиус (R), 2 – диаметр (D), 3 – длина (L), 4 – площадь круга (S). Дан номер одного из этих элементов и его значение. Вывести значения остальных элементов данной окружности (в том же порядке). В качестве значения Pi использовать 3.14. 


9.

A) Даны две переменные целого типа: A и B. Если их значения не равны, то присвоить каждой переменной максимальное из этих значений, а если равны, то присвоить переменным нулевые значения. 

B) Единицы массы пронумерованы следующим образом: 1 – килограмм, 2 – миллиграмм, 3 – грамм, 4 – тонна, 5 – центнер. Дан номер единицы массы и масса тела M в этих единицах (вещественное число). Вывести массу данного тела в килограммах. 


10.

A) Даны три переменные: X, Y, Z. Если их значения упорядочены по убыванию, то удвоить их; в противном случае заменить значение каждой переменной на противоположное. 

B) Единицы длины пронумерованы следующим образом: 1 – дециметр, 2 – километр, 3 – метр, 4 – миллиметр, 5 – сантиметр. Дан номер единицы длины и длина отрезка L в этих единицах (вещественное число). Вывести длину данного отрезка в метрах. 


11.

A) Даны три переменные: X, Y, Z. Если их значения упорядочены по возрастанию или убыванию, то удвоить их; в противном случае заменить значение каждой переменной на противоположное. 

B) Арифметические действия над числами пронумерованы следующим образом: 1 – сложение, 2 – вычитание, 3 – умножение, 4 – деление. Дан номер действия и два числа A и B (В не равно нулю). Выполнить над числами указанное действие и вывести результат. 


12.

A) Даны целочисленные координаты точки на плоскости. Если точка не лежит на координатных осях, то вывести 0. Если точка совпадает с началом координат, то вывести 1. Если точка не совпадает с началом координат, но лежит на оси OX или OY, то вывести соответственно 2 или 3.

B) Дано целое число в диапазоне 1 – 5. Вывести строку – словесное описание соответствующей оценки (1 – "плохо", 2 – "неудовлетворительно", 3 – "удовлетворительно", 4 – "хорошо", 5 – "отлично"). 

13.

A) Даны вещественные координаты точки, не лежащей на координатных осях OX и OY. Вывести номер координатной четверти, в которой находится данная точка. 

B) Дано целое число в диапазоне 0 – 9. Вывести строку — название соответствующей цифры на русском языке (0 – "ноль", 1 – "один", 2 – "два", 3 – "три", и т.д.). 


14.

A) На числовой оси расположены три точки: A, B, C. Определить, какая из двух последних точек (B или C) расположена ближе к A, и вывести эту точку и ее расстояние от точки A. 

B) Дан номер месяца (1 – январь, 2 – февраль, ...). Вывести число дней в этом месяце для невисокосного года. 


15.

A) Даны четыре целых числа, одно из которых отлично от трех других, равных между собой. Вывести порядковый номер этого числа. 

B) Дан номер месяца (1 – январь, 2 – февраль, ...). Вывести название соответствующего времени года ("зима", "весна" и т.д.). 


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

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


Цель:

Изучение операторов цикла языка Си

Контрольные вопросы:
  1. Чему будет равно число b

int a=10,b=0;

for(int i=0;i<10;i++ )

{

a--;

b++;

b *= i;

}
  1. Напишите код программы для подсчета всех нечетных чисел от 0 до 99.
  2. Какие типы данных можно использовать в выражении-условии циклов?
  3. Каким образом организовать вечный цикл при помощи каждого из известных Вам операторов цикла языка Си?
  4. Укажите основное различие между циклами while с пост-условием и с пред-условием.

Задание:
    1. Реализовать программно решения задач из раздела «общие задачи».
    2. Согласно вариантам реализовать программно решение задачи из индивидуального задания.


Общие задачи:

1. Определить, является ли целое число N – простым. Простым называется число, которое нацело делится только на себя и на 1.

2. Вычислить N! = 1·2·3·4·…·N.

3. При помощи символов «+» и «*» изобразить на экране квадратные узоры размера NхN:













Индивидуальные задания:

1. Даны два целых числа A и B (A < B). Вывести все целые числа, расположенные между данными числами (включая сами эти числа), в порядке их возрастания, а также количество N этих чисел. 

2. Даны два целых числа A и B (A < B). Вывести все целые числа, расположенные между данными числами (не включая сами эти числа), в порядке их убывания, а также количество N этих чисел. 

3. Дано вещественное число A и целое число N (> 0). Вывести A в степени N: AN = A·A·...·A (числа A перемножаются N раз). 

4. Дано вещественное число A и целое число N (> 0). Вывести все целые степени числа A от 1 до N. 

5. Дано вещественное число A и целое число N (> 0). Вывести 1 + A + A2 + +A3+ ... + AN.

Begin85. Дано вещественное число A и целое число N (> 0). Вывести 1 – A + + A2 – A3 + ... + (–1)NAN

6. Дано вещественное число A (> 1). Вывести наименьшее из целых чисел N, для которых сумма 1 + 1/2 + ... + 1/N будет больше A, и саму эту сумму. 

7. Дано вещественное число A (> 1). Вывести наибольшее из целых чисел N, для которых сумма 1 + 1/2 + ... + 1/N будет меньше A, и саму эту сумму. 

8. Дано целое число N (> 0). Вывести произведение 1·2·...·N. Чтобы избежать целочисленного переполнения, вычислять это произведение с помощью вещественной переменной и выводить его как вещественное число. 

9. Дано целое число N (> 0). Если N — нечетное, то вывести произведение 1·3·...·N; если N — четное, то вывести произведение 2·4·...·N. Чтобы избежать целочисленного переполнения, вычислять это произведение с помощью вещественной переменной и выводить его как вещественное число. 

10. Дано целое число N (> 2) и две вещественные точки на числовой оси: A, B (A < B). Отрезок [A, B] разбит на равные отрезки длины H с концами в N точках вида A, A + H, A + 2H, A + 3H, ..., B. Вывести значение H и набор из N точек, образующий разбиение отрезка [A, B]. 

11. Дано целое число N (> 2) и две вещественные точки на числовой оси: A, B (A < B). Функция F(x) задана формулой F(x) = 1 – sin(x). Вывести значения функции F в N равноотстоящих точках, образующих разбиение отрезка [A,B]: F(A), F(A + H), F(A + 2H), ..., F(B). 

12. Дано число D>0. Последовательность чисел AN определяется следующим образом: A1 = 2, AN = 2 + 1/AN–1, N = 2, 3, ... Найти первый из номеров K, для которых выполняется условие |AK – AK–1| < D, и вывести этот номер, а также числа AK–1 и AK

13. Дано число D>0. Последовательность чисел AN определяется следующим образом: A1 = 1, A2 = 2, AN = (AN–2+ AN–1)/2, N = 3, 4, ... Найти первый из номеров K, для которых выполняется условие |AK –AK–1| < D, и вывести этот номер, а также числа AK–1 и AK.

14. Вывести на экран все простые числа в диапазоне от 2 до N.

15. Найти все простые числа, на которые делится целое N.


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


Массив - это последовательность элементов данных, имеющих одинаковый тип данных, причем каждому из этих элементов соответствует собственный индекс. Т.о. обращаться к элементам массива необходимо по имени массива и индексу элемента. В Си индексирование элементов начинается с 0 (т.е. первый элемент массива имеет индекс 0, второй имеет индекс 1, и т.д.). Объявляются массивы с помощью следующей синтаксической конструкции:


<тип_данных> <имя_массива> [<количество_элементов>];


Например, конструкция int arr[100]; обьявляет массив из 100 целых чисел под названием arr, при этом элементы массива будут иметь индексы от 0 до 99. Обращаться к элементам массива нужно с помощью следующей конструкции:


<имя_массива> [<индекс_элемента>]


Например, для того чтобы обратиться к десятому элементу массива arr (который имеет индекс 9, т.к. индексирование начинается с нуля), объявленного выше, необходимо написать arr[9].

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

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


<тип_данных> <имя_массива> [<количество_элементов_первого_измерения>] [<количество_элементов_второго_измерения>] [<количество_элементов_третьего_измерения>];


Таким образом, количество индексных скобок равно количеству измерений. Обращаться к элементам многомерного массива нужно по аналогии с обращением к элементам одномерного массива: <имя_массива> [<индекс_элемента_1>] [<индекс_элемента_2>] ... [<индекс_элемента_n>] (здесь n - размерность массива). Индексирование в каждом измерении также начинается с нуля.


Пример программы работы с двухмерным массивом:

#include


int a[10][10]; //Обьявляем двухмерный массив размерности 10х10


void main()

{

for(int i=0;i<10;i++) // Цикл по первому индексу массива

for(int j=0;j<10;j++) // Цикл по второму индексу массива

{

printf( "Введите элемент массива (%d,%d): ", i, j );

scanf( "%d", &a[i][j] );

}

}


В этом примере элементы массива просто вводятся с клавиатуры пользователем. Далее, в зависимости от цели, должна следовать обработка элементов массива и вывод результатов этой обработки. Стоит в очередной раз заметить, что индексы i и j изменяются от 0 до 9 при проходе по строкам и столбцам массива.


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


#include


float a[15]; //Обьявляем одномерный массив из 15 вещественных чисел


void main()

{

for(int i=0;i<15;i++) //Цикл ввода элементов массива

{

printf( "Введите элемент массива №%d: ", i );

scanf( "%g", &a[i] );

}


// Изначально предположим, что наибольшим

// является первый элемент массива.

float max = a[0];


// Теперь рассмотрим остальные элементы массива.

// Стоит заметить, что цикл начинается со второго

// элемента массива, т.к. смысла рассматривать первый

// элемент нет в силу нашего изначального предположения.

for(int i=1;i<15;i++)

if(a[i]>max)max = a[i]; //Если находим элемент больше, чем

// max, то заменяем max на него


// Вывод результата.

printf( "Наибольший элемент массива равен %g", max );

}


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


int a[20][10];

int b[20][10];

a=b;


Иными словами, мы не можем «присвоить массив массиву». Для копирования значений одного массива в другой нужно использовать циклы:


for(int i=0;i<20;i++)

for(int j=0;j<10;j++)

{

a[i][j] = b[i][j];

}


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


int a[] = {1,2,4,8,16,32,64,128,256,512,1024};


которая будет аналогична записи:


int a[11];

a[0]=1; a[1]=2; a[2]=4; a[3]=8; a[4]=16; a[5]=32;

a[6]=64; a[7]=128; a[8]=256; a[9]=512; a[10]=1024;


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

РАБОТА С МАССИВАМИ


Цель:

Изучение возможностей языка Си по работе с массивами

Контрольные вопросы:
  1. Можно ли символьную строку считать массивом?
  2. Можно ли в одном массиве хранить переменные разных типов?
  3. Каким образом можно организовать ввод \ вывод массива?
  4. Каким образом можно скопировать содержимое одного массива в другой?

Задание:

Согласно вариантам реализовать программно решение задачи из индивидуального задания.


Индивидуальное задание:

1. Найти сумму всех неотрицательных элементов квадратной матрицы.

2. Найти наибольший по модулю элемент квадратной матрицы.

3. Даны два линейных массива одинакового размера. Найти количество одинаковых элементов (элементов, значения и индексы которых равны).

4. Найти количество нулевых элементов на обеих диагоналях квадратной матрицы.

5. Дана прямоугольная матрица MxN. Вывести номер строки, сумма элементов в которой наименьшая.

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

7. Дан линейный массив. Вывести индексы двух его элементов, модуль разности между которыми наименьший.

8. Дана прямоугольная матрица MxN. Для каждого ее столбца вывести сумму элементов, если номер столбца четный, и произведение, если номер столбца нечетный.

9. Дана квадратная матрица. Транспонировать ее и вывести результат.

10. Дан линейный массив. Обе его половины развернуть в обратном порядке (например, массив {1,2,3,4,5,6} станет {3,2,1,6,5,4}) вывести результат.

11. Дано два линейных массива A и B одинаковой размерности N, все элементы которых неотрицательны и не превосходят 9. Получить линейный массив C размерности N+1, каждый элемент которого равен сумме двух соответствующих элементов массивов A и B, причем если сумма превышает 9, то записывается лишь младший разряд результата, а к сумме следующих двух элементов добавляется 1 (т.е. осуществляется перенос).

12. Дана прямоугольная матрица MxN. Подсчитать количество ее элементов, которые нацело делятся на заданное число K.

13. Дана квадратная матрица, элементы которой равны либо 0, либо 1. Определить, является ли она единичной матрицей.

14. Дан линейный массив, в котором содержится нечетное количество элементов, первый элемент неотрицательный, а также любые два отрицательных элемента находятся не на соседних позициях. Заменить все отрицательные элементы на сумму двух соседних.

15. Дана квадратная матрица с положительными элементами. Определить, является ли она магическим квадратом (т.е. матрицей, у которой суммы элементов всех строк и столбцов равны).


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

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


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


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

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

Большинство функций должно оперировать некоторыми значениями, например функция вычисления факториала N!, естественно, должна «знать» значение переменной N. Для передачи таких необходимых значений существуют параметры функции. Параметры разделяют на формальные и фактические.

Формальные параметры функции – это имена, действующие внутри тела функции. Именно ими оперирует функция для вычисления результата.

Фактические параметры функции – это значения, передаваемые в функцию при ее вызове (то, что записывается в круглых скобках).

Обьявление функции выглядит следующим образом:


<тип_данных_фнукции> <имя_функции> (список_формальных_параметров);


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

Рассмотрим все введенные выше понятия на примере функции возведения в степень:


#include


long int power( int x, int y )

{

long int res = 1;

for(int i=1;i<=y;i++)

res *= x;

return res;

}


void main()

{

printf( "7 в степени 5 равно %ld.\n", power(7,5) );

}


В данном случае мы объявили пользовательскую функцию с двумя параметрами, возвращающую значение типа "длинное целое". Имя этой функции - power, именно по нему мы можем к ней обращаться. В описании функции мы указали сначала ее тип данных - long int, затем ее имя, а затем список формальных параметров - два целых числа x и y. Внутри главной функции мы вызываем нашу функцию с фактическими параметрами 7 и 5, которые соответствуют формальным параметрам x и y. Таким образом, во время работы функции x=7 и y=5.

Если функция возвращает некоторое значение, то внутри нее обязательно должен присутствовать оператор return с выражением, значение которого будет возвращено в качестве результата работы функции. Если его не будет, то компилятор выдаст ошибку. Если же функция не возвращает никакого значения, то оператор return не обязателен, однако при необходимости можно его использовать для досрочного возврата из функции.


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


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

Как уже было сказано выше, строка является не более чем массивом символов, значит и объявляется также. Однако может возникнуть необходимость в одном и том же массиве символов хранить строки разной длины (например, если строку вводит пользователь, то неизвестно какой длины строку он введет). Для этого необходимо объявить массив некоторого максимального размера (например, если точно известно, что в нем будут храниться строки длины меньше 1000 символов, то можно объявить массив на 1000 символов). Но в таком случае необходимо каким-то образом определять, где же находится конец строки. Для этого разработчиками Си было принято решение, что конец строки будет обозначаться нулевым символом (не цифрой '0', а символом, имеющим ASCII-код 0).

Таким образом, строкой в Си называется часть массива символов, завершающаяся нулевым символом. Например, строка "студент" в памяти будет представлена как последовательность следующих символов: 'с','т','у','д','е','н','т','\0'. При этом буква 'с' будет являться элементом массива с индексом 0, вторая буква 'т' - элементом массива с индексом 6, а завершающий нулевой символ - элементом массива с индексом 7. Несмотря на то, что длина этой строки равна 7 символам, очевидно, что в памяти она будет занимать не меньше 8 символов из-за необходимости хранить завершающий нулевой символ.

Что касается операций со строками, таких как слияние двух строк, сравнение двух строк, выделение подстроки, поиск символа в строке, и т.д., то их не придется разрабатывать самому – в Си включены многие функции по работе со строками, нужно только подключить к программе заголовочный файл string.h с помощью директивы #include.

Более подробное описание каждой функции по работе со строками можно найти в справочной системе используемой среды разработки Cи, ниже приведены лишь самые основные из них и их назначение:


strcat – слияние двух строк (дописывание второй строки в конец первой)

strcmp – сравнение двух строк

strcpy – присваивание строк

strlen – длина строки

strrev – реверс строки (зеркальное отображение содержимого)

strset – заполнение строки одним символом

strstr – поиск подстроки в строке


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


#include


char a[1000], b[1000]; //Допустим что в строках не будет более 999 символов


void main()

{

printf( "Введите первую строку : " );

scanf( "%s", a );

printf( "Введите вторую строку : " );

scanf( "%s", b );


int i = 0; while(a[i] != 0) i++; //Находим конец первой строки

int j = 0;

while(b[j] != 0) //Проходим по второй строке полностью

{

a[i] = b[j]; //Копируем символ из строки b в конец строки a

i++; j++; // Переход к следующему символу

}

a[i] = 0; //Ставим завершающий нулевой символ в конце строки

printf( "Слиянием двух строк будет : %s\n", a );

}