Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

variant_2

.docx
Скачиваний:
32
Добавлен:
19.03.2017
Размер:
383.14 Кб
Скачать

ВОРОНЕЖСКИЙ ИНСТИТУТ МВД РОССИИ

Кафедра автоматизированных информационных систем органов внутренних дел

Домашняя контрольная работа

по учебной дисциплине «Информатика»

Вариант № 2

Выполнил

курсант 11 взвода РТФ

рядовой полиции

Е.С. Иванов

Проверил

Доцент кафедры АИС ОВД

к.т.н., доцент

подполковник полиции

С.А. Мишин

Воронеж − 2015

Задание 1. Вычислить в MathCAD предел числовой последовательности, графически показать к чему стремиться числовая последовательность при .

Задание 2. Построить график функции f(x) (таблица 1) и приблизительно определить на нём один из корней уравнения. Решить уравнение f(x)= 0 с помощью вычислительного блока Given/Find и встроенной функции MathCAD root(), интервал поиска корня определить самостоятельно из графика функции.

- начальное приближение

Задача 3. Найти решение системы нелинейных уравнений из таблицы 2. Построить их графики и определить начальное приближение решения. Решить систему нелинейных уравнений с помощью вычислительного блока Given/Find.

2.

privedennay k standartnomu vidu (y=f(x), x=f(y)) systema yravneniy

Решений нет.

Задание 4. Даны матрица А и вектор (таблица 3). Считая вектор вектором неизвестных, выписать систему уравнений .

а) Вычислить определитель матрицы А и убедиться, что матрица А не вырождена, т.е. det(A)0. Найти обратную матрицу А-1. Решить неоднородную систему и проверить правильность решения системы уравнений.

б) Найти вектор-решение с помощью вычислительного блока MathCAD Given/Find.

в) Найти вектор-решение с помощью функции MathCAD lsolve. Сравнить полученные результаты.

А

а)

- определитель матрицы

- решение системы уравнений

- Проверка

б)

система линейных уравнений

решение системы уравнений

в)

решение системы уравнений

Задание 5. а) Составить схему алгоритма, используя разветвляющуюся структуру, и программу на языке C++ для расчёта значения функции у=у(x) в соответствии со своим вариантом, где значение x – вводится с клавиатуры. Если x не входит в область определения функции y(x), предусмотреть вывод сообщения на экран «Введенное значение x не принадлежит ОДЗ».

б) Рассчитать значение функции у(x) при x=3 в MathCAD и с помощью разработанной Вами программы. Сравнить полученные значения. Результаты представить в отчете по работе.

в) Составить программу на языке C++ для расчёта значения функции у=у(x) в соответствии со своим вариантом, где значение x – вводится с клавиатуры. Если x не входит в область определения функции y(x), предусмотреть вывод сообщения на экран «Введенное значение x не принадлежит области определения функции».

2.

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

Листинг П. 1

#include "stdafx.h"

#include <iostream>

#define _USE_MATH_DEFINES

#include "math.h"

#include <conio.h>

int main()

{

using namespace std;

float y, x;

cout << "Vvedite x=";

cin >> x;

y = log(fabs((double)x)+2)/(4+x*x)+exp(3*x-2)*cos(M_PI*x+1);

cout << "Pri x=" << x << " y=" << y << endl;

_getch(); //ожидаем нажатия любой клавиши

return 0;

}

Тестирование программы.

Рассчитаем значение функции при x = 3

Рассчитаем значение функции в MathCAD

Полученное значение совпадает со значением, рассчитанным с помощью программы.

в) Составим программу на языке C++ для расчёта значения функции у=у(x), где значение x – вводится с клавиатуры. Если x не входит в область определения функции y(x), предусмотрим вывод сообщения на экран «Введенное значение x не принадлежит области определения функции».

Листинг П.2

#include "stdafx.h"

#include <iostream>

#include "math.h"

#include <conio.h>

int main()

