работа по си с использованием динамических массивов. Отчёт по семинару 1. Семинар Задание Вспомнить задачи 2 и 3 из семинара 1 прошлого семестра, выполнить их с использованием динамических массивов
Скачать 230.08 Kb.
|
Шмагин Сергей Ильич, ИД-02135-18, 2 семестр, семинар 1. Задание 1. Вспомнить задачи 2 и 3 из семинара 1 прошлого семестра, выполнить их с использованием динамических массивов. раздел 6. Найти число n1 отрицательных элементов вектора X и их сумму C1 и число n2 положительных элементов вектора Y и их сумму C2 версия с прошлого семестра: #include "stdafx.h" #include #include #include #include int main() { setlocale(LC_ALL, "RUS"); int n, m, n1, n2; float C1, C2; n1 = n2 = 0; C1 = C2 = 0; printf("Введите длину вектора X\n"); scanf_s("%d", &n); float X[100]; for (int i = 0; i < n; i++) scanf_s("%f", &X[i]); printf("Введите длину вектора Y\n"); scanf_s("%d", &m); float Y[100]; for (int i = 0; i < m; i++) scanf_s("%f", &Y[i]); for (int i = 0; i < n; i++) if (X[i] < 0) { n1++; C1 += X[i]; } printf("Сумма %d отрицательных элементов вектора X равна %f\n", n1, C1); for (int i = 0; i < m; i++) if (Y[i] > 0) { n2++; C2 += Y[i]; } printf("Сумма %d положительных элементов вектора Y равна %f", n2, C2); _getch(); } Код на локальном #include #include #include int main() {SetConsoleCP(1251); SetConsoleOutputCP(1251); float T[20], X[20], zero; int k, z, i; printf("Введите k\n"); scanf_s("%d", &k); printf("Введите массив из %d элементов\n", k); for (i = 0; i < k; i++) scanf_s("%f", &X[i]); for (i = 0; i < k; i++) if (X[i] > 0) T[i] = X[i]; else T[i] = 0; zero = 0; z = 0; for (i = 0; i < k; i++) if (T[i] == zero) { z = z + 1; } printf("Число нулей=%d \n", z); _getch(); } версия с динамическими массивами: #include "stdafx.h" #include #include #include #include int main() { setlocale(LC_ALL, "RUS"); int n, m, n1, n2; float C1, C2; n1 = n2 = 0; C1 = C2 = 0; printf("Введите длину вектора X\n"); scanf_s("%d", &n); float *X = new float [n]; for (int i = 0; i < n; i++) scanf_s("%f", &X[i]); printf("Введите длину вектора Y\n"); scanf_s("%d", &m); float *Y = new float[m]; for (int i = 0; i < m; i++) scanf_s("%f", &Y[i]); for (int i = 0; i < n; i++) if (X[i] < 0) { n1++; C1 += X[i]; } printf("Сумма %d отрицательных элементов вектора X равна %f\n", n1, C1); for (int i = 0; i < m; i++) if (Y[i] > 0) { n2++; C2 += Y[i]; } printf("Сумма %d положительных элементов вектора Y равна %f", n2, C2); _getch(); } Код на динамике #include #include #include int main() {SetConsoleCP(1251); SetConsoleOutputCP(1251); int k, z, i; printf("Введите k\n"); scanf_s("%d", &k); printf("Введите массив из %d элементов\n", k); float*T = new float[k]; float*X = new float[k], zero; for (i = 0; i < k; i++) scanf_s("%f", &X[i]); for (i = 0; i < k; i++) if (X[i] > 0) T[i] = X[i]; else T[i] = 0; zero = 0; z = 0; for (i = 0; i < k; i++) if (T[i] == zero) { z = z + 1; } printf("Число нулей=%d \n", z); _getch(); } Блок-схема не изменилась.
раздел 7. Для каждого столбца матрицы вычислить среднее арифметическое элементов, меньших первого элемента этого столбца версия с прошлого семестра: #include "stdafx.h" #include #include #include #include int main() { int i, j, m, n; setlocale(LC_ALL, "RUS"); printf("Введите размеры матрицы n и m\n"); scanf_s("%d%d", &n, &m); float matrix[100][100]; float summ[100]; for (j = 0; j < m; j++) summ[j] = 0; for (i = 0; i < n; i++) for (j = 0; j < m; j++) scanf_s("%f", &matrix[i][j]); for (j = 0; j < m; j++) for (i = 0; i < n; i++) if (matrix[i][j] < matrix[0][j]) summ[j] += matrix[i][j]; printf("Суммы для каждого столбца:\n"); for (j = 0; j < m; j++) printf("%.2f ", summ[j]); _getch(); } #include {SetConsoleCP(1251); SetConsoleOutputCP(1251); float a[5][5]; int N,M,i,j,plus, minus; printf("Введите N, M\n"); scanf_s("%d%d",&N, &M); printf("Введите массив %d * %d\n",N,M); for (i=0; i scanf_s("%f", &a[i][j]); { plus=0, minus=0; for ( int i = 0; i < N; ++i ) for ( int j = 0; j < M; ++j ) { if(a[i][j]>0) plus++; if(a[i][j]<0) minus++;} } printf("Положительных элементов:%i\n",plus); printf("Отрицательных элементов:%i\n",minus); _getch(); } #include #include #include void main() {SetConsoleCP(1251); SetConsoleOutputCP(1251); float a[5][5]; int N,M,i,j,plus, minus; printf("Введите N, M\n"); scanf_s("%d%d",&N, &M); printf("Введите массив %d * %d\n",N,M); for (i=0; i { plus=0, minus=0; for ( int i = 0; i < N; ++i ) for ( int j = 0; j < M; ++j ) { if(a[i][j]>0) plus++; if(a[i][j]<0) minus++;} } printf("Положительных элементов:%i\n",plus); printf("Отрицательных элементов:%i\n",minus); _getch(); } версия с динамическими массивами: #include #include #include #include int main() { int i, j, m, n; setlocale(LC_ALL, "RUS"); printf("Введите размеры матрицы n и m\n"); scanf_s("%d%d", &n, &m); float **matrix = new float*[n]; float *summ = new float[n]; for (i = 0; i < n; i++) matrix[i] = new float[m]; for (j = 0; j < m; j++) summ[j] = 0; for (i = 0; i < n; i++) for (j = 0; j < m; j++) scanf_s("%f", &matrix[i][j]); for (j = 0; j < m; j++) for (i = 0; i < n; i++) if (matrix[i][j] < matrix[0][j]) summ[j] += matrix[i][j]; printf("Суммы для каждого столбца:\n"); for (j = 0; j < m; j++) printf("%.2f ", summ[j]); _getch(); } Версия с динамикой #include #include #include int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); int N, M, i, j, plus, minus; printf("Введите N, M\n"); scanf_s("%d%d", &N, &M); float**A = new float*[N]; for (i = 0; i < N; i++); A[i] = new float[M]; for (i = 0; i < N; i++); for (j = 0; j < M; j++); scanf_s("%f", &A[i][j]); { plus = 0, minus = 0; for (int i = 0; i < N; ++i) for (int j = 0; j < M; ++j) { if (A[i][j] > 0) plus++; if (A[i][j] < 0) minus++; } } printf("Положительных элементов:%i\n", plus); printf("Отрицательных элементов:%i\n", minus); _getch(); } #include #include #include int main() {SetConsoleCP(1251); SetConsoleOutputCP(1251); int N, M, i, j, plus, minus; printf("Введите N, M\n"); scanf_s("%d%d", &N, &M); printf("Введите массив %d * %d\n", N, M); float** A = new float* [N]; for (i = 0; i < N; i++) A[i] = new float[M]; for (j = 0; j < M; j++) scanf_s("%f", &A[i][j]); { plus = 0, minus = 0; for (int i = 0; i < N; ++i) for (int j = 0; j < M; ++j) { if (A[i][j] > 0) plus++; if (A[i][j] < 0) minus++; } } printf("Положительных элементов:%i\n", plus); printf("Отрицательных элементов:%i\n", minus); _getch(); } #include #include #include int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); int N, M, i, j, plus, minus; printf("Введите N, M\n"); scanf_s("%d%d", &N, &M); float** A; A= new float*[N]; for (i = 0; i < N; i++); A[i] = new float[M]; for (j = 0; j < M; j++); scanf_s("%f", &A[i][j]); { plus = 0, minus = 0; for (int i = 0; i < N; ++i) for (int j = 0; j < M; ++j) { if (A[i][j] > 0) plus++; if (A[i][j] < 0) minus++; } } printf("Положительных элементов:%i\n", plus); printf("Отрицательных элементов:%i\n", minus); _getch(); }
Задание 2. Вспомнить задачу 2 из второго семинара прошлого семестра, изменить ее используя динамические массивы. Если среднее арифметическое SA положительных элементов матрицы A (5×4) больше среднего арифметического SB положительных элементов матрицы B (4×6), найти сумму SA + SB, иначе найти разность SA – SB. я оформил ввод матрицы и вычисление среднего арифметического в матрице как функции. void matrixIn(float matrix[][4], int n, int m); эта функция ввода матрицы. передается матрица, и ее размер. выходное значение не требуется. float meanInMatrix(float matrix[][4], int n, int m); эта функция находит среднее арифметическое в матрице. передается матрица, и ее размер. возвращается среднее арифметическое файл source.cpp #include #include #include void matrixIn(float matrix[][4], int n, int m); float meanInMatrix(float matrix[][4], int n, int m); int main() { setlocale(LC_ALL, "Russian"); float A[5][4]; float B[6][4]; matrixIn(A, 5, 4); matrixIn(B, 6, 4); float meanA = meanInMatrix(A, 5, 4); float meanB = meanInMatrix(B, 6, 4); float result; if (meanA > meanB) result = meanA + meanB; else result = meanA - meanB; printf("среднее арифметическое матрицы A: %f\nсреднее арифметическое матрицы B: %f\n", meanA, meanB); printf("результат: %f", result); _getch(); } файл func.cpp #include void matrixIn(float matrix[][4], int n, int m) { for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) scanf_s("%f", &matrix[i][j]); } float meanInMatrix(float matrix[][4], int n, int m) { float summ = 0; int count = 0; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) if (matrix[i][j] > 0) { summ += matrix[i][j]; count++; } return summ / count; } Решение с использованием динамических массивов: Файл source.cpp: #include "stdafx.h" #include #include #include #include #include using namespace std; float meanInMatrix(float **matrix, int n, int m); float **createMatrix(int n, int m, bool manualInput = false); void printMatrix(float **matrix, int n, int m); int main() { setlocale(LC_ALL, "Russian"); int an, am, bn, bm; cout << "Введите n и m матрицы A" << endl; cout << "n="; cin >> an; cout << endl << "m="; cin >> am; float **A = createMatrix(an, am); cout << endl; printMatrix(A, an, am); cout << "Введите n и m матрицы B" << endl; cout << "n="; cin >> bn; cout << endl << "m="; cin >> bm; float **B = createMatrix(bn, bm); cout << endl; printMatrix(B, bn, bm); float sa, sb, res; sa = meanInMatrix(A, an, am); sb = meanInMatrix(B, bn, bm); cout << fixed << setprecision(2) << "Среднее арифметическое положительных элементов матрицы A равно " << sa << ", а среднее арифметическое положительных элементов матрицы B равно" << sb << endl; if (sa > sb) res = sa + sb; else res = sa - sb; cout << fixed << setprecision(2) << "Результат равен " << res << endl; if (A) for (int i = 0; i < an; i++) delete[] A[i]; delete A; if (B) for (int i = 0; i < bn; i++) delete[] B[i]; delete B; cin >> bm; return 0; } Файл func.cpp: #include "stdafx.h" #include #include #include #include #include using namespace std; float meanInMatrix(float **matrix, int n, int m) { float res = 0; int count = 0; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) if (matrix[i][j] > 0) { res += matrix[i][j]; count++; } if (count) res = res / count; else res = 0; return res; } float **createMatrix(int n, int m, bool manualInput = false) { float **res = new float *[n]; for (int i = 0; i < n; i++) { res[i] = new float[m]; for (int j = 0; j < m; j++) if (manualInput) scanf_s("%f", &res[i][j]); else res[i][j] = 4.5f - static_cast } return res; } void printMatrix(float **matrix, int n, int m) { for (int i = 0; i < n; i++, cout << endl) for (int j = 0; j < m; j++) cout << fixed << setprecision(2) << setw(6) << matrix[i][j]; } Я добавил функцию, заполняющую матрицу случайными значениями для упрощения отладки и демонстрации превосходства версии с динамическими массивами. Так же я исправил недостаток предыдущей версии, с возможным делением на ноль. Исправленная блок-схема: Код на си ++ локальные массивы #include #include #include #include using namespace std; double PA = 0, PB = 0, PC = 0; void count_A(double matr[][4], int n, int m) { double multipl = 1; for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < m; j++) { if (matr[i][j] > 0) { multipl *= matr[i][j]; PA = 1; PA *= multipl; } } } cout << "\nПроизведение положительных элементов матрицы A (PA), стоящих выше главной диагонали: " << PA; } void input_A(double matr[][4], int n, int m) { cout << "\nВведите элементы матрицы A[4][4]: \n"; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> matr[i][j]; } } } void count_B(double matr[][5], int n, int m) { double multipl = 1; for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < m; j++) { if (matr[i][j] > 0) { multipl *= matr[i][j]; PB = 1; PB *= multipl; } } } cout << "\nПроизведение положительных элементов матрицы B (PB), стоящих выше главной диагонали: " << PB; } void input_B(double matr[][5], int n, int m) { cout << "\nВведите элементы матрицы B[5][5]: \n"; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> matr[i][j]; } } } void count_C(double matr[][3], int n, int m) { double multipl = 1; for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < m; j++) { if (matr[i][j] > 0) { multipl *= matr[i][j]; PC = 1; PC *= multipl; } } } cout << "\nПроизведение положительных элементов матрицы C (PC), стоящих выше главной диагонали: " << PC; } void input_C(double matr[][3], int n, int m) { cout << "\nВведите элементы матрицы C[3][3]: \n"; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> matr[i][j]; } } } void count_P() { double P = 0; P = (PA + PB) * PC; cout << "\nВыражение (PA + PB)*PC =" << P; } int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); double A[4][4], B[5][5], C[3][3]; input_A(A, 4, 4); input_B(B, 5, 5); input_C(C, 3, 3); count_A(A, 4, 4); count_B(B, 5, 5); count_C(C, 3, 3); count_P(); _getch(); } Код на динамике #include #include #include #include using namespace std; double PA = 0, PB = 0, PC = 0; void count_A(double**matr, int n, int m) { double**creatematr (int n, int m, bool manuallnput = false); void printmatr(double** matr, int n, int m); int main(); double multipl = 1; for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < m; j++) { if (matr[i][j] > 0) { multipl *= matr[i][j]; PA = 1; PA *= multipl; } } } cout << "\nПроизведение положительных элементов матрицы A (PA), стоящих выше главной диагонали: " << PA; } void input_A(double matr[][4], int n, int m) { cout << "\nВведите элементы матрицы A[4][4]: \n"; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> matr[i][j]; } } } void count_B(double matr[][5], int n, int m) { double multipl = 1; for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < m; j++) { if (matr[i][j] > 0) { multipl *= matr[i][j]; PB = 1; PB *= multipl; } } } cout << "\nПроизведение положительных элементов матрицы B (PB), стоящих выше главной диагонали: " << PB; } void input_B(double matr[][5], int n, int m) { cout << "\nВведите элементы матрицы B[5][5]: \n"; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> matr[i][j]; } } } void count_C(double matr[][3], int n, int m) { double multipl = 1; for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < m; j++) { if (matr[i][j] > 0) { multipl *= matr[i][j]; PC = 1; PC *= multipl; } } } cout << "\nПроизведение положительных элементов матрицы C (PC), стоящих выше главной диагонали: " << PC; } void input_C(double matr[][3], int n, int m) { cout << "\nВведите элементы матрицы C[3][3]: \n"; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> matr[i][j]; } } } void count_P() { double P = 0; P = (PA + PB) * PC; cout << "\nВыражение (PA + PB)*PC =" << P; } int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); double A[4][4], B[5][5], C[3][3]; input_A(A, 4, 4); input_B(B, 5, 5); input_C(C, 3, 3); count_A(A, 4, 4); count_B(B, 5, 5); count_C(C, 3, 3); count_P(); _getch(); } |