ChemChecker

Status
Niet open voor verdere reacties.

mcgeneral

Gebruiker
Lid geworden
15 feb 2010
Berichten
12
Hoi,
Ik zit met 'n opdracht over het checken van reactievergelijkingen.
De opdracht is dat als je bv. de chemische reactievergelijking
CH4 + 2O2 --> CO2 + 2H2O hebt, dat er wordt geteld of links en rechts evenveel O, danwel C danwel H staat en dat de massa van deze worden opgeteld.
Ik had iets bedacht als het volgende:
(er wordt o.a. van ascii code gebruikt gemaakt)
[cpp]
int main()
{
int i,x,array[90],sum[90];
string s1;
ifstream fin;
fin.open("reactievgl1.txt");

if(fin.fail())
{
cerr<< "fout"<<endl;
exit(1);
}

while(s1!="-->")
while(s1!="+")
{
fin >> s1;
for(i=65;i<90;i++)
{
if(47<array[0]<58)
x=array[0];
else
x=1;

sum[array]=0;
if(65<array<90)
{
if(array[i+1]>65)
sum[array]=array[i+1]*x;
else
sum[array]=x;

}
cout << sum[array];
}
}
//lezen van enkel molecuul, moet uitgebreid worden
return 0;
}
[/cpp]
-Code nog lang niet compleet, maar met deze code lukte het al niet om 1 molecuul, bv CH4, in te lezen. Any ideas? Alvast bedankt.
 
Laatst bewerkt door een moderator:
zal je alles aslejbelieft even netjes tussen code tags kunnen zette, het is zo onoverzichtelijk nu
 
Eindelijk ok (?)

Code:
int main()
{
int i,x,array[90],sum[90];
string s1;
ifstream fin;
fin.open("reactievgl1.txt");

if(fin.fail())
 {
  cerr<< "fout"<<endl;
  exit(1);
 }

while(s1!="-->")
{
while(s1!="+")
 {
  fin >> s1;
  for(i=65;i<90;i++)
  {
   if(47<array[0]<58)
    x=array[0];
   else
    x=1;

   sum[array[i]]=0;
   if(65<array[i]<90)
   {
    if(array[i+1]>65)
     sum[array[i]]=array[i+1]*x;
    else
     sum[array[i]]=x;
    }
   cout << sum[array[i]];
  }
 }
}
return 0;
 
De code kan je beter tussen [cpp ] en [/cpp ] zetten, dan krijg je leuke kleurtjes op basis van de C++-syntax.

Maar dat er niks ingelezen wordt is logisch. Je opent namelijk wel het bestand [cpp]fin.open("reactievgl1.txt");[/cpp]
maar je leest er niks uit. Iets lezen kan met de member functies "get", "getline" of "read". Die functies kan je hier vinden.
 
Bijna klaar ! Nog een paar duwtjes in de rug pls ^^

Hoi allemaal,
Dank voor de reacties :thumb:
Ik heb flink zitten *****n met de code, en ik ben al best ver. Het resultaat is nu dat ik de ingevoerde reactie kan printen, en de voorfactor en het subgetal (respectievelijk getal voor en na een atoom, bv 3 H2, 3=voorgetal, 2=subgetal) opgeslagen heb.

Het probleem is dat ik nu moet opslaan hoeveel atomen links en hoeveel atomen rechts van de pijl voorkomen, voor respectievelijk B,H,C,N,O en F. Dit doe ik dmv een array. Alleen bij de uitvoer geeft hij bv. bij 2 CH4 "8 atomen", en telt hij de C niet mee.

In het reactievgl1.txt bestand staat bv:
2H2 + O2 --> 2H2O $
en moet als uitvoer geven:
2 H2 + O2 --> 2 H2O (dat gaat dus goed nu)
"atomen links is gelijk aan atomen rechts" --> probeer ik op te slaan in array
"massa links is: blabla" --> bedoeling is dat ik de atomen opsla in de array, bv array[1] * subgetal * voorgetal * massa.
"massa rechts is: blabla"

Ik plaats liever niet m'n hele code omdat ik 'm misschien vrijgeef aan een paar mensen uit m'n groep haha, ik kan 'm helemaal mailen. Hoop dat dat oke is.

Alvast bedankt ! :)
 
Zonder code kan ik hier niets zinnigs over zeggen. Heb jij toevallig ook een topic geopend op cppforum.nl of was dat 1 van je klasgenoten?
Ik had daar namelijk redelijk wat tijd in gestopt, maar mijn suggesties werden toen genegeerd.Niet om mij 2 keer aan dezelfde steen te stoten, snapt u?
 
Zonder code kan ik hier niets zinnigs over zeggen. Heb jij toevallig ook een topic geopend op cppforum.nl of was dat 1 van je klasgenoten?
Ik had daar namelijk redelijk wat tijd in gestopt, maar mijn suggesties werden toen genegeerd.Niet om mij 2 keer aan dezelfde steen te stoten, snapt u?

Hoi niek_e,
Nee ik ben niet ook van cppforum :D
Kan ik je 'privé' een mail sturen met het cpp bestand of zoiets?

Groeten,
Mitchel
 
Hoi niek_e,
Nee ik ben niet ook van cppforum :D
Kan ik je 'privé' een mail sturen met het cpp bestand of zoiets?

Dat zou theoretisch mogelijk zijn, maar ik heb het liever niet. Forums zijn openbaar en de onderwerpen die hier besproken worden kunnen ook mensen in de toekomst weer helpen.

Ik kan wél de demo-code posten die ik je klasgenoot gegeven heb. Deze breekt een string op in moleculen. Dit zelfde principe kun je ook weer gebruiken om van moleculen naar atomen te gaan. Zie maar of je er wat aan hebt.

[cpp]
#include <string>
#include <vector>
#include <iostream>
#include <utility>
#include <sstream>
#include <cstdlib>

using std::pair;
using std::string;
using std::vector;
using std::cout;
using std::stringstream;

int stringToInt(string in) {
int ret = 1;
try {
stringstream str(in);
str >> ret;
} catch (...) {
return 1;
}
return ret;
}

pair<vector<string>, vector<string> > parseLine(string line) {
pair<vector<string>, vector<string> > return_val;
stringstream stream(line);
string word = "";

vector<string> molecules;
while (stream >> word) { // alle losse woorden uit de regel halen
if (word == "+" || word == "$") // niets met deze tekens doen
continue; // volgende woord

if (word == "-->") { // van links naar rechts gaan
return_val.first = molecules; // linker helft van vergelijking opslaan aan de linkerkant
molecules.clear(); // moleculen weer leeggooien, aangezien we nu de rechter kan gaan doen
continue; // volgende woord
}

string str_number = "";
unsigned index = 0; // dit nummer hebben we nog nodig om het "molecuul" gedeelte van dit woord te vinden
for (unsigned index = 0; isdigit(word[index]); ++index) // proberen of het woord begint met een cijfer
str_number += word[index]; // alle charachter die een cijfer opslaan

int number = stringToInt(str_number); // het hele nummer converteren naar een int

for (unsigned k = 0; k < number; ++k) {
int aantal_digits = str_number.size(); // aantal digits hebben we nodig om te kijken hoever we de string moeten strippen
string molecule = word.substr(index + aantal_digits, word.length() - index - aantal_digits); // hier gebruiken we de index weer om alleen het "molecuul" gedeelte te vinden
molecules.push_back(molecule); // molecuul opslaan in de vector
}
}
return_val.second = molecules; // rechterhelft van de vergelijking opstaan

return return_val;
}

void show(vector<string> in) {
for (size_t j = 0; j < in.size(); ++j)
cout << in.at(j) << '\n';
cout << '\n';
}

int main(){
string line = "CH4 + 2O2 --> CO2 + 2H2O $";
pair<vector<string>, vector<string> > values = parseLine(line);

cout << "linkerhelft: \n";
show(values.first);

cout << "rechterhelft: \n";
show(values.second);

return 0;
}[/cpp]

Mijn output:

Code:
linkerhelft:
3 moleculen
CH4
O2
O2

rechterhelft:
3 moleculen
CO2
H2O
H2O
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan