Waňov web

PB161 Jazyk C++ - 5. cvicení

-ný, -natý, -itý, -icitý... - ceské názvosloví oxidu

(práce se stringy)

Zadání:

Vytvorte program, který bude císt chemické vzorce oxidu a prevádet je na jejich názvy.

Pozadavky:

Poznámky:


Riešenie:


oxidy.C
#include<iostream>
#include<map>
#include<vector>
#include<string>
#include<cctype>
#include<cstdlib>
using namespace std;

int i,chyba=0, vyskyt_O,dlzka_vzorca,prve_cislo,druhe_cislo,valencia;
string vzorec,prva_latka,pomocna,
  pripony[]={"ny","naty","ity","icity","icny","ovy","isty","icely"},
  znacky[]={"Fe","Au","Zr","Zn","Y","W","Ca","V","U","C","Ti","Th","Te","Ta",
            "Ag","Sr","Na","S","Se","Sm","Ru","Hg","Rh","Re","Pt","Pd","Os",
            "Pb","Nb","Ni","Mo","Cu","Mn","Li","La","Si","Co","Cd","I","Cr",
            "Cl","Al","Hf","Ge","P","N","K","Sn","Ce","B","Bi","Be","Ba","As",
            "Sb","H","Mg"},
  nazvy[]={ "zelez","zlat","zirkon","zinec","yttr","wolfram","vape","vanad",
            "uran","uhel","titan","thor","tellur","tantal","stribr","stront",
            "sod","siric","selen","samar","ruthen","rtut","rhod","rhen",
            "plat","pallad","osm","olov","niob","nikel","molybden","med",
            "mangan","lith","lanthan","krem","kobalt","kadem","jod","chrom",
            "chlor","hlin","hafn","german","fosfor","dus","drasel","cin",
            "cer","bor","bismut","berill","bar","arsen","antimon","vod",
            "horec"};
map<string,string>vynimky,pom;
map<string,string>::iterator p;
//===========================MAIN===============================================
int main(void)
{
 cout << "Program na prevod vzorcov oxidov na ich slovny prepis. "<<endl;
//=====================VYNIMKY==================================================
vynimky.insert(make_pair("H2O","voda"));
vynimky.insert(make_pair("Fe3O4","oxid zeleznato-zelezity"));
vynimky.insert(make_pair("CO2","oxid uhl-icity(4-mocny)"));
vynimky.insert(make_pair("MnO","oxid manga-naty(2-mocny)"));
vynimky.insert(make_pair("ReO3","oxid rheni-ovy(6-mocny)"));
vynimky.insert(make_pair("P2O5","oxid fosforecny(5-mocny)"));
vynimky.insert(make_pair("P4O10","oxid fosforecny(5-mocny)"));
//=====================hlavny cyklus============================================


 for(;;)      // hlavny cyklus
 {
  cout <<endl<< "Zadaj vzorec: ";     //nacitanie vstupu
  if (!(cin >> vzorec)) break;  // ak EOF tak koniec programu

 if(vynimky.find(vzorec)!=vynimky.end())           // kontrola vynimiek
   {
	  p=vynimky.find(vzorec);
	  cout<<vzorec<<" = "<<p->second<<endl;
	  continue;
	 }                                           // koniec kontroly

  vyskyt_O=vzorec.find('O');    // kde sa nachadza O
  if (vyskyt_O>3)
  	 {
      cout << "CHYBA: Nemoze to byt oxid!!! "<< endl;
      chyba=1;
		  continue;
		 };
  if (vyskyt_O==0)                   // ak obsahuje prvok Os alebo neobsahuje O
     {pomocna=vzorec; pomocna[0]=' ';
      vyskyt_O=pomocna.find('O');
      if(vyskyt_O<2 ||vyskyt_O>3)
        {
         cout << "CHYBA: Nemoze to byt oxid!!! "<< endl;
         chyba=1;
		     continue;
        }
     }
	prve_cislo=druhe_cislo=1;
//==============testovanie vzorca na korektnost druheho cisla===================
  if (vyskyt_O==static_cast<int>(vzorec.size()-2))       //za O je jeden znak


   {
    if (isdigit(vzorec[vyskyt_O+1]))
	  druhe_cislo=vzorec[vyskyt_O+1]-48;
	else {cout<<"CHYBA:Za O nie je cislo ale znak"<<endl;chyba=3;continue;}
	 }

	if ((vzorec.size()-vyskyt_O)>2)
	 {cout<<"CHYBA:Za O je viac znakov ako jeden"<<endl;chyba=4;continue;}

//==============testovanie vzorca na korektnost prveho cisla====================
  if (isdigit(vzorec[vyskyt_O-1]))
  {
	 prve_cislo=vzorec[vyskyt_O-1]-48;
	 prva_latka=vzorec.substr(0,vyskyt_O-1);
  }
     else {
		if (vyskyt_O>2)
		 {cout<<"CHYBA:Neznamy prvok"<<endl;chyba=5;continue;}
           prve_cislo=1;
           prva_latka=vzorec.substr(0,vyskyt_O);
  	  }


  if (prve_cislo<1 || druhe_cislo<1)
   {cout <<"CHYBA: pocet atomov musi byt kladny\n";
    return 9;}

  if(!(prve_cislo%2) && !(druhe_cislo%2))    // delenie 2
    {prve_cislo/=2;druhe_cislo/=2;}

//============ samotny preklad vzorca===========================================
                                                     // nie je vo vynimkach
 dlzka_vzorca=-5;                        //dlzka_vzorca je len pomocna premenna
 for(i=0;i<57;i++)
   if (znacky[i]==prva_latka) {dlzka_vzorca=i;break;}

if (dlzka_vzorca==(-5))
     {cout<<vzorec<<"- prvy prvok nebol najdeny ako platny!!";chyba=7; }
  else
     {
      valencia=static_cast<int>((druhe_cislo*2)/prve_cislo)-1;
      if (valencia<8 && valencia>=0 &&      ((druhe_cislo*2)%prve_cislo)==0)
         {cout<<vzorec<<" = "<<"oxid "<<nazvy[dlzka_vzorca];
          cout<<"-"<<pripony[valencia]<<" ("<<valencia+1<<"mocny)"<<endl;}
      else {cout<<vzorec<<" nema platnu valenciu (1-8)!!";chyba=6; }
     }

 }
 cout << endl;
 return chyba;
}



Nahor