/// <summary> /// Startet die Metall-Saeure Reaktion /// </summary> public override void BeginneReaktion() { // Erhalte die ionisierten Saeurevarianten der Saeure. Die Anzahl der Protonen // in der Saeure gibt die Anzahl der Varianten an, da jeweils Protonen im // Saeurerest sich anlagern koennen List <(Kation wasserstoffIon, Anion saeurerestIon)> saeureVariationen = ReagierendeSaeure.ErhalteIonisierteSaeurevarianten(); // Generiere fuer jede Saerevariante eine Reaktionsgleichung foreach ((Kation wasserstoffIon, Anion saeurerestIon)saeureVariation in saeureVariationen) { // Ionisiere das Metall, damit ein Salz kreiert werden kann Kation metallIon = new Kation(new Molekuel(new Atombindung(ReagierendesMetall, 1), 1)); // Generie das Salz aus dem ionisierten Metall + dem ionisierten // Saeurerest Salz salz = new Salz(metallIon, saeureVariation.saeurerestIon); // Erstelle die Wasserstoffbindung Atombindung wasserstoff = new Atombindung("H₂", "Wasserstoff"); // Erstelle die Reaktionsstoffe mit den vorhandenen Bindungen. // Diese Klasse merkt sich zu den Bindungen auch die Anzahl // der Molekuele nach dem ausgleichen Reaktionsstoff wasserstoffKomponente = new Reaktionsstoff(wasserstoff); Reaktionsstoff metallKomponente = new Reaktionsstoff(ReagierendesMetall); Reaktionsstoff saeureKomponente = new Reaktionsstoff(ReagierendeSaeure); Reaktionsstoff salzKomponente = new Reaktionsstoff(salz); // Die Anzahl der Metallkomponente entspricht der Anzahl der Metallatome // im Salz bei der Salzkreierung werden die Metall-Atome so gesetzt, dass // sie mit der Ladung des Saeurerestes uebereinstimmt metallKomponente.Anzahl = salz.Kation.Molekuel.AnzahlAtomeInMolekuel(); // Die Anzahl der Saeurekomponente entspricht der Anzahl des // Saeurerest-Molekuels im Salz bei der Salzkreierung werden // die Saeurerest-Molekuele so gesetzt, dass sie mit der Ladung // des Metalls übereinstimmt saeureKomponente.Anzahl = salz.Anion.Molekuel.Anzahl; // Die Anzahl der Salzkomponente bleibt bei dieser Reaktion immer eins salzKomponente.Anzahl = 1; // Erhalte die Anzahl der Wasserstoffatome in der Saeure double maximaleWasserstoffAtome = saeureKomponente.Anzahl * ReagierendeSaeure.Wasserstoff.AnzahlAtomeInMolekuel(); // Subtrahiere die Anzahl der Wasserstoffatome in der Saeure mit der // Anzahl der Wasserstoffatome im Salz um die restlichen // Wasserstoffatome für die Wasserstoffbindung H2 zu erhalten double restlicheWasserstoffAtome = maximaleWasserstoffAtome - (salzKomponente.Anzahl * salz.Anion.Molekuel.Anzahl * (ReagierendeSaeure.Wasserstoff.AnzahlAtomeInMolekuel() - saeureVariation.wasserstoffIon.Molekuel.AnzahlAtomeInMolekuel())); // Die Anzahl der Wasserstoffbindung H2 ergibt sich aus der Anzahl // Wasserstoffatomeder restlichen Wasserstoffatome / 2 wasserstoffKomponente.Anzahl = restlicheWasserstoffAtome / 2; // Fuege der Liste der Reaktionen diese Reaktion hinzu ReaktionsResultate.Add(new MetallSaeureReaktionsResultat(metallKomponente, saeureKomponente, salzKomponente, wasserstoffKomponente)); } }
public Salz(Kation kation, Anion anion) { Kation = kation; Anion = anion; (int anzahlKation, int anzahlAnionen)benoetigeMolekuehle = Ion.BerechneAnzahlMolekuele(kation, anion); Kation.Molekuel.Anzahl = benoetigeMolekuehle.anzahlKation; Anion.Molekuel.Anzahl = benoetigeMolekuehle.anzahlAnionen; if (Anion.Molekuel.Atombindung.IstElementbindung()) { if (!String.IsNullOrEmpty(Anion.Molekuel.Atombindung.ErhalteElement().Wurzel)) { Name = Kation.Molekuel.Atombindung.Name + Anion.Molekuel.Atombindung.ErhalteElement().Wurzel.ToLower() + "id"; } else { Name = Kation.Molekuel.Atombindung.Name + Anion.Molekuel.Atombindung.ErhalteElement().Name.ToLower() + "id"; } } else { Name = Kation.Molekuel.Atombindung.Name + Anion.Molekuel.Atombindung.Name.ToLower(); } if (Kation.Molekuel.Anzahl > 1) { if (Kation.Molekuel.Atombindung.IstElementbindung()) { ChemischeFormel += $"{Kation.Molekuel.Atombindung.ChemischeFormel}{UnicodeHelfer.GetSubscriptOfNumber(Kation.Molekuel.Anzahl)}"; } else { ChemischeFormel += $"({Kation.Molekuel.Atombindung.ChemischeFormel}){UnicodeHelfer.GetSubscriptOfNumber(Kation.Molekuel.Anzahl)}"; } } else { ChemischeFormel += $"{Kation.Molekuel.Atombindung.ChemischeFormel}"; } if (Anion.Molekuel.Anzahl > 1) { if (UnicodeHelfer.GetNumberOfSubscript(Anion.Molekuel.Atombindung.ChemischeFormel.Last()) != -1) { ChemischeFormel += $"({Anion.Molekuel.Atombindung.ChemischeFormel}){UnicodeHelfer.GetSubscriptOfNumber(Anion.Molekuel.Anzahl)}"; } else { ChemischeFormel += $"{Anion.Molekuel.Atombindung.ChemischeFormel}{UnicodeHelfer.GetSubscriptOfNumber(Anion.Molekuel.Anzahl)}"; } } else { ChemischeFormel += $"{Anion.Molekuel.Atombindung.ChemischeFormel}"; } }
public List <(Kation wasserstoffIon, Anion saeurerestIon)> ErhalteIonisierteSaeurevarianten() { List <(Kation wasserstoffIon, Anion saeurerestIon)> ionisierteSaeurevarianten = new List <(Kation wasserstoffIon, Anion saeurerestIon)>(); Nichtmetall wasserstoff = Periodensystem.Instance.FindeNichtmetallNachAtomsymbol("H"); if (wasserstoff == null) { throw new Exception("Wasserstoff konnte im Periodensystem nicht gefunden werden"); } for (int wasserstoffInEster = Wasserstoff.Atombindung.AnzahlAtome - 1; wasserstoffInEster >= 0; wasserstoffInEster--) { // Kation Atombindung wasserstoffbindung = new Atombindung(wasserstoff, Wasserstoff.Atombindung.AnzahlAtome - wasserstoffInEster); Kation abgabeWasserstoff = new Kation(new Molekuel(wasserstoffbindung, 1), Wasserstoff.Atombindung.AnzahlAtome - wasserstoffInEster); // Anion if (wasserstoffInEster == 0) { // Das Säurerest hat sich nicht verändert und wird identisch abgegeben Anion abgabeSaeurerest = new Anion(Saeurerest, -(Wasserstoff.Atombindung.AnzahlAtome - wasserstoffInEster)); abgabeSaeurerest.Molekuel.Atombindung.SetzeTrivialname(NameSaurerestAnion); ionisierteSaeurevarianten.Add((abgabeWasserstoff, abgabeSaeurerest)); } else { // Das Säurerest beinhaltet nun Wassserstoff Atome string saeurerestName = null; if (wasserstoffInEster > 1) { saeurerestName = NomenklaturHelfer.Praefix(wasserstoffInEster) + "hydrogen" + NameSaurerestAnion; } else { saeurerestName = "Hydrogen" + NameSaurerestAnion; } Atombindung wasserstoffbindungInSaeurerest = new Atombindung(wasserstoff, wasserstoffInEster); string saurerrestFormel = wasserstoffbindungInSaeurerest.ChemischeFormel + Saeurerest.Atombindung.ChemischeFormel; Atombindung saeurerestbindung = new Atombindung(saurerrestFormel, wasserstoffbindungInSaeurerest, Saeurerest.Atombindung); saeurerestbindung.SetzeTrivialname(saeurerestName); Anion abgabeSaeurerest = new Anion(new Molekuel(saeurerestbindung, 1), -(Wasserstoff.Atombindung.AnzahlAtome - wasserstoffInEster)); ionisierteSaeurevarianten.Add((abgabeWasserstoff, abgabeSaeurerest)); } } return(ionisierteSaeurevarianten); }
public override void BeginneReaktion() { // Erhalte die ionisierten Saeurevarianten der Saeure. Die Anzahl der Protonen // in der Saeure gibt die Anzahl der Varianten an, da jeweils Protonen im // Saeurerest sich anlagern koennen List <(Kation wasserstoffIon, Anion saeurerestIon)> saeureVariationen = ReagierendeSaeure.ErhalteIonisierteSaeurevarianten(); // Generiere fuer jede Saerevariante eine Reaktionsgleichung foreach ((Kation wasserstoffIon, Anion saeurerestIon)saeureVariation in saeureVariationen) { // Definiere die benoetigten Komponenenten, damit ihrer Anzahl gesezt werden kann Reaktionsstoff laugeKomponente = new Reaktionsstoff(ReagierendeLauge); Reaktionsstoff saeureKomponente = new Reaktionsstoff(ReagierendeSaeure); Salz salz = null; // UeberprUefe, ob es sich bei der Lauge um Ammoniak handelt if (ReagierendeLauge is Ammoniak) { // Es handelt sich bei der Lauge um Ammoniak Ammoniak ammoniak = ReagierendeLauge as Ammoniak; // Erstelle das Ammonium-Ion Kation ammonium = new Kation(new Molekuel(new Atombindung("NH₄", "Ammonium"), 1), 1); // Erstelle das Salz aus dem Ammonium-Ion und dem Saeurerest-Ion salz = new Salz(ammonium, saeureVariation.saeurerestIon); // Setze die Anzahl der Lauge gleich der Anzahl der Ammonium-Moeluele laugeKomponente.Anzahl = salz.Kation.Molekuel.Anzahl; // Erstelle die restlichen Reaktionsstoffe Reaktionsstoff salzKomponente = new Reaktionsstoff(salz); // Setze die Anzahl der restlichen Komponenten gleich eins saeureKomponente.Anzahl = 1; salzKomponente.Anzahl = 1; // Fuege der Liste der Reaktionen diese Reaktion hinzu ReaktionsResultate.Add(new SaeureLaugeReaktionsResultat(saeureKomponente, laugeKomponente, salzKomponente, null)); } else { // Es handelt sich bei der Lauge um ein Metallhydroxid Metall metall = ReagierendeLauge.Metall.Atombindung.ErhalteElement() as Metall; // Erstelle das Metall-Ion Kation metallIon = new Kation(new Molekuel(new Atombindung(metall, 1), 1)); // Erstelle das Salz aus dem Metall-Ion und dem Saeurerest-Ion salz = new Salz(metallIon, saeureVariation.saeurerestIon); // Erstelle die Wasserstoffbindung Atombindung wasser = new Atombindung("H₂O", "Wasser"); // Erstelle die restlichen Reaktionsstoffe Reaktionsstoff wasserKomponente = new Reaktionsstoff(wasser); Reaktionsstoff salzKomponente = new Reaktionsstoff(salz); //Falls die Anzahl der Metall-Atome in der Lauge gleich dem im Salz sind if (ReagierendeLauge.Metall.AnzahlAtomeInMolekuel() == salz.Kation.Molekuel.AnzahlAtomeInMolekuel()) { // Die Anzahl der Metall-Atome in der Lauge, sowie im Salz sind identisch // => Anzahl Lauge und Salz auf 1 setzen laugeKomponente.Anzahl = 1; salzKomponente.Anzahl = 1; } //Falls die Anzahl der Metall-Atome in der Lauge groeßer dem im Salz sind else if (ReagierendeLauge.Metall.AnzahlAtomeInMolekuel() > salz.Kation.Molekuel.AnzahlAtomeInMolekuel()) { // Die Anzahl der Metall-Atome in der Lauge sind groeßer als die im Salz // => Anzahl Lauge auf 1 setzen und die Anzahl des Salzes berechnen laugeKomponente.Anzahl = 1; salzKomponente.Anzahl = ReagierendeLauge.Metall.AnzahlAtomeInMolekuel() / salz.Kation.Molekuel.AnzahlAtomeInMolekuel(); } //Falls die Anzahl der Metall-Atome in der Lauge kleiner dem im Salz sind else { // Die Anzahl der Metall-Atome in der Lauge sind geringer als die im Salz // => Anzahl Lauge berechnen und die Anzahl des Salzes auf 1 setzen laugeKomponente.Anzahl = salz.Kation.Molekuel.AnzahlAtomeInMolekuel() / ReagierendeLauge.Metall.AnzahlAtomeInMolekuel(); salzKomponente.Anzahl = 1; } // Die Anzahl der Saeure entspricht die Anzahl des Saeurerest-Ions // => Saeure um die Anzahl des Saeurerestions multiplizieren saeureKomponente.Anzahl = salzKomponente.Anzahl * salz.Anion.Molekuel.Anzahl; // Erhalte die Anzahl der Wasserstoffatome in der Saeure double wasserstoffAtomeInSaeure = saeureKomponente.Anzahl * ReagierendeSaeure.Wasserstoff.AnzahlAtomeInMolekuel(); // Erhalte die Anzahl der Wasserstoffatome im Salz double wasserstoffAtomeInSalz = salzKomponente.Anzahl * salz.Anion.Molekuel.Anzahl * ((saeureKomponente.Molekuel as Saeure).Wasserstoff.AnzahlAtomeInMolekuel() - saeureVariation.wasserstoffIon.Molekuel.AnzahlAtomeInMolekuel()); // Erhalte die Anzahl der Wasserstoffatome in der Lauge double wasserstoffAtomeInLauge = laugeKomponente.Anzahl * ReagierendeLauge.Hydroxid.Anzahl; // Subtrahiere die Wasserstoffatome im Salz von der Saeure + Lauge und // teile es durch zwei, da H20 gleich zwei Wasserstoffatome pro Molekuel besitzt wasserKomponente.Anzahl = (wasserstoffAtomeInSaeure + wasserstoffAtomeInLauge - wasserstoffAtomeInSalz) / 2; // Fuege der Liste der Reaktionen diese Reaktion hinzu ReaktionsResultate.Add(new SaeureLaugeReaktionsResultat(saeureKomponente, laugeKomponente, salzKomponente, wasserKomponente)); } } }
public override void BeginneReaktion() { // Erhalte die ionisierten Saeurevarianten der Saeure. Die Anzahl der Protonen // in der Saeure gibt die Anzahl der Varianten an, da jeweils Protonen im // Saeurerest sich anlagern koennen List <(Kation wasserstoffIon, Anion saeurerestIon)> saeureVariationen = ReagierendeSaeure.ErhalteIonisierteSaeurevarianten(); // Generiere fuer jede Saerevariante eine Reaktionsgleichung foreach ((Kation wasserstoffIon, Anion saeurerestIon)saeureVariation in saeureVariationen) { // Erhalte das Metallelement aus dem Oxid und ionisiere es Metall metall = ReagierendesMetalloxid.Bindungspartner.Atombindung.ErhalteElement() as Metall; Kation metallIon = new Kation(new Molekuel(new Atombindung(metall, 1), 1)); // Bilde das Salz aus dem Metallion und dem ionisierten Saeurerest Salz salz = new Salz(metallIon, saeureVariation.saeurerestIon); // Erstelle die Wasserstoffbindung Atombindung wasser = new Atombindung("H₂O", "Wasser"); // Erstelle die Reaktionsstoffe mit den vorhandenen Bindungen. // Diese Klasse merkt sich zu den Bindungen auch die Anzahl // der Molekuele nach dem Ausgleichen Reaktionsstoff metalloxidKomponente = new Reaktionsstoff(ReagierendesMetalloxid); Reaktionsstoff saeureKomponente = new Reaktionsstoff(ReagierendeSaeure); Reaktionsstoff wasserKomponente = new Reaktionsstoff(wasser); Reaktionsstoff salzKomponente = new Reaktionsstoff(salz); //Falls die Anzahl der Metall-Atome im Oxid gleich dem im Salz sind if (ReagierendesMetalloxid.Bindungspartner.AnzahlAtomeInMolekuel() == salz.Kation.Molekuel.AnzahlAtomeInMolekuel()) { // Die Anzahl der Metall-Atome im Oxid, sowie im Salz sind identisch, // => Anzahl des Metalloxids und des Salzes auf 1 setzen metalloxidKomponente.Anzahl = 1; salzKomponente.Anzahl = 1; } //Falls die Anzahl der Metall-Atome im Oxid groeßer dem im Salz sind else if (ReagierendesMetalloxid.Bindungspartner.AnzahlAtomeInMolekuel() > salz.Kation.Molekuel.AnzahlAtomeInMolekuel()) { // Die Anzahl der Metall-Atome im Oxid sind groeßer als die im Salz // => Anzahl des Metalloxids auf 1 setzen und die Anzahl des Salzes berechnen metalloxidKomponente.Anzahl = 1; salzKomponente.Anzahl = ReagierendesMetalloxid.Bindungspartner.AnzahlAtomeInMolekuel() / salz.Kation.Molekuel.AnzahlAtomeInMolekuel(); } //Falls die Anzahl der Metall-Atome im Oxid kleiner dem im Salz sind else { // Die Anzahl der Metall-Atome im Oxid sind geringer als die im Salz // => Anzahl des Metalloxids berechnen und die Anzahl des Salzes auf 1 setzen metalloxidKomponente.Anzahl = salz.Kation.Molekuel.AnzahlAtomeInMolekuel() / ReagierendesMetalloxid.Bindungspartner.AnzahlAtomeInMolekuel(); salzKomponente.Anzahl = 1; } // Die Anzahl der Saeure entspricht die Anzahl des Saeurerestions // => Saeure um die Anzahl des Saeurerestions multiplizieren saeureKomponente.Anzahl = salzKomponente.Anzahl * salz.Anion.Molekuel.Anzahl; // Erhalte die Anzahl der Wasserstoffatome in der Saeure double wasserstoffAtomeInSaeure = saeureKomponente.Anzahl * ReagierendeSaeure.Wasserstoff.AnzahlAtomeInMolekuel(); // Erhalte die Anzahl der Wasserstoffatome im Salz double wasserstoffAtomeInSalz = salzKomponente.Anzahl * salz.Anion.Molekuel.Anzahl * ((saeureKomponente.Molekuel as Saeure).Wasserstoff.AnzahlAtomeInMolekuel() - saeureVariation.wasserstoffIon.Molekuel.AnzahlAtomeInMolekuel()); // Subtrahiere die Wasserstoffatome in der Saeure mit dem des Salzes und // teile es durch zwei, da H20 gleich zwei Wasserstoffatome pro Molekuel besitzt wasserKomponente.Anzahl = (wasserstoffAtomeInSaeure - wasserstoffAtomeInSalz) / 2; // Fuege der Liste der Reaktionen diese Reaktion hinzu ReaktionsResultate.Add(new MetalloxidSaeureReaktionsResultat(metalloxidKomponente, saeureKomponente, salzKomponente, wasserKomponente)); } }