Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C] Динамическая память, функции


Автор: Benya 18.4.2007, 23:41
Доброго вермени суток smile 
Очень нужна программа, а сам в функциях и динамической памяти - ноль.

Массив описывается динамически.
Элементы массива вещественного типа.
Размер рабочего массива определяет пользователь.
Обработка массива для поиска значения очередной переменной для вычисления выражения осуществляется в отдельной функции.
Все необходимые данные должны быть переданы в функции в качестве параметров.
Переменные описываются на внутреннем уровне.

Собственно условие:
Дана целочисленная матрица A[i,j], i,j=1,.,.,n. Пусть характеристика строки - среднее арифмитическое ее элементов.
Получить целочисленную матрицу B[i,j], i,j=1,.,.,n, помещая в нее строки из матрицы А в порядке роста их характеристик.

Автор: Anikmar 19.4.2007, 08:53
Цитата(Benya @  18.4.2007,  23:41 Найти цитируемый пост)
Собственно условие:
Дана целочисленная матрица A[i,j], i,j=1,.,.,n. Пусть характеристика строки - среднее арифмитическое ее элементов.
Получить целочисленную матрицу B[i,j], i,j=1,.,.,n, помещая в нее строки из матрицы А в порядке роста их характеристик. 


А вы просите:

Цитата(Benya @  18.4.2007,  23:41 Найти цитируемый пост)
Массив описывается динамически.
Элементы массива вещественного типа.


Так все таки вещественные или целые?

Автор: Benya 19.4.2007, 09:42
Да, ошибка вышла. Все-таки целые числа.

Автор: Anikmar 19.4.2007, 12:56
Что-то вроде этого?

Код

//---------------------------------------------------------------------------
#include <conio.h>
#include <iostream>
#pragma hdrstop

//---------------------------------------------------------------------------

int **MatrixA;
int **MatrixB;
int SizeMatrix;

void CreateMatrix(void)
{
    int i;
    MatrixA = new int *[SizeMatrix];
    MatrixB = new int *[SizeMatrix];
    for(i=0;i<SizeMatrix;i++)
    {
        MatrixA[i] = new int[SizeMatrix];
        MatrixB[i] = new int[SizeMatrix];
    }
}

void InputMatrix(int **Matr,int Size)
{
    int i,j;
    printf("Input source matrix(%dx%d)\n",Size,Size);
    for (i=0;i<Size;i++)
    {
        for (j=0;j<Size;j++)
        {
            printf("[%d][%d]=",i,j);
            scanf("%d",&Matr[i][j]);
        }
    }
}

void OutMatrix(int **Matr, int Size)
{
    int i,j;
    for (i=0;i<Size;i++)
    {
        for (j=0;j<Size;j++)
        {
            printf("[%d][%d]=%d\t",i,j,Matr[i][j]);
        }
        printf("\n");
    }
}

void CalcHaract(int **MatrA, int **MatrB, int Size)
{
    int *Har,i,j,Sum,*Tmp,hTmp,Index;
    Har = new int[Size];
    bool Flag;
    // Заполнение матрицы В
    for(i=0;i<Size;i++)
    {
        Sum = 0;
        for(j=0;j<Size;j++)
        {
            Sum += MatrA[i][j];
            MatrB[i][j] = MatrA[i][j];
        }
        Har[i] = Sum/Size;
    }
    // Сортировка Матрицы В
    Index = Size-1;
    do
    {
        Flag = false;
        for(i=0;i<Index;i++)
        {
            if (Har[i] > Har[i+1])
            {
                hTmp = Har[i];
                Har[i] = Har[i+1];
                Har[i+1] = hTmp;

                Tmp = MatrB[i];
                MatrB[i] = MatrB[i+1];
                MatrB[i+1] = Tmp;
                Flag = true;
            }
        }
        Index--;
    }while(Flag);

    printf("Result matrix:\n");
    for(i=0;i<Size;i++)
    {
        printf("%d: ",i);
        for(j=0;j<Size;j++) printf("%d\t",MatrB[i][j]);
        printf("\t haract = %d\n",Har[i]);
    }
    delete[] Har;
}

void DeleteMatrix(void)
{
    int i;
    for(i=0;i<SizeMatrix;i++)
    {
        delete[] MatrixA[i];
        delete[] MatrixB[i];
    }
    delete[]MatrixA;
    delete[]MatrixB;
}

