variant_8
.docxВОРОНЕЖСКИЙ ИНСТИТУТ МВД РОССИИ
Кафедра автоматизированных информационных систем органов внутренних дел
Домашняя контрольная работа
по учебной дисциплине «Информатика»
Вариант № 8
Выполнил
курсант 11 взвода РТФ
рядовой полиции
Е.С. Иванов
Проверил
Доцент кафедры АИС ОВД
к.т.н., доцент
подполковник полиции
С.А. Мишин
Воронеж − 2015
Задание 1. Вычислить в MathCAD предел числовой последовательности, графически показать к чему стремиться числовая последовательность при .
Задание 2. Построить график функции f(x) (таблица 1) и приблизительно определить на нём один из корней уравнения. Решить уравнение f(x)= 0 с помощью вычислительного блока Given/Find и встроенной функции MathCAD root(), интервал поиска корня определить самостоятельно из графика функции.
8.
- начальное приближение
Задача 3. Найти решение системы нелинейных уравнений из таблицы 2. Построить их графики и определить начальное приближение решения. Решить систему нелинейных уравнений с помощью вычислительного блока Given/Find.
8.
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 не принадлежит области определения функции».
8.
Приведем листинг программы на языке С++, рассчитывающей значение функции 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 = x*x*sqrt(1 + 3 * fabs((double)x)) + sin(x + M_PI / 4) / (0.2 + pow(cos(x), 2));
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>
#define _USE_MATH_DEFINES
#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 >= 0 && x <= 1)
{
y = x;
cout << "Pri x=" << x << " y=" << y << endl;
}
else if (x > 1 / 6 && x < 3)
{
y = -pow(x,2)+4*x-2;
cout << "Pri x=" << x << " y=" << y << endl;
}
else if (x >= 3 && x <= 5)
{
y = 1;
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 и с помощью разработанной Вами программы. Сравнить полученные значения. Результаты представить в отчете по работе.
8.
Листинг П.3
#include "stdafx.h"
#include <iostream>
#define _USE_MATH_DEFINES
#include "math.h"
#include <conio.h>
double my_sum(int);
using namespace std;
int main()
{
cout << "Summa S=" << my_sum(60) << endl;
_getch();
return 0;
}
double my_sum(int n)
{
double sum = 0;
int i;
for (i = 1; i <= n; i++)
sum += cos(M_PI*i/3) / ((2*i-1)*(2*i+5));
return sum;
}
Результат выполнения программы
Вычислим значение ряда в MathCAD
Значение, вычисленное с помощью разработанной программы, совпадает со значением, вычисленным с помощью MathCAD.
Задание 7. а) Составить схему алгоритма и программу на языке C++ с использованием собственной функции summa () для расчёта суммы бесконечного ряда. В качестве параметра функции использовать точность . В теле функции summa () предусмотреть не только расчет значения суммы бесконечного ряда с заданной точностью1, но и подсчет количества членов ряда n, участвовавших в суммировании.
1) напишите программу, используя цикл while;
2) напишите программу, используя цикл do while.
б) Рассчитать значение суммы ряда в MathCAD и с помощью разработанной Вами программы. Сравнить полученные значения. Результаты представить в отчете по работе.
8.
Листинг П.4
используя цикл while
#include "stdafx.h"
#include <iostream>
#define _USE_MATH_DEFINES
#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(0.01+M_PI**n))/(2**n**n+*n-2);
sum += an;
} ;
return sum;
}
используя цикл do while
Листинг П.5
#include "stdafx.h"
#include <iostream>
#define _USE_MATH_DEFINES
#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(0.01+M_PI**n))/(2**n**n+*n-2);
sum += an;
}
while (fabs(an) >= eps);
return sum;
}
Результат выполнения программы
Рассчитаем значение суммы ряда в MathCAD
Значения практически совпадают.
Задание 8. В соответствии с Вашим вариантом составить схему алгоритма и программу на языке C++ для решения следующей задачи обработки одномерных массивов: В одномерном массиве перенести в конец минимальный элемент.
Листинг П.6.
#include<iostream>
using namespace std;
#include <cstdlib>
#include <conio.h>
int iMin(int *array, int &lenAr);
void push_back(int *Arr, int &lenAr, int index);
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 n = iMin(A, length_array);
cout << "iMin = " << A[n] << endl;
// переносим в конец
push_back(A, length_array, n);
for (int i = 0; i < length_array; i++)
{
cout << A[i] << " "; // вывод полученного массива
}
cout << endl;
_getch();
delete[] A;
return 0;
}
//функция переносит элемент массива в конец
//index - номер элемента, который нужно перенести в конец
void push_back(int *Arr, int &lenAr, int index)
{
int last_elm = Arr[index]; //запоминаем элемент, который нужно перенести в конец
int last = Arr[lenAr - 1];
for (int i = index; i < lenAr - 1; i++) // начинаем перебор всех элементов, кроме последнего и сдвигаем на 1 влево
{
Arr[i] = Arr[i + 1];
}
Arr[lenAr - 1] = last_elm;
}
// функция возвращает номер минимального элемента массива
int iMin(int *array, int &lenAr)
{
int i, index = 0;
int min;
min = array[0];
for (i = 1; i < lenAr; i++)
{
if (array[i] < min)
{
min = array[i];
index = i; //запоминаем номер максимального элемента
}
}
return index;
}
Результат работы программы
Задание 9. В соответствии с Вашим вариантом составить схему алгоритма и программу на языке C++ для решения задачи обработки двумерных массивов: Дана матрица А(n,m). Сформировать массив В(m), каждый элемент которого есть третий элемент соответствующего столбца матрицы А, где n>3.
Листинг П. 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;
float *B = new float[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;
}
for (int count_column = 0; count_column < cols; count_column++)
{
B[count_column] = A[5][count_column]; //третий элемент, начиная с n > 3
}
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). Вычислить сумму тех столбцов матрицы, последний элемент которых равен элементу, стоящему на главной диагонали.
Листинг П.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 S = 0; //сумма
for (int count_column = 0; count_column < cols; count_column++)
{
if (A[rows - 1][count_column] == A[count_column][count_column]) //если последни элемент столбца равен элементу на диагонали
for (int count_row = 0; count_row < rows; count_row++)
{
S += A[count_row][count_column];
}
}
cout << "S:" << S << endl;
// удаление двумерного динамического массива
for (int count = 0; count < rows; count++)
delete[]A[count];
_getch();
return 0;
}
Результат работы программы
Задание 11. В соответствии с Вашим вариантом составьте схему алгоритма, выполняющего требуемые в задании функции обработки массива структур, и реализуйте его код на С++.
а) Создать массив структур (Hokey), содержащий сведения об игроках хоккейных клубов России. Структура igrok имеет следующие поля: название команды (Komanda), фамилия и инициалы хоккеиста (Fio), возраст (Vozrast), рост (Rost), вес (Ves), количество заброшенных им шайб (Shayby), заработанные штрафные минуты (Shtrafnoe_Vremay). Размер массива не более 25 элементов.
б) Вывести на экран информацию обо всех игроках, забросивших более 5 шайб в турнире и заработавших не более 8 минут штрафного времени. Информацию представить в виде таблицы, имеющей следующие столбцы: фамилия и инициалы хоккеиста, количество заброшенных им шайб, заработанные штрафные минуты.
Листинг П.9.
#include<iostream>
#include<windows.h>
#include<conio.h>
using namespace std;
struct igrok
{
char Komanda[32]; // название команды
char Fio[32]; // фио хоккеиста
int Vozrast; // Возраст
int Rost; // Рост
int Ves; // Вес
int Shayby; //количетво заброшенных шайб
int Shtrafnoe_Vremay; // штрафные минуты
};
igrok* AddStruct(igrok* Obj, const int amount);
void setData(igrok* Obj, const int amount);
void showData(const igrok* Obj, const int amount);
int main()
{
setlocale(LC_ALL, "rus");
igrok* Hokey = 0;
int Amount = 0;
int YesOrNot = 0; // продолжить или остановить ввод данных
do
{
Hokey = AddStruct(Hokey,Amount);
setData(Hokey, Amount);
Amount++;
cout << "Продолжить ввод данных (1 - да, 0 - нет): ";
cin >> YesOrNot;
cin.get();
} while (YesOrNot != 0);
showData(Hokey, Amount);
delete[] Hokey;
return 0;
}
igrok* AddStruct(igrok* Obj, const int amount)
{
if (amount == 0)
{
Obj = new igrok[amount + 1]; // выделение памяти для первой структуры
}
else
{
igrok* tempObj = new igrok[amount + 1];
for (int i = 0; i < amount; i++)
{
tempObj[i] = Obj[i]; // копируем во временный объект
}
delete[] Obj;
Obj = tempObj;
}
return Obj;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void setData(igrok* Obj, const int amount)
{
cout << "Название команды: ";
cin.getline(Obj[amount].Komanda, 32);
cout << "Игрок: ";
cin.getline(Obj[amount].Fio, 32);
cout << "Возраст: ";
cin >> Obj[amount].Vozrast;
cout << "Рост: ";
cin >> Obj[amount].Rost;
cout << "Вес: ";
cin >> Obj[amount].Ves;
cout << "Количество шайб: ";
cin >> Obj[amount].Shayby;
cout << "Штрафные минуты: ";
cin >> Obj[amount].Shtrafnoe_Vremay;
cin.get();
cout << endl;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void showData(const igrok* Obj, const int amount)
{
cout << "№ " << "ФИО хоккеиста\t" << "Шайбы\t" << "Штрафн. мин.\t" << endl;
cout << "============================================" << endl;
for (int i = 0; i < amount; i++)
{
//игрок забил более 5 шайб и
//проштрафился не более чем на 8 минут
if (Obj[i].Shayby > 5 && Obj[i].Shtrafnoe_Vremay<=8)
cout << i + 1 << " " << Obj[i].Fio << '\t' << Obj[i].Shayby << '\t' << Obj[i].Shtrafnoe_Vremay << '\t' << 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 и записываем в этот указатель новый адрес. Теперь он будет указывать на память, в которой есть сохраненные данные и дополнительный выделенный участок памяти для заполнения новыми данными.