Войти

Показать полную графическую версию : [решено] Помогите решить задачу по С++


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 [15] 16

ferget
24-10-2011, 15:51
в свойствах проекта -> свойства конфигурации -> общие
поставьте использовать многобайтовую кодировку

Titanium
24-10-2011, 18:07
#include <math.h>
#include <conio.h>
#include <iostream.h>
#define f(x)(exp( x ) + 2*pow(x,2) - 30)

double F_X(double); // ???????? ??????? ?? ?????;
double PARABL_METHOD(double, double, double); // ??????? ??? ?????????? ????????

main()
{
double MIN_VAL = 0.0; // ????????? ?????
double MAX_VAL = 0.0; // ???????? ?????
double ESP = 0.0, MINIMUM = 0.0; // ????????? ????????, ???????

cout << "Vvedite MIN_VAL: ";
cin >> MIN_VAL;
cout << "Vvedite MAX_VAL: ";
cin >> MAX_VAL;
cout << "Vvedite ESP: ";
cin >> ESP;

MINIMUM = PARABL_METHOD(MIN_VAL, MAX_VAL, ESP);

cout << "Minimum: " << MINIMUM << endl;
getch();
return 0;
}
double PARABL_METHOD(double X0, double H, double ESP)
{
// ????????? ??????????????? ?????
double X1 = 0.0;
double X2 = 0.0;
double XN = 0.0;
// ????????? ??????????????? ??????????
double Q = 0.0, A = 0.0, B = 0.0, C = 0.0, D = 0.0, Z = 0.0;
int k = 0;

X1 = X0 + H; // ????????????? ?????? ?????
X2 = X0 + (2*H); // ????????????? ?????? ?????

// ????????? ???????? ???????? ????????? ?????? ???????? ??????? ???????
do
{
Q = (X0-X1)/(X1-X2);
A = (((Q*F_X(X0))-((Q*(1+Q))*F_X(X1)) )+(Q*Q*F_X(X2)));
B = (((2*Q+1)*F_X(X0))-((1+Q)*(1+Q)*F_X(X1)))+Q*Q*F_X(X2);
C = (1+Q)*F_X(X0);
D = sqrt(B*B-(4*A*C));

if (abs(B+D) > abs(B-D))
Z=B+D;
else
Z=B-D;

XN = X0 - (((X0-X1)*2*C)/Z);

F_X(XN);
// ?????????, ???????? ?? ?? ????????? ????????
if (abs(F_X(XN) < ESP))
k=10000;

// ?????? ????? ???????? ??????
X2 = X1;
X1 = X0;
X0 = XN;
// ??????????? ???????
k = k+1;

} while(k <= 10000); // ???????????? ??????????? ?????
return XN;
}
// ????????? ???????? ??????? ? ??????
double F_X(double x)
{
return f(x);
}


можно ли как нибудь упростить данный листинг?

lxa85
30-10-2011, 16:03
кто знает как это решить?) »
Я знаю! :)я не просил решать, я просил подсказки »
Не просили.
Примеры решались? Матрицы рисовались? Пальчиком последовательности перебирались?
Не можешь решить теоретически, решай практически! Потом общий случай получишь.

zena
01-11-2011, 23:19
Помогите пожалуйста с этой задачкой:
Дана строка содержащая слова. Вывести на экран слово, являющееся первым в алфавитном порядке.

lxa85
02-11-2011, 00:15
Вопросы те же :
где собственные размышления?
Какие заданы ограничения?
По решению:
имеет смысл посмотреть на предыдущую работу с массивами, и подумать над применением уже известных методов, для решения поставленной задачи.

SPD-PrAlex
02-11-2011, 10:52
Помогите пожалуйста составить программу на C++

Проводится перепись населения. На улице N-домов (N - известно заранее и задается константой).
Число квартир в домах может различаться; это значение вводится с клавиатуры в переменную m для каждого дома. Число жильцов каждой квартиры вводят с клавиатуры.
Сколько всего людей проживает на этой улице?

P.S. Решение производится на C++ со вложенными циклами

lxa85
02-11-2011, 11:21
SPD-PrAlex, если вычеркнуть С++, как бы вы решали эту задачу?
Есть 5 домов, 5, 7, 10 этажей, или от 2 до 200 сот квартир, в каждой квартире от 1 до 10 человек.
Как провести перепись населения?
Из чего вообще вообще будет вычитаться кол-во людей? или не будет, или не вычитаться, а умножаться и делиться? :)

Prof
03-11-2011, 21:07
Условие:
Имеем две строки. Из каждой строки разрешается удалять символы, но количество удаленных символов, идущих подряд, не должна превышать W. Задание- удалив минимально возможное количество символов, сделать строки одинаковыми (символы разного регистра считать одинаковыми).
Входящие данные:
Входящий файл содержит в первой строке число W (1 <= W <= 1500), во втором и третьем- две заданных строки, состоящие из цифр и символов английского алфавита (от 1 до 1500 символов).
Исходящие данные:
Исходящий файл должен содержать одну строку, которую можно получить с обеих строк по правилам задачи. Если существует несколько вариантов ответа, вывести любой. Если ответа не существует- вывести No solution.

Личные мысли:
две строки загнать в массивы, потом искать следующим образом a[i-w] (a[i+w]), где a[i]- определённый елемент массива. Если совпадения есть- удаляем, в конце выводим массиыв что остался. Но чтото не идёт мне эта идея: лимит на 4с не пройдёт и врятли w=1500 возьмёт.

lxa85
03-11-2011, 21:47
Ха. Есть мысль красивее, но о ней потом. :)
Связана с массивами, поиском в массиве, условием одинаковости строк.
Перебрать за 4с массив в 1500 элементов - крайне просто.
потом искать следующим образом a[i-w] (a[i+w]), где a[i]- определённый элемент массива. Если совпадения есть- удаляем, в конце выводим массиыв что остался. »
Идея не понятна. Как осуществляется поиск? Почему при совпадении мы что-то удаляем?
----
Строки должны быть одинаковыми. Дайте определение "одинаковым строкам", полное, развернутое. Это значительно облегчит решение задачи.

Prof
04-11-2011, 00:39
Немного не так сформулировал мысль. Берём первый елемент первого массива, ищем такойже во втором массиве, если есть, запоминаем номера ячеек. Потом удаляем все елементы, номера которых не запоминали. Далле проверяем, если количество удаленных подряд элементов в массиве > W выводим "No solution", если <= W, тогда выводим данные из массива.

Titanium
20-11-2011, 17:07
bool valid(int i, int j)
{
return i > 0 && i < m && j > 0 && j < n;
}

// элементы игрового поля (пусто, крестик, нолик)
enum XO { _e_, _x_, _o_ };
const XO f[m][n];
XO field(int i, int j) { return valid(i,j) ? f[i][j] : _e_; }

XO test()
{

// ранг каждой клетки
struct RANK
{
int hor, ver, diag1, diag2;
};
RANK r[m][n];
const RANK rnull = { 0, 0, 0, 0 };

int i,j;
for(i = 0; i < m; ++i) for(j = 0; j < n; ++j)
{
XO xo = f[i][j];
RANK& rr = r[i][j];

if(xo == _e_) { rr = rnull; continue; }
if(xo == field(i-1, j )) = 1 + r[i-1][j ];
if(xo == field(i, j-1)) rr.ver = 1 + r[i ][j-1];
if(xo == field(i-1, j-1)) rr.diag1 = 1 + r[i-1][j-1];
if(xo == field(i+1, j-1)) rr.diag2 = 1 + r[i+1][j-1];

if(rr.hor >= 5
|| rr.ver >= 5
|| rr.diag1 >= 5
|| rr.diag2 >= 5
)
return xo; // этот игрок победил
}

return _e_; // ничья
}