{

using namespace std;

float y, x;

while ((_kbhit() == 0) && (_getch() != 27))

{

cout << "Vvedite x=";

cin >> x;

if (x >= 1 && x <= 2)

{

y = x-1;

cout << "Pri x=" << x << " y=" << y << endl;

}

else if (x >= 2 && x < 3)

{

y = x*x-3;

cout << "Pri x=" << x << " y=" << y << endl;

}

else if (x >= 3 && x <= 5)

{

y = 6;

cout << "Pri x=" << x << " y=" << y << endl;

}

else

{

cout << "x=" << x << " ne vhodit v OOF funkcii y(x)\n";

}

}

return 0;

}

Результат выполнения программы

Задание 6. а) Составить схему алгоритма, используя циклическую структуру, и программу (с оператором for) на языке C++ с использованием собственной функции summa () для расчёта суммы ряда в соответствии со своим вариантом задания.

б) Рассчитать значение суммы ряда в MathCAD и с помощью разработанной Вами программы. Сравнить полученные значения. Результаты представить в отчете по работе.

2.

Листинг П.3

#include "stdafx.h"

#include <iostream>

#include "math.h"

#include <conio.h>

double my_sum(int);

using namespace std;

int main()

{

cout << "Summa S=" << my_sum(30) << endl;

_getch();

return 0;

}

double my_sum(int n)

{

double sum = 0;

int i;

for (i = 1; i <= n; i++)

sum += (cos(2*i)) / (sqrt((2*i-1)*(2*i*i+1)));

return sum;

}

Результат выполнения программы

Вычислим значение ряда в MathCAD

Значение, вычисленное с помощью программы, совпадает со значением, вычисленным с помощью MathCAD.

Задание 7. а) Составить схему алгоритма и программу на языке C++ с использованием собственной функции summa () для расчёта суммы бесконечного ряда. В качестве параметра функции использовать точность . В теле функции summa () предусмотреть не только расчет значения суммы бесконечного ряда с заданной точностью1, но и подсчет количества членов ряда n, участвовавших в суммировании.

1) напишите программу, используя цикл while;

2) напишите программу, используя цикл do while.

б) Рассчитать значение суммы ряда в MathCAD и с помощью разработанной Вами программы. Сравнить полученные значения. Результаты представить в отчете по работе.

2.

Листинг П.4

используя цикл while

#include "stdafx.h"

#include <iostream>

#include "math.h"

#include <iomanip>

#include <conio.h>

double my_summa(const double, int *kol);

using namespace std;

int main()

{

int n = 0;

cout.setf(ios::fixed); cout << "Summa S=" << setprecision(3) << my_summa(0.01, &n) << " fiksir. format" << endl;

cout << endl;

cout << "Kol-vo chlenov rayda n=" << n << endl;

_getch();

return 0;

}

double my_summa(const double eps, int *n)

{

double sum = 0, an;

an = 10;

while (fabs(an) >= eps)

{

(*n)++;

an = (log(*n*(0.01+1))/(*n**n+2**n-1));

sum += an;

} ;

return sum;

}

используя цикл do while

Листинг П.5

#include "stdafx.h"

#include <iostream>

#include "math.h"

#include <iomanip>

#include <conio.h>

double my_summa(const double, int *kol);

using namespace std;

int main()

{

int n = 0;

cout.setf(ios::fixed); cout << "Summa S=" << setprecision(3) << my_summa(0.01, &n) << " fiksir. format" << endl;

cout << endl;

cout << "Kol-vo chlenov rayda n=" << n << endl;

_getch();

return 0;

}

double my_summa(const double eps, int *n)

{

double sum = 0, an;

do

{

(*n)++;

an = (log(*n*(0.01+1))/(*n**n+2**n-1));

sum += an;

}

while (fabs(an) >= eps);

return sum;

}

Результат выполнения программы

Рассчитаем значение суммы ряда в MathCAD

Значения практически совпадают.

Задание 8. В соответствии с Вашим вариантом составить схему алгоритма и программу на языке C++ для решения следующей задачи обработки одномерных массивов: Исключить из массива А1..AN первый четный элемент, следующий за максимальным.

Схема алгоритма:

  1. Вводим элементы массива.

  2. Первый элемент массива считаем максимальным.

  3. Цикл по элементам массива для определения максимального элемента: если текущий элемент больше максимального, то этот элемент становится максимальным. Запоминаем номер элемента. По окончании цикла получаем порядковый номер максимального элемента.

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

  5. Удаляем найденный четный элемент из массива.

  6. Выводим результат.

