Форум программистов, компьютерный форум CyberForum.ru

Довести программу решения ОДУ в консоли до ума - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Удаление файла без возможности его удаления. Подскажите, с чего начать. http://www.cyberforum.ru/cpp-beginners/thread990765.html
есть задачка удаление файла без возможности его удаления, подскажите с чего начать? и нужно ли использовать WinAPI ? может что почитать посоветуете??
C++ Реализация математических функций Где можно найти, как реализованы примитивные мат. функции такие, как sqrt, pow, sin, asin, log и другие и сколько примерно тактов потребуется для каждой из них? Всё что я знаю, что sqrt, скорее всего, использует двоичный поиск, а возведение степень метод "быстрого возведения в степень", но мне интересно сравнить тот же самый pow со степенью 1/2 и sqrt. А, быть может, это одно и то же? http://www.cyberforum.ru/cpp-beginners/thread990757.html
Посчитать значение следующего математического выражения, x вводится с клавиатуры C++
Не знаю, что еще добавить, чтобы норм работало.
C++ Блок-схема!
Всем здраствуйте, кому не сложно, пожайлуста помогите сделать схему алгортима (блок-схему). Вот задание "Найти произведение элементов , которые больше за первый элемент массива" Вот код: #include<stdio.h> #include<conio.h> intresult(intmas, intsize) { int proiz=1; intelement; for (int I=1; I<size; I++) {
C++ Создать массив http://www.cyberforum.ru/cpp-beginners/thread990741.html
Создать массив с 9 действительных чисел и отсортировать его методом вставки,с спаданием.
 

Показать сообщение отдельно
Zambal
83 / 3 / 1
Регистрация: 14.11.2011
Сообщений: 68
28.10.2013, 18:52     Довести программу решения ОДУ в консоли до ума
Задание:
Дано ОДУ (записано в код программы). Требуется решить его 3 из 5 методов (Зейделя, Эйлера-Коши, Рунге-Кутта, Адамса, Милна) - выбраны выделенные. Осуществить проверку на допустимость входных данных (предложена ф-я в коде программы), произвести тестирование (решить всеми тремя способами, повозможности использовать интерактивный инт-с).

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

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
//описание инт-са
class Method{
    int nmbr;
public:
    Method();
    int getMethod(int nmbr);//ф-я выбора нужного метода
    int getInt();//ф-я запрета ввода букв
};
 
int Method::Method()
{
    nmbr = 0;
}
 
int Method::getMethod(int nmbr)
{
    if (nmbr >=1 && nmbr <= 3)//проверка на вхождение значения переменной в границы количества методов
    {   
        switch(nmbr)
        {
        case 1:
            double Adams::A(double x, double y);//выбор метода Адамса
            break;
        case 2:
            double Euler::E(double x, double y);//выбор метода Ейлера
            break;
        case 3:
            double Runge::R(double x, double y);//выбор метода Рунге-Кутта
            break;
        default:
            cout << "Ne hochesh - ne reshai";
        }
    }       
}
 
int Method::getInt()//описание функции запрета ввода букв
{
   int k, n = 0, flgS = 0, c = 0, q = 0;
 
    while (1)
   {
        k = getch();
        if ((k == '-') && (c == 0) && (flgS == 0)) 
       {
          flgS=-1;
          putch('-');
          c++;
       }
 
       if ((k >= '0') && (k <= '9')) 
       {
           printf("%c",k);
           n=n*10+k-'0';
           c++;
           q++;
       }
     
       if (k == 8)
       {
           putch(8);
           putch(' ');
           putch(8);
           n = n / 10;
           q--;
           if (q < 0) q = 0;
           c--;
           if (c == 0) flgS = 0;
       }
 
       if ((k == 13) && (c != 0) && (q != 0)) break;
 
    }
 
    if (flgS == -1) n=-n;
    return n;
}
 
//описание метода Адамса
class Adams{
    double a, b, h;
public:
    Adams();
    double getA(double x, double y);
    double A(double x, double y);
};
 
Adams::Adams()
{
    a = 0; b = 0; h = 0;
}
 
double Adams::getA(double x, double y)
{
    return (y*y * log(x) - y) / x;//уравнение
}
 
double Adams::A(double x, double y)//решение
{
    int i, j;
    cout.precision(10);
    double a, b, h;
    
    cout << "Vvedite granici (a, b) i velichinu shaga (h)\n";
    cin >> a >> b >> h;
        
    if (h < 0)//проверка на положительный шаг
    {
        cout << "Vvedite h > 0:\n";
        cin >> h;
    }
    
    int n = (b - a)/(h + 1);
    double  x[n+1], y[n+1], del[n+1];
    x[0] = a;
    cout << "Vvedite nachal'noe znachenie funkcii";
    cin >> y[0];
    for (i = 1; i <= n; i++)
    {
        x[i] = a + i*h;
        
        if (i <= 3)
        {
            y[i] = y[i-1] + h*getA(x[i-1], y[i-1]);
            del[i] = 0;
        }
 
        else
        {
            del[i] = h/24*(55*getA(x[i-1], y[i-1]) - 59*getA(x[i-2], y[i-2]) + 37*getA(x[i-3], y[i-3]) - 9*getA(x[i-4], y[i-4));
            y[i] = y[i-1] + h/24*(55*getA(x[i-1], y[i-1]) - 59*getA(x[i-2], y[i-2]) + 37*getA(x[i-3], y[i-3]) - 9*getA(x[i-4], y[i-4]));
        }
        cout << i << " " << x[i] << " " << y[i] << " " << del[i] << " " << getA(x[i], y[i]) << endl;
    }
    system ("pause");
    return 0;
}
 
//описание метода Эйлера
class Euler{
    double a, b, h;
public:
    Euler();
    double getE(double x, double y);
    double E(double x, double y);
};
 
Euler::Euler()
{
    a = 0; b = 0; h = 0;
}
 
double Euler::getE(double x, double y)
{
    return (y*y * log(x) - y) / x;//уравнение
}
 
double Euler::E(double x, double y)//решение
{
    double a, b, h;
    cout << "Vvedite granici (a, b) i velichinu shaga (h)\n";
    cin >> a >> b >> h;
    
    if (h < 0)//проверка на положительный шаг
    {
        cout << "Vvedite h > 0:\n";
        cin >> h;
    }
    
    x[0] = a; y[0] = b;
    int n = (b - a)/(h + 1);
    double  x[n+1], y[n+1];
    for(int i = 1; i <= n; i++)
    {
        x[i] = a + i*h;
        y[i] = y[i-1] + h*getE(x[i-1], y[i-1]);
        cout << i << " " << x[i] << " " << y[i] << " " << getE(x[i], y[i]) << endl;
    }
    system ("pause");
    return 0;
}
 
//Описание метода Рунге-Кутта
class Runge{
    double a, b, h;
public:
    Runge();
    double getR(double x, double y);
    double R(double x, double y);
};
 
Runge::Runge()
{
    a = 0; b = 0; h = 0;
}
 
double Runge::getR(double x, double y)
{
    return (y*y * log(x) - y) / x;//уравнение
}
 
double Runge::R(double x, double y)//решение
{
    int i, n = 10;
    double a, b, h;
    
    cout << "Vvedite velichinu shaga (h):\n";
    cin >> h;
    
    if (h < 0)//проверка на положительный шаг
    {
        cout << "Vvedite h > 0:\n";
        cin >> h;
    }
    
    double x[10], y[10], y1[10], k1, k2, k3, k4;
    
    cout << "Vvedite nachalnoe znachenie X:\n";
    cin >> x[0];
    cout << "Vvedite nachalnoe znachenie Y:\n";
    cin >> y[0];
    y1[0] = getM(x[0], y[0]);
    
    for (i = 1; i <= 3; i++)
        {   
            k1 = h*getM(x[i-1],y[i-1]);
            k2 = h*getM(x[i-1]+h/2,y[i-1]+k1/2);
            k3 = h*getM(x[i-1]+h/2,y[i-1]+k2/2);
            k4 = h*getM(x[i-1]+h,y[i-1]+k3);
            x[i]= x[i-1]+h;
            y[i]= y[i-1]+(k1+2*k2+2*k3+k4)/6;
            y1[i]=getM(x[i],y[i]);
    }
    for(i = 1; i <= 3; i++)
    {
        cout << " x = " << x[i] <<"\n y = "<< y[i] << endl;
    }
    
    system ("pause");
    return 0;
}
 
int main()
{   
    int m;
    cout << "1) Metod Adamsa\n" << "2) Metod Eulera\n" << "3) Metod Runge-Kutta\n";
    m = getInt();//ввода значения для переменной выбора номера метода
    cout << "Vi vibrali:\n", m;//подтверждение
    getMethod(m);//выбор метода решения
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 15:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru