Aller au menu - Aller au contenu
Inscris-toi au e-camp "Héberge ton jeu Facebook sur Azure" de Microsoft vendredi 25 mai à 13h30 !

Programmation d'un calculateur de masse molaire

Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page 1 
Auteur Message
1 visiteur sur ce sujet (1 Anonyme)
Page 1 
Hors ligne chenapan47 # Posté le 19/05/2010 à 18:21:09

Bonjour,
Je suis en première année d'IUT mesures physiques et je suis nouveau sur le site du zéro.
J'aurais besoin de quelques pistes pour un programme que j'ai à faire dans le cadre d'un projet informatique.
Je ne suis pas très doué dans ce domaine même si je suis censé maîtriser tout ce qui est tableau, pointeurs, etc...

Le but de mon projet informatique est que lorsqu'on entre une formule chimique brute ((ou même semi-développée)) d'une molécule, le programme devra renvoyer la masse molaire du composé...
Par exemple : On entre C6H12O6 et cela donnera 180 g/mol.

J'aimerais avoir quelques indications ou pistes afin de débuter à programmer. J'ai vraiment du mal à voir comment faire... :(

Publicité # Posté le 19/05/2010 à 18:21:09

Hors ligne dridri93 # Posté le 19/05/2010 à 18:27:37
Programmeur 3D sur PSP et PC

Bon, déjà personnellement je verrais l'organisation du programme comme ça :
- Entrée de la formule par l'utilisateur
- Lecture de la chaine pour récupérer les "indices" et les éléments chimiques
- Multiplication des "indices" avec les éléments correspondants
- Addition du tout
- Retour de la masse molaire finale
 
Hors ligne Marc Mongenet # Posté le 19/05/2010 à 18:52:42

Citation : chenapan47
J'aimerais avoir quelques indications ou pistes afin de débuter à programmer. J'ai vraiment du mal à voir comment faire... :(

C'est un intéressant problème, et assez piégeux me semble-t-il...
Pour la partie intéressante, je verrais:
- int masseMolaire(const char *formule); // retourne la masse de la formule ("H2O")
-- int masseAtomesSuivants(const char **curseur_formule); // retourne la masse de "H2", puis "O", avance le pointeur
--- int masseAtome(const char **curseur_formule); // retourne la masse de "H", puis "O", avance le pointeur
--- int atomeN(const char **curseur_formule); // retourne 2 (pour H2), puis 1 (pour O), avance le pointeur

Pour masseAtome, la fonction doit être capable de retourner la masse H dans "H2O", mais celle de Hg dans "HgO", et enfin celle de H dans "HO". Et bien sûr, retourner une masse impossible en cas de lettre ne correspondant à aucun atome.
Hors ligne germino # Posté le 19/05/2010 à 19:19:01
public programmer<C++>
Avatar
Flux RSS

Ville : St germain laprade
Pays : France métropolitaine

Je dirai qu'il te faut une structure 'element' qui contient les variables 'char *nom' 'double masseMolaire'. :)

Citation : Qui-Gon-Jin
Ce n'est pas parce que tu parles que tu es intelligent.
 
Hors ligne tux3 # Posté le 19/05/2010 à 19:27:00

Ville : Vendeuvre-du-poitou
Pays : France métropolitaine

Je dirais qu'il te faut un parseur de formule chimique, une pile pour empiler, une fonction qui récupére les masse atomiques dans un tableau périodique des éléments de Dimitri Ivanovitch Mendeleïev dans un tableau.txt tout en dépilant, des multiplications/additions et un affichage pasque c'est quand même utile.
Voila :) .
Édité le 19/05/2010 à 19:35:15 par tux3
Hors ligne Arthurus # Posté le 19/05/2010 à 19:38:32
Everyday I'm shuffling
Avatar
Validateurs

Études : Ensimag

Citation : Marc Mongenet
Citation : chenapan47
J'aimerais avoir quelques indications ou pistes afin de débuter à programmer. J'ai vraiment du mal à voir comment faire... :(

C'est un intéressant problème, et assez piégeux me semble-t-il...
Pour la partie intéressante, je verrais:
- int masseMolaire(const char *formule); // retourne la masse de la formule ("H2O")
-- int masseAtomesSuivants(const char **curseur_formule); // retourne la masse de "H2", puis "O", avance le pointeur
--- int masseAtome(const char **curseur_formule); // retourne la masse de "H", puis "O", avance le pointeur
--- int atomeN(const char **curseur_formule); // retourne 2 (pour H2), puis 1 (pour O), avance le pointeur

Pour masseAtome, la fonction doit être capable de retourner la masse H dans "H2O", mais celle de Hg dans "HgO", et enfin celle de H dans "HO". Et bien sûr, retourner une masse impossible en cas de lettre ne correspondant à aucun atome.


C'est intéressant.
On pourrait améliorer ce que tu dis en faisant du pseudo objet en C.
Au lieu d'avoir par exemple une fonction qui donne la masse molaire, on la calcule systématiquement lors de la création de la formule (on aurait un champs spécifique à ça dans sa structure, ce qui jouera le rôle d'attribut en langage objet).

Sinon :
Citation : tux3
un tableau périodique des éléments de Dimitri Ivanovitch Mendeleïev

Ça sent la recherche wikipedia à plein fouet :lol:
On dit le tableau de Mendeleiev, tout comme on dit les équations de Maxwell ( et non pas les équations James Clerk Maxwell).
Édité le 19/05/2010 à 19:39:13 par Arthurus
 
Hors ligne tux3 # Posté le 19/05/2010 à 19:41:09

Ville : Vendeuvre-du-poitou
Pays : France métropolitaine

"Ça sent la recherche wikipedia à plein fouet :lol: "

Dans le mile :D
Mais pour la bonne cause, je ne savais pas comment écrire bien mandéléyef !

Citation : Arthurus
On dit le tableau de Mendeleïev

Fix'd :)
Édité le 19/05/2010 à 19:43:44 par tux3
Hors ligne Arthurus # Posté le 19/05/2010 à 19:47:20
Everyday I'm shuffling
Avatar
Validateurs

Études : Ensimag

Hors ligne chenapan47 # Posté le 19/05/2010 à 20:00:57

Merci les gars! :)
Je vais tester tout ça et je vous dirais si j'y arrive...
Hors ligne Lord Casque Noir # Posté le 19/05/2010 à 21:19:42 Message supprimé pour le motif suivant : Message complètement hors sujet.
Hors ligne IATGOF # Posté le 19/05/2010 à 21:48:27 Message supprimé pour le motif suivant : Message complètement hors sujet.
Hors ligne Arthurus # Posté le 19/05/2010 à 21:49:35 Message supprimé pour le motif suivant : Message complètement hors sujet.
Hors ligne Adroneus # Posté le 19/05/2010 à 21:49:38 Message supprimé pour le motif suivant : Message complètement hors sujet.
Hors ligne Lord Casque Noir # Posté le 19/05/2010 à 22:09:56 Message supprimé pour le motif suivant : Message complètement hors sujet.
Hors ligne Adroneus # Posté le 19/05/2010 à 22:30:54 Message supprimé pour le motif suivant : Message complètement hors sujet.
Hors ligne Masado # Posté le 19/05/2010 à 22:38:12
I'm a noob =)
Avatar

Ville : Lacanau
Pays : France métropolitaine
Études : Epitech Bordeaux

Pour en revenir au problème initial, tu n'as pas de facteurs à gérer ? 6(H2O) par exemple (je donne un exemple bidon mais c'est pour que tu vois ce que je veux dire)
 
Hors ligne Pouet_forever # Posté le 19/05/2010 à 22:41:56 Message supprimé pour le motif suivant : Message complètement hors sujet.
Hors ligne Lord Casque Noir # Posté le 19/05/2010 à 23:17:20 Message supprimé pour le motif suivant : Message complètement hors sujet.
Hors ligne Adroneus # Posté le 19/05/2010 à 23:30:10 Message supprimé pour le motif suivant : Message complètement hors sujet.
Hors ligne Lord Casque Noir # Posté le 19/05/2010 à 23:32:32 Message supprimé pour le motif suivant : Message complètement hors sujet.
Hors ligne GuilOooo # Posté le 20/05/2010 à 11:53:56
Attention, je mords !
Avatar
Modérateurs

Lord Casque Noir, on arrête le troll maintenant.

Si la personne veut faire son projet en C et demande de l'aide en C en postant sur le forum de C, tes remarques sur python n'ont rien à faire ici. Ça n'est tout simplement pas le sujet. Par contre, tu fais dériver la discussion vers un débat stérile, ce qui nuit à chenapan47 bien plus que ça ne l'aide. (EDIT : J'ai nettoyé tout ledit « débat » du topic)

Tu gagnes 5% pour faire dériver un topic en troll. Merci de ne pas recommencer.

Le sujet est maintenant ouvert à nouveau, mais n'en déviez plus.
Édité le 20/05/2010 à 12:00:24 par GuilOooo

HaskellReal World HaskellLearn yourself HaskellGentille intro à HaskellTuto SdZ
ErlangBuzzerl@home???

Modérateur spécialiste du langage C.
Bien poster sur le forum de CMe contacter
 
Hors ligne henri27 # Posté le 20/05/2010 à 13:56:17
Avatar

Ville : Versailles
Pays : France métropolitaine
Études : ENS Lyon

Waou, jamais vu autant de censure o_O
Je plussoi l'idée de tux3
Citation : tux3
Je dirais qu'il te faut un parseur de formule chimique, une pile pour empiler, une fonction qui récupére les masse atomiques dans un tableau périodique des éléments de Dimitri Ivanovitch Mendeleïev dans un tableau.txt tout en dépilant, des multiplications/additions et un affichage pasque c'est quand même utile.
Voila :) .

Tu peux décomposer une formule en sous formule (j'aime bien l'histoire de la pile même si j'ai un soucis avec les parenthèses...)
ex Fe(H2O)6 -> Fe/1 - H2O/6
............-> Fe/1 - ( H/2 - O/1 )/6

Après tu évalues la masse molaire d'une molécule par la somme pondérée des masses molaires des sous molécules ou, s'il s'agit d'un atome, par sa masse molaire fois le nombre associé.
Je propose 2 passage, peut être est ce possible en un (surement)
Si qqn a une idée pour l'implémenter... :-°

Edit: Dans une formule, je pense qu'il n'y a pas de facteur devant. Ça peut néanmoins être pratique (si on veut pas faire une multiplication par un scalaire mais sinon à la place de mettre 6(H2O) tu mets (H2O)6 :p
Édité le 20/05/2010 à 14:00:45 par henri27
Hors ligne Lord Casque Noir # Posté le 20/05/2010 à 13:57:25
Avatar

De rien.

chenapan47, si tu veux le tableau périodique (symboles-masses) sous forme de fichier C que j'avais posté, fais-moi signe.

Au fait on ne sait toujours pas si ça doit parser les trucs du genre Fe(H2O)6...

- Pourquoi le capitalisme est-il au bord du gouffre ?
- Parce qu’il regarde le communisme qui est au fond.

Wizard book (web) / Optimise ton apache php mysql / C++ FQA Lite / template<> / The Man / delete new[] / Hardware / PIC16F / eventlet / lxml / Économie / Politique / empêcher le clic droit sur les images / goto linus<linus> / output buffering
 
Hors ligne henri27 # Posté le 20/05/2010 à 14:02:04
Avatar

Ville : Versailles
Pays : France métropolitaine
Études : ENS Lyon

J'imagine que ça doit être le cas. Sinon le programme perd une grande partie de son intérêt.
Hors ligne Lord Casque Noir # Posté le 20/05/2010 à 17:14:02
Avatar

Il dit que c'est "dans le cadre d'un projet informatique" donc ce serait intéressant d'avoir l'énoncé exact du machin... cahier des charges tout ça...

D'ailleurs, il est où l'OP ?
Édité le 20/05/2010 à 17:14:27 par Lord Casque Noir

- Pourquoi le capitalisme est-il au bord du gouffre ?
- Parce qu’il regarde le communisme qui est au fond.

Wizard book (web) / Optimise ton apache php mysql / C++ FQA Lite / template<> / The Man / delete new[] / Hardware / PIC16F / eventlet / lxml / Économie / Politique / empêcher le clic droit sur les images / goto linus<linus> / output buffering
 
Hors ligne Alienore # Posté le 21/05/2010 à 12:03:22

Études : Polytech'Lille

Il s'agit premièrement de décomposer l'entrée. Pour ça, il faut savoir sous quelle forme on peut trouver une formule (surtout pour le semi-développé).
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/* convertit une formule moléculaire et renvoie sa masse molaire */
unsigned int mol_to_int(char const * chaine)
{
  unsigned int result = 0;
  unsigned int cpt,i,cpt_tmp;
  char tmp[10];
  for(i=0;i<10;i++)
    tmp[i] = '\0';

  for(cpt = 0,cpt_tmp=0;chaine[cpt] != '\0';cpt++,cpt_tmp++)
  {
    if(chaine[cpt] >= 'A' && chaine[cpt] <= 'Z') /* si la lettre étudiée est une majuscule, alors on a affaire à un nouvel atome */
    {
      cpt_tmp=0
      if(tmp[0] != '\0')
        result+=translate(tmp); /* permet de transformer un nom d'atome en sa masse molaire */

      tmp[0] = chaine[cpt];
      for(i=1;i<10;i++)
        tmp[i] = '\0';
      continue;
    }
    /* si on arrive à cet endroit, on a affaire à une minuscule ou à un nombre*/
    tmp[cpt_tmp] = chaine[cpt];
  }
  /* on a besoin de traduire le dernier atome de la chaine qui n'est actuellement pas encore traduit */
  result += translate(tmp);
  return result;
}

Il suffit maintenant de faire la fonction translate qui permet de faire correspondre à chaque symbole sa masse molaire multiplié par le nombre qui suit.
Il faut encore gérer les parenthèses mais ne sachant pas exactement de quelle manière elles doivent l'être, je ne l'ai pas fait ici.
Hors ligne Lord Casque Noir # Posté le 23/05/2010 à 12:10:19
Avatar

Vu que l'OP est parti, on peut se lâcher.
Donc, voici une solution qui fonctionne. Bien sûr j'ai enlevé tous les commentaires histoire de mettre un peu de piment, mais bon le code est très simple.

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>
#include <alloca.h>

/* la flemme de faire un makefile */
#include "elements.c"

double get_element_mass( const char* symbol )
{
	int	i = 0;
	const Element *e;
	
	while( (e = &Elements[i++])->symbol )
		if( !strcmp( e->symbol, symbol ))
			return e->mass;
		
	return -1;
}

double parse_formula( const char** formula )
{
	const char*	f = *formula;
	double	total_mass = 0, current_mass;
	char	c;
	char	tmp[4];
	
	while( c = *f )
	{
		if( c >= 'A' && c <= 'Z' )
		{
			char	*t = tmp;
			
			do {
				*t++ = c;
				c = *(++f);
				if( t >= tmp+sizeof(tmp) )
				{
					printf( "Nom de l'élément trop long\n%s\n", f );
					exit(-1);
				}
			} while( c >= 'a' && c <= 'z' );
			
			*t++ = 0;
			current_mass = get_element_mass( tmp );
			goto get_int;
		}
		else if( c == '(' )
		{
			f++;
			current_mass = parse_formula( &f );
			goto get_int;
			
		}
		else if( c == ')' )
		{
			f++;
			break;
		}
		
		printf( "Erreur dans la formule\n%s\n", f );
		exit(-1);
		
get_int:
		{
			char* endp;
			int n = strtol( f, &endp, 10 );
			if( endp == f )
				n = 1;
			f = endp;
			//~ printf( "Nombre : %d * %lf\n", n, current_mass );
			total_mass += n * current_mass;
		}
	}
	*formula = f;
	return total_mass;
}

double masse_molaire( const char* formula )
{
	return parse_formula( &formula );
}

int main( void )
{
	const char * exemples[] = {
		"C6H12O6", "H2O", "CH4", "AgNO3", "Al(H2O)6", 
		"Ni(NH2CH2CH2NH2)3", "Ni((NH2)2(CH2)2)3", 0 };
	
	int i;
		
	for( i=0; exemples[i]; i++ )
		printf( "%s : %lf\n", exemples[i], masse_molaire( exemples[i] ));
}

- Pourquoi le capitalisme est-il au bord du gouffre ?
- Parce qu’il regarde le communisme qui est au fond.

Wizard book (web) / Optimise ton apache php mysql / C++ FQA Lite / template<> / The Man / delete new[] / Hardware / PIC16F / eventlet / lxml / Économie / Politique / empêcher le clic droit sur les images / goto linus<linus> / output buffering
 
Hors ligne Marc Mongenet # Posté le 24/05/2010 à 22:53:28

Citation : Lord Casque Noir

Code : C
1
2
/* la flemme de faire un makefile */
#include "elements.c"

Quel rapport avec un Makefile? Un simple cc main.c elements.c et c'est réglé proprement.
Hors ligne Lord Casque Noir # Posté le 25/05/2010 à 01:40:25
Avatar

La flemme aussi.

- Pourquoi le capitalisme est-il au bord du gouffre ?
- Parce qu’il regarde le communisme qui est au fond.

Wizard book (web) / Optimise ton apache php mysql / C++ FQA Lite / template<> / The Man / delete new[] / Hardware / PIC16F / eventlet / lxml / Économie / Politique / empêcher le clic droit sur les images / goto linus<linus> / output buffering
 

Retour au forum "Langage C" ou à la liste des forums

Pour accéder à cette section
Connectez-vous !
connexion_rpx