IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

fonction qui fait la somme d'une chaine de caractères


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 4
    Points : 0
    Points
    0
    Par défaut fonction qui fait la somme d'une chaine de caractères
    je veux faire une fonction récursive qui prend en entrée une chaine de caractère par exp :"−1,37 + 40−10,08+7"
    et j'ai fait ça mais je me plante quelque part car je suis débutante en C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main() {
    char str[20];
    sommec(str,N);
    printf("la somme vaut %f",sum);
    	return 0;
    }
    int sommec(int N, char*str){
    	double sum=0.0;
    	int i;
    	if(N==0){
    		sum=0;
    	}
    	if (N==1){
    		sum=atof(*str);}
    	else{
    		for(i=0;i<N;i++){
    			while(str[i]!='+'||str[i]!='-'){
    				atof(*str);
    				sum= atof(*str)+sommec(chat*str,int N-1);
    			}
     
    		}
     
    	}
    	return sum ;
     
    }

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Quand tu compiles ton code, le compilateur doit déjà t'indiquer que certaines lignes n'ont aucun sens.
    Par exemple ligne 7, il doit indiquer : "c'est quoi ce N ?". Tu utilises une variable qui n'a jamais été déclarée avant.
    Toujours ligne 7, il indique : "c'est quoi cette fonction sommeC ?". Tu la définis, mais ça n'est qu'après. Une fonction doit être à minima déclarée avant d'être utilisée. Il faut ajouter avant le main() : int sommec(int N, char*str);Toujours ligne 7, tu passes des paramètres a une fonction qui n'ont jamais reçu de valeur. La fonction va donc recevoir des valeurs totalement quelconques.
    Toujours ligne 7, les paramètres que tu passes à la fonction sont inversés. La fonction attend un nombre puis une chaine, tu lui passes une chaine puis un nombre.

    Sinon dans le codage de la fonction, c'est un bon début. Mais attention atof(*str) n'a pas de sens non plus d'ailleurs ça aussi le compilateur doit le dire : "la fonction attend un chaine de caractère et reçoit un simple charactère".

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    C'est + compliqué que tu le crois

    Tu peux faire 1 code "one shot" mais la solution est 1 arbre "je-ne-sais-plus-son-nom" qui
    • a des opérateurs comme nœud
    • a des valeurs comme feuille

    Ensuite est-ce que chaque nœud a exactement 0 ou 2 fils ?
    Il faudrait chercher sur Internet (c'est 1 sujet ultra classique ) mais je dirais tant que tu ne gères pas les fonctions (log, sin, cos, atan, ...) cela devrait être le cas.
    Ensuite, si tu gères les parenthèses, c'est juste l'arbre qui est construit différemment.

    Donc voila automate/ machine à états pour générer 1 arbre "je-ne-sais-plus-son-nom" : il y a du travail

    "−1,37 + 40−10,08+7" devient (si je ne me trompe pas )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
             +
           /   \
       -1.37    -
              /   \
             40    +
                 /   \
               10.8   7
    Ensuite tu as juste à faire 1 parcours pour avoir le résultat

    Édit : Il y a aussi la précédence des opérateurs Par exemple 1 + 4 * 5 donne 21 (1 + 20) et non pas 25 (5 * 5)
    Donc effectivement si tu n'as que des soustractions et des additions et rien d'autre pour 1 code "one shot"

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    S'il n'y a que des additions et des soustractions, cela peut être tout à fait traité linéairement. La récursivité est possible mais ne fait que compliquer le traitement.

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 4
    Points : 0
    Points
    0
    Par défaut
    j'ai pris en compte un peu ce que vous avez dit et j'ai fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define N (10)
     
    float sommec(int N,char*str){
        double sum=0.0;
        int i;
        if(N==0){
            sum=0;
        }
        if (N==1 && str[i]!='+'||str[i]!='-'){
            sum+=atof(*str);}
        else{
            for(i=0;i<N;i++){
                if (str[0]=='+'){
                    sum += atof(str+1)+sommec(str+2,N-2);
                }
                if (str[0]=='-'){
                    sum += atof(str)+sommec(str+2,N-2);
                }
                sum +=atof(str)+sommec(str+1,N-1)
            }
        }
        return sum ;
    }
     
    int main() {
    char*str="-10.48+50-10, 04+8-244";
    sommec(N,str);
    printf("la somme vaut %f",sum);
        return 0;
    }

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par mariael Voir le message
    j'ai pris en compte un peu ce que vous avez dit
    Grave erreur, il faut prendre en compte tout ce qui est dit !!!
    Citation Envoyé par mariael Voir le message
    et j'ai fait ça :
    Et le compilateur lui il a fait quoi ?

    Donc les erreurs
    • tu définis une macro "N" alors qu'il y a une variable "N" (sur la ligne du dessous en plus, franchement !!!)
    • la fonction reçoit un int en premier et une string en second, mais tu l'appelles en lui passant une string en premier et un int en second
    • ligne 22: le point-virgule n'est pas une option
    • ligne 31: variable "sum" ???

    Tout cela t'était déjà indiqué par le compilateur. Tu aurais fait l'effort de lire ses messages tu n'aurais pas eu besoin de venir ici nous demander de les lire à ta place. Ok, t'as quand-même gagné le droit d'avoir un conseil: quand un compilateur te sort 500 erreurs, bien souvent les 490 dernières sont directement issues des 10 premières (le compilateur n'ayant pas compris le début est alors totalement perdu et tout ce qui suit lui semble incompréhensible). Donc tu ne te concentres que sur la première erreur et tu modifies ton code jusqu'à ce qu'elle disparaisse et généralement ça fait disparaitre les 480 suivantes. Ne t'en reste alors que 8 ou 9 et tu recommences de la même façon à ne te concentrer que sur la première en oubliant toutes les autres.

    Citation Envoyé par foetus Voir le message
    mais la solution est 1 arbre "je-ne-sais-plus-son-nom"
    Arbre... binaire ?

    Citation Envoyé par foetus Voir le message
    Il y a aussi la précédence des opérateurs Par exemple 1 + 4 * 5 donne 21 (1 + 20) et non pas 25 (5 * 5)
    Une fois j'ai bâché un type qui voulait me vendre une calculatrice sur la plage (comme si j'avais besoin de calculer les grains de sable). Pour qu'il arrête de me casser les noix, je lui ai dit "je ne vais pas acheter une calculatrice qui ne sait pas calculer" et j'ai tapé "2+3*4" en lui montrant le résultat "20" (c'était une calculette de bazar à 2 ronds et seules les calculatrices scientifiques connaissent les priorités des opérateurs) et en lui disant "tu vois, ça donne 20 alors que ça devrait donner 14". Il m'a plus fait chier ensuite.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Arbre... binaire ?
    binary expression tree, lien wiki en anglais ... pour les expressions mathématiques et booléennes

Discussions similaires

  1. Réponses: 10
    Dernier message: 23/05/2016, 20h44
  2. Réponses: 5
    Dernier message: 20/10/2013, 03h09
  3. Réponses: 10
    Dernier message: 30/07/2009, 13h08
  4. fonction qui permet de vérifier qu'une chaine est un double
    Par celiaaa dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 20/12/2006, 13h35
  5. fonction qui fait le tri d'une Table de BDD
    Par devlopassion dans le forum C++Builder
    Réponses: 7
    Dernier message: 03/10/2006, 15h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo