Показать полную графическую версию : помогите написать программу на C++
помогите пожалуйста решить задачку, очень нужно((((((
я понял, что задачу нужно решать как массив, но тут я столкнулся с проблемой, поскольку очень сложна для меня, очень много условий в этой задачке
сам размер матрицы (количество строк и столбцов) не задан, но имеет ограничения как по 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²)))
feytan, ааа а что спросить то хотел? Условий много, а их цель и смысл не ясны. В чем возникла проблема? Что ты не знаешь "Как сделать?"?
Описав проблему, ты не задал ни одного вопроса, поэтому помочь тебе пока сложно.
ты бы для начала сам понял что от тебя хотят в этой задаче а не у нас спрашивал.. это не мы тебе задали эту задачу. чесно.
тебе правильно говорят - задай вопрос. он состоит обычно из нескольких частей: 1. условие, т.е. то что имеется, 2. желаемый ответ, т.е. то что предполагается сделать и получить., и 3. фраза - "вот я тут набросал [ссылка_на_наброски], но не пойму как сделать [непонятная_штука]" .
Я вроде сделал первую часть программы, проверьте правильно ли (у меня запускается, но все равно прошу проверьте, мож я слишком громозко сделал). В ней я взял просто случайные числы для матрицы, поэтому код нужно будет переделать слегка, но как сделать два других пункта я не знаю. Потому и прошу о помощи.
#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;
}
Задачу я решил. Я изменил код программы, взяв за основу, что ∆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
Помогите написать программу.
Студенты... ммм я по ним скучал :)
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();
}
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 подправила,
Tanya_93, вот и молодец! Решила задачу, не отвлекая народ по мелочаам.
Последняя наверно придирка - какие были основания для написания тройного условия if ?
Можно ли решить заданные уравнения на заданных диапазонах другим способом (в чуть иных конструкциях), какие плюсы и минусы мы от этого получим?
Т.е. при составлениии отчета по лабе, обычно требуется вывод, и хорошо бы, что бы в выводе были не просто слова, а обоснованные числа.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.