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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2009, 21:33   #1
aka_faith
Пользователь
 
Аватар для aka_faith
 
Регистрация: 15.05.2009
Сообщений: 74
Восклицание разработка функции для работы с матрицей, помогите исправить ошибки

Многоуважаемые программисти или программеры-любители, помогите, плиз, подкоректировать прогу, а то я уже измучалась сама и измучала весь компилятор...

Задание :
Получить элементы квадратной матрицы А=||А(i,j)||, где A(i,j)=F(i,j)=2^i/((i-5/2)*(i+1)^2)*(2-|j-5|)^2 .из полученной матрицы получить компоненты массива Х, если в качестве X(i) принять max(a(i,j)-min(a(i,j)) каждой строки матрицы А. Вычислить значение U=f(X), где f(X)=min{|x(i+1)|-|x(i)|} ,1<=i<=n-1. Предусмотреть вывод на печать строк матрицы А, промежуточных матриц или массивов, результирующего массива Х, а также значение U.

Требования к выполнению работы:
1. Разработать функции формирования матриц
2. Разработать функции печати и обработки массивов
3. Для печати массивов функциям использовать указатели





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

void Form_Matrix(float *x,float k1,float k2,float k3,int *n)
{
  int i,j,k;
  scanf("%d",n);
  for(i=0;i<*n;i++)
    for(j=0;j<*n;j++)
    *(x+i**n+j)=fabs(pow(2,i)/((i-k1)*(i+k2)*(i+k2)))*((2-fabs(j-k3))*(2-fabs(j-k3)));
}

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]);
}