не пойму чего не хватает

Суть задания:
клеточное поле размером м*n есть результат игры в крестики-нолики на неограниченном поле. Проверить является ли конфигурация одного из игроков предвыигрышной, т.е. нельзя ли за один ход достичь победы

lxa85
20-11-2011, 19:32
Titanium, не пойму чего не хватает »
а я вот не пойму, что вы пытаетесь сделать?
Словами алгоритм можете описать? И код прокомментировать тоже не мешало бы.
Каков принцип поиска предвыигрышной ситуации?

keks666sex
20-11-2011, 22:52
Определите, пересекаются ли кривая у=аx3+bx2+сx+d и прямая y=fx+g. При положительном ответе найти точки пересечения.

lxa85
20-11-2011, 23:14
keks666sex, решите уравнение. Либо аналитически, либо дискретно.
Большим пока помочь не могу.

keks666sex
20-11-2011, 23:41
Будит ли правильным такой вариант решения?
Если сначала решить систему уравнений аx3+bx2+сx+d=fx+g
где найдем x=g-d
и дискриминант D=sqrt(b^2-4az) где z=c-f
и с помощью дискриминанта найдем 2 корня
x2=(-b+дискриминант)/(2*a);
x3=(-b-дискриминант)/(2*a);



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

void main()
{
double a,b,c,d,f,g,x,y,tret,discrim,x1,x2,x3,y1,y2,y3,yrav2;
cout<<"Vvedite A ";
cin>>a;
cout<<"Vvedite B ";
cin>>b;
cout<<"Vvedite C ";
cin>>c;
cout<<"Vvedite D ";
cin>>d;
cout<<"Vvedite F ";
cin>>f;
cout<<"Vvedite G ";
cin>>g;

x1=g-d;
y1=f*x1+g;
yrav2=a*pow(x1,3)+b*pow(x1,2)+c*x1+d;
tret=c-f;
discrim=sqrt(pow(b,2)-4*a*tret);
// cout<<"Deskriminant: "<<discrim<<'\n';

cout<<"Krivaya i pryamaya peresekaet'sya v tochkah:"<<'\n';

cout<<"Tochka peresecheniya: "<<"("<<x1<<";"<<y1<<")"<<'\n';
if (discrim>0)
{
x2=(-b+discrim)/(2*a);
x3=(-b-discrim)/(2*a);
y2=f*x2+g;
y3=f*x3+g;
cout<<"Tochka peresecheniya : "<<"("<<x2<<";"<<y2<<")"<<'\n';
cout<<"Tochka peresecheniya : "<<"("<<x3<<";"<<y3<<")"<<'\n';
}
else if(discrim=0)
{
x2=-b/(2*a);
y2=f*x2+g;
cout<<"Tochka peresecheniya: "<<"("<<x2<<";"<<y2<<")"<<'\n';
}
else
{
cout<<" "<<'\n';
}

}

lxa85
21-11-2011, 08:40
Будит ли правильным такой вариант решения?
Если сначала решить систему уравнений аx3+bx2+сx+d=fx+g
где найдем x=g-d
и дискриминант D=sqrt(b^2-4az) где z=c-f
и с помощью дискриминанта найдем 2 корня
x2=(-b+дискриминант)/(2*a);
x3=(-b-дискриминант)/(2*a); »
Ну и чего здесь понаписано?
Почему Х стал константой g-d?
сколь я помню алгебра выглядит так:
аx3+bx2+сx+d=fx+g
аx3+bx2+(с-f)x=g-d
x(ax2+bx+c-f)=g-d

Liisa
10-12-2011, 00:45
Помогите, пожалуйста, решить задачку:
В одномерном массиве, состоящем из N целых элементов, вычислить:
1) произведение элементов массива с четными номерами;
2) сумму элементов массива, расположенных между первым и последним
нулевыми элементами.
Преобразовать массив таким образом, чтобы сначала располагались все
положительные элементы, а потом — все отрицательные (элементы, равные 0, считать положительными).
Вывести на экран в удобной и наглядной форме исходные данные и результаты.

Первый пункт я сделала, вот что получилось:

#include <stdio.h>
#include <conio.h>

int main(void)
{ float FMass[10] = {1,-2,3,-5,0,2,3,8,0,1};
float proizv = 1; int i=0;


clrscr();

for(i=0;i<10;i++) // print Fmass:
{
printf("\n FMass[%d] = %+12.1f",i,FMass[i]);
}

// proizv:
for(i=0;i<10;i=i+2)
{
proizv = proizv * FMass[i];
}


printf("\n\n proizv = %+12.1f", proizv);



getch();
return 1;
}

Хотя бы второй пункт подскажите?

Drongo
11-12-2011, 16:25
Первый пункт я сделала, вот что получилось: »В принципе с первым пунктом просто. Единственное, что в чётных элементах значение ноль, так что произведение будет всегда равно нулю. А со вторым я бы сделал так:
...
int IndexFirstNull, // Индекс первого нулевого значения
IndexLastNull; // Индекс последнего нулевого значения
...
// Вычисление первого значения с нулём
// Начинаем поиск его с начала
// И как только найдём, запоминаем break
for(int i = 0; i < size; i++)
if(FMass[i] == 0){
IndexFirstNull = i;
break;
}
// Вычисления последнего значения с нулём
// Начинаем поиск его с конца массива
// И как только найдём, запоминаем и break
for(int i = size - 1; i >= 0; i--)
if(FMass[i] == 0){
IndexLastNull = i;
break;
}
cout << endl;
// Вывод значений между первым и последним нулевым элементом.
for(int i = IndexFirstNull + 1; i < IndexLastNull; i++)
cout << "FMass[" << i << "] = " << FMass[i] <<endl;
#include <iostream>
using namespace std;
#include <conio.h>

int main(void)
{
int const size = 10; // Размер массива
float FMass[size] = {1, -2, 3, -5, 0, 2, 3, 8, 0, 1};
float proizv = 1;
int IndexFirstNull, IndexLastNull;

// Вывод массива
for(int i = 0; i < size; i++){ // print Fmass:
cout << "FMAss[" << i << "] = " << FMass[i] << endl;
}

// Вывод произведения чётных элементов массива
for(int i = 0; i < size; i++)
if(i % 2 == 0)
proizv *= FMass[i];
cout << "\nProizvedenie chetnih = " << proizv << endl;

// Вывод суммы элементов массива,
// расположенных между первым и последним нулевыми элементами.
// Вычисление первого значения с нулём
for(int i = 0; i < size; i++)
if(FMass[i] == 0){
IndexFirstNull = i;
break;
}
// Вычисления последнего значения с нулём
for(int i = size - 1; i >= 0; i--)
if(FMass[i] == 0){
IndexLastNull = i;
break;
}
cout << endl;
// Вывод значений между первым и последним нулевым элементом.
for(int i = IndexFirstNull + 1; i < IndexLastNull; i++)
cout << "FMass[" << i << "] = " << FMass[i] <<endl;

getch();
return 0;
}

Daswedoc
20-12-2011, 12:38
Добрый день...
Помогите пожалуйста.
Задние лабы:
Для заданной матрицы сформулировать вектор из элементов её побочной диоганали.Добавить элементы полученого вектора к элемантам строки с инфексом K.Значение K вводиться.Исходная патрица задаеться в виде двумерного массива случайны образом.Вывести на экран исходную и результирующую мартицы.

Drongo
20-12-2011, 22:20
Daswedoc, Есть какие-либо наработки, мысли? Для начала ознакомьтесь с Правилами Форума (http://forum.oszone.net/announcement-21-187.html)




© OSzone.net 2001-2012