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

variant_11

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

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

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

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

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

Вариант № 11

Выполнил

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

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

Е.С. Иванов

Проверил

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

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

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

С.А. Мишин

Воронеж − 2015

Задание на домашнюю контрольную работу по дисциплине «Информатика»

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

11.

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

11.

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

11.

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

11.

Приведем листинг программы на языке С++, рассчитывающей значение функции 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 = (log(x*x + fabs((double)x) + 2)) / (x*x + 1) + (1 - 5 * x)*exp(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>

#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 >= -M_PI && x <= 0)

{

y = -sin(x/2);

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

}

else if (x > 0 && x < 1)

{

y = 2*x-x*x;

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

}

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

{

y = 1;

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

}

else

{

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

}

}

return 0;

}

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

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

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

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

11.

Листинг П.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(100) << endl;

_getch();

return 0;

}

double my_sum(int n)

{

double sum = 0;

int i;

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

sum += 1/(sqrt(pow(i,3)-i+4));

return sum;

}

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

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

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

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

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

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

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

11.

Листинг П.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 = (2+fabs(cos(*n+2*M_PI*0.01)))/(*n*pow(log(*n+4),3));

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 = (2+fabs(cos(*n+2*M_PI*0.01)))/(*n*pow(log(*n+4),3));

sum += an;

}

while (fabs(an) >= eps);

return sum;

}

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

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

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

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

Исключить из массива А1..AN первый отрицательный элемент.

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

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

Листинг П.6.

#include<iostream>

using namespace std;

#include <cstdlib>

#include <conio.h>

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

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;

cout << "Massive A: ";

int index = -1; // номер первого отрицательного элемента

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

{

if (A[i] < 0)

{

index = i;

break;

}

}

int n;

if (index!=-1)

iDel(A, length_array, index+1);

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

{

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

}

cout << endl;

_getch();

delete[] A;

return 0;

}

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;

}

Задание 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;

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

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

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

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

A[count] = new float[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++)

S += A[count_row][count_column];

B[count_column] = S / rows;

}

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, где 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 Max = 0;

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

{

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

{

// i+j < N-1

if (count_row+count_column < rows -1)

if (A[count_row][count_column]>Max) Max = A[count_row][count_column];

}

}

cout << "Max:" << Max << endl;

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

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

delete[]A[count];

_getch();

return 0;

}

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

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

а) Создать массив структур (Priem), содержащий сведения об абитуриентах, поступающих в Вуз. Структура abiturient имеет следующие поля: фамилию абитуриента (Fam), его имя (Imay) и отчество (Otch), год рождения (God_rogd), номер аттестата о среднем образовании (Nomer_at), средний балл аттестата (Sr_ball), оценка по трем вступительным экзаменам (Rus, Math, Inf), контактный телефон (Tel). Размер массива не более 25 элементов.

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

Листинг П.9.

#include<iostream>

#include<windows.h>

#include<conio.h>

using namespace std;

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);

int main()

{

setlocale(LC_ALL, "rus");

Abiturient* Priem = 0;

int AbiturientAmount = 0;

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

do

{

Priem = AddStruct(Priem, AbiturientAmount);

setData(Priem, AbiturientAmount);

AbiturientAmount++;

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

cin >> YesOrNot;

cin.get();

} while (YesOrNot != 0);

showData(Priem, AbiturientAmount);

delete[] Priem;

return 0;

}

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

{

if (amount == 0)

{

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

}

else

{

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

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

{

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

}

delete[] Obj;

Obj = tempObj;

}

return Obj;

}

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

void setData(Abiturient* Obj, const int amount)

{

cout << "Фамилия: ";

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

cout << "Имя: ";

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

cout << "Отчество: ";

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

cout << "Год Рождения: ";

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

cout << "Номер аттестата: ";

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

cout << "Контактный телефон: ";

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

cout << "Средний балл: ";

cin >> Obj[amount].Sr_ball;

cout << "Оценка по русскому: ";

cin >> Obj[amount].Rus;

cout << "Оценка по математике: ";

cin >> Obj[amount].Math;

cout << "Оценка по информатике: ";

cin >> Obj[amount].Inf;

cin.get();

cout << endl;

}

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

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

{

system("cls");

cout << "№ " << "Фамилия\t" << "Имя\t" << "Отчество\t" << "Год рожд.\t" << "N аттестата\t" << "Ср. балл\t" << "Рус.\t" << "Мат.\t" << "Инф.\t" << "Тел.\t" << endl;

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

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

{

//если сумма баллов по всем экзаменам меньше 13

if (Obj[i].Rus + Obj[i].Math + Obj[i].Inf < 13)

cout << i + 1 << " " << Obj[i].Fam << '\t' << Obj[i].Imya << '\t' << Obj[i].Otch << '\t' << Obj[i].God_rogd << '\t' << Obj[i].Nomer_at << '\t' << Obj[i].Sr_ball << '\t' << Obj[i].Rus << '\t' << Obj[i].Math << '\t' << Obj[i].Inf << '\t' << Obj[i].Phone << endl;

}

_getch();

}

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

  1. Ввод данных

  1. Вывод на экран абитуриентов со средним баллом ниже 13.

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

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

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

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 и записываем в этот указатель новый адрес. Теперь он будет указывать на память, в которой есть сохраненные данные и дополнительный выделенный участок памяти для заполнения новыми данными.

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