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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2012, 18:19   #1
Alendorff
Форумчанин
 
Аватар для Alendorff
 
Регистрация: 04.06.2011
Сообщений: 104
По умолчанию Задача на матрицы. С++

Здравствуйте. Помогите, есть вопрос - нужна идея...
Вот задача:
Цитата:
Дана функция y=f(x), x изменяется от xmin до xmax . Максимальное и минимальное значение функции на интервале [xmin,xmax] обозначим как ymin и ymax . Необходимо создать матрицу M размерностью mxn , так что элемент матрицы M[0][0] имеет координаты (xmin,ymin), а элемент матрицы M[m-1][n-1] имеет координаты (xmax,ymax). Элемент матрицы равен ‘o’, если его координата по оси Y ближе к f(x) , чем некоторое значение d, иначе равен ‘ ‘(пробел). Необходимо вывести на экран строки матрицы M от m-1 до нулевой.
Матрица будет типа char.
d - это сколь угодно малое число
n - вводится с клавиатуры
m - легко рассчитывается в соотв. с необходимыми пропорциями

Вопрос: как связать координаты ячейки матрицы в системе координат с непосредственной нумерацией ячеек в матрице?

Заранее спасибо!
Alendorff вне форума Ответить с цитированием
Старый 05.03.2012, 18:29   #2
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию

чую что неверно понял задание... но все же... вдруг на мысль коль что подтолкнет...
у матрицы для обращения к элементам есть индексы допустим M[i][j] ..
тогда смотрим сколько у нас всего размерность... тобишь ваши m и n... затем смотрим расстояние между ymin и ymax а так же xmin и xmax... и находим сколько и в каком направлении будет интервал между одним индексом... между M[1][0] и M[0][0] будет расстояние |ymin - ymax|/ n ну или что то подобное... а дальше уже смотреть по вашему заданию... что ближе и что дальше...
пишу код не только за печеньки
VIK_aka_TOR вне форума Ответить с цитированием
Старый 06.03.2012, 05:16   #3
Alendorff
Форумчанин
 
Аватар для Alendorff
 
Регистрация: 04.06.2011
Сообщений: 104
По умолчанию

Вот я вчера тоже так подумал... что может как-то попробовать делить весь интервал по оси координат, на размерность матрицы и от этого плясать... но ничего стоящего всё равно в голову не пришло... Пока задание остаётся в таком состоянии:
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <iostream>
#include <stdio.h>
#include <iomanip.h>
#include <math.h>

double Min(double xmin, double xmax, double step) //функция возвращает ymin
{
  double min;
  min=sin(xmin*xmin);
  for (double i=xmin+step; i<=xmax; i+=step)
    {
     if (sin(i*i)<min) min=sin(i*i);
    }
  return min;
}

double Max(double xmin, double xmax, double step) //Функция возвращает ymax
{
  double max;
  max=sin(xmin*xmin);
  for (double i=xmin+step; i<=xmax; i+=step)
    {
     if (sin(i*i)>max) max=sin(i*i);
    }
  return max;
}

double mcalc(int n,double ymax,double ymin,double xmax,double xmin) //функция считает m
{
  double m;
  m=n*(ymax-ymin)/(xmax-xmin);
  return m;
}

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

int main()
{
  int m,n;
  double ymin, ymax, d, k;
  const xmin=-3.14, xmax=3.14;
  printf("Lab N1. \nFunction: sin(x*x).\nRange: [-Pi;Pi]\n");

  //Ввод n и d
  printf("\nInput n: \n");
  cin>>n;
  printf("\nInput d: \n");
  cin>>d;

  //Расчет ymax и ymin

  ymin=Min(xmin,xmax, d);
  ymax=Max(xmin,xmax, d);
  //Расчет m
   k=mcalc(n,ymax,ymin,xmax,xmin);
  m=ceil(k);
  cout<<"m = "<<m<<endl;

//Объявление матрицы
float **M;
M=new float* [m];
for (int i=0; i<m; i++)
  M[i]=new float[n];
//Заполнение матрицы

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

//Вывод матрицы

        for (int i=m-1; i>=0; i--)
        {
          cout<<"\n";
          for (int j=0; j<n; j++)
          cout<<setw(3)<<M[i][j]<<" ";
        }

        system("pause");
        return 0;
}
//---------------------------------------------------------------------------
Может кто-то помочь? Я вот так и чувствую, что там будет цикл не более чем в 7 строчек :D

Последний раз редактировалось Alendorff; 06.03.2012 в 05:19.
Alendorff вне форума Ответить с цитированием
Старый 06.03.2012, 15:39   #4
Alendorff
Форумчанин
 
Аватар для Alendorff
 
Регистрация: 04.06.2011
Сообщений: 104
По умолчанию

Ну неужели никто?..
Alendorff вне форума Ответить с цитированием
Старый 07.03.2012, 13:43   #5
Alendorff
Форумчанин
 
Аватар для Alendorff
 
Регистрация: 04.06.2011
Сообщений: 104
Смущение

Ребята, ну пожалуйста, мне нужна ваша помощь, скоро сдаваться )
Я попробовал сделать этот цикл так:
Код:
//Заполнение матрицы
double dX, dY, Y, X;
dX=(fabs(xmin)+fabs(xmax))/n;
dY=(fabs(ymin)+fabs(ymax))/m;
Y=ymin;
for (int i=0; i<m; i++)
{
   X=xmin;
   for (int j=0; j<n; j++)
   {
     if(fabs(sin(X*X)-Y)<=d) M[i][j]='o';
     else M[i][j]=' ';
     X+=dX;
   }
   Y+=dY;
}
Если, допустим, ввести n=15 или n=20, а d=0.3 (забавно, но при других d очертания выглядят менее похожими) например, то... на самом деле выводит нечто отдалённо напоминающее по очертаниям график моей функции sin(x^2). Но это как-то слишком отдалённо по-моему. Хотя может так и должно быть. Но вот зато, если ввести n=2, то m=1, т.е. это можно представить, как будто вся функция заключена в матрице из двух ячеек, т.е. по-любому эти ячейки должны быть нулями, так как функция явно по ним проходит. Но этого не происходит, выводятся пробелы...
Alendorff вне форума Ответить с цитированием
Старый 07.03.2012, 13:47   #6
Alendorff
Форумчанин
 
Аватар для Alendorff
 
Регистрация: 04.06.2011
Сообщений: 104
По умолчанию

http://www.wolframalpha.com/input/?i=sin%28x%5E2%29
Кстати так выглядит функция в нормальном изображении. Ну, так, не считая того, что у меня интервалом ограничена.
Alendorff вне форума Ответить с цитированием
Старый 07.03.2012, 14:11   #7
Alendorff
Форумчанин
 
Аватар для Alendorff
 
Регистрация: 04.06.2011
Сообщений: 104
По умолчанию

Нет... всё это бред, всё это не работает по-нормальному, даже с линейной функцией f(x)=x
Alendorff вне форума Ответить с цитированием
Старый 12.03.2012, 14:09   #8
Alendorff
Форумчанин
 
Аватар для Alendorff
 
Регистрация: 04.06.2011
Сообщений: 104
По умолчанию

К сожалению, ап...

Последний раз редактировалось Alendorff; 13.03.2012 в 00:51.
Alendorff вне форума Ответить с цитированием
Старый 13.03.2012, 00:53   #9
Alendorff
Форумчанин
 
Аватар для Alendorff
 
Регистрация: 04.06.2011
Сообщений: 104
По умолчанию

Ладно, упорно никто не отвечает... закрывайте тему...
Alendorff вне форума Ответить с цитированием
Старый 25.03.2012, 20:08   #10
Alendorff
Форумчанин
 
Аватар для Alendorff
 
Регистрация: 04.06.2011
Сообщений: 104
По умолчанию

Просто выложу, вдруг кто наткнется.
Помогли, доделал. Ходил вокруг да около, всё очевидно же ><
Код целиком:
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <iostream.h>
#include <stdio.h>
#include <math.h>

double Min(double xmin, double xmax, double step) //Функция должна вернуть ymin
{
  double min;
  min=sin(xmin*xmin);
  for (double i=xmin+step; i<=xmax; i+=step)
    {
     if (sin(i*i)<min) min=sin(i*i);
    }
  return min;
}

double Max(double xmin, double xmax, double step) //Функция должна вернуть ymax
{
  double max;
  max=sin(xmin*xmin);
  for (double i=xmin+step; i<=xmax; i+=step)
    {
     if (sin(i*i)>max) max=sin(i*i);
    }
  return max;
}


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

int main()
{
  int m,n;
  double ymin, ymax,x,dx,dy,y,f,d;
  double xmin,xmax;
  xmin=-3.14, xmax=3.14;
  printf("Lab N1. \nFunction: sin(x*x).\nRange: [-Pi;Pi]\n");

  //Получить n и d
  printf("\nInput n: \n");
  cin>>n;

  printf("\nInput d: \n");
  cin>>d;
  if (n<=0||d<=0){ cout<<"ERROR\n"; system("pause"); return 0;}

  //Рассчитать ymax и ymin

  ymin=Min(xmin,xmax, d);
  ymax=Max(xmin,xmax, d);
  //Рассчет m
  m=(n*(ymax-ymin)/(xmax-xmin));
  cout<<"m = "<<m<<endl;

//Объявление матрицы
char **M;
M=new char* [m];
for (int i=0; i<m; i++)
  M[i]=new char[n];

//Заполнение матрицы
dx=(xmax-xmin)/n;//Щаг по x
dy=(ymax-ymin)/m;//Шаг по y
x=xmin;
int j=0,i;
while (j<n){
  f=sin(x*x);
  i=m-1; y=ymin;
  while (i>=0){   
    if (fabs(y-f)<=d )
      M[i][j]='0';
    else M[i][j]='_';
    i--; y=y+dy;
  }
  j++; x=x+dx;
}

//Вывод матрицы
for (i=0;i<m;i++)
{ for(j=0;j<n;j++)
  cout<<M[i][j];
 cout<<"\n";
}


for (int i = 0; i < m; i ++ )
delete M[i];
delete M;
        cout<<endl;
        system("pause");
        return 0;
}
//---------------------------------------------------------------------------

Последний раз редактировалось Alendorff; 25.03.2012 в 20:13.
Alendorff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задача на матрицы sanchoflat Паскаль, Turbo Pascal, PascalABC.NET 13 07.11.2011 07:14
Задача на матрицы Basiclan Помощь студентам 2 08.04.2011 18:15
Задача на матрицы Гамбит Паскаль, Turbo Pascal, PascalABC.NET 20 19.10.2009 21:22
Задача на матрицы щдуп Паскаль, Turbo Pascal, PascalABC.NET 3 26.06.2008 08:52
Задача на матрицы Integral Паскаль, Turbo Pascal, PascalABC.NET 1 12.12.2007 13:32