Probléme d'écriture

fouffouf Membre
07:52 modifié dans API AppKit #1
Vous êtes bien d'accord que 2x = 2*x.  ???
Jusqu'à  là , pas d'embrouilles. Malheureusement, je dois remplacer le caractère 'x' par un nombre. (par exemple x -> 10) Mais quand la chaine d'origine est 2x, on obtient un truc du genre f(10)=210 alors que ce que je veux c'est f(10)=2*10.

Ma question est simple : comment fait-on pour insérer le * entre le 2 et la valeur ?

Réponses

  • fouffouf Membre
    07:52 modifié #2
    En fait, j'utilise déjà  plus ou moins cette méthode là . Voila mon code :
    - (void)sendData<br />{<br />&nbsp; &nbsp; NSAutoreleasePool *threadPool =<br />	[ [NSAutoreleasePool alloc] init];<br />&nbsp; &nbsp; NSString *formula;<br />	NSString *name;<br />	PlotFormula *f;<br />&nbsp; &nbsp; double x;<br />&nbsp; &nbsp; int i;<br />	int n = 0;<br />	<br />	NSEnumerator *e = [formulas objectEnumerator];<br />	<br />	while(f = [e nextObject]){<br />		<br />		name = [f name];<br />		formula = [f formula];<br />		<br />		for (x=xmin; stop_sending==NO &amp;&amp; x&lt;=xmax; x+=xstep) {<br />			<br />			NSMutableString *fsend =<br />			[NSMutableString stringWithString:@&quot;x,&quot;];<br />			NSString *xString = [NSString stringWithFormat:@&quot;%f&quot;,x];<br />			<br />			[fsend appendString:formula];<br />			[fsend appendFormat:@&quot;,%i&quot;,n];<br />			[fsend appendString:@&quot;&#092;n&quot;];<br /><br /><br />			// c&#39;est ici qu&#39;il faudrait remplacer &quot;nx&quot; par &quot;n*x&quot;<br /><br />			// Now go through the formula and change<br />			// every &#39;x&#39; to a &#39;%g&#39;<br />			<br />			for (i=[fsend length]-1; i&gt;=0; i--) {<br />				if ([fsend characterAtIndex:i] == &#39;x&#39;) {<br />					[fsend replaceCharactersInRange:NSMakeRange(i,1)<br />										 withString:xString]; // &lt;-- ici, on remplace x par la valeur<br />				}<br />			}<br />			<br />			// Send this to the other side<br />			[toEvaluator writeData:<br />				[fsend dataUsingEncoding:NSASCIIStringEncoding<br />					allowLossyConversion:YES] ];<br />		}<br />		<br />		n++;<br />	}<br />&nbsp; &nbsp; // Now send through the termination code<br />&nbsp; &nbsp; [toEvaluator writeData:[@&quot;999&#092;n&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp;  dataUsingEncoding:NSASCIIStringEncoding<br />&nbsp; &nbsp; &nbsp; allowLossyConversion:YES] ];<br />	<br />&nbsp; &nbsp; [self doStop:STOP_SENDER];<br />	<br />&nbsp; &nbsp; // When this returns, our thread will die.<br />&nbsp; &nbsp; [threadPool release];<br />}<br />
    
  • cbrandtcbrandt Membre
    07:52 modifié #3
    en remplaçant
    <br />[fsend appendFormat:@&quot;,%i&quot;,n];<br />
    

    par
    <br />[fsend appendFormat:@&quot;,%i * &quot;,n];<br />
    


    ?
  • fouffouf Membre
    07:52 modifié #4
    Merci cbrandt mais ce n'est pas ca.

    J'explique mon code :

    - (void)sendData<br />{<br />    NSAutoreleasePool *threadPool =<br />      [ [NSAutoreleasePool alloc] init];<br />    NSString *formula;<br />  NSString *name;<br />       PlotFormula *f;<br />    double x;<br />    int i;<br /> int n = 0;<br />     <br />        NSEnumerator *e = [formulas objectEnumerator];<br />
    

    J'ai plusieurs formules (PlotFormula *f), j'utilise donc un enumérateur pour toutes les passer en revue.
    while(f = [e nextObject]){<br />             <br />                name = [f name];<br />             formula = [f formula];<br />
    

    Je récupére les nom et l'expression de la formule.
    for (x=xmin; stop_sending==NO &amp;&amp; x&lt;=xmax; x+=xstep) {<br />
    

    A chaque boucle, je rajoute xstep à  x
    NSMutableString *fsend =<br />                      [NSMutableString stringWithString:@&quot;x,&quot;];<br />                       NSString *xString = [NSString stringWithFormat:@&quot;%f&quot;,x];<br />                    <br />                        [fsend appendString:formula];<br />                       [fsend appendFormat:@&quot;,%i&quot;,n];<br />                       [fsend appendString:@&quot;&#092;n&quot;];<br />
    

    Je crée fsend, et je la rempli avec x, la formule, et le numero de la courbe. On a donc, avec la fonction sin(x), un truc du genre :
    x,sin(x),0.
    xString est la chaine qui contient la valeur de x formattée.
    // Now go through the formula and change<br />                 // every &#39;x&#39; to a &#39;%g&#39;<br />                   <br />                        for (i=[fsend length]-1; i&gt;=0; i--) {<br />                           if ([fsend characterAtIndex:i] == &#39;x&#39;) {<br />                                   [fsend replaceCharactersInRange:NSMakeRange(i,1) withString:xString]; // &lt;-- ici, on remplace x par la valeur<br />                              }<br />                        }<br />
    

    On remplace touts les caractères 'x' par la valeure formatée. On a donc à  cet endroit un truc du genre :
    0.1,sin(0.1),0

    // Send this to the other side<br />                  [toEvaluator writeData:<br />                               [fsend dataUsingEncoding:NSASCIIStringEncoding<br />                                       allowLossyConversion:YES] ];<br />               }<br />
    

    On envoie les données à  l'evaluateur, et on passe à  l'intération suivante .
                    n++;<br />        }
    
    On change de courbe et on incrémente de 1 le numéro de la courbe.
    // Now send through the termination code<br />    [toEvaluator writeData:[@&quot;999&#092;n&quot;<br />         dataUsingEncoding:NSASCIIStringEncoding<br />      allowLossyConversion:YES] ];<br />     <br />    [self doStop:STOP_SENDER];<br />     <br />    // When this returns, our thread will die.<br />    [threadPool release];<br />}<br />
    

    L'envoi est fini. On dit à  l'Evaluateur que l'on a fini. Et on s'en va.
  • cbrandtcbrandt Membre
    07:52 modifié #5
    ok. donc si j'ai bien compris, 'formula' peut contenir '2x' que tu veux remplacer par '2 * x', mais peut aussi contenir déjà  '2*x' qu'il ne faut pas modifier.

    ya bon ?

    j ereviens dans 10 min avec un bout de code...
  • cbrandtcbrandt Membre
    mars 2005 modifié #6
    bon, j'ai peut-être quelque chose là .
    dis-moi, que fais-tu des cas comme x(3+x) et 2(2+x) ?
    là  aussi tu as besoin d'insérer des '*' avant la '(' ?

    edit:
    bon, j'ai fais un bout de code qui produit ça comme résultat:
    <br />avant:  (12x) x*x + ( x  2 )<br />apres:  (12*x)* x*x + ( x  *2 )<br /><br />avant: sin (x) + cos (2x/5) -x8<br />apres: sin (x) + cos (2*x/5) -x*8<br /><br />avant:  2 (3+x)<br />apres:  2* (3+x)<br /><br />avant: x(x-1)<br />apres: x*(x-1)<br /><br />avant: (x 2)(12x-3)<br />apres: (x *2)*(12*x-3)<br /><br />avant: (x 2)5 x<br />apres: (x *2)*5* x<br />
    

    ça correspond à  tes besoins ?
  • fouffouf Membre
    07:52 modifié #7
    C'est exactement ca. Merci beaucoup cbrandt. Tu me le passes ?? STP  o:)
  • cbrandtcbrandt Membre
    07:52 modifié #8
    ok. :fouf): :fouf):

    ça s'utilise sur des chaà®nes de caratère en C, donc faut adapter un peu...

    <br />#include &lt;stdio.h&gt;<br /><br />void Insere (char *c);<br />int InsereAvant (char *c, int p);<br />int InsereApres (char *c, int p);<br /><br /><br />int main (int argc, const char * argv[])<br />{<br />	char	formule[100];<br />	<br />	strcpy (formule, &quot; (12x) x*x + ( x  2 )&quot;);<br />	Insere (formule);<br /><br />	strcpy (formule, &quot;sin (x) + cos (2x/5) -x8&quot;);<br />	Insere (formule);<br /><br />	strcpy (formule, &quot; 2 (3+x)&quot;);<br />	Insere (formule);<br /><br />	strcpy (formule, &quot;x(x-1)&quot;);<br />	Insere (formule);<br /><br />	strcpy (formule, &quot;(x 2)(12x-3)&quot;);<br />	Insere (formule);<br />	<br />	strcpy (formule, &quot;(x 2)5 x&quot;);<br />	Insere (formule);<br />	<br />    return 0;<br />}<br /><br />void Insere (char *c)<br />{<br />	int p, q, i;<br />	<br />	<br />	printf (&quot;avant: %s&#092;n&quot;, c);<br />	<br />	// on parcoure la chaà®ne<br />	for (p = 0; p &lt; strlen (c); p++)<br />	{<br />		// caractère trouvé ?<br />		switch (c[p])<br />		{<br />			case &#39;x&#39;:<br />				p += InsereAvant (c, p);<br />				p += InsereApres (c, p);<br />				break;<br />			case &#39;(&#39;:<br />				p += InsereAvant (c, p);<br />				break;<br />			case &#39;)&#39;:<br />				p += InsereApres (c, p);<br />				break;<br />		}<br />	}<br />			<br />	printf (&quot;apres: %s&#092;n&#092;n&quot;, c);<br />}							<br /><br />int InsereAvant (char *c, int p)<br />{	<br />	int	q, i;<br />	<br />	<br />	// on recule<br />	for (q = p - 1; q &gt;= 0; q--)<br />	{<br />		if ((c[q] &gt;= &#39;0&#39; &amp;&amp; c[q] &lt;= &#39;9&#39;) || c[q] == &#39;)&#39;) // est-ce un chiffre ou &#39;)&#39; ?<br />		{<br />			// on décale la formule<br />			for (i = strlen (c) + 1; i &gt; q + 1; i--)<br />				c[i] = c[i-1];<br />			// on intercale un signe &#39;*&#39;<br />			c[q+1] = &#39;*&#39;;<br />			// terminé<br />			return 1;<br />		}<br />		else if (c[q] != &#39; &#39;) // différent de &#39; &#39; ?<br />		{<br />			// terminé<br />			return 0;<br />		}<br />	}<br />	return 0;<br />}<br /><br />int InsereApres (char *c, int p)<br />{	<br />	int	q, i;<br />	<br />	<br />	// on avance<br />	for (q = p + 1; q &lt; strlen (c); q++)<br />	{<br />		if ((c[q] &gt;= &#39;0&#39; &amp;&amp; c[q] &lt;= &#39;9&#39;) || c[q] == &#39;(&#39;) // est-ce un chiffre ou &#39;(&#39; ?<br />		{<br />			// on décale la formule<br />			for (i = strlen (c) + 1; i &gt; q; i--)<br />				c[i] = c[i-1];<br />			// on intercale un signe &#39;*&#39;<br />			c[q] = &#39;*&#39;;<br />			// terminé<br />			return 1;<br />		}<br />		else if (c[q] != &#39; &#39;) // différent de &#39; &#39; ?<br />		{<br />			// terminé<br />			return 0;<br />		}<br />	}<br />	return 0;<br />}<br /><br />
    
  • fouffouf Membre
    07:52 modifié #9
    Merci beaucoup.
    J'ai pas le temps de l'essayer ce soir ("L'Assommoir" à  lire, sympa mais loonnnnnngg). Je poste deux mains  :fouf): pour t'en dire des nouvelles.
    Merci encore.
Connectez-vous ou Inscrivez-vous pour répondre.