Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2009, 19:18   #1
aka_faith
Пользователь
 
Аватар для aka_faith
 
Регистрация: 15.05.2009
Сообщений: 74
Вопрос динамическая память

Здравствуйте, дамы и госпада! Не будуте ли Вы так любезны подсказать девушке, каторая стремится к знаниям, как будет выглядеть функция, в которой определяется размер матрицы. На основании заданных размеров выделяется место в «куче» и вызывается функция формирования элементов матрицы с помощью генератора случайных чисел. Указатель на выделенный участок памяти возвращается через параметр функции??
Очень жду и надеюсь на вашу помощь и поддержку))
aka_faith вне форума Ответить с цитированием
Старый 24.05.2009, 19:32   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Так что вам нужно? Выделить память? Узнать размер? Конкретизируйте.
При создании динамического массива его размер нужно запоминать.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 24.05.2009, 21:53   #3
aka_faith
Пользователь
 
Аватар для aka_faith
 
Регистрация: 15.05.2009
Сообщений: 74
По умолчанию

Вот мое задание:
A<B<(C & A[B[2]])
M[K]-возвращает номер столбца матрицы с суммой элементов, большей К.
M&K-все элементы, сумма индексов которых не равна К, умножаются на отрицательное значение максимального элемента матрицы М.
M3=M1<M2-M3=M1, если матрица М1 содержит больше положительных элементов, чем М2 и наоборот.
*М-матрица;
А,В,С-массивы;
К-числовое значение

А вот требования:
1.Разработать:
а)функцию, в которой определяется размер матрицы. На основании заданных размеров выделяется место в «куче» и вызывается функция формирования элементов матрицы с помощью генератора случайных чисел. Указатель на выделенный участок памяти возвращается через параметр функции;
б) функции формирования элементов матрицы и вывода матрицы на печать;
в) функции обработки.
2. Стандартные алгоритмы (определение максимума, суммы, сортировка ит.п.) оформить отдельными функциями и вызвать при необходимости.
3. Функции должны содержать проверку соответствия размеров массивов, участвующих в операции (если необходимо). В случае различия доопределять массивы до максимального размера нулями (либо усекать до минимального размера).
4. В функции main описывается необходимое количество указателей на массивы и вычисляется выражение. На экран выводятся все промежуточные результаты (т.е. результаты работы каждой функции).

Вот то, что я смогла написать:
Код:
#include <stdio.h>
#include <alloc.h>
#include <conio.h>
#include<stdlib.h>

void Form_Matrix(float *x,int n)
{
  int i,j,k;
  for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    x[i*n+j]=randon(49)+2;
}
void Print_Matrix(float *x,int n)
{
  int i,j;
    for(i=0;i<n;i++,printf("\n"))
      for(j=0;j<n;j++)
      printf(" %3.1f ",x[i*n+j]);
}
float Max(float *f,int n)
{
  int i,j;
  int max=0;
  for (i=0; i<n; i++)
      for (j=0; j<n; j++)
      {
	if (f[i*n+j]>f[i*n+max]) max=j;
        }
printf("%3.1f", max);
      return max;
 }

float Kol(float *f,int n)
{
  int i,j,g;
   for (i=0; i<n; i++)
      for (j=0; j<n; j++)
      {
	if (f[i*n+j]>0) g++;
        }
printf("%3.1f",g);
      return g;
 }
float Sum_Matrix(float *X, int n)
{
 float summa;
 int i,j,num_j; 
  for(j=0;j<n;j++)
   { summa=0;
    for(i=0;i<n;i++)
      summa+=X[i][j];
     }if (summa>n) num_j=j;
  }
printf("%3.1f", num_j);
 return num_j;
}
void Min_Max(float *a,float*b,int n, float x[])
{
  int i,j;
  for (i=0; i<n; i++)
     for (j=0; j<n; j++)
        x[i]=a[i*n+j]-b[i*n+j];
}

void main ()
{  float M1[k][k], M2[k][k], M3[k][k], 
  int i,j;
  printf("matriza M1\n");
  Form_Matrix(&M1[0][0],k);
  Print_Matrix(&M1[0][0],k);
  printf("matriza M2\n");
  Form_Matrix(&M2[0][0],k);
  Print_Matrix(&M2[0][0],k);
  for (i=0; i<n; i++)
      for (j=0; j<n; j++)
      {
        if (num_j=Sum_Matrix(X,n1)<>k) M1[i][j]=M1[i][j]*(-(max=Max));
      }
  if (Kol(M1,k)>Kol(M2,k)) Min_Max(&M1,&M2,k,M3);
  printf("matriza M3\n");
  Print_Matrix(&M3[0][0],k);
  getch();}
Но вот как выполнить требования я, к сожалению, не знаю. Посмотрите, пожалуйста, и напишите как исправить ошибки.
aka_faith вне форума Ответить с цитированием
Старый 24.05.2009, 22:06   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
а)функцию, в которой определяется размер матрицы. На основании заданных размеров выделяется место в «куче» и вызывается функция формирования элементов матрицы с помощью генератора случайных чисел. Указатель на выделенный участок памяти возвращается через параметр функции;
Раз так, то матрицы объявлять нужно не статическими, как у вас:
Код:
 float M1[k][k], M2[k][k], M3[k][k],
а так:
Код:
float **M1, **M2, **M3;
Далее читаете размеры (например, M на N).
Выделяете память:
Код:
M1 = (float*)malloc(M*sizeof(float*));
for(i=0;i<M; i++)
 M1[i] = (float)malloc(N*sizeof(float));
Потом заполняете матрицу. Обращаться можно по двум индескам (то есть M1[i][j]).
Цитата:
3. Функции должны содержать проверку соответствия размеров массивов, участвующих в операции (если необходимо). В случае различия доопределять массивы до максимального размера нулями (либо усекать до минимального размера).
Вот эту часть не очень понял. Размер динамического массива нельзя определить, т.к. есть только указатель на область памяти. И размер массива нужно все время хранить.

Цитата:
2. Стандартные алгоритмы (определение максимума, суммы, сортировка ит.п.) оформить отдельными функциями и вызвать при необходимости.
С этим, я думаю, проблем не возникнет?
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 24.05.2009, 22:44   #5
aka_faith
Пользователь
 
Аватар для aka_faith
 
Регистрация: 15.05.2009
Сообщений: 74
По умолчанию

А как тогда будут выглядеть функции формирования и печати? Разве так?
Код:
void Form_Matrix(float **M1)
{
  M1= (float*)malloc(M*sizeof(float*));
for(i=0;i<M; i++)
 M1[i] = (float)malloc(N*sizeof(float));
 M1[i*N+j]=randon(49)+2;
}
void Print_Matrix(float **M1)
{
  int i,j;
    for(i=0;i<n;i++,printf("\n"))
      for(j=0;j<n;j++)
      printf(" %3.1f ",x[i*n+j]);
}
aka_faith вне форума Ответить с цитированием
Старый 24.05.2009, 22:52   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от aka_faith
А как тогда будут выглядеть функции формирования и печати? Разве так?
Нет. Я привел общее описание. Если вы выделяете память в функции, то нужно сделать так:
Код:
float **Form_Matrix(int M, int N)
{
float **M1;
M1= (float**)malloc(M*sizeof(float*));
for(int i=0;i<M; i++)
 M1[i] = (float*)malloc(N*sizeof(float));
 for(int j=0; j<N; j++)
  M1[i][j] = random(10);
return M1; // возвращаем указатель на наш массив
}
И в главной функции вызываем вот так:
Код:
float **M1;
M1 = Form_Matrix(M,N);
---------------
Во всех функциях принимайте матрицу как float**. И обращайтесь по двум индексам.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 25.05.2009 в 00:56.
Sazary вне форума Ответить с цитированием
Старый 25.05.2009, 00:43   #7
aka_faith
Пользователь
 
Аватар для aka_faith
 
Регистрация: 15.05.2009
Сообщений: 74
По умолчанию