Листинг П.6.

#include<iostream>

using namespace std;

#include <cstdlib>

#include <conio.h>

bool iDel(int *array, int &lenAr, int nom);

int iMax(int *array, int &lenAr);

bool parity(int x);

int main()

{

int length_array;

cout << "Vvedite kolichestvo elementov massiva: ";

cin >> length_array;

int *A = new int[length_array]; // одномерный динамический массив

// заполняем одномерный массив

cout << "Vvedite elementy massiva: ";

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

{

cin >> A[i];

}

cout << endl;

int max_i = iMax(A, length_array); //определяем максимальный элемент массива

cout << "iMax= " << A[max_i] << endl;

//перебираем все элементы после максимального и проверяем на четность

for (int i = max_i+1; i < length_array; i++)

{

if (parity(A[i])) //если встретился четный элемент

{

cout << "Pervyi chetnyi element " << A[i] << endl;

iDel(A, length_array, i + 1); //удаляем элемент

break; // выходим из цикла, так как требуется первый попавшийся, остальные нет смысла перебирать

}

}

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

{

cout << A[i] << " "; // вывод полученного массива

}

cout << endl;

_getch();

delete[] A;

return 0;

}

//функция удаляет элемент массива с номером nom

bool iDel(int *array, int &lenAr, int nom)

{

if (nom > lenAr || nom < 1)

{

cout << "Ошибка удаления" << endl;

return false;

}

for (int ix = nom - 1; ix < lenAr - 1; ix++)

{

array[ix] = array[ix + 1];

}

lenAr--;

return true;

}

// функция возвращает номер максимального элемента массива

int iMax(int *array, int &lenAr)

{

int i, index = 0;

int max;

max = array[0];

for (i = 1; i < lenAr; i++)

{

if (array[i] > max)

{

max = array[i];

index = i; //запоминаем номер максимального элемента

}

}

return index;

}

// функция определяет четность числа

bool parity(int x)

{

if (!(x & 1)) return true;

return false;

}

Результат работы программы

Задание 9. В соответствии с Вашим вариантом составить схему алгоритма и программу на языке C++ для решения задачи обработки двумерных массивов: Дана матрица А(n,m). Сформировать массив В(m), каждый элемент которого есть сумма четных элементов соответствующего столбца матрицы А.

Листинг П.7.

#include "stdafx.h"

#include <iostream>

#include <iomanip>

#include <conio.h>

using namespace std;

int main(int argc, char* argv[])

{

int rows=0, cols=0;

cout << "Vvedite kolichestvo strok massiva: ";

cin >> rows;

cout << endl << "Vvedite kolichestvo stolbcov massiva: ";

cin >> cols;

int *B = new int[cols]; // одномерный динамический массив

// динамическое создание двумерного массива

int **A = new int*[rows]; // строки в массиве

for (int count = 0; count < rows; count++)

A[count] = new int[cols]; // столбцы

// заполнение массива

for (int count_row = 0; count_row < rows; count_row++)

{

cout << "Stroka " << count_row << ": " << endl;

for (int count_column = 0; count_column < cols; count_column++)

{

cin >> A[count_row][count_column] ; //заполнение массива введенными числами

}

}

// вывод массива

cout << "A:" << endl;

for (int count_row = 0; count_row < rows; count_row++)

{

for (int count_column = 0; count_column < cols; count_column++)

cout << setw(4) << setprecision(2) << A[count_row][count_column] << " ";

cout << endl;

}

float S = 0;

for (int count_column = 0; count_column < cols; count_column++)

{

S = 0;

for (int count_row = 0; count_row < rows; count_row++)

{

if (A[count_row][count_column] % 2 == 0) //если элемент четный, то суммируем

S += A[count_row][count_column];

}

B[count_column] = S ;

}

cout << "B:" << endl;

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

{

cout << B[i] << " "; // вывод полученного массива

}

// удаление двумерного динамического массива

for (int count = 0; count < rows; count++)

delete[]A[count];

//удаление массива B

delete[] B;

_getch();

return 0;

}

