Avatar billede acid-head Nybegynder
09. november 2003 - 18:19 Der er 11 kommentarer og
1 løsning

Atom/Molekyleformler

Jeg er ved at lave et lille program, som automatisk skal kunne udregne vægten af molekyler. Hvis vi siger, at jeg har C3H8 gemt i en string, så skal den deles op i
$i[0] = "C";
$i[1] = 3;
$i[2] = "H";
$i[3] = 8;

Det er ikke sikkert, det er så svært, ved jeg ikke rigtigt, men siger vi derimod at jeg har HCl gemt i en string, så skal den jo deles i
$i[0] = "H";
$i[1] = "Cl";

Det er selvfølgelig meningen at stringen med et molekyle skal deles så jeg kan beregne vægten af hvert grundstof hver for sig, gange med antallet og så gå videre til næste grundstof.. Som fx i C3H8: Vægten af C ganget med 3, plus vægten af H ganget med 8!

Det er egentlig lige meget hvordan variablerne bliver smidt ud, må også gerne være i et array..

Det skal egentlig bruges til et lille delphi program, men hvis nogle forestrækker at smide eksempler i PHP så er det også helt iorden..

Jeg håber I forstår hvad jeg mener, ellers spørg!, og håber I kan hjælpe mig.. :)
Avatar billede roenving Novice
09. november 2003 - 18:53 #1
En regExp, som kan det meste af hvad du ønsker ser sådan ud:

/[A-Z][a-z]?|\d?/g;

-- men den kan ikke selv sætte et 0 ind, hvis der ikke er tal i formlen, så der bliver det nødvendigt langsomt at checke, om der forekommer fravær af index ...
Avatar billede erikjacobsen Ekspert
09. november 2003 - 19:05 #2
Kan det her bruges til noget?

  $g = "H|Cl|O|Fe|P|Au|Sn|S|C";

  $h = "H2OSClC";

  if (preg_match_all("/($g)(\\d*)/",$h,$r)) {

      for ($i=0;$i<count($r[2]);$i++) {
        if ($r[2][$i]=="") { $r[2][$i]=1; }
      }


      for ($i=0;$i<count($r[2]);$i++) {
        print $r[2][$i]." af ".$r[1][$i]."<br>\n";
      }

  }
Avatar billede acid-head Nybegynder
09. november 2003 - 20:38 #3
Erik-> Har aldrig lært Reg.Exp, har derfor lidt svært ved at forstå hvad der foregår, men det ser da ud som om det virker meget godt.. Vil lige lege lidt med det..
Avatar billede roenving Novice
09. november 2003 - 20:56 #4
Bagdelen ved eriks løsning er, at du skal opskrive samtlige aktuelle grundstoffers notation ind i $g-variablen ...

Men da du vel i forvejen har en database med atomvægte har du vel der også den del !o]

Bagdelen ved at tage udgangspunkt i min korte regExp er, at man selv skal tilføje 1-tallet (som også erik er nødt til i sin funktion !-) _og_ at du må cegecke et andet sted for validiteten ...
Avatar billede roenving Novice
09. november 2003 - 20:58 #5
cegecke --> checke ...
Avatar billede erikjacobsen Ekspert
09. november 2003 - 22:02 #6
Ja, forkortelserne kan jo bare tages fra dem liste af atomvægte
der yderligere skal tilføjes. Jeg tog nogle af dem jeg kunne huske ;)
Avatar billede erikjacobsen Ekspert
09. november 2003 - 22:03 #7
Men hvis du har at det enten er

  eet stort bogstav, eller
  eet stort bogstav efterfulgt af eet lille bogstav

så kan vi klare det uden listen
Avatar billede roenving Novice
09. november 2003 - 23:05 #8
-- som var den jeg forfulgte ,-)
Avatar billede erikjacobsen Ekspert
09. november 2003 - 23:07 #9
Ja, vi kan lave en fin krydsning mellem de to. En reg.exp-bastard.
Avatar billede acid-head Nybegynder
12. november 2003 - 17:17 #10
Jeg har fået rigtig godt udbytte af eriks forslag..

Hvis du gerne vil have nogle point, så må du gerne smide et svar.. :)
Avatar billede erikjacobsen Ekspert
12. november 2003 - 22:26 #11
Nej, det går ikke. Jeg synes du har afsat for mange point. Det er
en fornøjelse at hjælpe, og point er reelt set ligegyldige.
Avatar billede acid-head Nybegynder
13. november 2003 - 22:52 #12
Hmm.. Okay.. Du bestemmer :)
Men så nupper jeg dem da bare igen..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester