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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2009, 22:20   #21
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Скажу вам честно, вот это (то, что выше), мне тоже непонятно. Бред какой-то.

Сами функции (именно по логике работы):
Kol, Print_Matrix, Max_Matrix, вроде, верны.
Про Sum_Matrix я уже сказал.

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

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

хм, программка заработала!! и даже выдала вот такой результат:
Цитата:
0.0 0.0 0.0
0.0 0.0 3.0
0.0 3.0 2.0
5.0 1.0 7.0
9.0 2.0 4.0
1.0 6.0 5.0
0.0 1.0 8.0
0.0-1000.00.00.0matriza M3
0.0 1172341794045790620000000000.0 0.0
0.0 60388475047881685700000000000.0 18320845045406483900000000.0
0.0 0.0 0.0
с таким вот листингом:
Код:
#include <stdio.h>
#include <alloc.h>
#include <conio.h>
#include<stdlib.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(" %3.1f ",M1[i][j]);
}

//находим максимальный элемент матрицы
float Max_Matrix(float **M1, int n)
{
int i,j;
float max=-1000;
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=0;
   for (i=0; i<M; 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, int n)
{
 float summa;
 int i,j,num_j;
  for(j=0;j<N;j++)
   { summa=0;
    for(i=0;i<M;i++)
      summa+=M1[i][j];
     }if (summa>n) num_j=j;

printf("%3.1f", num_j);
 return num_j;
}

//находим M3=M1<M2-M3=M1, если матрица М1 содержит больше положительных элементов, чем М2 и наоборот
float **Form_M3(int M, int N, float **M1, float **M2)
{
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]-M2[i][j];
 }
return M3;
}

void main ()
{float **M1, **M2, **M3;
int i,j,n=3;
float num_j,max;
M1 = Form_Matrix(n,n);
Print_Matrix(n,n,M1);
M2 = Form_Matrix(n,n);
Print_Matrix(n,n,M2);
num_j=Sum_Matrix(n,n,M1,n);
M1[i][j]=M1[i][j]*(-(max=Max_Matrix(M1,n)));
if (Kol(n,n,M1)>Kol(n,n,M2)) M3=Form_M3(n,n,M1,M2);
  printf("matriza M3\n");
  Print_Matrix(n,n,M3);
  getch();}
но это явно не то, что требовалось получить...

Что еще необходимо исправить?
aka_faith вне форума Ответить с цитированием
Старый 28.05.2009, 11:36   #23
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Измените тип функции Kol на int (вы же количество чисел возвращаете. Как оно может быть вещественным?)

Аналогично с Sum_Matrix. Опять не смотрите на типы. Вы же номер столбца возвращаете. Должно быть что-то вроде этого:
Код:
int Sum_Matrix(int M, int N,float **M1, int n)
{
 float summa;
 int i,j,num_j;
  for(j=0;j<N;j++)
   {
    summa=0;
    for(i=0;i<M;i++)
      summa+=M1[i][j];
   if (summa>n) num_j=j;
   }
printf("%d", num_j);
return num_j;
}
Смысл вот этой строчки:
Код:
M1[i][j]=M1[i][j]*(-(max=Max_Matrix(M1,n)));
для меня остается загадкой.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

ужасное задание!! я чуть-чуть переделала код, но теперь он не компилируется с ошибками:
Цитата:
║ Compiling ..\..\LABC\V6\V6.CPP:
║•Error ..\..\LABC\V6\V6.CPP 101: Illegal use of floating point в (*)
║ Error ..\..\LABC\V6\V6.CPP 110: Illegal use of floating point в (**)
║ Error ..\..\LABC\V6\V6.CPP 117: Statement missing в (***);
Код:
#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(" %3.1f ",M1[i][j]);
}

int Sum_Matrix(int M, int N,float **M1, int K)
{
float summa;
int i,j,num_j;
 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("%3.1f", 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]>M1[i][j]) max=M1[i][j];
printf("%3.1f", max);
return max;
}

float Sum_Index(int M, int N,float **M1, int K, float max)
{
float summa;
int i,j,num;
 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 M1[i][j];
}

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("%3.1f",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 main ()
{int i,j,num_j,g1,g2, M=3,N=3,K=5;
float **M1, **M2, **M3;
float max1,max2;

printf ("matriza M1\n");
M1 = Form_Matrix(M,N);
Print_Matrix(M,N,M1);
num_j=Sum_Matrix(M,N,M1,K);
max1=Max_Matrix(M,N,M1);
M1=Sum_Index(M,N,M1,K,max1);//(*)
Print_Matrix(M,N,M1);
g1=Kol(M,N,M1);

printf ("matriza M2\n");
M2 = Form_Matrix(M,N);
Print_Matrix(M,N,M2);
num_j=Sum_Matrix(M,N,M2,K);
max2=Max_Matrix(M,N,M2);
M2=Sum_Index(M,N,M2,K,max2);//(**)
Print_Matrix(M,N,M2);
g2=Kol(M,N,M1);

printf ("matriza M3\n");
if (g1>g2) M3=Form_M3(M,N,M1);
else M3=Form_M3(M,N,M2)
Print_Matrix(M,N,M3);//(***)

getch();}
Как исправить?
Очень хочется эту прогу домучать...

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

Sazary, не могли бы Вы подсказать какой-нибудь ресург, где можно было почитать про двойной указатель?
aka_faith вне форума Ответить с цитированием
Старый 29.05.2009, 02:04   #26
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Радует, что количество ошибок с каждым разом меньше.

Итак:
Код:
M1=Sum_Index(M,N,M1,K,max1);
Уж извините, бред.
M1 - указатель на указатель на float. Или, просто двумерный массив.
И вы пытаетесь присвоить ему обычное число.
Код:
M2=Sum_Index(M,N,M2,K,max2);
Собственно, то же самое.

А здесь:
Код:
Print_Matrix(M,N,M3);
забыли точку с запятой поставить.

Что за функция Sum_Index? Что она должна делать?
Почему она у вас возвращает последний элемент матрицы?
Код:
return M1[i][j];
Цитата:
не могли бы Вы подсказать какой-нибудь ресург, где можно было почитать про двойной указатель?
Врядли могу посоветовать что-то конкретное. Да и нет ничего особенного в указателе на указатель.
В вашем случае это просто двумерный массив.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

В функции Sum_Index все элементы матрицы, сумма индексов которых не равна переданному К, умножаются на отрицательное значение максимального элемента матрицы, который нашли в функции Max_Matrix.
В Sum_Index может же передаваться найденный максимальный элемент?
aka_faith вне форума Ответить с цитированием
Старый 29.05.2009, 02:30   #28
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Значит эта функция нужна для изменения значений матрицы? Тогда ей не нужно ничего возвращать. А посылать ей нужно матрицу по адресу:
Код:
void Sum_Index(int M, int N, float ***M1, int K, float max)
{
float summa;
int i,j,num;
 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;
}
И вызов будет соответственно таким:
Код:
Sum_Index(M,N,&M1,K,max1);
И еще в функции Sum_Matrix измените вывод вот так:
Код:
printf("%d\n", num_j);
Вы же выводите целое число, а спецификатор ставите %f
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

но компилятор после измены функции пишет, что
Цитата:
Error ..\..\LABC\V6\V6.CPP 62: Invalid indirection
Error ..\..\LABC\V6\V6.CPP 62: Illegal use of floating point
на знаке равно и умножении
aka_faith вне форума Ответить с цитированием
Старый 29.05.2009, 02:44   #30
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от aka_faith
на знаке равно и умножении
А вы вызов изменили как я сказал?
Код:
Sum_Index(M,N,&M1,K,max1);
Заметьте: значение функции ничему не присваивается.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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