Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] Динамическая память, функции, вещетвенная матрица 
V
    Опции темы
Benya
Дата 18.4.2007, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 18.4.2007

Репутация: нет
Всего: нет



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

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

Собственно условие:
Дана целочисленная матрица A[i,j], i,j=1,.,.,n. Пусть характеристика строки - среднее арифмитическое ее элементов.
Получить целочисленную матрицу B[i,j], i,j=1,.,.,n, помещая в нее строки из матрицы А в порядке роста их характеристик.
PM MAIL   Вверх
Anikmar
Дата 19.4.2007, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(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 Найти цитируемый пост)
Массив описывается динамически.
Элементы массива вещественного типа.


Так все таки вещественные или целые?
PM MAIL ICQ   Вверх
Benya
Дата 19.4.2007, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 18.4.2007

Репутация: нет
Всего: нет



Да, ошибка вышла. Все-таки целые числа.
PM MAIL   Вверх
Anikmar
Дата 19.4.2007, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Что-то вроде этого?

Код

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




PM MAIL ICQ   Вверх
Benya
Дата 19.4.2007, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 18.4.2007

Репутация: нет
Всего: нет



Похоже, что да. Но код на С++. Буду очень признателен, если укажете, на то, что, кроме conio и pragma, надо заменить для  запуска на С. smile 
PM MAIL   Вверх
Dov
Дата 19.4.2007, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



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

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

p.s. шутка.  smile 



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Anikmar
Дата 19.4.2007, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Уф. Я не обратил внимание, что нужно чистый Си
Там надо заменить new и delete на обычные функции памяти - malloc и free, больше вроде ничего - все стандартно.
PM MAIL ICQ   Вверх
Benya
Дата 19.4.2007, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 18.4.2007

Репутация: нет
Всего: нет



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

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 
PM MAIL   Вверх
Anikmar
Дата 19.4.2007, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



А какой у вас компилятор?

Добавлено через 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> ?
PM MAIL ICQ   Вверх
Benya
Дата 19.4.2007, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 18.4.2007

Репутация: нет
Всего: нет



Про указатели понял, спасибо. А вот на bool, Flag, true, false продолжает ругаться. <stdlib.h> не помогает... Компилятор QuickC.
PM MAIL   Вверх
Anikmar
Дата 19.4.2007, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



А в других программах не ругается? Что говрит хелп?

Добавлено через 56 секунд
В конце концов не парьтесь, замените bool на int, true на 1, false на 0
PM MAIL ICQ   Вверх
Benya
Дата 20.4.2007, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 18.4.2007

Репутация: нет
Всего: нет



И замена не помогает, выдает ошибку о том, что пропущена точка с запятой перед 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 
PM MAIL   Вверх
Anikmar
Дата 20.4.2007, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



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

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

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

PM MAIL ICQ   Вверх
Benya
Дата 21.4.2007, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 18.4.2007

Репутация: нет
Всего: нет



Это помогло, теперь все правильно работает. Спасибо большое за помощь и подробный разбор. smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1281 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.