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  }