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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2009, 01:34   #1
aka_faith
Пользователь
 
Аватар для aka_faith
 
Регистрация: 15.05.2009
Сообщений: 74
Вопрос C++. подпрограммы, помогите переделать

вот листинг, условие не столь важно:
Код:
#include <stdio.h>
#include <conio.h>
#include <math.h>


void Form_Matrix(float *x,int *n)
{
  int i,j,k;
 printf("vvedite razmer matrizi\n");
 scanf("%d",n);
  float a=2;
  for(i=0;i<*n;i++,a*=2)
    for(j=0;j<*n;j++)
     x[i**n+j]=fabs(a/(((i+1)-2.5)*(i+2)*(i+2)))*((2-fabs(j-4))*(2-fabs(j-4)));
   }

void Print_Matrix(float *x,int n)
{
  int i,j;
     printf("vvedite razmer matrizi\n");
    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;
  int min,max;
  for (i=0; i<n; i++)
   {
    min=0;
    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;
       }
	   x[i]=f[i*n+max]-f[i*n+min];
    }
}

float U(float *X, int n)
{
 float min;
 int i;
 min = fabs(X[2])-fabs(X[1]);
 for(i=2; i<n;i++)
  {
   float xx = fabs(X[i+1])-fabs(X[i]);
   if (xx<min) min=xx;
  }
 return min;
}


void main ()
{

  float F[20][20], X[10],  min;
  int i,n;


  printf("\nmatriza A\n");
  Form_Matrix(&F[0][0],&n);
  Print_Matrix(&F[0][0],n);
  printf("matriza Max-Min\n");
  Min_Max(&F[0][0],n,X);
  for (i=0; i<n; i++)
    printf (" %3.1f", X[i]);
  printf("\nU=");
  min=U(X,n);
  printf("%3.1f", min);

  getch();

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

Цитата:
как правильно распечатать матрицу еще и в основной программе?
Просто распечатать?
Код:
for(i=0; i<n; i++)
 {
 for(j=0; j<n; j++)
  printf("%3.1 ",F[i][j]);
 printf("\n");
 }
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

хм, не просто

вот результаты с подпрограммой:
Цитата:
matriza A
vvedite razmer matrizi
6
vvedite razmer matrizi
1.3 0.3 0.0 0.3 1.3 0.3
3.6 0.9 0.0 0.9 3.6 0.9
4.0 1.0 0.0 1.0 4.0 1.0
1.7 0.4 0.0 0.4 1.7 0.4
1.4 0.4 0.0 0.4 1.4 0.4
1.5 0.4 0.0 0.4 1.5 0.4
matriza Max-Min
1.3 3.6 4.0 1.7 1.4 1.5
U=-2.3
а вот то, что получается, Если просто убрать ф-цию печати, а вместо нее поставить ваш вариант:
Цитата:
matriza A
vvedite razmer matrizi
6
1.3 0.3 0.0 0.3 1.3 0.3
0.0 0.4 1.7 0.4 1.4 0.4
0.0 0.0 -30910392235965145700000000000000000 .0 0.0 -3066228429329156980000000000
0000000.0 0.0
-34398976591313547300000000000000000 .0 0.0 -NAN -0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0
0.0 -NAN 0.0 0.0 0.0 0.0
matriza Max-Min
1.3 3.6 4.0 1.7 1.4 1.5
U=-2.3

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

Уфф Ну забыл спецификатор поставить... Ну видно же ))
Код:
 printf("%3.1f ",F[i][j]);
upd
да, все, уже вижу ) Это из-за того, что у нас массив статический 20 на 20, а мы посылаем n (когда заполняем его).

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

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

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

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

В общем, выше уже пояснил. Подводя итог: либо делать динамическими, либо как-то так:
Код:
#include <stdio.h>
#include <conio.h>
#include <math.h>

#define N 20

void Form_Matrix(float x[N][N],int *n)
{
  int i,j,k;
 printf("vvedite razmer matrizi\n");
 scanf("%d",n);
  float a=2;
  for(i=0;i<*n;i++,a*=2)
    for(j=0;j<*n;j++)
     x[i][j]=fabs(a/(((i+1)-2.5)*(i+2)*(i+2)))*((2-fabs(j-4))*(2-fabs(j-4)));
   }

void Print_Matrix(float x[N][N],int n)
{
  int i,j;
     printf("vvedite razmer matrizi\n");
    for(i=0;i<n;i++,printf("\n"))
      for(j=0;j<n;j++)
      printf(" %3.1f ",x[i][j]);
}


void Min_Max(float f[N][N],int n, float x[])
{
  int i,j;
  int min,max;
  for (i=0; i<n; i++)
   {
    min=0;
    max=0;
    for (j=0; j<n; j++)
      {
	if (f[i][j]>f[i][max]) max=j;
	       if (f[i][j]<f[i][min]) min=j;
       }
	   x[i]=f[i][max]-f[i][min];
    }
}

float U(float *X, int n)
{
 float min;
 int i;
 min = fabs(X[2])-fabs(X[1]);
 for(i=2; i<n;i++)
  {
   float xx = fabs(X[i+1])-fabs(X[i]);
   if (xx<min) min=xx;
  }
 return min;
}


