Главная страница
Навигация по странице:

  • Код на локальном

  • Задание 2. Вспомнить задачу 2 из второго семинара прошлого семестра, изменить ее используя динамические массивы.

  • работа по си с использованием динамических массивов. Отчёт по семинару 1. Семинар Задание Вспомнить задачи 2 и 3 из семинара 1 прошлого семестра, выполнить их с использованием динамических массивов


    Скачать 230.08 Kb.
    НазваниеСеминар Задание Вспомнить задачи 2 и 3 из семинара 1 прошлого семестра, выполнить их с использованием динамических массивов
    Анкорработа по си с использованием динамических массивов
    Дата15.02.2022
    Размер230.08 Kb.
    Формат файлаdocx
    Имя файлаОтчёт по семинару 1.docx
    ТипСеминар
    #363299

    Шмагин Сергей Ильич, ИД-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();

    }


    Блок-схема не изменилась.


    Имя

    Смысл

    Тип

    Структура

    N

    длина вектора X

    целый

    простая переменная

    M

    длина вектора Y

    целый

    простая переменная

    n1

    количество элементов

    целый

    простая переменная

    n2

    количество элементов

    целый

    простая переменная

    C1

    сумма

    целый

    простая переменная

    C2

    сумма

    целый

    простая переменная

    X

    вектор

    вещественный

    одномерный массив

    Y

    вектор

    вещественный

    одномерный массив



    раздел 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 #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; ifor (j=0; 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

    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; ifor (j=0; jscanf_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

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

    }



    Имя

    Смысл

    Тип

    Структура

    Исходные данные

    n

    количество строк

    целый

    простая переменная

    m

    количество столбцов

    целый

    простая переменная

    matrix

    Матрица

    вещественный

    двумерный массив

    summ

    массив сумм по столбцам

    вещественный

    одномерный массив

    промежуточные данные

    i

    счетчик цикла

    целый

    простая переменная

    j

    счетчик цикла

    целый

    простая переменная



    Задание 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(rand() % 10);

    }

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

    }


    написать администратору сайта