Результат работы программы

Задание 10. В соответствии с Вашим вариантом составить схему алгоритма и программу на языке C++ для решения задачи обработки двумерных массивов: Дана матрица А(n,n). Найти минимум среди элементов, лежащих ниже побочной диагонали.

Элементы, лежащие ниже побочной диагонали, имеют индекс

i+j > N-1

Листинг П. 8.

#include "stdafx.h"

#include <iostream>

#include <iomanip>

#include <conio.h>

using namespace std;

int main(int argc, char* argv[])

{ int rows = 0, cols = 0;

cout << "Vvedite kolichestvo strok massiva: ";

cin >> rows;

cout << endl << "Vvedite kolichestvo stolbcov massiva: ";

cin >> cols;

int **A = new int*[rows]; // строки в массиве

for (int count = 0; count < rows; count++)

A[count] = new int[cols]; // столбцы

// заполнение массива

for (int count_row = 0; count_row < rows; count_row++)

{ cout << "Stroka " << count_row << ": " << endl;

for (int count_column = 0; count_column < cols; count_column++)

{ cin >> A[count_row][count_column]; //заполнение массива введенными числами

}

}

// вывод массива

cout << "A:" << endl;

for (int count_row = 0; count_row < rows; count_row++)

{

for (int count_column = 0; count_column < cols; count_column++)

cout << setw(4) << setprecision(2) << A[count_row][count_column] << " ";

cout << endl;

}

int Min = 10000;

for (int count_column = 0; count_column < cols; count_column++)

{ for (int count_row = 0; count_row < rows; count_row++)

{ // i > n - j - 1

if (count_column > rows - count_row - 1)

if (A[count_row][count_column]<Min)

Min = A[count_row][count_column];

}

}

cout << "Min:" << Min << endl;

// удаление двумерного динамического массива

for (int count = 0; count < rows; count++)

delete[]A[count];

_getch();

return 0;

}

Результат работы программы

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

а) Создать массив структур (Biblio), содержащий сведения о книгах, находящихся в библиотечном фонде Вуза. Структура kniga имеет следующие поля: автор книги (Fio), название книги (Name), год издания (God_izd), издательство (Izdat), количество экземпляров (Kol_vo), название дисциплины, в которой используется книга (Predmet_name), шифр книги (Kod). Размер массива не более 25 элементов.

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

Листинг П.9.

#include<iostream>

#include<windows.h>

#include<conio.h>

using namespace std;

struct Kniga

{

char Fio[32]; // Автор книги

char Name[32]; //Название книги

int God_izd; //Год издания

char Izdat[32]; //Издательство

int Kol_vo; //Количество экземпляров

char Predmet_name[32]; //Дисциплина

char Kod[32]; //Шифр книги

};

Kniga* AddStruct(Kniga* Obj, const int amount);

void setData(Kniga* Obj, const int amount);

void showData(const Kniga* Obj, const int amount);

int main()

{

setlocale(LC_ALL, "rus");

Kniga* Biblio = 0;

int Amount = 0;

int YesOrNot = 0; // продолжить или остановить ввод данных

do

{

Biblio = AddStruct(Biblio, Amount);

setData(Biblio, Amount);

Amount++;

cout << "Продолжить ввод данных (1 - да, 0 - нет): ";

cin >> YesOrNot;

cin.get();

} while (YesOrNot != 0);

showData(Biblio, Amount);

delete[] Biblio;

return 0;

}

Kniga* AddStruct(Kniga* Obj, const int amount)