void Min_Max(float *f,int n, float *x)
{
  int i,j;
  float min=-1000,max=1000;
    for (i=1; i<n; i++)
      for (j=1; j<n; j++)
      {
       max = f[i][1] ;
       min = f[i][1] ;
       for (j=1; j<n; j++)
       {
	if (f[i][j]>max) max=f[i][j];
	if (f[i][j]<min) min=f[i][j];
       }
       printf ("min i max strok %d", i);
       printf ("max=%5.1f", max);
       printf ("min=%5.1f", min);
       x[i]=max-min;
      }
    
float U(float *x, int n)
for(i=1;i<n;i++)
      printf ("x[%d]=%5.1f\n", i, x[i]);
      if (n<3) printf ("U is not found: n<3");
      else
      {
      min=fabs(x[2])-fabs(x[1]);
      for (i=2; i<n; i++);
      {
       float xx=fabs(x[i+1])-fabs(x[i]);
	if(xx<fabs(min) min=xx;
	return min;
       } }



void main ()
{
  float F[36],min,x[6];
  int n1;
  clrscr();


  printf("matriza A\n");
  printf("razmer=");
  Form_Matrix(F,2.5,1,5,&n1);
  Print_Matrix(F,n1);
  printf("matriza Max-Min");
  Min_Max(F,6,x);
  min=U(F,n1,x);
  printf("\n %5.1f\n", min);
  


  getch();
}
Функции, которые вводят и печатают матрицу работают, а вот с обработкой беда..

Последний раз редактировалось aka_faith; 16.05.2009 в 22:33.
aka_faith вне форума Ответить с цитированием
Старый 16.05.2009, 21:47   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

У вас неверное обращение к элементам в функции мин_макс.
Код:
if (f[i][j]>max) max=f[i][j];
Массив-то вы принимаете одномерный:
Код:
float *f
Функция U вообще внутри Min_Max. Вынесите ее оттуда.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

а как это сделать? ведь надо найти max(a(i,j)-min(a(i,j)) каждой строки матрицы А, а для распечатки необходим одномерный массив, который распечатывает по кол-ву столбцов в строчке
aka_faith вне форума Ответить с цитированием
Старый 16.05.2009, 22:08   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
а как это сделать?
Ну если у вас в матрице M строк и N столбцов, то обращение будет примерно такое:
Код:
for(i=0; i<M; i++)
 for(j=0; j<N; j++)
  F[i*M + j] - элемент F[i][j]
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

матрица квадратная, размером nхn, n вводится с клавиатуры, т.е. кол-во столбцов и строк равное и функция float U находится как разница элементов, полученных с разницы макс и мин эл строк, полученных в void Min_Max. Т.е. необходимо распечатать мин и макс каждой строки, разницу между ними = вектору х и потом получить значение U=min{|x(i+1)|-|x(i)|}. Как это правильно написать в коде??
aka_faith вне форума Ответить с цитированием
Старый 16.05.2009, 22:46   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
функция float U находится как разница элементов, полученных с разницы макс и мин эл строк, полученных в void Min_Max. Т.е. необходимо распечатать мин и макс каждой строки, разницу между ними = вектору х и потом получить значение U=min{|x(i+1)|-|x(i)|}. Как это правильно написать в коде??
Вот честно, ничего не понял..
Нужно найти мин и макс в строке?
Код:
for(i=0; i<N; ++i)
{
 min = max = 0;
 for(j=0; j<N; ++j) 
  {
  if(F[i*N + j]>F[i*N + max]) max = j;
  if(F[i*N + j]<F[i*N + min]) min = j;
  }
 // теперь в min и max - индексы минимума и максимума строки i
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

в функции void Min_Max нужно найти минимальный и максимальный элемент в строке матрицы -> распечатать их; получить массив из разницы максимального и минимального элемента строки -> распечатать массив и, наверное, следует передать его в функцию float U, чтобы в ней найти разницу между последующим и предыдущим элементами массива...

а как это все можно сделать, получив только
Цитата:
for(i=0; i<N; ++i)
{
min = max = 0;
for(j=0; j<N; ++j)
{
if(F[i*N + j]>F[i*N + max]) max = j;
if(F[i*N + j]<F[i*N + min]) min = j;
}
// теперь в min и max - индексы минимума и максимума строки i
}
aka_faith вне форума Ответить с цитированием
Старый 17.05.2009, 02:03   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
получить массив из разницы максимального и минимального элемента строки ->
Что значит получить массив из разницы? В смысле в каждой строке ищем разность мин и макс и это значение забиваем в массив?
Цитата:
а как это все можно сделать, получив только
Ну индексы мин и макс для текущей строки у вас есть. Находите разность и кладите ее в массив (в элемент с индексом i).
Что-то вроде:
Код:
x[i]=F[i*N + max] - F[i*N + min];
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

Код:
void Min_Max(float *f,int n, float *x)
{
  int i,j;  
  for (i=1; i<n; i++)
      float min=-1000,max=1000;
      for (j=1; j<n; j++)
      {
       	if (f[i*n+j]>f[i*n+max]) max=j;
	if (f[i*n+j]<f[i*n+min]) min=j;
       }
       printf ("min i max strok %d", i);
       printf ("max=%5.1f",f[i*n + max] );
       printf ("min=%5.1f",f[i*n + min]);
       x[i]=f[i*n + max] - f[i*n + min];
}
так будет Min_Max выглядеть? а лучше распечатывать внутри функции или в основной программе? а что делать с функцией U?
aka_faith вне форума Ответить с цитированием
Старый 17.05.2009, 02:30   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
так будет Min_Max выглядеть?
Ну как-то так.
Цитата:
а лучше распечатывать внутри функции или в основной программе?
Печатайте в функции.
Цитата:
а что делать с функцией U?
Ну массив x у вас заполнен. Теперь передавайте его (в главной функции) в функцию U. И там делайте то, что нужно.
Я не очень понял, как получается значение в U. Оно одно, или их несколько?
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

Последний раз редактировалось Sazary; 17.05.2009 в 02:35.
Sazary вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите исправить ошибки Satorin Общие вопросы Delphi 4 25.12.2008 21:35
помогите исправить ошибки kermit Помощь студентам 1 21.06.2008 10:44
Помогите исправить незначительные ошибки HAMMAN Помощь студентам 1 10.06.2008 19:07
помогите исправить ошибки в программе... VDK23 Помощь студентам 1 17.04.2008 13:05
Помогите исправить ошибки ...С++ Настенька Помощь студентам 1 25.03.2007 23:30