int main(int argc, char* argv[])
{
    int i;
    printf("Input size of matrix:");
    scanf("%d",&SizeMatrix);
    printf("\n");
    CreateMatrix();
    InputMatrix(MatrixA,SizeMatrix);
    printf("Source Matrix:\n");
    OutMatrix(MatrixA,SizeMatrix);
    CalcHaract(MatrixA,MatrixB,SizeMatrix);
    DeleteMatrix();
    getch();
}
//---------------------------------------------------------------------------




Автор: Benya 19.4.2007, 18:36
Похоже, что да. Но код на С++. Буду очень признателен, если укажете, на то, что, кроме conio и pragma, надо заменить для  запуска на С. smile 

Автор: Dov 19.4.2007, 18:44
Цитата(Benya @  19.4.2007,  18:36 Найти цитируемый пост)
Но код на С++. Буду очень признателен, если укажете, на то, что, кроме conio и pragma, надо заменить для  запуска на С.

Прокладку между клавиатурой и спинкой стула.  smile 

p.s. шутка.  smile 

Автор: Anikmar 19.4.2007, 19:40
Уф. Я не обратил внимание, что нужно чистый Си
Там надо заменить new и delete на обычные функции памяти - malloc и free, больше вроде ничего - все стандартно.

Автор: Benya 19.4.2007, 21:15
Ругается что-то он сильно...Те места, где память я вроде ипсравил, хотя и не уверен, так как с динамической памятью почти не работал:
Код

void CreateMatrix(void)
{
    int i;
    MatrixA = calloc(SizeMatrix,sizeof(int));
    MatrixB = calloc(SizeMatrix,sizeof(int));
    for(i=0;i<SizeMatrix;i++)
    {
    MatrixA[i] = calloc(SizeMatrix,sizeof(int));
    MatrixB[i] = calloc(SizeMatrix,sizeof(int));
    }
}


А вот почему на bool Flag, true, false ругается - вообще без понятия: error: 'bool' : undefined smile 

Автор: Anikmar 19.4.2007, 21:21
А какой у вас компилятор?

Добавлено через 2 минуты и 50 секунд
Код

void CreateMatrix(void)
{
    int i;
    MatrixA = calloc(SizeMatrix,sizeof(int*)); // УКАЗАТЕЛИ!!
    MatrixB = calloc(SizeMatrix,sizeof(int*)); // УКАЗАТЕЛИ!!
    for(i=0;i<SizeMatrix;i++)
    {
    MatrixA[i] = calloc(SizeMatrix,sizeof(int));
    MatrixB[i] = calloc(SizeMatrix,sizeof(int));
    }
}



Сначала выделяем массив указателей, а потом каждый указатель - уже собственно столбец матрицы
(Правда ошибки скорее все не будет, так как указатель и int скорее всегоодного размера), но надо исправить

Добавлено через 13 минут и 42 секунды
Странно. Я создал чисто сишный проект в Билдере, он все схавал (включая new и delete) - видимо глюк компилятора
А вот почему на bool ругается? Может подключить ему <stdlib.h> ?

Автор: Benya 19.4.2007, 21:46
Про указатели понял, спасибо. А вот на bool, Flag, true, false продолжает ругаться. <stdlib.h> не помогает... Компилятор QuickC.

Автор: Anikmar 19.4.2007, 21:50
А в других программах не ругается? Что говрит хелп?

Добавлено через 56 секунд
В конце концов не парьтесь, замените bool на int, true на 1, false на 0

Автор: Benya 20.4.2007, 00:45
И замена не помогает, выдает ошибку о том, что пропущена точка с запятой перед int и потом не признает Flag во всем остальном коде.
Код

void CalcHaract(int **MatrA, int **MatrB, int Size)
{
    int *Har,i,j,Sum,*Tmp,hTmp,Index;
    Har = calloc(Size,sizeof(int));
    int Flag;

 smile 

Автор: Anikmar 20.4.2007, 11:11
Может быть QuckC не позволяет объявлять переменные в теле функции после операторов?
Попробуете переставить местами строчки и сделать так:
Код

void CalcHaract(int **MatrA, int **MatrB, int Size)
{
    int *Har,i,j,Sum,*Tmp,hTmp,Index;
    int Flag;

    Har = calloc(Size,sizeof(int));

Автор: Benya 21.4.2007, 14:20
Это помогло, теперь все правильно работает. Спасибо большое за помощь и подробный разбор. smile 

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