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

variant_15

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

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

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

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

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

Вариант № 15

Выполнил

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

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

Е.С. Иванов

Проверил

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

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

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

С.А. Мишин

Воронеж − 2015

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

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

х5х - 0,2sin(3x)

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

10.

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 не принадлежит области определения функции».

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

Листинг П. 1

#include "stdafx.h"

#include <iostream>

#include "math.h"

#include <conio.h>

int main()

{ using namespace std;

float y, x;

cout << "Vvedite x=";

cin >> x;

y = (2 * log(x*x + 4 * fabs((double)x)+3)) / (x*x+10) + exp(x + 1)*cos(M_PI*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 <= M_PI/4)

{ y = tan(x);

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

}

else if (x > M_PI/4 && x < 2)

{ y = 1;

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

}

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

{ y = x*x-3;

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 и с помощью разработанной Вами программы. Сравнить полученные значения. Результаты представить в отчете по работе.

Листинг П.3

#include "stdafx.h"

#include <iostream>

#include "math.h"

double my_sum(int);

using namespace std;

int main()

{ cout << "Summa S=" << my_sum(20) << endl;

return 0;

}

double my_sum(int n)

{ double sum = 0;

int i;

for (i = 1; i <= n; i++) sum += (2*i+1)*atan(1/pow(i,3));

return sum;

}

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

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

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

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

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

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

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

15.

Листинг П.4

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

#include "stdafx.h"

#include <iostream>

#define _USE_MATH_DEFINES

#include "math.h"

#include <iomanip>

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;

return 0;

}

double my_summa(const double eps, int *n)

{ double sum = 0, an;

an = 10;

while (fabs(an) >= eps)

{ (*n)++;

an = (2**n+sin(M_PI**n*0.01+1))/(pow(pow(*n,7)+2*pow(*n,6)-1,1.0/3));

sum += an;

} ;

return sum;

}

Листинг П.5

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

#include "stdafx.h"

#include <iostream>

#define _USE_MATH_DEFINES

#include "math.h"

#include <iomanip>

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;

return 0;

}

double my_summa(const double eps, int *n)

{ double sum = 0, an;

do

{ (*n)++;

an = (2**n+sin(M_PI**n*0.01+1))/(pow(pow(*n,7)+2*pow(*n,6)-1,1.0/3));

sum += an;

}

while (fabs(an) >= eps);

return sum;

}

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

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

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

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

Даны целые числа А1..AN.Определить количество целых чисел, входящих в последовательность А1..AN по одному разу.

Алгоритм: выполняем двойной вложенный цикл по массиву – сравниваем текущий элемент с оставшимися. Если найден похожий элемент, то выходим из цикла. Если такого элемента не найдено – наращиваем количество неповторяющихся уникальных элементов.

Листинг П.6.

#include<iostream>

using namespace std;

#include <cstdlib>

#include <conio.h>

int double_num(int *arr, const size_t N);

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 = double_num(A, length_array);

cout << "Kolichestvo elementov po odnomy = " << n << endl;

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

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

}

cout << endl;

_getch();

delete[] A;

return 0;

}

// функция определяет количество чисел, входящих в массив по одному разу

int double_num(int *arr, const size_t N)

{ int tmp = 0, flag;

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

{ flag = 1;

for (int k = 0; k < N; ++k)

if ((arr[i] == arr[k]) & (i != k))

{ flag = 0;

break;

}

if (flag)

++tmp;

}

return tmp;

}

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

Задание 9. В соответствии с Вашим вариантом составить схему алгоритма и программу на языке C++ для решения задачи обработки двумерных массивов:

Дана матрица А(n,m). Сформировать массив В(n), каждый элемент которого есть среднее арифметическое значение соответствующей строки матрицы А.

Листинг П.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[rows]; // одномерный динамический массив

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

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_row = 0; count_row < rows; count_row++)

{ S = 0;

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

{ S += A[count_row][count_column]; //суммируем элементы строки

}

B[count_row] = S/cols ; //среднее арифметическое

}

cout << "B:" << endl;

for (int i = 0; i < rows; 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

Листинг П.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_row = 0; count_row < rows; count_row++)

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

Min = A[count_row][count_row];

}

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

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

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

delete[]A[count];

_getch();

return 0;

}

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

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

а) Создать массив структур (Vedomost), содержащий сведения о зарплате преподавателей Вуза. Структура prep имеет следующие поля: фамилия и инициалы преподавателя (Fio), название кафедры (Kafedra), зарплата (Zarplata), ученая степень (Uch_st), ученое звание (Uc_zv), педагогический стаж (ped_stag). Размер массива не более 25 элементов.

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

Листинг П.9.

#include<iostream>

#include<windows.h>

#include<conio.h>

using namespace std;

struct prep

{ char Fio[32]; // фамилия и инициалы преподавателя

char Kafedra[32]; // Название кафедры

char Uch_st[32]; // Ученая степень

char Uch_zv[32]; // Ученое звание

int Zarplata; // зарплата

int ped_stag; // педагогический стаж

};

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

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

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

int main()

{ setlocale(LC_ALL, "rus");

prep* Vedomost = 0;

int Amount = 0;

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

do

{ Vedomost = AddStruct(Vedomost, Amount);

setData(Vedomost, Amount);

Amount++;

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

cin >> YesOrNot;

cin.get();

}

while (YesOrNot != 0);

showData(Vedomost, Amount);

delete[] Vedomost;

return 0;

}

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

{ if (amount == 0)

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

}

else

{ prep* tempObj = new prep[amount + 1];

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

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

}

delete[] Obj;

Obj = tempObj;

}

return Obj;

}

void setData(prep* Obj, const int amount)

{ cout << "ФИО: ";

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

cout << "Кафедра: ";

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

cout << "Ученая степень: ";

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

cout << "Ученое звание: ";

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

cout << "Стаж: ";

cin >> Obj[amount].ped_stag;

cout << "Зарплата: ";

cin >> Obj[amount].Zarplata;

cin.get();

cout << endl;

}

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

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

{ cout << "№ " << "ФИО\t" << "Уч. степень\t" << "Зарплата\t" << "Налог" << endl;

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

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

{ //если зарплата выше 35 тысяч рублей

if (Obj[i].Zarplata > 35000)

cout << i + 1 << " " << Obj[i].Fio << '\t' << Obj[i].Uch_st << '\t' << Obj[i].Zarplata << '\t' << Obj[i].Zarplata*0.13 << 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 и записываем в этот указатель новый адрес. Теперь он будет указывать на память, в которой есть сохраненные данные и дополнительный выделенный участок памяти для заполнения новыми данными.

И снова вызывается функция  setData(), которая позволит внести данные в новый выделенный участок памяти – в последний элемент массива структур.

Когда пользователь решит больше не вводить данные – он нажимает ноль. После этого сработает функция showData() и на экране отобразится таблица с данными со всех структур динамического массива.  В самом конце программы не забываем освободить память, которую занимает динамический массив структур.

Задание 12*. Составить схему алгоритма и программу на языке C++, позволяющую решить предложенную в Вашем варианте задачу с использованием рекурсии.

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