Войти

Показать полную графическую версию : помогите написать программу на C++


feytan
06-04-2011, 16:34
помогите пожалуйста решить задачку, очень нужно((((((

я понял, что задачу нужно решать как массив, но тут я столкнулся с проблемой, поскольку очень сложна для меня, очень много условий в этой задачке

сам размер матрицы (количество строк и столбцов) не задан, но имеет ограничения как по X так и по Y. Но они как-то связаны, к примеру если взять что ∆X = 1 и ∆Y = 1, то кол-во строк = 11, а кол-во столбцов = 9, а может быть и наоборот (они могут и отличаться, к примеру ∆X = 0,01 и ∆Y = 0,01); даже сами значения ∆X и ∆Y могут отличаться друг от друга, но они связаны с границами Xϵ[0;8] и Yϵ[0;10].

а вот и вторая проблема в этой же задаче:

• к примеру, как показано на рисунке значение в массиве при X = 0, а Y =10 будет = 0, затем при изменяющемся X и постоянном Y значение будет расти и в точке массива при X = 6, а Y =10 значение будет = 10, а далее будет падать до 0 в точке матрицы X = 8 и Y =10;
• также, как видно из рисунка значения в массиве при X = 0, а Y изменяющемся в диапазоне [0;2] будет = 5;
• все остальные граничные значения = 0.

И третья проблема: это расчет внутренних значений матрицы
Если ∆X = ∆Y, то внутренние значения каждой точки матрицы рассчитываются по формуле U[i][j]=(U[i-1][j]+ U[i+1][j]+ U[i][j-1]+ U[i][j+1])/4
Если ∆X ≠ ∆Y, то внутренние значения каждой точки матрицы рассчитываются по формуле U[i][j]=(U[i-1][j]+ U[i+1][j]+ ((∆X²/∆Y²)*(U[i][j-1]+ U[i][j+1])))/(2*(1+(∆X²/∆Y²)))

lxa85
06-04-2011, 16:59
feytan, ааа а что спросить то хотел? Условий много, а их цель и смысл не ясны. В чем возникла проблема? Что ты не знаешь "Как сделать?"?
Описав проблему, ты не задал ни одного вопроса, поэтому помочь тебе пока сложно.

Beyound
06-04-2011, 17:46
ты бы для начала сам понял что от тебя хотят в этой задаче а не у нас спрашивал.. это не мы тебе задали эту задачу. чесно.
тебе правильно говорят - задай вопрос. он состоит обычно из нескольких частей: 1. условие, т.е. то что имеется, 2. желаемый ответ, т.е. то что предполагается сделать и получить., и 3. фраза - "вот я тут набросал [ссылка_на_наброски], но не пойму как сделать [непонятная_штука]" .

feytan
16-04-2011, 13:31
Я вроде сделал первую часть программы, проверьте правильно ли (у меня запускается, но все равно прошу проверьте, мож я слишком громозко сделал). В ней я взял просто случайные числы для матрицы, поэтому код нужно будет переделать слегка, но как сделать два других пункта я не знаю. Потому и прошу о помощи.


#include <iostream>
#include<time.h>
using namespace std;

int main ()
{
srand (time(NULL));
float h, k;
int a, b, n, m, i, j;
cout<<"Enter a: "; //a - конечное значение на графике по оси Y
cin>>a;
cout<<"\nEnter h: "; //h - расстояние одной строки по оси Y
cin>>h;
n=(int)(a/h)+1; //расчитываем количество строк в массиве
cout<<"\n n="<<n; //n - количество строк в массиве
cout<<"\nEnter b: "; //b - конечное значение на графике по оси X
cin>>b;
cout<<"\nEnter k: "; //k - расстояние одного столбца по оси X
cin>>k;
m=(int)(b/k)+1; //расчитываем количество столбцов в массиве
cout<<"\n m="<<m; //m - количество столбцов в массиве
int** U = NULL;

/* Выделяем память под матрицу */
/* Выделяем память под массив строк матрицы */
U = new int*[n];
/* Выделяем память под каждую строку матрицы */
for(i = 0; i < n; ++i)
U[i] = new int[m];
//заполнение матрицы
for (i = 0; i < n; ++i)
{
for (j = 0; j < m; ++j)
{
U[i][j]=rand()%20;
cout<<U[i][j]<<"\t";
}
cout<<endl;
}

/* Удаление матрицы */
/* Удаление каждой строки матрицы */
for(i = 0; i < n; ++i)
delete[] U[i];

/* Удаление массива строк матрицы */
delete[] U;

system("pause");

return 0;
}

feytan
07-06-2011, 16:22
Задачу я решил. Я изменил код программы, взяв за основу, что ∆X = 1 и ∆Y = 1, т.о. кол-во строк = 11, а кол-во столбцов = 9. Вот код программы:

#include <iostream>

using namespace std;

int main ()
{
int i, j, n1, m1,k;
float e=0.000001, max_pogr, d1, d2, next;
int const n=11; //задаем количество строк в массиве
int const m=9; //задаем количество столбцов в массиве
float mas_U[n][m];
d1=10.0/6.0;
d2=5.0;
n1=n-1;
m1=m-1;
cout<<"===Zadanie nulei===" << endl;
cout<<"\n";
for(i = 0; i < n; i ++)
{
for(j = 0; j < m; j ++)
{
mas_U[i][j] = 0;
}
}
for(i = 0; i < n; i ++)
{
for(j = 0; j < m; j ++)
{
cout << mas_U[i][j] << "\t";
}
cout << endl;
}

cout<<"\n===Pervie granichnie usloviya===" << endl;
cout<<"\n";
for(i = 8; i < n; i++)
{
mas_U[i][0]=5;
}
for(i = 0; i < n; i ++)
{
for(j = 0; j < m; j ++)
{
cout << mas_U[i][j] << "\t";
}
cout << endl;
}
cout<<"\n===Vtorie granichnie usloviya===" << endl;
cout<<"\n";
for(j = 1; j <= 7; j ++)
{
mas_U[0][j] = mas_U[0][j-1] + d1;
}
for(j = 7; j < m ; j ++)
{
mas_U[0][j] = mas_U[0][j-1] - d2;
}
for(i = 0; i < n; i ++)
{
for(j = 0; j < m; j ++)
{
cout << mas_U[i][j] << "\t";
}
cout << endl;
}
cout<<"\n===Podschet massiva===" << endl;
cout<<"\n";
for(k=0;;k++)
{
max_pogr=0;
for(i = 1; i < n1; i ++)
{
for(j = 1; j < m1; j ++)
{
next = (mas_U[i+1][j] + mas_U[i-1][j] + mas_U[i][j+1] + mas_U[i][j-1])/4;
if((mas_U[i][j] - next) > max_pogr) max_pogr=(mas_U[i][j] - next);
else mas_U[i][j] = next;
}
}
if(max_pogr<=e||k>=10000)break;
}
for(i = 0; i < n; i ++)
{
for(j = 0; j < m; j ++)
printf("%7.4f\t",mas_U[i][j]);
printf("\n\n");
}

system("pause");

return 0;
}

Так же выкладываю результат и примерную блок-схему

Tanya_93
25-09-2011, 19:24
Помогите написать программу.

lxa85
25-09-2011, 21:19
Студенты... ммм я по ним скучал :)
Tanya_93, Выпиши пожалуйста
Определения переменных - т.е. имя переменной, ее тип (логическая, вещественная, целая и т.п.) и, если надо, размерность.
Формулы вычисления на каждом участке
Ответь, как переменной присвоить значение введенное с клавиатуры, как вывести значение на экран.
Привели конструкцию цикла for или цикла while.

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

Tanya_93
25-09-2011, 22:47
#include <stdio.h>
#include <iostream>
#include <conio.h>
using namespace std;

void main()
{

double a,b,c,x,x1,x2,d;
cout<< "vvesti a: \n";
cin>> a;
cout <<"vvesti b: \n";
cin>> b;
cout <<"vvesti c: \n";
cin>>c;

cout <<"vvesti x1: \n";
cin>>x1;
cout <<"vvesti x2: \n";
cin>>x2;
cout <<"vvesti d: \n";
cin>>d;

cout<<" -------------------------- \n";
cout<<"| X |";
cout<<" F |";
for(x=x1;x<x2)
{
if ((x<0)&&(b!=0))
{printf("\n| %10.1lf ",x);
printf("| %10.1lf |",a*x*x*x+b*x*x);
}
else
if ((x>0)&&(b==0))
{printf ("\n| %10.1lf ",x);
printf ("| %10.1lf |",(x-a)/(x-c));
}
else
{printf ("\n| %10.1lf ",x);
printf ("| %10.1lf |",(x+5.0)/c*(x-10.0));
}
printf("\n -------------------------- ");
}
getch();
}

lxa85
26-09-2011, 09:27
Tanya_93, Первый и самый злой комментарий : "Комментарии !"
Расставляй комментарии к коду, даже к такому простейшему.

Подключаем библиотеки, определяем пространство:
#include <stdio.h>
#include <iostream>
#include <conio.h>
using namespace std; »

определяем переменные, присваиваем им начальные значения:
double a,b,c,x,x1,x2,d;
cout<< "vvesti a: \n";
cin>> a;
cout <<"vvesti b: \n";
cin>> b;
cout <<"vvesti c: \n";
cin>>c;
cout <<"vvesti x1: \n";
cin>>x1;
cout <<"vvesti x2: \n";
cin>>x2;
cout <<"vvesti d: \n";
cin>>d; »
Формулы проверять не буду, поверю на слово:
for(x=x1;x<x2)
{
if ((x<0)&&(b!=0))
{printf("\n| %10.1lf ",x);
printf("| %10.1lf |",a*x*x*x+b*x*x);
}
else
if ((x>0)&&(b==0))
{printf ("\n| %10.1lf ",x);
printf ("| %10.1lf |",(x-a)/(x-c));
}
else
{printf ("\n| %10.1lf ",x);
printf ("| %10.1lf |",(x+5.0)/c*(x-10.0));
} »
К этому коду у меня есть один единственный вопрос: ты уверена в том, что здесь правильно применен цикл for ?
Ведь в задании, насколько я помню, был указан шаг dX, в существующем варианте шаг будет равен единице.
Т.е. тебе либо надо выправлять условия цикла for, либо использовать цикл while.

Tanya_93
26-09-2011, 18:31
да я for подправила,

lxa85
27-09-2011, 10:42
Tanya_93, вот и молодец! Решила задачу, не отвлекая народ по мелочаам.
Последняя наверно придирка - какие были основания для написания тройного условия if ?
Можно ли решить заданные уравнения на заданных диапазонах другим способом (в чуть иных конструкциях), какие плюсы и минусы мы от этого получим?
Т.е. при составлениии отчета по лабе, обычно требуется вывод, и хорошо бы, что бы в выводе были не просто слова, а обоснованные числа.




© OSzone.net 2001-2012