Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Матрица N*K


Автор: bncom 12.2.2006, 10:09
Помогите с задачей:

В двумерном массиве из целых чисел обнулить элементы над главной диагональю, если их сумма меньше суммы элементов под главной диагональю. В противном случае обнулить элементы под главной диагональю.

Код приведите желательно на Си.
Компилятор: TurboC 3

Автор: MAKCim 12.2.2006, 10:33
Код

int check(int** matrix, int n) //Проверка
{
    int s=0,c=0, i,j;
    for (i=0; i<n; i++)
    {
        for (j=i+1; j<n; j++) s+=matrix[i][j], c+=matrix[j][i]
    }
    return s<c ? 1: 0;
}

void set_zero(int** matrix, int n)  //Обнуление
{
    int i,j,checking=check(matrix,n);
    for (i=0; i<n; i++)
    {
        for (j=i+1; j<n; j++)
        {
            if (checking) matrix[i][j]=0;
            else matrix[j][i]=0;
        } 
    }
}

код для кв. матрицы размерности n

Автор: bncom 12.2.2006, 13:05
Спасибо, но не могли бы вы подробнее написать, с самого начала, начиная с #include smile . Плиз...

Автор: MAKCim 12.2.2006, 13:42
Код

#include <stdio.h>
#include <malloc.h>

//код из предыдущего поста

int main()
{
    int n,i,j,**matrix;
    printf("n=");
    scanf("%d",&n);
    matrix=(int**) malloc(n*sizeof(int*));
    for (i=0; i<n; i++)
    {
        matrix[i]=(int*) malloc(n*sizeof(int));
        for (j=0; j<n; j++)
        {
            printf("matrix[%d][%d]=",i,j);
            scanf("%d",&matrix[i][j]);
        }
    }
    set_zero(matrix,n);
    printf("New matrix:\n");
    for (i=0; i<n; i++)
    {
        for (j=0; j<n; j++) printf("matrix[%d][%d]=%d\n",i,j,matrix[i][j]);
        free(matrix[i]);
    }
    free(matrix);
    scanf("%d",&i);
    return 0;
}

вообще тебе стоит почитать книжку по C, а не ждать готовой программы здесь
если бы не хорошее настроение smile я бы ее писать не стал

Автор: bncom 12.2.2006, 15:17
Я вам очень признателен! надеюсь, у вас и впредь будет хорошее настроение smile
Добавлено @ 15:29
Ой, не компилируется. Вот, я собрал представленный код:
Код

#include <stdio.h>
#include <malloc.h>

//код из предыдущего поста
int check(int** matrix, int n) //Проверка
{
    int s=0,c=0, i,j;
    for (i=0; i<n; i++)
    {
        for (j=i+1; j<n; j++) s+=matrix[i][j], c+=matrix[j][i]
    }
    return s<c ? 1: 0;
}

void set_zero(int** matrix, int n)  //Обнуление
{
    int i,j,checking=check(matrix,n);
    for (i=0; i<n; i++)
    {
        for (j=i+1; j<n; j++)
        {
            if (checking) matrix[i][j]=0;
            else matrix[j][i]=0;
        } 
    }
}


int main()
{
    int n,i,j,**matrix;
    printf("n=");
    scanf("%d",&n);
    matrix=(int**) malloc(n*sizeof(int*));
    for (i=0; i<n; i++)
    {
        matrix[i]=(int*) malloc(n*sizeof(int));
        for (j=0; j<n; j++)
        {
            printf("matrix[%d][%d]=",i,j);
            scanf("%d",&matrix[i][j]);
        }
    }
    set_zero(matrix,n);
    printf("New matrix:\n");
    for (i=0; i<n; i++)
    {
        for (j=0; j<n; j++) printf("matrix[%d][%d]=%d\n",i,j,matrix[i][j]);
        free(matrix[i]);
    }
    free(matrix);
    scanf("%d",&i);
    return 0;
}


Выдаются ошибки:

11 Statement missing ;
15 Declaration is not allowed here
16 Declaration syntax error
59 Declaration missing ;
59 Compound statement missing }

Автор: volvo877 12.2.2006, 15:38
bncom,
Код
    for (i=0; i<n; i++)
    {
        for (j=i+1; j<n; j++) s+=matrix[i][j], c+=matrix[j][i]; // <--- Точку с запятой добавь
    }

Автор: bncom 15.2.2006, 20:06
У меня опять проблема6 программа не обнуляет нужные элементы. Помогите разобраться, где что не так....
Код

//Условие задачи:
//В двумерном массиве NxK массиве целых чисел обнулить элементы над главной диагональю,
//если их сумма меньше суммы элементов под главной диагональю. В противном случае
//обнулить элементы под главной диагональю.

#include <stdio.h> //описание функций ввода-вывода
#include <conio.h>  
#include <stdlib.h> //описание функций malloc
#define NOL 0 // константа со значением нуль

void main()
{
    int **matrix;
    int m; //число строк матрицы
    int n; //число столбцов матрицы
    int i=0; // промежуточная переменная
    int j=0; // промежуточная переменная
    int SymmaAboveDiag=0; //сумма элементов над главной диагональю
    int SymmaUnderDiag=0; // сумма элементов под главной диагональю
    
    clrscr(); //очищаем экран

    printf("Пожалуйста, введите размерность массива через пробел dim="); //вводим двумерный массив целых чисел
    scanf("%d%d",&m, &n);
    //Захватываем память под элементы матрицы    
    matrix=(int**) malloc(m*n*sizeof(int*));
    printf("Введите элементы матрицы:\n"); 
    for (i=0;i<n;i++)
    {
        matrix[i]=(int*) malloc(m*n*sizeof(int));
        for (j=0;j<n;j++)
        {
            // Вводим элементы с индексами i, j
            scanf("%d",&matrix[i][j]);
        }
    }
    //конец ввода двумерного массива целых чисел

    //считаем сумму элементов по обе строны от главной диагонали
    for (i=0;i<n;i++) //перебираем все строки
        for (j=0;j<n;j++) //перебираем все столбцы
        {
            if (j>i) SymmaAboveDiag+=matrix[i][j];
            if (j<i) SymmaUnderDiag+=matrix[i][j];
        }
    //конец суммирования

    //выполняем обнуление элементов массива
    if (SymmaAboveDiag<SymmaUnderDiag) //если сумма чисел над диагональю меньше суммы чисел под диагональю, то
        for (i=0;i<n;i++)
            for (j=0;j<n;j++)
                if (j>i)
                    matrix[i][j]=NOL; //элементу массива присваиваем нуль
    else
        for (i=0;i<n;i++)
            for (j=0;j<n;j++)
                if (j>i)
                    matrix[i][j]=NOL;
     //конец обнуления элементов массива

    printf("Сумма элементов над главной диагональю : %d\n",SymmaAboveDiag);
    printf("Сумма элементов под главной диагональю : %d\n",SymmaUnderDiag);
    
    printf("В итоге получаем матрицу:\n"); //выводим отредактированный двумерный массив
    for (i=0;i<n;i++)
    {
        for (j=0;j<n;j++)
        {
            printf("%i ",matrix[i][j]);
        }
        printf("\n");
    }
    // конец вывода отсортированного двумерного массива

    getch();
}

Автор: cardinal 15.2.2006, 20:52
bncom, ты хоть что-то сам пытался сделать?

Автор: bncom 16.2.2006, 19:56
cardinal, так это я сам написал! smile
Ты бы лучше помог бы, а не рассуждал smile

Автор: volvo877 16.2.2006, 20:24
Код
    // Захватываем память под элементы матрицы    
    matrix=(int**) malloc(m*n*sizeof(int*)); // <--- Неверно !!!
    printf("Введите элементы матрицы:\n"); 
    for (i=0;i<n;i++)
    {
        matrix[i]=(int*) malloc(m*n*sizeof(int)); // <--- Тоже неверно !!! 
        for (j=0;j<n;j++)
        {
            // Вводим элементы с индексами i, j
            scanf("%d",&matrix[i][j]);
        }
    }

Этот фрагмент должен быть таким:
Код
    // Захватываем память под элементы матрицы    
    matrix=(int**) malloc(n*sizeof(int*)); // <--- Память под n указателей на строки матрицы !
    printf("Введите элементы матрицы:\n"); 
    for (i=0;i<n;i++)
    {
        matrix[i]=(int*) malloc(m*sizeof(int)); // <--- В каждей строке - m элементов !
        for (j=0;j<m;j++)
        {
            // Вводим элементы с индексами i, j
            scanf("%d",&matrix[i][j]);
        }
    }

Ну, и далее по тексту:

Код

    // выполняем обнуление элементов массива
    if (SymmaAboveDiag<SymmaUnderDiag) 
        for (i=0;i<n;i++)
            for (j=0;j<n;j++) { // <-- Не забывай скобки !!!
                if (j>i)
                    matrix[i][j]=NOL;
            }
    else
        for (i=0;i<n;i++)
            for (j=0;j<n;j++) { // <--- Здесь тоже
                if (j<i)
                    matrix[i][j]=NOL;
            }

У тебя была ошибка - компилятор считал, что else относится к if(j > i) ...

Автор: Jilian 16.2.2006, 23:30
Цитата

bncom, ты хоть что-то сам пытался сделать?

Понимаешь, очень часто складывается ситуация, что людям, абсолютно ничего не понимающим в программировании надо написать прогу. Тогда они либо ищут помощи на форумах, либо платят за код. Но платить-то не охота... Так что не нервничай.

Автор: cardinal 16.2.2006, 23:54
Цитата(Jilian @ 16.2.2006, 21:30 Найти цитируемый пост)
Так что не нервничай.

Да я и не нервничаю, просто не люблю тунеядцев. smile

(если в этом случае, bncom, я ошибаюсь, то я беру свои слова обратно и публично извиняюсь.)

Автор: bncom 17.2.2006, 12:24
Всех благодарю за помощь!
Спасибо большое (подсказали, указали на ошибки), вот так и надо учиться программировать! smile
cardinal , замяли... smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)