Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 15.02.2015
Сообщений: 12

Программа для коррекции орбиты в циклическом ускорителе

15.02.2015, 20:56. Показов 2817. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем. Нужна ваша помощь. Учусь в аспирантуре и на данный момент, занимаюсь моделированием. Начальник поручил мне, что бы я написал программу для корекции орбиты в циклическом ускорителе. Желательно написать на Форртране или С++. Беда в том, что мои навыки программирования заканчиваются на умении вывести Hello, world.

Суть задачи. Есть примерно сто элементов, на каждом элементе есть ровно десять параметров - бета-функции, набеги фаз и т.д. Пользователь должен выбрать 3 корректора из 16 и вручную ввести название элемента, на котором будет корректироваться положение пучка и расстояние, на которое нужно сдвинуть пучек. Затем, с помощью не сложных алгоритмов (пара довольно легких формул), я считаю силы для этих трех корректоров и выдаю. Все это собираюсь делать в C++. Весь диалог в консоле.

Как бы вы это реализовали?

Проблема в том. Что мне посоветовали делать это через struct. Я уже начал забивать значения. Но вот вопрос - как мне апотом обратится именно к значениям именно того элемента. Название элемента на котором собираюсь делать коррекцию, я сохраняю в переменную CorElement, но как мне при вычислениях, оперировать параметрами именно этого элемента? как их соотнести? Никогда такого не делал, а времени нормально разбираться со всем нет. Может есть другой путь. подскажите плиз.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.02.2015, 20:56
Ответы с готовыми решениями:

Программа для расчета орбиты ИСЗ
Доброго времени суток, уважаемые форумчане. Есть такая задача: Составить программу, иллюстрирующую полет спутника по эллиптической...

