-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.cpp
155 lines (132 loc) · 5.24 KB
/
main.cpp
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
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <string.h>
#include "Vegrehajt.h"
#include "Beolvas.h"
using namespace mercure;
using namespace std;
/*****************************************************************************/
//a main gondoskodik a program altal megkapott parancssori parameterek
//ertelmezeserol es feldolgozasarol
//megnyitja olvasasra a megadott input fajlt
//a Beolvas fuggveny meghivasaval feldolgozza az input fajl sorait
//megnyitja irasra a megadott fajlnevu szoveges fajlt
//az igy kapott adatokat tovabbitva a megfelelo modszert vegrehajtjo fugvenynek,
//elvegezteti az eredmeny meghatarozasat es output fajlba valo irasat
/*****************************************************************************/
int main(int argc, char *argv[])
{
//a program legalabb 1 legfeljebb 3 parancssori parametert var
if( (argc != 2) && (argc != 3) && (argc != 4) )
{
cout << "a program inditasi parametereinek helyes formaja:" << endl;
cout << "mercure [-m<e|2|4>] <parameterek fajlja> [<eredmeny fajl>]" << endl;
cout << "pl.: mercure -me input.txt output.txt" << endl;
cout << "a [] kozott szerpelo parameterek opcionalisak" << endl;
return 1;
}
string strModszer; //
string strInputFajl; //
string strOutputFajl; //a parancssori parameterek tarolasara
bool bModszerParancsSorbol = false; //ha legalabb 2 parameterrrel hivtuk meg
//a programot es ezek kozul az elso
// modszer valaszto parameterkent ertelmezheto
// "-me" "-m2" "-m4" akkor erteke igaz lesz
switch(argc)
{
case 4: //teljes prameterlistaval torteno inditas eseten
strModszer = argv[1]; //a megadott sorrend szerint ertelmezzuk
strInputFajl = argv[2]; //a parametereket
strOutputFajl = argv[3]; //
bModszerParancsSorbol = true; //es a moszdervalasztast innen fogjuk vegezni
break;
case 2: //minimalis parameterlistaval torteno inditas eseten
strModszer = "-m4"; //
strInputFajl = argv[1]; //a megadott egyetlen parameter az input fajlt jelenti
strOutputFajl = "output_BGGUER.txt"; //a tobbi az alapertelmezett ertekeket kapja
break;
case 3: //ha 2 parameterrel inditjuk a programot
//attol fuggoen, hogy az elsot tudjuk-e modszervalasztaskent ertelmezni
if( (strcmp(argv[1], "-me") == 0) || (strcmp(argv[1], "-m2") == 0) || (strcmp(argv[1], "-m4") == 0) )
{
strModszer = argv[1]; //ha igen akkor az lesz a hasznalt modszer
strInputFajl = argv[2]; //a masodik az inputfajl
strOutputFajl = "output_BGGUER.txt"; //
bModszerParancsSorbol = true; //
}
else //ha nem
{
strModszer = "-m4"; //
strInputFajl = argv[1]; //akkor az elsot input
strOutputFajl = argv[2]; //a masodikat output fajlkent ertelmezzuk
}
break;
}
ifstream infile(strInputFajl.c_str()); //megprobaljuk elerni az inputfajlt
if(!infile) //ha nem sikerul, akkor megszakitjuk a program futasat
{
cerr << strInputFajl << endl;
cerr << "a megadott inputfajlt nem sikerult megnyitni" << endl;
return 1;
}
double** KezdetiErtekek; //ezen keresztul foguk elerni az input fajlbol szarmazo ertekeket
int FeladatokSzama = 0; //megoldando kezdeti ertek feladatok
ModszerValaszto Modszer = RK4; //enum valtozo a modszerek szamara {EULER, RK2, RK4}
//alapertelmezett ertek: Runge-Kutta4
//meghivjuk az input fajl feldolgozasat vegzo fuggvenyt
//ami visszateresi ertekkent double tombokre mutato pointert ad
//amin keresztul elerjuk a kezdeti ertekeket
//a megoldando feladatok szamat es esetlegesen a fajlban rogzitett modszert
//referenciakon keresztuli modositassal szolgaltatja
KezdetiErtekek = Beolvas(infile, Modszer, FeladatokSzama);
if(bModszerParancsSorbol) //ha parancssor ban adtunk meg modszervalasztast
//akkor az lesz a meghatarozott
{
if(strModszer == "-me") Modszer = EULER;
if(strModszer == "-m2") Modszer = RK2;
if(strModszer == "-m4") Modszer = RK4;
}
//egyebkent nem valtoztatunk azon ami az inputfajlbol szarmazik
ofstream outfile(strOutputFajl.c_str()); //megnyitjuk irasra a megfelelo szoveges fajlt
if(!outfile)
{
cerr << "nem sikerult a fajl megnyitasa irasra: (" << strOutputFajl <<")" << endl;
return 1;
}
outfile << "Programozas 2 II. feladat 2012" << endl; //feladatban elvasrt ertek
cout << "Szamitas folyamatban." << endl;
switch(Modszer) //Modszer erteke vagy parancssori parameterbol
//vagy az input fajlbol szarmazik, vagy alapertelmezett
//erteke altal meghatarozottan hivjuk meg a megfelelo vegrehajto fuggvenyt
//a feladatok szamaval megegyezo szamszor
//(egy-egy hivassal egy-egy feladatot tudunk megoldani)
{
case EULER :
for(int iii = 0; iii < FeladatokSzama; iii++)
{
outfile << iii+1;
VegrehajtEuler( KezdetiErtekek[iii], outfile);
}
break;
case RK2 :
for(int iii = 0; iii < FeladatokSzama; iii++)
{
outfile << iii+1;
VegrehajtRK2( KezdetiErtekek[iii], outfile);
}
break;
case RK4 :
for(int iii = 0; iii < FeladatokSzama; iii++)
{
outfile << iii+1;
VegrehajtRK4( KezdetiErtekek[iii], outfile);
}
break;
}
//a szamitasok befejezese utan
outfile.close(); //zarjuk a kimeneti szoveges fajlt
cout << "Szamitas befejezve." << endl;
return 0;
}