Загрузка...

Help with sparse matrices

Thread in C/C++ created by WhatElse Mar 5, 2021. (bumped Mar 6, 2021) 156 views

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

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

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

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

    Мой код:

    Code
    #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 Mar 8, 2021 0 May 31, 2020
    for loop
     
Top
Loading...