|
feherje200605_C++_obj.cpp
|
|
1 #include <iostream> // cin és cout parancsok
2 #include <fstream> // fájlkezelés
3 #include <vector> // vector adattípushoz
4 #include <set> // halmaz adattípushoz
5 #include <map> // szótár adattípushoz
6 #include <algorithm> // sort függvény
7
8 using namespace std;
9
10 class mol // objektumterv: aminosav tulajdonságai (adatai) és egy-két metódus
11 {
12 public:
13 struct adatok { // egy aminosav adatai
14 string az;
15 char betujel;
16 int c,h,o,n,s;
17 int t;
18 };
19 adatok aminosav; // az aminosav egy struktúra a fenti mezőkkel
20 map<char, int> atom; // 4. feladatban lesz szerepe - C, H, O, N, S darabszáma egy aminosavban, maga a vegyjel lesz a kulcs
21 int tomeg(adatok aminosav) // legyen egy ilyen is... egy aminosav molekulatömege
22 {
23 return aminosav.c*12 + aminosav.h*1 + aminosav.o*16 + aminosav.n*14 + aminosav.s*32;
24 }
25 map<char, int> feltolt() // minden objektum (aminosav) esetén feltöltjük ezt a szótárt az objektum (aminosav) adatai alapján
26 {
27 atom['C']=aminosav.c;
28 atom['H']=aminosav.h;
29 atom['O']=aminosav.o;
30 atom['N']=aminosav.n;
31 atom['S']=aminosav.s;
32 return atom; // ez a metódus ezt a szótárt "szolgáltatja"
33 }
34 };
35
36 ofstream fki; // globális fájlváltozó az egyszerűség kedvéért...
37
38 void kiir(int ssz, string sz)
39 {
40 cout << "-------------------------------------------------------------------" << endl;
41 cout << ssz << ". feladat - " << sz << endl;
42 cout << "-------------------------------------------------------------------" << endl;
43 }
44
45 void F1_2(vector<mol> &m)
46 {
47 kiir(1,"Adatok beolvasása");
48 kiir(2,"Aminosavak relatív molekulatömegének meghatározása");
49 ifstream fbe;
50 fbe.open("aminosav.txt");
51 mol tmp; // tmp - átmentileg szükséges az adatok beolvasásához - mol objektum
52 while(fbe>>tmp.aminosav.az&&fbe>>tmp.aminosav.betujel&&fbe>>tmp.aminosav.c&&fbe>>tmp.aminosav.h&&fbe>>tmp.aminosav.o&&fbe>>tmp.aminosav.n&&fbe>>tmp.aminosav.s)
53 {
54 tmp.aminosav.t=tmp.tomeg(tmp.aminosav); // alkalmazzuk az objektumunk tomeg metódusát
55 m.push_back(tmp); // m-ben objektumokat tárolunk
56 }
57 fbe.close();
58 }
59
60 bool tomeg_szerint(mol a, mol b)
61 {
62 return a.aminosav.t < b.aminosav.t; // tömeg szerint növekvő sorrendbe rendezés
63 }
64
65 void F3(vector<mol> m)
66 {
67 kiir(3,"Aminosavak relatív molekulatömegének rendezett kiírása");
68 fki << "3. feladat" << endl;
69 vector<mol> tmp; // mol objektumok átmenetileg szükséges vektora
70 tmp=m; // tmp-t fogjuk rendezni, hogy az eredeti vektorunk megmaradjon
71 sort(tmp.begin(),tmp.end(),tomeg_szerint); // rendezés
72 for(auto amin:tmp) // vektorunk bejárása objektumról objektumra
73 {
74 cout << amin.aminosav.az << " " << amin.aminosav.t << endl; // 3 betűs azonosító és a tömeg kiírása
75 fki << amin.aminosav.az << " " << amin.aminosav.t << endl; // fájlba is...
76 }
77
78 }
79
80 void F4(vector<mol> m, vector<char> &bsa) // bsa vektor címszerinti átadása, hogy feltölthessük a fájl alapján
81 {
82 kiir(4,"BSA fehérje összegképlete");
83 fki << "4. feladat" << endl;
84 ifstream fbe;
85 char tmp;
86 // bsa.txt minden sorában egy karakter van
87 fbe.open("bsa.txt");
88 while(fbe>>tmp) bsa.push_back(tmp);
89 // osszesen egy szótár, olyan, mint az objektumoknál leírt szótár, ebben összesítjük
90 // az objektumok szótáraiban lévő adatokat (C H O N S kulcsok)
91 map<char,int> osszesen;
92 string betuk="CHONS";
93 for(char b:betuk) osszesen[b]=0; // osszesen inicializálása, nulla kezdőértékkel
94
95 for(char a:bsa) // bsa-ból vesszük az egyes aminosavakat (a)
96 for(auto amin:m) // m objektum-vektorunkon is végig megyünk...
97 if(amin.aminosav.betujel==a) // ha az aminosav és az objektum illeszkedik (betűjelek megegyeznek), akkor
98 for(auto ok:amin.feltolt()) // az adott objektum (aminosav) szótára alapján összegezzük az adatokat az osszesen szótárban
99 {
100 osszesen[ok.first]+=ok.second; // first - a kulcs, second a kulcshoz tartozó számérték...
101 }
102
103 osszesen['H']-=2*(bsa.size()-1); // minden kapcsolódáskor kilép egy H2O, ezt le kell vonni...
104 osszesen['O']-=(bsa.size()-1);
105 for(auto ossz:osszesen)
106 {
107 cout << ossz.first << " " << ossz.second << " "; // összegek kiírása
108 fki << ossz.first << " " << ossz.second << " "; // fájlba is...
109 }
110 cout << endl;
111 fki << endl;
112
113 }
114 bool hossz_szerint(vector<int> a, vector<int> b)
115 {
116 return a[0] > b[0]; // csökkenő rendezés lánc hossza szerint
117 }
118
119 // Tirozin (Y), Fenilalanin (W) és a Triptofán (F) után hasít
120 void F5(vector<mol> m, vector<char> bsa)
121 {
122 kiir(5,"BSA hasítása (Y, W, F után) - leghosszabb lánc adatai");
123 fki << "5. feladat" << endl;
124 vector<vector<int>> infok; // információk, amiket keresünk: hossz, kezdete és vége - ilyen 3-asokból van vektorunk
125 set<char> hasit={'Y','W','F'}; // halmazban lesznek a hasító aminosavak
126 int kezdete=1, vege, hossz=0; // infok "alkotóelemei", a kezdetet 1-re állítjuk
127 for(int i=0;i<bsa.size();i++) // bsa vektor bejárása
128 {
129 if(hasit.find(bsa[i])!=hasit.end()) // halmazunkban (hasit) megtaláljuk a bsa aktuális karakterét (aminosavát), tehát hasítás van
130 {
131 vege=i+1; // itt a vége a láncnak (index és valódi sorszám, ugye, ezért van a +1)
132 hossz=vege-kezdete+1; // a +1 itt kell
133 infok.push_back({hossz,kezdete,vege}); // infok vektorba "pakoljuk" a három adat "kis" vektorát
134 kezdete=vege+1; // az estelegesen következő lánc kezdete
135 }
136 }
137 sort(infok.begin(),infok.end(),hossz_szerint); // rendezzük a 3-asokat a hossz adat alapján csökkenő sorrendbe
138 cout << "Leghosszabb lánc: " << infok[0][0] << ", kezdete: " << infok[0][1] << " vége: " << infok[0][2];
139 fki << "Leghosszabb lánc: " << infok[0][0] << ", kezdete: " << infok[0][1] << " vége: " << infok[0][2];
140 }
141
142 void F6(vector<mol> m, vector<char> bsa)
143 {
144 kiir(6,"BSA hasítása (R|A vagy R|V) - első láncban Ciszteinek száma");
145 fki << "6. feladat" << endl;
146
147 int vege; // csak a vége kell, mert az első láncról van szó...
148 for(int i=0;i<bsa.size()-1;i++) // indexeléssel dolgozunk, hogy tudjunk hivatkozni az aktuális és a következő elemre is
149 {
150 if(bsa[i]=='R'&&(bsa[i+1]=='A'||bsa[i+1]=='V')) // hasítás, ha R után A vagy V aminosav jön
151 {
152 vege=i+1; // végét tároljuk és
153 break; // ki is ugorhatunk a ciklusból (lehetne while-lal is, de most így is jó lesz...
154 }
155 }
156 cout << "A hasítás során keletkező első fehérjelánc részletben" << endl;
157 // count függvény: adott vectorban adott értékű elemek darabszámát adja
158 // bsa.begin(), azaz kezdettől a vege-ig terjedő részét nézzük a bsa vektornak
159 cout << count(bsa.begin(),bsa.begin()+vege,'C') << " Cisztein (C) található" << endl;
160 fki << "A hasítás során keletkező első fehérjelánc részletben" << endl;
161 fki << count(bsa.begin(),bsa.begin()+vege,'C') << " Cisztein (C) található" << endl;
162 }
163
164 int main()
165 {
166 setlocale(LC_ALL,"");
167
168 vector<mol> molekula;
169 vector<char> bsa; // 4., 5. és 6. feladathoz
170 F1_2(molekula);
171 fki.open("eredmeny.txt");
172 F3(molekula);
173 F4(molekula,bsa);
174 F5(molekula,bsa);
175 F6(molekula,bsa);
176 fki.close();
177
178 return 0;
179 }