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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2009, 03:48   #41
aka_faith
Пользователь
 
Аватар для aka_faith
 
Регистрация: 15.05.2009
Сообщений: 74
По умолчанию

а куда столбцы деваются?
aka_faith вне форума Ответить с цитированием
Старый 11.06.2009, 03:54   #42
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от aka_faith
а куда столбцы деваются?
Сами освобождаются )
Функцией free мы освобождаем память под одномерный массив. А матрица - массив массивов (по большому счету). Вот мы и освобождаем сначала каждый из массивов (то есть каждую строку матрицы), а потом всю матрицу в целом.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

как-то так:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <alloc.h>

float **Form_Matrix(int M, int N)
{
int i,j;
float **M1;
M1= (float**)malloc(M*sizeof(float*));
for(i=0;i<M; i++)
 {
 M1[i] = (float*)malloc(N*sizeof(float));
 for(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<M;i++,printf("\n"))
      for(j=0;j<N;j++)
      printf(" %5.1f ",M1[i][j]);
}

int Sum_Matrix(int M, int N,float **M1, float K)
{
float summa;
int i,j,num_j=0;
 for(j=0;j<N;j++)
  {
   summa=0;
   for(i=0;i<M;i++)
     summa+=M1[i][j];
   if (summa>K) num_j=j;
   }
printf("%d\n", num_j);
return num_j;
}

float Max_Matrix(int M, int N,float **M1)
{
int i,j;
float max=-1000;
for(i=0; i<M; i++)
 for(j=0; j<N; j++)
   if (M1[i][j]>max) max=M1[i][j];
printf("max = %5.1f\n", max);
return max;
}

void Sum_Index(int M, int N, float ***M1, int K)
{
float summa, max1,max2;
int i,j,num;

max=Max_Matrix(M,N,*M1);
 for(i=0;i<M;i++)
   for(j=0;j<N;j++)
    {
     summa=i+j;
     if (summa!=K) (*M1)[i][j]=-((*M1)[i][j]*max);
    }
return;
}

int Kol(int M, int N,float **M1)
{
int i,j,g=0;
for (i=0; i<M; i++)
 for (j=0; j<N; j++)
   if (M1[i][j]>0) g++;
printf("%d",g);
return g;
}

float **Form_M3(int M, int N, float **M1)
{
int i,j;
float **M3;
M3= (float**)malloc(M*sizeof(float*));
 for(i=0;i<M;i++)
 {
  M3[i] = (float*)malloc(N*sizeof(float));
    for(j=0; j<N; j++)
     M3[i][j]=M1[i][j];
   }
 return M3;
}

int main ()
{
int i,j,num_j,g1,g2,
    m1=4,n1=4,m2=5,n2=5;
float **M1, **M2, **M3;
float k=50.65;

printf ("matriza M1\n");
M1 = Form_Matrix(m1,n1);
Print_Matrix(m1,n1,M1);

num_j=Sum_Matrix(m1,n1,M1,k);



Sum_Index(m1,n1,&M1,k);

printf("\n");
Print_Matrix(m1,n1,M1);
g1=Kol(m1,n1,M1);

printf ("\nmatriza M2\n");
M2 = Form_Matrix(m2,n2);
Print_Matrix(m2,n2,M2);
num_j=Sum_Matrix(m2,n2,M2,k);


Sum_Index(m2,n2,&M2,k);

Print_Matrix(m2,n2,M2);
g2=Kol(m2,n2,M1);

printf ("\nmatriza M3\n");
if (g1>g2) M3=Form_M3(m1,n1,M1);
else M3=Form_M3(m2,n2,M2);
Print_Matrix(m2,n2,M3);

osvobogd(M1,m1);
osvobogd(M2,m2);
osvobogd(M3,m3);

getch();
}
??
aka_faith вне форума Ответить с цитированием
Старый 11.06.2009, 13:03   #44
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

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

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

И снова переделанный вариант не работает...

Ошибка в написании новой ф-ции void Srav_g, которая вместо основной программы сравнивает кол-во положительных элементов матриц для формирования третьей:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <alloc.h>

float **Form_Matrix(int M, int N)
{
int i,j;
float **M1;
M1= (float**)malloc(M*sizeof(float*));
for(i=0;i<M; i++)
 {
 M1[i] = (float*)malloc(N*sizeof(float));
 for(j=0; j<N; j++)
  M1[i][j] =-20+40*(float)rand()/RAND_MAX;
 }
return M1;
}

void Print_Matrix(int M, int N, float **M1)
{
  int i,j;
    for(i=0;i<M;i++,printf("\n"))
      for(j=0;j<N;j++)
      printf(" %7.1f ",M1[i][j]);
}

int Sum_Matrix(int M, int N,float **M1, float K)
{
float summa;
int i,j,num_j=0;
 for(j=0;j<N;j++)
  {
   summa=0;
   for(i=0;i<M;i++)
     summa+=M1[i][j];
   if (summa>K) num_j=j;
   }
printf("%d\n", num_j);
return num_j;
}

float Max_Matrix(int M, int N,float **M1)
{
int i,j;
float max=-1000;
for(i=0; i<M; i++)
 for(j=0; j<N; j++)
   if (M1[i][j]>max) max=M1[i][j];
printf("max = %5.1f\n", max);
return max;
}

void Sum_Index(int M, int N, float ***M1, int K)
{
float summa, max;
int i,j,num;

max=Max_Matrix(M,N,*M1);
 for(i=0;i<M;i++)
   for(j=0;j<N;j++)
    {
     summa=i+j;
     if (summa!=K) (*M1)[i][j]=-((*M1)[i][j]*max);
    }
    Print_Matrix(M,N,*M1);
return;
}

int Kol(int M, int N,float **M1)
{
int i,j,g=0;
for (i=0; i<M; i++)
 for (j=0; j<N; j++)
   if (M1[i][j]>0) g++;
printf("%d",g);
return g;
}

float **Form_M3(int M, int N, float **M1)
{
int i,j;
float **M3;
M3= (float**)malloc(M*sizeof(float*));
 for(i=0;i<M;i++)
 {
  M3[i] = (float*)malloc(N*sizeof(float));
    for(j=0; j<N; j++)
     M3[i][j]=M1[i][j];
   }
 return M3;
}

void Srav_g(float *M1, int m1, int n1, float *M2, int m2, int n2, float *M3, int m3, int n3)
{
int i,j, g1, g2;
g1=Kol(m1,n1,M1);
g2=Kol(m2,n2,M2);
if (g1>g2) M3=Form_M3(m1,n1,M1);
else M3=Form_M3(m2,n2,M2);
Print_Matrix(m3,n3,M3)
}

void osvobogd(float**M1,int M)
{int i;
for(i=0;i<M;i++)
free(M1[i]);
free (M1);
}

int main ()
{
const k=2;
int i,j,num_j1, num_j2,
    m1=4,n1=4,m2=5,n2=5, m3, n3:
float **M1, **M2, **M3;

printf ("matriza M1\n");
M1 = Form_Matrix(m1,n1);
Print_Matrix(m1,n1,M1);
num_j1=Sum_Matrix(m1,n1,M1,k);
Sum_Index(m1,n1,&M1,k);


printf ("\nmatriza M2\n");
M2 = Form_Matrix(m2,n2);
Print_Matrix(m2,n2,M2);
num_j2=Sum_Matrix(m2,n2,M2,k);
Sum_Index(m2,n2,&M2,k);


printf ("\nmatriza M3\n");
Srav_g(M1,m1,n1,M2,m2,n2,M3,m3,n3);

osvobogd(M1,m1);
osvobogd(M2,m2);
osvobogd(M3,m2);

getch();
}
Как в ней определить m3 и n3??

И очень прошу, помогите написать проверку соответствия размеров массивов, участвующих в операции (если необходимо). В случае различия доопределять массивы до максимального размера нулями (либо усекать до минимального размера).
aka_faith вне форума Ответить с цитированием
Старый 12.06.2009, 03:43   #46
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Кое-что подправил и написал функцию уравнения размеров.
Только не знаю, где вам ее нужно вызывать. Поэтому вставил там, где вставил.

Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <alloc.h>

float **Form_Matrix(int &M, int &N)
{
int i,j;
float **M1;
M1= (float**)malloc(M*sizeof(float*));
for(i=0;i<M; i++)
 {
 M1[i] = (float*)malloc(N*sizeof(float));
 for(j=0; j<N; j++)
  M1[i][j] =-20+40*(float)rand()/RAND_MAX;
 }
return M1;
}


void Print_Matrix(int M, int N, float **M1)
{
  int i,j;
    for(i=0;i<M;i++,printf("\n"))
      for(j=0;j<N;j++)
      printf(" %7.1f ",M1[i][j]);
}

int Sum_Matrix(int M, int N,float **M1, float K)
{
float summa;
int i,j,num_j=0;
 for(j=0;j<N;j++)
  {
   summa=0;
   for(i=0;i<M;i++)
     summa+=M1[i][j];
   if (summa>K) num_j=j;
   }
printf("%d\n", num_j);
return num_j;
}

float Max_Matrix(int M, int N,float **M1)
{
int i,j;
float max=-1000;
for(i=0; i<M; i++)
 for(j=0; j<N; j++)
   if (M1[i][j]>max) max=M1[i][j];
printf("max = %5.1f\n", max);
return max;
}

void Sum_Index(int M, int N, float ***M1, int K)
{
float summa, max;
int i,j,num;

max=Max_Matrix(M,N,*M1);
 for(i=0;i<M;i++)
   for(j=0;j<N;j++)
    {
     summa=i+j;
     if (summa!=K) (*M1)[i][j]=-((*M1)[i][j]*max);
    }
    Print_Matrix(M,N,*M1);
return;
}

int Kol(int M, int N,float **M1)
{
int i,j,g=0;
for (i=0; i<M; i++)
 for (j=0; j<N; j++)
   if (M1[i][j]>0) g++;
printf("%d\n",g);
return g;
}

float **Form_M3(int M, int N, float **M1)
{
int i,j;
float **M3;
M3= (float**)malloc(M*sizeof(float*));
 for(i=0;i<M;i++)
 {
  M3[i] = (float*)malloc(N*sizeof(float));
    for(j=0; j<N; j++)
     M3[i][j]=M1[i][j];
   }
 return M3;
}

void Srav_g(float **M1, int m1, int n1, float **M2, int m2, int n2, float ***M3, int &m3, int &n3)
{
int i,j, g1, g2;
g1=Kol(m1,n1,M1);
g2=Kol(m2,n2,M2);
if (g1>g2) 
 {
  m3 = m1;
  n3 = n1;
 *M3=Form_M3(m3,n3,M1);
 }
else 
 {
  m3 = m2;
  n3 = n2;
  *M3=Form_M3(m2,n2,M2);
 }

Print_Matrix(m3,n3,*M3);
}

void osvobogd(float**M1,int M)
{
int i;
for(i=0;i<M;i++)
 free(M1[i]);
free (M1);
}


//---------------------
// функция для уравнения размеров матриц
// принимает матрицы по ссылке и их размеры
void synhronize(float ***M1, int &m1, int &n1, float ***M2, int &m2, int &n2)
{
float **P;
int i,j;
int MMAX, NMAX;  // максимумы

if(m1 > m2) MMAX = m1;
else MMAX = m2;
if(n1 > n2) NMAX = n1;
else NMAX = n2;

// выделяем память под первую матрицу
P = (float**)malloc(MMAX*sizeof(float*));
for(i=0; i<MMAX; i++)
 P[i] = (float*)malloc(NMAX*sizeof(float));
 
for(i=0; i<m1; i++)  // копируем то, что есть
 {
  for(j=0; j<n1; j++)   // по столбцам
   P[i][j] = (*M1)[i][j];
  for(j=n1; j<NMAX; j++)  // и забиваем нулями остальное
   P[i][j] = 0; 
 } 
for(i=m1; i<MMAX; i++)  // забиваем нулями строки
 for(j=0; j<NMAX; j++)
  P[i][j] = 0;

osvobogd(*M1,m1); // освобождаем память
*M1 = P;   // и переводим указатель на новую матрицу
m1 = MMAX;  // меняем размеры
n1 = NMAX;
//----------
// дальше то же самое для второй матрицы
P = (float**)malloc(MMAX*sizeof(float*));
for(i=0; i<MMAX; i++)
 P[i] = (float*)malloc(NMAX*sizeof(float));

for(i=0; i<m2; i++)
 {
  for(j=0; j<n2; j++)
   P[i][j] = (*M2)[i][j];
  for(j=n2; j<NMAX; j++)
   P[i][j] = 0;
 }
for(i=m2; i<MMAX; i++)
 for(j=0; j<NMAX; j++)
  P[i][j] = 0;

osvobogd(*M2,m2);
*M2 = P;
m2 = MMAX;
n2 = NMAX; 
}


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

int main ()
{
const int k=2;
int i,j,num_j1, num_j2,m1=4,n1=4,m2=5,n2=5, m3, n3;
float **M1, **M2, **M3;

printf ("matriza M1\n");
M1 = Form_Matrix(m1,n1);
Print_Matrix(m1,n1,M1);
num_j1=Sum_Matrix(m1,n1,M1,k);
Sum_Index(m1,n1,&M1,k);



printf ("\nmatriza M2\n");
M2 = Form_Matrix(m2,n2);
Print_Matrix(m2,n2,M2);
num_j2=Sum_Matrix(m2,n2,M2,k);
Sum_Index(m2,n2,&M2,k);

synhronize(&M1,m1,n1,&M2,m2,n2);  // не знаю, где точно вам это нужно вызывать
// поэтому пихнул сюда

printf ("\nmatriza M3\n");

Srav_g(M1,m1,n1,M2,m2,n2,&M3,m3,n3);





osvobogd(M1,m1);
osvobogd(M2,m2);
osvobogd(M3,m3);

getch();
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

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

о_О о_О

у меня все закрывается при компиляции, быстренько так все исчезает

Как такое может быть??
aka_faith вне форума Ответить с цитированием
Старый 12.06.2009, 12:35   #48
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от aka_faith
у меня все закрывается при компиляции, быстренько так все исчезает
Как такое может быть??
Не могу сказать. У меня везде компилится и работает (MinGW и BC 3.1)
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
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