Uploaded by treyser2222

РГР по языкам программирования

advertisement
Министерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное
образовательное учреждение высшего образования
«Комсомольский-на-Амуре государственный университет»
Факультет компьютерных технологий
Кафедра «Прикладная математика»
РАСЧЕТНО-ГРАФИЧЕСКАЯ РАБОТА
по дисциплине
«Языки программирования»
Вариант 12
Студент группы 0ВСб-1
А.М. Черников
Преподаватель
Е.П. Жарикова
2021
Содержание
1 Линейные программы .............................................................................................. 3
2 Разветвляющиеся вычислительные процессы ...................................................... 5
3 Организация циклов ................................................................................................. 8
4 Одномерные массивы ............................................................................................ 15
5 Двухмерные массивы ............................................................................................. 19
Заключение ................................................................................................................ 20
2
1 Линейные программы
Порядок выполнения работы:
а. Написать программу для расчета по двум формулам (1), (2):
z1 =
sin⁡(4𝑎)
1+cos⁡(4𝑎)
∗
cos⁡(2𝑎)
1+cos⁡(2𝑎)
3
z2 = 𝑐𝑡𝑔( 𝜋 − 𝑎)
2
(1)
(2)
б. Выполнить отчет о проделанной работе.
Ход работы
а. Код написанной программы для расчета по двум формулам представлен в
листинге 1.1.
Листинг 1.1 – Программа для расчета по двум формулам
#include <iostream>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;
bool isExit;
string aStr;
double a, z1, z2;
int main(){
setlocale(LC_ALL, "Russian"); //Возможность использовать русские символы
cout << "a = ";
cin >> aStr; //Ввод значение для переменной aStr
a = atof(aStr.c_str()); //Преобразование строки aStr в число
z1 = (sin(4 * a)/(1 + cos(4 * a))) * (cos(2 * a)/(1 + cos(2 * a)));
z2 = 1/tan(1.5 * M_PI - a);
cout << "z1 = " << z1 << "\n" << "z2 = " << z2 << endl;
cout << "enter 0 to exit or 1 to continue" << endl;
cin >> isExit; //Условие выхода из программы
if(isExit) {cin.clear(); main();} else{exit;} //если введено значение 0, то завершить
программу, иначе запустить заново
}
3
б. Результат работы программы для расчета по двум формулам представлен
на рисунке 1.1.
Рисунок 1.1 – Результат работы программы для расчета по двум формулам
4
2 Разветвляющиеся вычислительные процессы
Порядок выполнения работы:
а. Написать программу, которая определяет, попадает ли точка с заданными
с клавиатуры координатами в область (Рисунок 2.1.), закрашенную на рисунке
серым цветом. Величину R задать в виде именованной константы.
Рисунок 2.1 – Область попадания точки
б. Выполнить отчет о проделанной работе.
Ход работы
а. Код написанной программы, которая определяет, попадает ли точка с
заданными с клавиатуры координатами в область, закрашенную на рисунке серым
цветом, представлен в листинге 2.1.
Листинг 2.1 – Код программы, которая определяет, попадает ли точка с заданными
с клавиатуры координатами в область
#include <iostream>
#define _USE_MATH_DEFINES
#include <cmath>
#include <stdlib.h>
#include <string>
using namespace std;
int numOrNot(string variable){ //Функция ввода и проверки числа
5
double value;
cin >> value;
while (cin.fail()){ //cin.fail() означает: если предыдущий ввод был неудачен, то
true, иначе false
cin.clear(); //Восстановить ввод
cin.ignore(32767,'\n'); //Отчистить буфер ввода
cout << "Please enter the correct value" << endl << variable << " = ";
cin >> value;
}
return value; //Вернуть значение из функции
}
double solve(double Radius, double coord_x, double coord_y){ //Функция решения
Radius = abs(Radius); //abs - это модуль
if((abs(coord_x) <= Radius) && (abs(coord_y) <= Radius)){ //square 2R x 2R
if((coord_x >= 0 && coord_y <= 0) || (coord_x <= 0 && coord_y >= 0)){ //2 and 4
coord parts
if((pow(coord_x - Radius, 2) + pow(coord_y + Radius, 2)) >= pow(Radius, 2)){
//4 circle
if((pow(coord_x + Radius, 2) + pow(coord_y - Radius, 2)) >= pow(Radius, 2)){
//2 circle
return true;
} else return false;
} else return false;
} else return false;
} else return false;
}
int main(){
double coord_x, coord_y, R;
cout << "R = ";
R = numOrNot("R"); //Вызов функции numOrNot с аргументом "R"
const double Radius = R;
cout << "x = ";
coord_x = numOrNot("x");
cout << "y = ";
6
coord_y = numOrNot("y");
cout << "Your point is ";
if(solve(Radius, coord_x, coord_y)) cout << "BELONGS"; else cout << "DOESN'T
BELONG";
cout << " to area 12";
}
б. Результат работы программы, которая определяет, попадает ли точка с
заданными с клавиатуры координатами в область, закрашенную на рисунке серым
цветом, представлена на рисунке 2.2.
Рисунок 2.2 – Программа, которая определяет, попадает ли точка с
заданными с клавиатуры координатами в область
7
3 Организация циклов
Порядок выполнения работы:
а. Таблица значений функции. Вычислить и вывести на экран в виде
таблицы значения функции F в соответствии с вариантом задания на интервале от
Xнач до Xкон с шагом dX. Через a, b, c, d обозначены действительные числа, через
Aц, Bц, Cц — целые части значений a, b, c. Значения a, b, c, d, Xнач, Xкон, dX
ввести с клавиатуры. Операции НЕ, И, ИЛИ и МОД2 — поразрядные. (задание «а»
показано на рисунке 3.1)
б. Ряды Тейлора. Вычислить и вывести в виде таблицы значения функции,
заданной с помощью ряда Тейлора, на интервале от Xнач до Xкон с шагом dX с
точностью ε (исходные данные ввести с клавиатуры). Таблицу снабдить
заголовком и шапкой. Каждая строка таблицы должна содержать значение
аргумента, значение функции и количество просуммированных членов ряда.
(задание «б» показано на рисунке 3.2).
Рисунок 3.1 – Задание “a”
Рисунок 3.2 – Задание “б”
в. Выполнить отчет о проделанной работе.
8
Ход работы
а. Код написанной программы, которая вычисляет и выводит на экран в виде
таблицы значения функции F в соответствии с вариантом задания на интервале от
Xнач до Xкон с шагом dX, представлен в листинге 3.1.
Листинг 3.1 – Код программы, которая вычисляет и выводит на экран в виде
таблицы значения функции F в соответствии с вариантом задания на интервале от
Xнач до Xкон с шагом dX
#include <iostream>
#define _USE_MATH_DEFINES
#include <cmath>
#include <stdlib.h>
#include <limits>
using namespace std;
double inputNumber(string variable){
double value;
cout << variable << " = ";
cin >> value;
while(cin.fail() || cin.get() != '\n'){
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Invalid input, try again" << endl << variable << " = ";
cin >> value;
}
return value;
}
int main(){
setlocale(LC_ALL,"RUSSIAN");
double a, b, c, d, X_start, X_end, dx;
int A, B, C;
a = inputNumber("a");
b = inputNumber("b");
c = inputNumber("c");
d = inputNumber("d");
X_start = inputNumber("X start");
X_end = inputNumber("X end");
dx = inputNumber("dx");
9
A = a; B = b; C = c;
double x = 0;
if(X_start > X_end){X_start += X_end; X_end = X_start - X_end; X_start -= X_end;}
if(X_end - X_start < 0.00001) dx = 1;
else if(dx < 0.00001) dx = (X_end - X_start)/4000;
cout << "X
";
cout << "F" << endl;
while(X_start + x <= X_end){
cout << X_start + x << "
";
if(x < 0.6 && b + c > 0.000001){
((A || B) && C == 0) ? cout << floor(a * pow(x, 3) + pow(b, 2) + c) : cout << a *
pow(x, 3) + pow(b, 2 + c);
cout << endl;
x += dx;
continue;
}
if(x > 0.6 && b + c < 0.000001){
((A || B) && C == 0) ? cout << floor((x - a)/(x - c)) : cout << (x - a)/(x - c);
cout << endl;
x += dx;
continue;
}
((A || B) && C == 0) ? cout << floor(x / c + x / a) : cout << x / c + x / a;
cout << endl;
x += dx;
}
}
б. Код написанной программы, которая вычисляет и выводит в виде таблицы
значения функции, заданной с помощью ряда Тейлора, на интервале от Xнач
до Xкон с шагом dX с точностью ε, представлен в листинге 3.2.
10
Листинг 3.2 – Код программы, которая вычисляет и выводит в виде таблицы
значения функции, заданной с помощью ряда Тейлора, на интервале от Xнач
до Xкон с шагом dX с точностью ε
#define _USE_MATH_DEFINES
#include <iomanip>
#include <iostream>
#include <cmath>
#include <limits>
using namespace std;
double inputNumber(string variable){
double value;
cout << variable << " = " ;
cin >> value;
while(cin.fail() || cin.get() != '\n'){
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Invalid input, try again" << endl << variable << " = ";
cin >> value;
}
return value;
}
double lessNegative1(string variable){
double value = inputNumber(variable);
while(value >= -1){
cout << variable << " must be less than -1" << endl;
value = inputNumber(variable);
}
return value;
}
int main(){
setlocale(LC_ALL,"RUSSIAN");
double X_start, X_end, dx, eps;
int epsCount;
X_start = lessNegative1("X start");
X_end = lessNegative1("X end");
dx = inputNumber("dx");
11
epsCount = abs(inputNumber("eps (количество знаков после запятой)"));
eps = pow(10, -epsCount);
if(X_start > X_end){X_start += X_end; X_end = X_start - X_end; X_start -= X_end;}
if(X_end - X_start < 0.00001) dx = 1;
else if(dx < 0.00001) dx = (X_end - X_start)/4000;
cout << "X
";
cout << "F
";
cout << "Members number" << endl;
double f, delta;
int count, coeff;
while(X_start <= X_end){
coeff = 1;
count = 0;
delta = numeric_limits<streamsize>::max();
f = -M_PI/2;
while(abs(delta) > eps){
delta = pow(-1, count+1) / (coeff * pow(X_start, coeff));
f += delta;
coeff += 2;
count++;
}
cout << X_start << "
endl;
X_start += dx;
" << setprecision(epsCount+1) << f << "
" << count <<
}
}
в. Результат работы программы, которая вычисляет и выводит на экран в виде
таблицы значения функции F в соответствии с вариантом задания на интервале от
Xнач до Xкон с шагом dX, представлен на рисунке 3.3
12
Рисунок 3.3 – Результат работы программы, которая вычисляет и выводит на
экран в виде таблицы значения функции F в соответствии с вариантом задания на
интервале от Xнач до Xкон с шагом dX
Программа, которая вычисляет и выводит в виде таблицы значения
функции, заданной с помощью ряда Тейлора, на интервале от Xнач до Xкон
с шагом dX с точностью ε, представлена на рисунке 3.4.
13
Рисунок 3.4 – Результат работы программы, которая вычисляет и выводит в виде
таблицы значения функции, заданной с помощью ряда Тейлора
14
4 Одномерные массивы
a. Массив состоит из вещественных чисел. Размерность массива задать
именованной константой. Найти номер максимального по модулю элемента
массива. Найти сумму элементов массива, расположенных после первого
положительного элемента. Преобразовать массив таким образом, чтобы сначала
располагались все элементы, целая часть которых лежит в интервале [а, b], а
потом — все остальные.
б. Выполнить отчет в проделанной работе.
Ход работы
а. Код программы, которая находит номер максимального по модулю
элемента массива, сумму элементов массива, расположенных после первого
положительного элемента, и преобразует массив так, чтобы сначала были
элементы, у которых целая часть находится в интервале [a, b] представлена в
листинге 4.1.
Листинг 4.1 – Программа, которая находит номер максимального по модулю
элемента массива, сумму элементов массива, расположенных после первого
положительного элемента, и преобразует массив так, чтобы сначала были
элементы, у которых целая часть находится в интервале [a, b]
#include <iostream>
#define _USE_MATH_DEFINES
#include <cmath>
#include <stdlib.h>
#include <string>
#include <limits>
#include <array>
using namespace std;
double inputDouble(string variable){
double value;
cout << variable << " = " ;
cin >> value;
while(cin.fail() || cin.get() != '\n'){
15
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Invalid input, try again" << endl << variable << " = ";
cin >> value;
}
return value;
}
int main(){
const int arrNum = 10;
double arr[arrNum];
cout << "Enter array elements" << endl;
// for(auto &x : arr) x = inputDouble();
for(int i = 0; i < arrNum; i++){
arr[i] = inputDouble("element " + to_string(i));
}
int a = inputDouble("a");
int b = inputDouble("b");
int maxAbsIndex = 0;
double sumAfterPos = 0;
bool isSumDone = false;
for(int i = 1; i < arrNum; i++){ //i макс. abs элемента
if(abs(arr[i]) > abs(arr[maxAbsIndex])){maxAbsIndex = i;}
}
for(int i = 0; i < arrNum-1; i++){ //сумма эл. после первого положительного
if(arr[i] > 0){
for(i; i < arrNum-1; i++) sumAfterPos += arr[i+1];
exit;
}
}
cout << "Max abs Index : " << maxAbsIndex << endl;
cout << "After fst pos Sum: " << sumAfterPos << endl;
cout << "array" << endl;
for(int i = 0; i < arrNum; i++){
16
cout << arr[i] << ", ";
}cout << endl;
for(int i = 0; i < arrNum-1; i++){
if(!((int)arr[i] >= a && (int)arr[i] <= b)){
for(int k = i+1; k < arrNum; k++){
if((int)arr[k] >= a && (int)arr[k] <= b){
arr[i] += arr[k]; arr[k] = arr[i] - arr[k]; arr[i] -= arr[k];
}}}}
cout << "transformed array" << endl;
for(int i = 0; i < arrNum; i++){
cout << arr[i] << ", ";
}
}
б. Результат работы программы, которая находит номер максимального по
модулю элемента массива, сумму элементов массива, расположенных после
первого положительного элемента, и преобразует массив так, чтобы сначала были
элементы, у которых целая часть находится в интервале [a, b] представлен на
рисунке 4.1.
17
Рисунок 4.1 – Результат работы программы, которая находит номер
максимального по модулю элемента массива, сумму элементов массива,
расположенных после первого положительного элемента, и преобразует массив
так, чтобы сначала были элементы, у которых целая часть находится в интервале
[a, b]
18
5 Двухмерные массивы
Порядок выполнения работы:
а. Уплотнить заданную матрицу, удаляя из нее строки и столбцы,
заполненные нулями. Найти номер первой из строк, содержащих хотя бы один
положительный элемент.
б. Выполнить отчет о проделанной работе.
Ход работы
а. Код программы, которая уплотняет матрицу, удаляя из нее строки и
столбцы,
заполненные
нулями,
и
выводящая
номер
первой
строки
с
положительным элементом представлен в листинге 5.1.
Листинг 5.1 – Программа, которая уплотняет матрицу, удаляя из нее строки и
столбцы,
заполненные
нулями,
и
выводящая
положительным элементом
#include <iostream>
#define _USE_MATH_DEFINES
#include <cmath>
#include <stdlib.h>
#include <string>
#include <limits>
#include <array>
using namespace std;
double inputDouble(){
double value;
cin >> value;
while(cin.fail() || cin.get() != '\n'){
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Invalid input, try again" << endl;
cin >> value;
}
return value;
}
int main(){
19
номер
первой
строки
с
const int row = 4;
const int column = 4;
int fstPosRow;
bool fstPosRowHave = false;
double matrix[row][column];
for(int i = 0; i < row; i++){
for(int k = 0; k < column; k++){
cout << i << " row, " << k << " column = ";
matrix[i][k] = inputDouble();
if(matrix[i][k] > 0.00000001 && !fstPosRowHave){fstPosRow
fstPosRowHave = true;}
}
cout << "\n";
}
=
double matrixShiftRow[row][column];
int R = 0;
for(int r = 0; r < row; r++){
for(int c = 0; c < column; c++){
if(abs(matrix[r][c]) > 0.00000001){
for(int c = 0; c < column; c++) matrixShiftRow[R][c] = matrix[r][c];
R++;
break;
}
}
}
double matrixShiftRowCol[row][column];
int C = 0;
for(int c = 0; c < column; c++){
for(int r = 0; r < R; r++){
if(abs(matrixShiftRow[r][c]) > 0.00000001){
for(int r = 0; r < row; r++) matrixShiftRowCol[r][C] = matrixShiftRow[r][c];
C++;
break;
}
}
20
i;
}
for(int i = 0; i < R; i++){
for(int k = 0; k < C; k++){
cout << matrixShiftRowCol[i][k] << " ";
}
cout << "\n";
}
if(fstPosRowHave) cout << "First row with positive element : " << fstPosRow+1;
else cout << "Massive didn't have a positive element";
}
б. Результат работы программы, которая уплотняет матрицу, удаляя из нее
строки и столбцы, заполненные нулями, и выводящая номер первой строки с
положительным элементом представлен на рисунке 5.1.
Рисунок 5.1 – Программа, которая уплотняет матрицу, и выводит номер
первой строки с положительным элементом
21
Заключение
В ходе выполнения расчетно-графической работы были изучены: линейный
подход, разветвляющиеся вычислительные процессы, организация циклов,
одномерные массивы, двухмерные массивы.
22
Download