int main ()
{

  float F[20][20], X[10],  min;
  int i,n;

  printf("\nmatriza A\n");
  Form_Matrix(F,&n);
 // Print_Matrix(F,n);

  printf("\n----------\n");
  for(int i=0; i<n; i++)
   {
    for(int j=0; j<n; j++)
     printf("%3.1f ",F[i][j]);
    printf("\n");
   }
  printf("matriza Max-Min\n");
  Min_Max(F,n,X);
  for (i=0; i<n; i++)
    printf (" %3.1f", X[i]);
  printf("\nU=");
  min=U(X,n);
  printf("%3.1f", min);

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

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

но результат опять не тот:
Цитата:
matriza A
vvedite razmer matrizi
6

----------
0.0
0.0
0.0
0.0
0.0
0.0
matriza Max-Min
1.3 3.6 4.0 1.7 1.4 1.5
U=-2.3
и динамическим по условию делать нельзя
aka_faith вне форума Ответить с цитированием
Старый 11.06.2009, 02:39   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от aka_faith
но результат опять не тот:
Уверены, что скомпилили то, что нужно?

У меня вот такое:
Код:
matriza A
vvedite razmer matrizi
6

----------
1.3 0.3 0.0 0.3 1.3 0.3
3.6 0.9 0.0 0.9 3.6 0.9
4.0 1.0 0.0 1.0 4.0 1.0
1.7 0.4 0.0 0.4 1.7 0.4
1.4 0.4 0.0 0.4 1.4 0.4
1.5 0.4 0.0 0.4 1.5 0.4
matriza Max-Min
 1.3 3.6 4.0 1.7 1.4 1.5
U=-2.3
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

да то, то скопировала, но компилятор выдает ошибки в а была и по и и жи - я исправила - получила этот ужас!! о_О

а от версии компилятора результаты разве могут изменятся??

и, наверное, там надо как-то через указатель... я заметила, что если максимальное кол-во элементов, допустим, 10 на 10, а вводим 6 на 6, то эти 4 осавшихся элемента не переносятся для печати, вместо них идут уже следующие... массив же в памяти в строчку...

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

У меня никаких ошибок не было.
Цитата:
а от версии компилятора результаты разве могут изменятся??
В некоторых старых компиляторах не всегда стандарт соблюдается. Могут быть некоторые глюки.

В общем, вот вам еще вариант. С указателями.
Код:
#include <stdio.h>
#include <conio.h>
#include <math.h>

#define N 20

void Form_Matrix(float *x,int &n)
{
  int i,j;
 printf("vvedite razmer matrizi\n");
 scanf("%d",&n);
  float a=2;
  for(i=0;i<n;i++,a*=2)
    for(j=0;j<n;j++)
     x[i*N+j]=fabs(a/(((i+1)-2.5)*(i+2)*(i+2)))*((2-fabs(j-4))*(2-fabs(j-4)));
}

void Print_Matrix(float *x,int n)
{
  int i,j;
     printf("vvedite razmer matrizi\n");
    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;
  int min,max;
  for (i=0; i<n; i++)
   {
    min=0;
    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;
       }
	   x[i]=f[i*N+max]-f[i*N+min];
    }
}

float U(float *X, int n)
{
 float min;
 int i;
 min = fabs(X[2])-fabs(X[1]);
 for(i=2; i<n;i++)
  {
   float xx = fabs(X[i+1])-fabs(X[i]);
   if (xx<min) min=xx;
  }
 return min;
}


int main ()
{

  float F[20][20], X[10],  min;
  int i,n;

  printf("\nmatriza A\n");
  Form_Matrix(&F[0][0],n);
 // Print_Matrix(F,n);

  printf("\n----------\n");
  for(int i=0; i<n; i++)
   {
    for(int j=0; j<n; j++)
     printf("%3.1f ",F[i][j]);
    printf("\n");
   }
  printf("matriza Max-Min\n");
  Min_Max(&F[0][0],n,X);
  for (i=0; i<n; i++)
    printf (" %3.1f", X[i]);
  printf("\nU=");
  min=U(X,n);
  printf("%3.1f", min);

  getch();
}
Пример вывода:
Код:
matriza A
vvedite razmer matrizi
6

----------
1.3 0.3 0.0 0.3 1.3 0.3
3.6 0.9 0.0 0.9 3.6 0.9
4.0 1.0 0.0 1.0 4.0 1.0
1.7 0.4 0.0 0.4 1.7 0.4
1.4 0.4 0.0 0.4 1.4 0.4
1.5 0.4 0.0 0.4 1.5 0.4
matriza Max-Min
 1.3 3.6 4.0 1.7 1.4 1.5
U=-2.3
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
решить с использованием рекурсивной подпрограммы. помогите пожалуйста ваще ни че не понял st1m Паскаль, Turbo Pascal, PascalABC.NET 2 02.04.2009 15:31
Помогите переделать и проверьте Mokriy Паскаль, Turbo Pascal, PascalABC.NET 3 22.05.2008 17:26
Помогите переделать Stanislav Общие вопросы Delphi 2 24.10.2007 16:14
Помогите переделать БД Antowka БД в Delphi 17 15.06.2007 21:35