Загрузка...

Помощь с разреженными матрицами

Тема в разделе C/C++ создана пользователем WhatElse 5 мар 2021. (поднята 6 мар 2021) 155 просмотров

  1. WhatElse
    WhatElse Автор темы 5 мар 2021 33 15 фев 2021
    Необходимо создать новую матрицу из данных входного потока, не меняя при этом старую. Как это можно сделать? При этом необходимо, чтобы менялись все элементы строки, если их несколько.

    Из входного потока вводится непрямоугольная матрица вещественных чисел [aij], i = 1, …, m, j = 1, …, ni. Значения m и ni заранее не известны и вводятся из входного потока.

    Сформировать новую матрицу, поменяв в каждой строке местами максимальный и минимальный элементы (все, если их несколько).

    Исходную и полученную матрицы вывести в выходной поток с необходимыми комментариями.

    Мой код:

    Код
    #include<stdio.h>
    #include<malloc.h>


    typedef struct line{
    int n;
    int *arr;
    } line;


    typedef struct matrix{
    int lines;
    line *matr;
    } matrix;


    int getint(int *h);
    int input(matrix *a);
    int output(matrix *a);
    void modify(matrix *a);



    int main()
    {
    struct matrix matr;
    input(&matr);
    output(&matr);
    modify(&matr);
    output(&matr);
    return 0;
    }



    int getint(int *h)
    {
    int x;
    do {
    x = scanf("%d", h);
    if (x < 0)
    return 0;
    if (x == 0)
    {
    printf("Ошибка ввода (требуется ввести натуральное число)\n");
    scanf("%*[^\n]");
    }
    } while (x == 0);
    return 1;
    }


    int input(matrix *a)
    {
    int m,n;
    int i,j,k;

    printf("Введите количество строк матрицы: ");
    getint(&m);
    a->lines = m;
    a->matr = (line *)calloc(m, sizeof(line));

    for (j = 0; j < a->lines; ++j){
    printf("\nВведите длину строки[%d]: ",j);
    getint(&n);
    a->matr[j].n = n;
    a->matr[j].arr = (int *)malloc(sizeof(int)* n);
    for (i = 0; i < a->matr[j].n; ++i)
    {
    printf("Введите значение[%d][%d]: ",j,i);
    getint(&k);
    a->matr[j].arr[i] = k;
    }
    }

    }

    int output(matrix *a)
    {
    int m,n;
    int i,j;
    printf("\n");
    for (j = 0; j < a->lines; ++j){
    for (i = 0; i < a->matr[j].n; ++i)
    {
    printf("%d ",a->matr[j].arr[i]);
    }
    printf("\n");
    }

    }


    void modify(matrix *a)
    {
    int i,j, max,min,tmp;

    for (j = 0; j < a->lines; ++j)
    {
    min = 0;
    max = 0;
    for (i = 0; i < a->matr[j].n; ++i)
    {
    if(a->matr[j].arr[i] > a->matr[j].arr[max]) max = i;
    if(a->matr[j].arr[i] < a->matr[j].arr[min]) min = i;
    }
    tmp = a->matr[j].arr[min];
    a->matr[j].arr[min] = a->matr[j].arr[max];
    a->matr[j].arr[max] = tmp;
    }

    }
     
  2. sagethnndog
    sagethnndog 8 мар 2021 0 31 май 2020
    for loop
     
Загрузка...
Top