Vytvorte program, který bude císt chemické vzorce oxidu a prevádet je na jejich názvy.
Ctrl
D). oxidy.C. find_first_of a
find_first_not_of; jejich popis
byl doplnen do 4. prednásky
#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;
}