шпаргалка. Контрольная работа по учебной дисциплине Информатика Вариант 5 Выполнил курсант 11 взвода ртф рядовой полиции
Скачать 342.93 Kb.
|
ВОРОНЕЖСКИЙ ИНСТИТУТ МВД РОССИИ Кафедра автоматизированных информационных систем органов внутренних дел Домашняя контрольная работа по учебной дисциплине «Информатика» Вариант № 5 Выполнил курсант 11 взвода РТФ рядовой полиции Е.С. Иванов Проверил Доцент кафедры АИС ОВД к.т.н., доцент подполковник полиции С.А. Мишин Воронеж − 2015 Задание 1. Вычислить в MathCAD предел числовой последовательности, графически показать к чему стремиться числовая последовательность при . Задание 2. Построить график функции f(x)(таблица 1) и приблизительно определить на нём один из корней уравнения. Решить уравнение f(x)= 0с помощью вычислительного блока Given/Find и встроенной функции MathCAD root(), интервал поиска корня определить самостоятельно из графика функции. 5. - начальное приближение Задача 3. Найти решение системы нелинейных уравнений из таблицы 2. Построить их графики и определить начальное приближение решения. Решить систему нелинейных уравнений с помощью вычислительного блока Given/Find. 5. 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 не принадлежит области определения функции». 5. Приведем листинг программы на языке С++, рассчитывающей значение функции y(x) с учетом области её определения . Листинг П. 1 #include "stdafx.h" #include #define _USE_MATH_DEFINES #include "math.h" #include int main() { using namespace std; float y, x; cout << "Vvedite x="; cin >> x; y = exp(3 - 2 * x) + log(2 * fabs((double)x) + 1) / (sin(2 * x + M_PI)*sin(2 * x + M_PI)-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 #include "math.h" #include int main() { using namespace std; float y, x; while ((_kbhit() == 0) && (_getch() != 27)) { cout << "Vvedite x="; cin >> x; if (x >= 0 && x <= 1) { y = sqrt(x); cout << "Pri x=" << x << " y=" << y << endl; } else if (x > 1 && x <= 2) { y = 2*x-1; cout << "Pri x=" << x << " y=" << y << endl; } else if (x > 2 && x <= 3) { y = x*x-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 и с помощью разработанной Вами программы. Сравнить полученные значения. Результаты представить в отчете по работе. 5 . Листинг П.3 #include "stdafx.h" #include #include "math.h" #include double my_sum(int); using namespace std; int main() { cout << "Summa S=" << my_sum(20) << endl; _getch(); return 0; } double my_sum(int n) { double sum = 0; int i; for (i = 1; i <= n; i++) sum += pow(log(i),3) / (i*sqrt(5*i+1)); return sum; } Результат выполнения программы Вычислим значение ряда в MathCAD Значение, вычисленное с помощью разработанной программы, совпадает со значением, вычисленным с помощью MathCAD. Задание 7. а) Составить схему алгоритма и программу на языке C++ с использованием собственной функции summa () для расчёта суммы бесконечного ряда. В качестве параметра функции использовать точность . В теле функции summa () предусмотреть не только расчет значения суммы бесконечного ряда с заданной точностью1, но и подсчет количества членов ряда n, участвовавших в суммировании. 1) напишите программу, используя цикл while; 2) напишите программу, используя цикл do while. б) Рассчитать значение суммы ряда в MathCAD и с помощью разработанной Вами программы. Сравнить полученные значения. Результаты представить в отчете по работе. 5 . Листинг П.4 используя цикл while #include "stdafx.h" #include #include "math.h" #include #include 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 = (4-fabs(sin(*n*0.01)))/(*n*pow(log(*n+3),2)); sum += an; } ; return sum; } используя цикл do while Листинг П.5 #include "stdafx.h" #include #include "math.h" #include #include 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 = (4-fabs(sin(*n*0.01)))/(*n*pow(log(*n+3),2)); sum += an; } while (fabs(an) >= eps); return sum; } Результат выполнения программы Рассчитаем значение суммы ряда в MathCAD Значения практически совпадают. Задание 8. В соответствии с Вашим вариантом составить схему алгоритма и программу на языке C++ для решения следующей задачи обработки одномерных массивов: Даны целые числа А1..AN.Определить количество целых чисел, входящих в последовательность А1..AN по одному разу. Алгоритм: выполняем двойной вложенный цикл по массиву – сравниваем текущий элемент с оставшимися. Если найден похожий элемент, то выходим из цикла. Если такого элемента не найдено – наращиваем количество неповторяющихся уникальных элементов. Листинг П.6. #include using namespace std; #include #include 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 #include #include 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 #include #include 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 = 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 #include #include 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'>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++, позволяющую решить предложенную в Вашем варианте задачу с использованием рекурсии. Вариант 5. Напишите программу, которая определяет сумму цифр в натуральном числе. Листинг П.10. #include #include #include using namespace std; int digits_sum(int n) { return n < 10 ? n : ((n % 10) + digits_sum(n / 10)); } int main() { int a; setlocale(LC_ALL, "rus"); cout << "Введите натуральное число: " ; cin >> a; cout << "Сумма цифр: " << digits_sum(a); _getch(); return 0; } Результат работы программы: 1 Будем считать, что заданная точность достигнута, если абсолютное значение члена ряда anстанет меньше , т.е. . |