а остальные функции так будут выглядеть:
Код:
void Print_Matrix(int M, int N)
{
  float **M1;
  int i,j;  
    for(i=0;i<n;i++,printf("\n"))
      for(j=0;j<n;j++)
      printf(" %3.1f ",M1[i][j]);
}

float **Max(int M, int N)
{
  int i,j;
  float **M1,**max=0;
  max== (float*)malloc(M*sizeof(float*));
  for (i=0; i<n; i++)
      for (j=0; j<n; j++)
      {
	if (M1[i][j]>M1[i][j]) max=M1[i][j];
        }
printf("%3.1f", max);
      return max;
 }

float Kol(int M, int N)
{
  float **M1;
  int i,j,**g;
   for (i=0; i<n; i++)
      for (j=0; j<n; j++)
      {
	if (M1[i][j]>0) g++;
        }
printf("%3.1f",g);
      return g;
 }
float Sum_Matrix(int M, int N)
{
 float summa;
 int i,j,num_j; 
  for(j=0;j<n;j++)
   { summa=0;
    for(i=0;i<n;i++)
      summa+=X[i][j];
     }if (summa>n) num_j=j;
  }
printf("%3.1f", num_j);
 return num_j;
}
void Min_Max(float *a,float*b,int n, float x[])
{
  int i,j;
  for (i=0; i<n; i++)
     for (j=0; j<n; j++)
        x[i]=a[i*n+j]-b[i*n+j];
}
??
aka_faith вне форума Ответить с цитированием
Старый 25.05.2009, 00:56   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Код:
void Print_Matrix(int M, int N)
{
  float **M1;
  int i,j;  
    for(i=0;i<n;i++,printf("\n"))
      for(j=0;j<n;j++)
      printf(" %3.1f ",M1[i][j]);
}
Где матрица? Вы должны принимать ее в аргументах.
Код:
float **Max(int M, int N)
{
  int i,j;
  float **M1,**max=0;
  max== (float*)malloc(M*sizeof(float*));
  for (i=0; i<n; i++)
      for (j=0; j<n; j++)
      {
	if (M1[i][j]>M1[i][j]) max=M1[i][j];
        }
printf("%3.1f", max);
      return max;
 }
Что это???
Код:
float Kol(int M, int N)
{
  float **M1;
  int i,j,**g;
   for (i=0; i<n; i++)
      for (j=0; j<n; j++)
      {
	if (M1[i][j]>0) g++;
        }
printf("%3.1f",g);
      return g;
 }
Опять же. Матрицу принимайте в аргументах.
Код:
float Sum_Matrix(int M, int N)
{
 float summa;
 int i,j,num_j; 
  for(j=0;j<n;j++)
   { summa=0;
    for(i=0;i<n;i++)
      summa+=X[i][j];
     }if (summa>n) num_j=j;
  }
И снова матрица нигде не принимается.
Код:
void Min_Max(float *a,float*b,int n, float x[])
{
  int i,j;
  for (i=0; i<n; i++)
     for (j=0; j<n; j++)
        x[i]=a[i*n+j]-b[i*n+j];
}
Без комментариев. Скопировали с вашего предыдущего варианта.
Функция должна принимать float**.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 25.05.2009, 01:48   #9
aka_faith
Пользователь
 
Аватар для aka_faith
 
Регистрация: 15.05.2009
Сообщений: 74
По умолчанию

Код:
//формируем матрицу
float **Form_Matrix(int M, int N)
{
float **M1;
M1= (float**)malloc(M*sizeof(float*));
for(int i=0;i<M; i++)
 M1[i] = (float*)malloc(N*sizeof(float));
 for(int j=0; j<N; j++)
  M1[i][j] = random(10);
return M1; // возвращаем указатель на наш массив
}

//печатаем матрицу
void Print_Matrix(int M, int N, float **M1)
{
  int i,j;  
    for(i=0;i<n;i++,printf("\n"))
      for(j=0;j<n;j++)
      printf(" %3.1f ",M1[i][j]);
}

//находим максимальный элемент матрицы
float **Max(int M, int N,float **M1)
{
  int i,j;
  max== (float*)malloc(M*sizeof(float*));
  for (i=0; i<n; i++)
      for (j=0; j<n; j++)
      {
	if (M1[i][j]>M1[i][j]) max=M1[i][j];
        }
printf("%3.1f", max);
      return max;
 }

//находим кол-во положительных элементов в матрице
float Kol(int M, int N,float **M1)
{
   int i,j,**g;
   for (i=0; i<n; i++)
      for (j=0; j<n; j++)
      {
	if (M1[i][j]>0) g++;
        }
printf("%3.1f",g);
      return g;
 }

//находим номер столбца матрицы с суммой элементов, большей К
float Sum_Matrix(int M, int N,float **M1)
{
 float summa;
 int i,j,num_j; 
  for(j=0;j<n;j++)
   { summa=0;
    for(i=0;i<n;i++)
      summa+=X[i][j];
     }if (summa>n) num_j=j;
  }
printf("%3.1f", num_j);
 return num_j;
}

//находим M3=M1<M2-M3=M1, если матрица М1 содержит больше положительных элементов, чем М2 и наоборот
void Min_Max(float **M1,float**M2,float **M3)
{
  int i,j;
  for (i=0; i<n; i++)
     for (j=0; j<n; j++)
        M3[i]=M1[i][j]-M2[i][j];
}
что теперь не верно??
aka_faith вне форума Ответить с цитированием
Старый 25.05.2009, 02:07   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Код:
//формируем матрицу
float **Form_Matrix(int M, int N)
{
float **M1;
M1= (float**)malloc(M*sizeof(float*));
for(int i=0;i<M; i++)
 {
 M1[i] = (float*)malloc(N*sizeof(float));
 for(int j=0; j<N; j++)
  M1[i][j] = random(10);
 }
return M1; // возвращаем указатель на наш массив
}
Код:
//печатаем матрицу
void Print_Matrix(int M, int N, float **M1)
{
  int i,j;  
    for(i=0;i<n;i++,printf("\n"))
      for(j=0;j<n;j++)
      printf(" %3.1f ",M1[i][j]);
}
Регистр исправьте. У ват нет переменной "n".
Код:
//находим максимальный элемент матрицы
float **Max(int M, int N,float **M1)
{
  int i,j;
  max== (float*)malloc(M*sizeof(float*));
  for (i=0; i<n; i++)
      for (j=0; j<n; j++)
      {
	if (M1[i][j]>M1[i][j]) max=M1[i][j];
        }
printf("%3.1f", max);
      return max;
 }
Во-первых, зачем выделяете память? У вас max - обычная переменная. Не массив.
Во-вторых, синтаксические ошибки.
Код:
//находим кол-во положительных элементов в матрице
float Kol(int M, int N,float **M1)
{
   int i,j,**g;
   for (i=0; i<n; i++)
      for (j=0; j<n; j++)
      {
	if (M1[i][j]>0) g++;
        }
printf("%3.1f",g);
      return g;
 }
Во-первых, исправьте регистр.
Во-вторых, что за **g? Это обычная переменная должна быть.
Код:
//находим номер столбца матрицы с суммой элементов, большей К
float Sum_Matrix(int M, int N,float **M1)
{
 float summa;
 int i,j,num_j; 
  for(j=0;j<n;j++)
   { summa=0;
    for(i=0;i<n;i++)
      summa+=X[i][j];
     }if (summa>n) num_j=j;
  }
printf("%3.1f", num_j);
 return num_j;
}
Снова регистр.
Никакого X в функции не объявлено.
Функция возвращает int, а объявлено, что возвращает float.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическая память. Пaвeл Помощь студентам 16 31.05.2009 21:16
Динамическая память liver1981 Общие вопросы C/C++ 5 22.04.2009 09:16
Динамическая память.Списки. Гвендолин Помощь студентам 6 31.03.2009 11:12
Динамическая память MadDog__ Помощь студентам 2 22.11.2007 00:05