{

if (amount == 0)

{

Obj = new Kniga[amount + 1]; // выделение памяти для первой структуры

}

else

{

Kniga* tempObj = new Kniga[amount + 1];

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

{

tempObj[i] = Obj[i]; // копируем во временный объект

}

delete[] Obj;

Obj = tempObj;

}

return Obj;

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

void setData(Kniga* Obj, const int amount)

{

cout << "Название книги: ";

cin.getline(Obj[amount].Name, 32);

cout << "Автор книги: ";

cin.getline(Obj[amount].Fio, 32);

cout << "Издательство: ";

cin.getline(Obj[amount].Izdat, 32);

cout << "Шифр книги: ";

cin.getline(Obj[amount].Kod, 32);

cout << "Дисциплина: ";

cin.getline(Obj[amount].Predmet_name,32);

cout << "Количество экземпляров: ";

cin >> Obj[amount].Kol_vo;

cout << "Год издания: ";

cin >> Obj[amount].God_izd;

cin.get();

cout << endl;

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

void showData(const Kniga* Obj, const int amount)

{

cout << "№ " << "Название книги\t" << "Автор книги\t" << "Год издания\t" << "Издательство\t" << "Количество\t" << "Дисциплина\t" << "Шифр" << endl;

cout << "========================================================================================================================" << endl;

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

{

//если год издания меньше 2003

if (Obj[i].God_izd < 2003)

cout << i + 1 << " " << Obj[i].Name << '\t' << Obj[i].Fio << '\t' << Obj[i].God_izd << '\t' << Obj[i].Izdat << '\t' << Obj[i].Kol_vo << '\t' << Obj[i].Predmet_name << '\t' << Obj[i].Kod << endl;

}

_getch();

}

Результат работы программы:

Ввод начальных данных

Результат отбора книг

Описание работы программы:

После каждого ввода данных программа задает вопрос: продолжить ввод или нет.  Каждый раз, когда пользователь выбирает “продолжить” – надо выделяется участок памяти еще под одну структуру. Таким образом динамический массив структур будет расти, пока пользователь не приостановит ввод.

Определение структуры

struct Abiturient

{

char Imya[32]; //Имя

char Fam[32]; //Фамилия

char Otch[32]; //Отчество

char God_rogd[32]; //Год рождения

char Nomer_at[32]; //Номер аттестата

int Sr_ball; //средний балл

int Rus; //оценка по русскому

int Math; //оценка по математике

int Inf; // оценка по информатике

char Phone[32]; //Контактный телефон

};

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

Abiturient* AddStruct(Abiturient* Obj, const int amount);

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

Вторая  

void setData(Abiturient* Obj, const int amount);

отвечает за ввод данных в структуру.

Третья 

void showData(const Abiturient* Obj, const int amount);

выводит на экран все данные в виде таблицы.

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

Abiturient* Priem = 0;

Этот указатель пока ни на что не указывает. Можно было бы выделить память под массив структур сразу. Например:

Abiturient* Priem = new Abiturient [10];

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

Также объявлены переменные abiturientAmount - счетчик количества абитуриентов и YesOrNot - выбор пользователя (продолжить или прервать ввод).

Далее расположен цикл do while. Он выполняется до тех пор, пока пользователю необходимо вводить данные. Затем вызываем функцию, которая выделяет память под структуру 

Priem = AddStruct(Priem, AbiturientAmount);

Опустимся к ее определению. Тут видно, что данная функция будет возвращать указатель на структуру Abiturient.  Она принимает два параметра – указатель на структуру и количество структур. Когда она вызывается в первый раз – в нее будет передан объявленный в main указатель Priem и переменная AbiturientAmount, которая равна нулю. В функции выполнится блок if – выделится память для одной структуры. Потом функция вернет адрес (указатель) на этот участок памяти, и он будет записан в  Priem.

Затем вызываем функцию, которая позволит внести данные в структуру.

setData(Priem, AbiturientAmount);

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

Если продолжаем – снова вызывается функция AddStruct().

Надо помнить, что указатель Priem уже ссылается на участок памяти с записанными данными. Поэтому не получится просто перевыделить память. Сначала необходимо позаботиться о сохранении данных. В блоке else создаем временный указатель. Под него выделяем память для amount + 1 структур (т.е. на одну структуру больше, чем приняла функция). Далее копируем данные из принятого объекта. Последний объект массива структур tempObj останется незаполненным. Когда данные скопированы, освобождаем память Obj и записываем в этот указатель новый адрес. Теперь он будет указывать на память, в которой есть сохраненные данные и дополнительный выделенный участок памяти для заполнения новыми данными.

Соседние файлы в предмете Информатика