Оценка фокального параметра и эксцентриситета орбиты через уравнение орбиты
дано угол ист анамалии 3 эксцентриситет высота апогея и перигея как найти оценку скрипт точнее?! помогите((( Добавлено через 2...

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

30
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
16.02.2015, 17:22
Студворк — интернет-сервис помощи студентам
Блин, это надолго, наверное...

В общем, идея простая - добавить поле corpoint в структуру (только вместо char лучше std::string использовать):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct Element
{   
    std::string corpoint;   //  1 параметр
    float s;                //  2 параметр
    float betx;             //  3 параметр
    float bety;             //  4 параметр
    float alfx;             //  5 параметр
    float alfy;             //  6 параметр
    float dx;               //  7 параметр
    float dy;               //  8 параметр
    float mux;              //  9 параметр
    float muy;              // 10 параметр
};
и приглашать пользователя ввести строку:

C++
1
2
3
    cout << "\nPlease chose correction point: ";
    std::string corpoint;
    cin >> corpoint;
которую потом функцией поиска (сравниваем строки - которую ввёл пользователь и поле corpoint каждого элемента) находим в массиве элементов. Как только строки идентичны, элемент выбирается для использования в подсчётах.

Добавлено через 35 минут
Ещё раз, чтобы уяснить терминологию:

Вот формула:
F = sqrt (DRI51.betx^2 - SF12.betx^2)*(DRI51.mux - SF12.mux)*1/2
здесь:
DRI51 - точка коррекции
SF12 - корректор
DRI51.betx и SF12.betx - бета-функции

правильно?

Что есть F? Сила? Тот самый результат, который потом надо вывести на экран?

И надо, чтобы имя точки коррекции (в нашей формуле DRI51) и корректора (в нашей формуле SF12) пользователь мог выбрать через диалог в консоли и дальше это всё подставлялось в формулу, считалось и выводилось на экран?
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
16.02.2015, 19:55
В общем, пока ещё коряво и не работает, но общий смысл примерно уже прощупывается:

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
#include <iostream>         // для ввода-вывода
#include <fstream>          // для чтения из файла
#include <string>           // для строк класса string
#include <cmath>            // для математических функций
 
const int ARR_SIZE = 100;   // количество элементов
 
struct Element
{
    std::string name;        // имя
    double s;                // 1 параметр
    double betx;             // 2 параметр
    double bety;             // 3 параметр
    double alfx;             // 4 параметр
    double alfy;             // 5 параметр
    double dx;               // 6 параметр
    double dy;               // 7 параметр
    double mux;              // 8 параметр
    double muy;              // 9 параметр
};
 
// прототип функции поиска:
double find_and_set(std::string name, int parameter, Element * elem);
 
// прототип функции выбора параметра:
int choose_parameter(std::string name);
 
// прототип функции подсчёта результатов:
double calculate_result(double a, double b, double c, double d);
 
int main()
{
    const int COR_NUM = 3;      // количество корректоров
 
    Element elem[ARR_SIZE];     // массив из 100 элементов
 
    std::ifstream fin;          // создание объекта fin типа ifstream
    fin.open("data.txt");       // ассоциирование создание объекта fin
                                // c файлом data.txt
 
    for (int i=0; i<ARR_SIZE; i++) // циклом читаем из файла в массив:
    {   // используем созданный нами объект fin по аналогии с объектом cin:
        fin.ignore();                    // убираем лишние символы из потока
        getline (fin, elem[i].name);     // имя
        fin >> elem[i].s;                // 1 параметр
        fin >> elem[i].betx;             // 2 параметр
        fin >> elem[i].bety;             // 3 параметр
        fin >> elem[i].alfx;             // 4 параметр
        fin >> elem[i].alfy;             // 5 параметр
        fin >> elem[i].dx;               // 6 параметр
        fin >> elem[i].dy;               // 7 параметр
        fin >> elem[i].mux;              // 8 параметр
        fin >> elem[i].muy;              // 9 параметр
    }
    fin.close ();   // закрытие соединения ввода с файлом
 
    double parameter = 0;
    std::string corpointName;
    std::string correctorName;
 
    for (int i=0; i<COR_NUM; ++i) // в цикле трижды запрашиваем у пользователя имена элементов:
    {
        std::cout << "\nPlease choose " << i+1 << " correction point: ";
        std::cin >> corpointName;
        parameter = choose_parameter(corpointName);
        double a = find_and_set(corpointName, parameter, elem);
 
        std::cout << "\nPlease choose " << i+1 << " corrector: ";
        std::cin >> correctorName;
        parameter = choose_parameter(correctorName);
        double b = find_and_set(corpointName, parameter, elem);
 
        std::cout << "\nPlease choose " << i+2 << " correction point: ";
        std::cin >> corpointName;
        parameter = choose_parameter(corpointName);
        double c = find_and_set(corpointName, parameter, elem);
 
        std::cout << "\nPlease choose " << i+2 << " corrector: ";
        std::cin >> correctorName;
        parameter = choose_parameter(correctorName);
        double d = find_and_set(corpointName, parameter, elem);
 
 
        // выводим результат на экран:
        std::cout << i+1 << " result is: " << calculate_result(a, b, c, d);
        std::cout << std::endl << std::endl;
    }
 
    std::cin.get(); // ожидание ввода от пользователя (чтобы окно внезапно не закрывалось
                    // по завершении программы и можно было прочитать результаты)
 
    return 0;
}
 
double find_and_set(std::string name, int parameter, Element * elem)
{
    double chosenField = 0;
    while (true)
    {
        for (int i=1; i<ARR_SIZE; i++)
        {
            if (name == elem[i].name)
            {
                switch (parameter)
                {
                    case 1: chosenField = elem[i].s;                // 1 параметр
                        break;
                    case 2: chosenField = elem[i].betx;             // 2 параметр
                        break;
                    case 3: chosenField = elem[i].bety;             // 3 параметр
                        break;
                    case 4: chosenField = elem[i].alfx;             // 4 параметр
                        break;
                    case 5: chosenField = elem[i].alfy;             // 5 параметр
                        break;
                    case 6: chosenField = elem[i].dx;               // 6 параметр
                        break;
                    case 7: chosenField = elem[i].dy;               // 7 параметр
                        break;
                    case 8: chosenField = elem[i].mux;              // 8 параметр
                        break;
                    case 9: chosenField = elem[i].muy;              // 9 параметр
                        break;
                }
                return chosenField;
            }
        }
        std::cout << "\nNo matches were found. Try another name or parameter number.\n";
        std::cout << "\nPlease choose existed name: ";
        std::cin >> name;
        std::cout << "\nPlease choose permitted parameter number: ";
        std::cin >> parameter;
    }
}
 
int choose_parameter(std::string name)
{
    std::cout << "\nPlease choose parameter from list\n"
                 "(if you want to choose first parameter press 1,\n"
                 "if second press 2 etc.):\n\n";
    std::cout << "1. " << name << ".s"    << std::endl; // 1 параметр
    std::cout << "2. " << name << ".betx" << std::endl; // 2 параметр
    std::cout << "3. " << name << ".bety" << std::endl; // 3 параметр
    std::cout << "4. " << name << ".alfx" << std::endl; // 4 параметр
    std::cout << "5. " << name << ".alfy" << std::endl; // 5 параметр
    std::cout << "6. " << name << ".dx"   << std::endl; // 6 параметр
    std::cout << "7. " << name << ".dy"   << std::endl; // 7 параметр
    std::cout << "8. " << name << ".mux"  << std::endl; // 8 параметр
    std::cout << "9. " << name << ".muy"  << std::endl; // 9 параметр
    int parameter;
    std::cin >> parameter;
 
    return parameter;
}
 
double calculate_result(double a, double b, double c, double d)
{
    return sqrt ((pow(a, 2) - pow(b, 2)) * (pow(c, 2) - pow(d, 2))) * 0.5;
}
Вложения
Тип файла: txt data.txt (9.5 Кб, 2 просмотров)
1
0 / 0 / 0
Регистрация: 15.02.2015
Сообщений: 12
16.02.2015, 21:53  [ТС]
gru74ik, спасибо большое - сейчас сяду разбираться. Мы обычно говорим сила - но по факту это будет или магнитная индукция или что тоже самое - код тока, который нужно будет подать на корректор, что бы получить необходимое магнитное поле. Просто это будет решаться добавлением одного коифициента, в зависимости от требуемой размерности.

да, все правильно

DRI51 - точка коррекции
SF12 - корректор
DRI51.betx и SF12.betx - бета-функции
естественно, это не все параметры, которые будут использоваться в формуле, но это уже детали - главное извлечь хоть один.

Спасибо.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
16.02.2015, 22:19
Azera, не могу сделать, чтобы прога читала весь файл полностью в массив. Что-то там не стыкуется, надо сидеть, искать причину. Читает только кусок 76-го элемента и далее до конца.
Попробовал с векторами сделать, поправил текстовый файл (проверил на лишние пробелы, табуляции, символы переноса строки, русские буквы), но не помогает пока что. Буду ещё думать.
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
#include <iostream>         // для ввода-вывода
#include <fstream>          // для чтения из файла
#include <string>           // для строк класса string
#include <cmath>            // для математических функций
#include <vector>           // для массива структур
 
const int ARR_SIZE = 100;   // количество элементов
 
struct Element
{
    std::string name;        // имя
    double s;                // 1 параметр
    double betx;             // 2 параметр
    double bety;             // 3 параметр
    double alfx;             // 4 параметр
    double alfy;             // 5 параметр
    double dx;               // 6 параметр
    double dy;               // 7 параметр
    double mux;              // 8 параметр
    double muy;              // 9 параметр
};
 
// прототип функции поиска:
double find_and_set(std::string name, int parameter, std::vector <Element> elem);
 
// прототип функции выбора параметра:
int choose_parameter(std::string name);
 
// прототип функции подсчёта результатов:
double calculate_result(double a, double b, double c, double d);
 
// Перегрузка оператора >>
std::istream & operator>>(std::istream & is, Element & item);
 
int main()
{
    const int COR_NUM = 3;      // количество корректоров
 
    std::vector <Element> elem;     // массив элементов
 
    std::ifstream fin;          // создание объекта fin типа ifstream
    fin.open("data.txt");       // ассоциирование создание объекта fin
                                // c файлом data.txt
 
    // заполняем массив (вектор) нашими элементами из файла:
    for (Element temp; ;)
    {
        fin >> temp;    // временный объект
        elem.push_back(temp);   // затолкнуть в конец вектора очередной элемент
        if (fin.get() == EOF) break; //как достигнем конца файла, прекратить чтение
    }
 
    for (int i=0; i<ARR_SIZE; ++i) // циклом выводим на экран чего у нас в массиве:
    {   
        std::cout << i+1 << " element:" << std::endl;
        std::cout << ".name == " << elem[i].name << std::endl; // имя
        std::cout << "   .s == " << elem[i].s    << std::endl; // 1 параметр
        std::cout << ".betx == " << elem[i].betx << std::endl; // 2 параметр
        std::cout << ".bety == " << elem[i].bety << std::endl; // 3 параметр
        std::cout << ".alfx == " << elem[i].alfx << std::endl; // 4 параметр
        std::cout << ".alfy == " << elem[i].alfy << std::endl; // 5 параметр
        std::cout << "  .dx == " << elem[i].dx   << std::endl; // 6 параметр
        std::cout << "  .dy == " << elem[i].dy   << std::endl; // 7 параметр
        std::cout << " .mux == " << elem[i].mux  << std::endl; // 8 параметр
        std::cout << " .muy == " << elem[i].muy  << std::endl; // 9 параметр
        std::cout << std::endl;
 
    }
 
    fin.close ();   // закрытие соединения ввода с файлом
 
    double parameter = 0;
    std::string corpointName;
    std::string correctorName;
 
    double result[COR_NUM];     // массив для хранения результатов вычислений
 
    for (int i=0; i<COR_NUM; ++i) // в цикле трижды запрашиваем у пользователя имена элементов:
    {
        std::cout << "\nPlease choose 1 correction (a) point for " << i+1 << " expression: ";
        std::cin >> corpointName;
        parameter = choose_parameter(corpointName);
        double a = find_and_set(corpointName, parameter, elem);
 
        std::cout << "\nPlease choose 1 corrector (b) for " << i+1 << " expression: ";
        std::cin >> correctorName;
        parameter = choose_parameter(correctorName);
        double b = find_and_set(corpointName, parameter, elem);
 
        std::cout << "\nPlease choose 2 correction (c) point for " << i+1 << " expression: ";
        std::cin >> corpointName;
        parameter = choose_parameter(corpointName);
        double c = find_and_set(corpointName, parameter, elem);
 
        std::cout << "\nPlease choose 2 corrector (d) for " << i+1 << " expression: ";
        std::cin >> correctorName;
        parameter = choose_parameter(correctorName);
        double d = find_and_set(corpointName, parameter, elem);
 
        result[i] = calculate_result(a, b, c, d);
    }
 
    std::cout << std::endl;
 
    for (int i=0; i<COR_NUM; ++i) // выводим результаты на экран:
        std::cout << "This is " << i+1 << " result: " << result[i] << std::endl;
 
    std::cin.get(); // ожидание ввода от пользователя (чтобы окно внезапно не закрывалось
                    // по завершении программы и можно было прочитать результаты)
 
    return 0;
}
 
double find_and_set(std::string name, int parameter, std::vector <Element> elem)
{
    double chosenField = 0;
    while (true)
    {
        for (int i=0; i<ARR_SIZE; ++i)
        {
            if (name == elem[i].name)
            {
                switch (parameter)
                {
                    case 1: chosenField = elem[i].s;                // 1 параметр
                        break;
                    case 2: chosenField = elem[i].betx;             // 2 параметр
                        break;
                    case 3: chosenField = elem[i].bety;             // 3 параметр
                        break;
                    case 4: chosenField = elem[i].alfx;             // 4 параметр
                        break;
                    case 5: chosenField = elem[i].alfy;             // 5 параметр
                        break;
                    case 6: chosenField = elem[i].dx;               // 6 параметр
                        break;
                    case 7: chosenField = elem[i].dy;               // 7 параметр
                        break;
                    case 8: chosenField = elem[i].mux;              // 8 параметр
                        break;
                    case 9: chosenField = elem[i].muy;              // 9 параметр
                        break;
                }
                return chosenField;
            }
        }
        std::cout << "\nNo matches were found. Try another name or parameter number.\n";
        std::cout << "\nPlease choose existed name: ";
        std::cin >> name;
        std::cout << "\nPlease choose permitted parameter number: ";
        std::cin >> parameter;
    }
}
 
int choose_parameter(std::string name)
{
    std::cout << "\nPlease choose parameter from list:\n\n";
    std::cout << "1. " << name << ".s"    << std::endl; // 1 параметр
    std::cout << "2. " << name << ".betx" << std::endl; // 2 параметр
    std::cout << "3. " << name << ".bety" << std::endl; // 3 параметр
    std::cout << "4. " << name << ".alfx" << std::endl; // 4 параметр
    std::cout << "5. " << name << ".alfy" << std::endl; // 5 параметр
    std::cout << "6. " << name << ".dx"   << std::endl; // 6 параметр
    std::cout << "7. " << name << ".dy"   << std::endl; // 7 параметр
    std::cout << "8. " << name << ".mux"  << std::endl; // 8 параметр
    std::cout << "9. " << name << ".muy"  << std::endl; // 9 параметр
    std::cout << std::endl;
    int parameter;
    std::cin >> parameter;
 
    return parameter;
}
 
double calculate_result(double a, double b, double c, double d)
{
    return sqrt ((pow(a, 2) - pow(b, 2)) * (pow(c, 2) - pow(d, 2))) * 0.5;
}
 
// Перегрузка оператора >>
std::istream & operator>>(std::istream & is, Element & item)
{
    is >> item.name
       >> item.s
       >> item.betx
       >> item.bety
       >> item.alfx
       >> item.alfy
       >> item.dx
       >> item.dy
       >> item.mux
       >> item.muy;
 
    return is;
}
Вложения
Тип файла: txt data.txt (9.5 Кб, 2 просмотров)
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
16.02.2015, 23:04
Если сделать массив на 24 элемента, то работает как положено. Правда формула иногда выдаёт в качестве результата значение nan (not a number) - видимо, имеет место деление на ноль.
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
#include <iostream>         // для ввода-вывода
#include <fstream>          // для чтения из файла
#include <string>           // для строк класса string
#include <cmath>            // для математических функций
#include <vector>           // для массива структур
 
const int ARR_SIZE = 24;   // количество элементов
 
struct Element
{
    std::string name;        // имя
    double s;                // 1 параметр
    double betx;             // 2 параметр
    double bety;             // 3 параметр
    double alfx;             // 4 параметр
    double alfy;             // 5 параметр
    double dx;               // 6 параметр
    double dy;               // 7 параметр
    double mux;              // 8 параметр
    double muy;              // 9 параметр
};
 
// прототип функции поиска:
double find_and_set(std::string name, int parameter, std::vector <Element> elem);
 
// прототип функции выбора параметра:
int choose_parameter(std::string name);
 
// прототип функции подсчёта результатов:
double calculate_result(double a, double b, double c, double d);
 
// Перегрузка оператора >>
std::istream & operator>>(std::istream & is, Element & item);
 
int main()
{
    const int COR_NUM = 3;      // количество корректоров
 
    std::vector <Element> elem;     // массив элементов
 
    std::ifstream fin;          // создание объекта fin типа ifstream
    fin.open("data.txt");       // ассоциирование создание объекта fin
                                // c файлом data.txt
 
    // заполняем массив (вектор) нашими элементами из файла:
    for (Element temp; ;)
    {
        fin >> temp;    // временный объект
        elem.push_back(temp);   // затолкнуть в конец вектора очередной элемент
        if (fin.get() == EOF) break; //как достигнем конца файла, прекратить чтение
    }
 
    for (int i=0; i<ARR_SIZE; ++i) // циклом читаем из файла в массив:
    {   /*
        fin >> elem[i].name;             // имя
        fin >> elem[i].s;                // 1 параметр
        fin >> elem[i].betx;             // 2 параметр
        fin >> elem[i].bety;             // 3 параметр
        fin >> elem[i].alfx;             // 4 параметр
        fin >> elem[i].alfy;             // 5 параметр
        fin >> elem[i].dx;               // 6 параметр
        fin >> elem[i].dy;               // 7 параметр
        fin >> elem[i].mux;              // 8 параметр
        fin >> elem[i].muy;              // 9 параметр
        */
        std::cout << i+1 << " element:" << std::endl;
        std::cout << ".name == " << elem[i].name << std::endl; // имя
        std::cout << "   .s == " << elem[i].s    << std::endl; // 1 параметр
        std::cout << ".betx == " << elem[i].betx << std::endl; // 2 параметр
        std::cout << ".bety == " << elem[i].bety << std::endl; // 3 параметр
        std::cout << ".alfx == " << elem[i].alfx << std::endl; // 4 параметр
        std::cout << ".alfy == " << elem[i].alfy << std::endl; // 5 параметр
        std::cout << "  .dx == " << elem[i].dx   << std::endl; // 6 параметр
        std::cout << "  .dy == " << elem[i].dy   << std::endl; // 7 параметр
        std::cout << " .mux == " << elem[i].mux  << std::endl; // 8 параметр
        std::cout << " .muy == " << elem[i].muy  << std::endl; // 9 параметр
        std::cout << std::endl;
 
    }
 
    fin.close ();   // закрытие соединения ввода с файлом
 
    double parameter = 0;
    std::string corpointName;
    std::string correctorName;
 
    double result[COR_NUM];     // массив для хранения результатов вычислений
 
    for (int i=0; i<COR_NUM; ++i) // в цикле трижды запрашиваем у пользователя имена элементов:
    {
        std::cout << "\nPlease choose 1 correction (a) point for " << i+1 << " expression: ";
        std::cin >> corpointName;
        parameter = choose_parameter(corpointName);
        double a = find_and_set(corpointName, parameter, elem);
 
        std::cout << "\nPlease choose 1 corrector (b) for " << i+1 << " expression: ";
        std::cin >> correctorName;
        parameter = choose_parameter(correctorName);
        double b = find_and_set(corpointName, parameter, elem);
 
        std::cout << "\nPlease choose 2 correction (c) point for " << i+1 << " expression: ";
        std::cin >> corpointName;
        parameter = choose_parameter(corpointName);
        double c = find_and_set(corpointName, parameter, elem);
 
        std::cout << "\nPlease choose 2 corrector (d) for " << i+1 << " expression: ";
        std::cin >> correctorName;
        parameter = choose_parameter(correctorName);
        double d = find_and_set(corpointName, parameter, elem);
 
        result[i] = calculate_result(a, b, c, d);
    }
 
    std::cout << std::endl;
 
    for (int i=0; i<COR_NUM; ++i) // выводим результаты на экран:
        std::cout << "This is " << i+1 << " result: " << result[i] << std::endl;
 
    std::cin.get(); // ожидание ввода от пользователя (чтобы окно внезапно не закрывалось
                    // по завершении программы и можно было прочитать результаты)
 
    return 0;
}
 
double find_and_set(std::string name, int parameter, std::vector <Element> elem)
{
    double chosenField = 0;
    while (true)
    {
        for (int i=0; i<ARR_SIZE; ++i)
        {
            if (name == elem[i].name)
            {
                switch (parameter)
                {
                    case 1: chosenField = elem[i].s;                // 1 параметр
                        break;
                    case 2: chosenField = elem[i].betx;             // 2 параметр
                        break;
                    case 3: chosenField = elem[i].bety;             // 3 параметр
                        break;
                    case 4: chosenField = elem[i].alfx;             // 4 параметр
                        break;
                    case 5: chosenField = elem[i].alfy;             // 5 параметр
                        break;
                    case 6: chosenField = elem[i].dx;               // 6 параметр
                        break;
                    case 7: chosenField = elem[i].dy;               // 7 параметр
                        break;
                    case 8: chosenField = elem[i].mux;              // 8 параметр
                        break;
                    case 9: chosenField = elem[i].muy;              // 9 параметр
                        break;
                }
                return chosenField;
            }
        }
        std::cout << "\nNo matches were found. Try another name or parameter number.\n";
        std::cout << "\nPlease choose existed name: ";
        std::cin >> name;
        std::cout << "\nPlease choose permitted parameter number: ";
        std::cin >> parameter;
    }
}
 
int choose_parameter(std::string name)
{
    std::cout << "\nPlease choose parameter from list:\n\n";
    std::cout << "1. " << name << ".s"    << std::endl; // 1 параметр
    std::cout << "2. " << name << ".betx" << std::endl; // 2 параметр
    std::cout << "3. " << name << ".bety" << std::endl; // 3 параметр
    std::cout << "4. " << name << ".alfx" << std::endl; // 4 параметр
    std::cout << "5. " << name << ".alfy" << std::endl; // 5 параметр
    std::cout << "6. " << name << ".dx"   << std::endl; // 6 параметр
    std::cout << "7. " << name << ".dy"   << std::endl; // 7 параметр
    std::cout << "8. " << name << ".mux"  << std::endl; // 8 параметр
    std::cout << "9. " << name << ".muy"  << std::endl; // 9 параметр
    std::cout << std::endl;
    int parameter;
    std::cin >> parameter;
 
    return parameter;
}
 
double calculate_result(double a, double b, double c, double d)
{
    return sqrt ((pow(a, 2) - pow(b, 2)) * (pow(c, 2) - pow(d, 2))) * 0.5;
}
 
// Перегрузка оператора >>
std::istream & operator>>(std::istream & is, Element & item)
{
    is >> item.name
       >> item.s
       >> item.betx
       >> item.bety
       >> item.alfx
       >> item.alfy
       >> item.dx
       >> item.dy
       >> item.mux
       >> item.muy;
 
    return is;
}
Вложения
Тип файла: txt data24.txt (2.2 Кб, 2 просмотров)
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
16.02.2015, 23:05
P.S. Пойду спать, час ночи уже...
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
17.02.2015, 03:02
Цитата Сообщение от gru74ik Посмотреть сообщение
Правда формула иногда выдаёт в качестве результата значение nan
Возможная причина - отрицательное основание степени в pow
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
17.02.2015, 07:11
Цитата Сообщение от IrineK Посмотреть сообщение
Возможная причина - отрицательное основание степени в pow
Да, я потом, уже когда засыпал, тоже так подумал. Всю ночь код снился, ппц ^^
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
17.02.2015, 12:57
Переделал функции, вставил проверки, стало покрасивее. Вроде бы, работает корректно.
Но, всё равно, постоянно подмывало всё это дело в класс переделать. Может вечером дома сделаю в виде класса, если будет время.
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
#include <iostream>         // для ввода-вывода
#include <fstream>          // для чтения из файла
#include <string>           // для строк класса string
#include <cmath>            // для математических функций
#include <vector>           // для массива структур
 
struct Element
{
    std::string name;        // имя
    double s;                // 1 параметр
    double betx;             // 2 параметр
    double bety;             // 3 параметр
    double alfx;             // 4 параметр
    double alfy;             // 5 параметр
    double dx;               // 6 параметр
    double dy;               // 7 параметр
    double mux;              // 8 параметр
    double muy;              // 9 параметр
};
 
// прототип функции выбора имени точки коррекции или корректора:
int choose_name(std::string name, int expression, std::vector <Element> elem);
 
// прототип функции выбора параметра:
int choose_parameter(std::string name);
 
// прототип функции выбора значения:
double set_value(int index, int parameter, std::vector <Element> elem);
 
// прототип функции подсчёта результатов:
double calculate_result(double a, double b, double c, double d);
 
// прототип функции перегрузки оператора >>
std::istream & operator>>(std::istream & is, Element & item);
 
int main()
{
    const int COR_NUM = 3;          // количество корректоров
    std::vector <Element> elem;     // массив элементов
 
    std::ifstream fin;          // создание объекта fin типа ifstream
    fin.open("data.txt");       // ассоциирование создание объекта fin
                                // c файлом data.txt
 
    // заполняем массив (вектор) нашими элементами из файла:
    for (Element temp; ; )
    {
        fin >> temp;    // временный объект
        elem.push_back(temp);   // затолкнуть в конец вектора очередной элемент
        if (fin.get() == EOF) break; //как достигнем конца файла, прекратить чтение
    }
 
    fin.close ();   // закрытие соединения ввода с файлом
 
    double parameter = 0;
    int index = 0;
    std::string kindOfElement;
    double result[COR_NUM];     // массив для хранения результатов вычислений
 
    for (int i=0; i<COR_NUM; ++i)
    {
        kindOfElement = "1 correction point";
        index = choose_name(kindOfElement, i+1, elem);
        parameter = choose_parameter(elem[index].name);
        double a = set_value(index, parameter, elem);
 
        kindOfElement = "1 corrector";
        index = choose_name(kindOfElement, i+1, elem);
        parameter = choose_parameter(elem[index].name);
        double b = set_value(index, parameter, elem);
 
        kindOfElement = "2 correction point";
        index = choose_name(kindOfElement, i+1, elem);
        parameter = choose_parameter(elem[index].name);
        double c = set_value(index, parameter, elem);
 
        kindOfElement = "2 corrector";
        index = choose_name(kindOfElement, i+1, elem);
        parameter = choose_parameter(elem[index].name);
        double d = set_value(index, parameter, elem);
 
        result[i] = calculate_result(a, b, c, d);
    }
 
    std::cout << std::endl;
 
    for (int i=0; i<COR_NUM; ++i) // выводим результаты на экран:
        std::cout << "This is " << i+1 << " result: " << result[i] << std::endl;
 
    std::cin.get(); // ожидание ввода от пользователя (чтобы окно внезапно не закрывалось
                    // по завершении программы и можно было прочитать результаты)
 
    return 0;
}
 
// определение функции выбора имени точки коррекции или корректора:
int choose_name(std::string name, int num, std::vector <Element> elem)
{
    std::cout << "\nPlease choose " << name << " for " << num << " expression: ";
    std::cin >> name;
    while (true)
    {
        for (size_t i=0; i < elem.size(); ++i)
            if (name == elem[i].name)
                return i;
 
        std::cout << "\nNo matches were found. " << name
                  << " is not exists. Try another name: ";
        std::cin >> name;
    }
}
 
// определение функции выбора параметра:
int choose_parameter(std::string name)
{
    std::cout << "\nPlease choose parameter from list:\n\n";
    std::cout << "1. " << name << ".s"    << std::endl; // 1 параметр
    std::cout << "2. " << name << ".betx" << std::endl; // 2 параметр
    std::cout << "3. " << name << ".bety" << std::endl; // 3 параметр
    std::cout << "4. " << name << ".alfx" << std::endl; // 4 параметр
    std::cout << "5. " << name << ".alfy" << std::endl; // 5 параметр
    std::cout << "6. " << name << ".dx"   << std::endl; // 6 параметр
    std::cout << "7. " << name << ".dy"   << std::endl; // 7 параметр
    std::cout << "8. " << name << ".mux"  << std::endl; // 8 параметр
    std::cout << "9. " << name << ".muy"  << std::endl; // 9 параметр
    std::cout << std::endl;
    int parameter;
    std::cin >> parameter;
    while (true)
    {
        if (parameter >=1 && parameter <= 9)
        {
            return parameter;
        }
        else
        {
            std::cout << "\nParameter is wrong. Try another parameter number (from 1 to 9): ";
            std::cin >> parameter;
        }
    }
}
 
// определение функции выбора значения:
double set_value(int index, int parameter, std::vector <Element> elem)
{
    double chosenField = 0;
 
    switch (parameter)
    {
        case 1: chosenField = elem[index].s;                // 1 параметр
            break;
        case 2: chosenField = elem[index].betx;             // 2 параметр
            break;
        case 3: chosenField = elem[index].bety;             // 3 параметр
            break;
        case 4: chosenField = elem[index].alfx;             // 4 параметр
            break;
        case 5: chosenField = elem[index].alfy;             // 5 параметр
            break;
        case 6: chosenField = elem[index].dx;               // 6 параметр
            break;
        case 7: chosenField = elem[index].dy;               // 7 параметр
            break;
        case 8: chosenField = elem[index].mux;              // 8 параметр
            break;
        case 9: chosenField = elem[index].muy;              // 9 параметр
            break;
    }
    return chosenField;
}
 
// определение функции подсчёта результатов:
double calculate_result(double a, double b, double c, double d)
{
    return sqrt ((pow(a, 2) - pow(b, 2)) * (pow(c, 2) - pow(d, 2))) * 0.5;
}
 
// определение функции перегрузки оператора >>
std::istream & operator>>(std::istream & is, Element & item)
{
    is >> item.name
       >> item.s
       >> item.betx
       >> item.bety
       >> item.alfx
       >> item.alfy
       >> item.dx
       >> item.dy
       >> item.mux
       >> item.muy;
 
    return is;
}
Вложения
Тип файла: txt data.txt (10.5 Кб, 4 просмотров)
1
0 / 0 / 0
Регистрация: 15.02.2015
Сообщений: 12
18.02.2015, 20:26  [ТС]
gru74ik, спасибо большое. только добрался домой. Так получилось, что из-за другого задания на весь день - выпал.
Сегодня отпросился у начальника - так что до конца недели я свободен - засяду разбираться с основами С++ и с тем, что здесь написанно. Чувствую, что это мне ещё ой как пригодиться.

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

С конкретными формулами по которым буду считать поля - начну разбираться завтра. Хотя там все просто, но есть куча приближенных методов подсчета, суть одна как и используемые значения параметров (беты, набеги фаз и т.д. ), но надо выбрать что-то конкретное - а статья на 50 страниц и на английском. Просто в формулах появяться пару коифициентов и их будет 6. 3 формулы для вертикальной плоскости (поля на каждый корректор) и 3 для горизонтальной.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
19.02.2015, 09:49
Azera, ну как разберётесь со статьёй и формулами, так и код поправим. Это уже намного проще будет. Как говориться, "были бы кости, мясо нарастёт", а костяк кода уже написан. Так что, слово за Вами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.02.2015, 09:49
Помогаю со студенческими работами здесь

Вычислить параметр стохастичности s для орбиты
Возникла проблема с заданием про стохастичность. Само задание: Дано множество Г(n) взаимно простых остатков по модулю n и динамическая...

Вычислить параметр стохастичности для орбиты
Дано множество Г(n) взаимно простых остатков по модулю n и динамическая система f(x)=2*x mod n. Вычислить параметр стохастичности s для...

Определите для водородоподобного атома радиус n-й боровской орбиты
№1 Определите для водородоподобного атома радиус n-й боровской орбиты , скорость электрона на ней. вычислить эти величины для 1й...

Как заставить работать макросы, написанные в excel 2003, для коррекции данных в word 2007?
ситуация следующая макросы, написанные в excel 2003 для коррекции данных в word 2003 все открывается правится, сохраняется, НО вот на...

Орбиты
Имеется модель солнечной системы. Как нарисовать в ней орбиты для каждой планеты? float Width = 600; float Height = 600; float...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru