Bonjour a tous.
Pour apprendre le language C, je me suis recuperé un exercisse ou je doit reconnaitre, si l'entrée un "int", un "long" ou une "chaine" de charactères. J'aimerai bien connaitre l'argoritme pour faire le choix.
Merci d'avance
-----
Bonjour a tous.
Pour apprendre le language C, je me suis recuperé un exercisse ou je doit reconnaitre, si l'entrée un "int", un "long" ou une "chaine" de charactères. J'aimerai bien connaitre l'argoritme pour faire le choix.
Merci d'avance
Tu peux reformuler car ça ne veux rien dire.je me suis recuperé un exercisse ou je doit reconnaitre, si l'entrée un "int", un "long" ou une "chaine" de charactères
alors:
J'ai 4 entrées diférantes:
1.-le nombre d'entré, dans une entré j'ai:
-une chaine de characteres (str),
-un poid decimal (long)
-et pour finir un Numero (int). (Un Paquet pour la poste)
ils peuvent etre dans n'importe quel ordre.
je dois suprimer la chaine de charactère, donner le N°, puis le poid.
je voulais n'utiliser que 2 variables,
1. Variable pour un for next
2. Variable pour un If
if estce un str oui suprimé
est-ce un int oui garder
est-ce un long oui garder
metre en ordre
rendre les données
Excusez-mois pour mon charabia
Dernière modification par Claude-23 ; 18/12/2016 à 02h23.
Je ne demande pas une reponse complète, (pas encore)
j'aimerai uniquement savoir comment avec if je pourrais reconnaitre la valeur de l'entrée
Merci encore
C'est mieux, mais il reste encore des points pas très clairs:
C'est quoi le nombre d'entré(e)(es)? Le nombre d'adresses qui vont suivre? Un numéro qui s'incrémente à chaque entrée?J'ai 4 entrées diférantes:
1.-le nombre d'entré, dans une entré j'ai:
-une chaine de characteres (str),
-un poid decimal (long)
-et pour finir un Numero (int). (Un Paquet pour la poste)
Comment sont séparés les champs d'une entrée? Un ou plusieurs espaces, des caractères de séparation (; - etc)?
Ce serait plus simple si tu donnais quelques exemples à traiter, tu ne trouves pas?
Bonjour
les entrées ce font les une après les autres, après les 3 groupes d'entrées il revient et demande le nombres de colis
je recoit: un nombre de colis : 3
1er tour
: lyon
: 456
: 2.345
ensuite 2e tour
: 56
: 23.568
: paris
3e. tour
:
: 6.543
: 2834
mon travail et de sortir:
456, 2.35
56, 23.57
2834, 6.54
cela pourrais tout aussi bien etre 5 ou 30 colis
Tu pourrais lire les item et les stocker dans une chaine avec la fonction fgets. Il faudra ensuite y lire les items avec sscanf en exploitant aa valeur de retour pour connaitre si le type de la variable était le bon.
Techniquement toutes tes entrées sont des tableaux de caractères, et c'est bien dans leur contenu que tu dois trouver un critère pour choisir quoi faire de la chaîne. Un critère pouvant être par exemple le type de caractères autorisées...
J'aimerrais bien arrivé a cela:
declaration de monNombre
declaration de monEntier
declaration de monLong
1ere entré dans ma variable : if est-ce une chaine? oui, (je n'en veut pas)
non suivant
else if est-ce un entier? oui , dans 1er variable entier
non suivant
else if est-ce un long? oui,dans la 1er ariable long
non suivant
else Erreur.
Bonjour,J'aimerrais bien arrivé a cela:
declaration de monNombre
declaration de monEntier
declaration de monLong
1ere entré dans ma variable : if est-ce une chaine? oui, (je n'en veut pas)
non suivant
else if est-ce un entier? oui , dans 1er variable entier
non suivant
else if est-ce un long? oui,dans la 1er ariable long
non suivant
else Erreur.
lou_ibmix_xi vous a mis sur la voie :
Vous devez définir clairement les critères discriminants vos différents types d'entrées. Par exemple :
1) Si l'entrée contient au moins un caractère alphabétique, alors il s'agit une chaine de caractère, donc une ville;
2) Si l'entrée contient un point décimal, alors il s'agit un nombre décimal;
3) Dans tous les autres cas, il ne peut s'agir que d'un entier.
Cordialement
Bonjour,
Je serais curieux de connaître tes définitions de long et de entier.
Et de comment et pourquoi tu les différencie ?
Pour tes besoins, vu tes exemples, je pense que tu maîtrise mal ces notions.
Attends tu des nombres à virgule (flottantes)?
Ces types de données seraient alors mal adaptées, utilise plutôt float ou double dans ce cas.
Exemple typique ici du poid, c'est bien un nombre à virgule flottante, à moins que tu ne considères que des poids entier (int ou long)...
Par définition un long est en entier (long), la différence est simplement l'espace de stockage nécessaire, mais depuis bien longtemps, ces deux types utilisent (généralement) le même nombre d'octet (à ma connaissance): 4 octets...
Autrefois, le type int (dans la plupart des langages) n'utilisait que 2 octets.
Pour des espace de stockage plus réduit, on peut utiliser le short (2 octets) ou même en C, le char (1 seul octer normalement)...
Si tu n'utilises pas les nombres négatifs, les unsigned te permettent se grappiller des valeurs supérieures, sans effort, et évitent les erreur de conception.
De plus en C (standard), les string n'existent pas.
On parle plutôt de tableaux de caractères:
Si ton programme reçoit ces entrées en paramètre (ligne de commande par exemple), ils sont déjà "triés" puisque dans le tableau des paramètres du logiciel:Code:char[]
Il suffit de parcourir ce tableau,Code:*argv[]
Si ces entrées sont toujours dans le même ordre, aucun problème de traitement, sinon tu peux jouer sur le
Qui te donnera le nombre de paramètres entrés, et par consequent, tu sauras que le "string" n'a pas été fourni (vu tes exemple)...Code:int argc
Tu peux développer une fonction qui reprendrait le fonction de instanceOf() des langages de haut niveau, qui renverrais true si l'élement testé correspond au type recherché...
Et finalement, si les élements ne sont pas entrés en paramètre à l'appel du programme, qu'est ce qui t'empèche de "forcer un parcours":
Entrez la ville
Entrez le poid
Entrez le numéro
...
Il faudrait préciser (après réflexion) comment le programme récupère ces données ?
Fournies au programme en paramètres ?
Fournies (au clavier) par l'utilisateur ?
Lues à partir d'un fichier ?
- Format du fichier (CSV, tabulations, tailles fixes, xml, ... --> dans tous ces cas les données devraient être bien organisées, sinon il y aurait un gros problème en amont...) ?
- Comment est approvisionné le fichier ?
Communication inter-processus (peu probable ici) ? Là il faudrait agir sur le processus émetteur pour standardiser la communication !
- par exemple fournies par un processus industriel ou un matériel (lecture optique)
... (non exhaustif)
Le traitement dépend en grande partie de cette fonctionnalité.
Et si c'est un exercice, cela permettra une réflexion plus approfondie.
Edit (HS) : Il faudrait augmenter le temps pendant lequel l'édition d'un message reste possible, cela limiterait bien le nombre de "re-post" inutiles...
Dernière modification par Ikhar84 ; 18/12/2016 à 14h06. Motif: Emoticone retirée et ajout d'une remarque personnelle
Merci beaucoup pour votre interesse a tous,
a vrai dire, je cherche le moyen de savoir qu'est-ce que j'ai rentré?
si je rentre un int: comment doit-je ecrire la question dans mon IF
effectivement je vais me faire deux tableaux,Code:if variable = int ... else if variable = flaot ....
l'un int et l'autre comme conseiller plus haut float.
En C, vous ne pouvez pas utiliser des noms de variables qui n'aient pas été déclarés antérieurement. Ce qui implique que vous connaissez déjà le type de votre 'variable'.
Montrez sa déclaration et la manière dont elle est initialisée, l'aide qui pourra ensuite vous être apportée n'en sera que plus efficace.
Cordialement
(Re)lire mon message #9: tu tentes une conversion et tu adaptes la suite selon qu'elle a fonctionné ou non.si je rentre un int: comment doit-je ecrire la question dans mon IF
J'ai l'impression que tu débutes vraiment le C, est-ce ton 1er exercice? Il faut que tu ais déjà vu les notions de boucle, de tableau, de test de comparaison (égalité)... pour résoudre cet exercice.a vrai dire, je cherche le moyen de savoir qu'est-ce que j'ai rentré?
si je rentre un int: comment doit-je ecrire la question dans mon IF
De plus il faut décrypter tes messages et ça ne facilite pas, met de vrais morceaux de code (compilé) pour illustrer.
Je réessaye de te mettre sur la voie: sous quelle forme récupères-tu tes entrées à tester ?
Comme je l'ai déjà dit,je suis vraiment un d#ebutant
je vais essaier de metre ca aux claire.
voici ce que j'ai fait j'usqu'a maintenant, mais 2 erreurs sont la, et c'est j'ustement ma questionCode:#include <stdio.h> int main() { int colis=0; printf("entrer le nombre de colis..!"); scanf("%d\n", &colis); int monInt[colis]; float monFloat[colis]; long maVariable=0; for (int i= 0; i<colis; i++) { printf("votre donne"); scanf("%ld", maVariable); if maVariable = int { monInt[i] = maVariable; maVariable = 0; else { monFloat[i] = maVariable; maVariable = 0; } printf("%d %ld\n", monInt[i], monfloat[i]; } } }
Bonjour,
Je donne comme d'habitude le même conseil : commencer la rédiger l'algorithme en français : papier/crayon.
Ensuite, il sera temps de traduire cela en C.
Petite info : en C de base, on ne peut pas déclarer un tableau avec une dimension variable.
Si, si, depuis la norme C99 on peut. Mais tous les compilateurs ne l'ont pas intégrée: ça marche avec gcc mais pas avec msvc par exemple.Petite info : en C de base, on ne peut pas déclarer un tableau avec une dimension variable.
Pour le reste, en voyant la ligne " if maVariable = int " , il me semble que la marche à franchir est un peu haute pour le moment et il va falloir acquérir des bases de C un peu plus solides.
Bonjour Jack,
Oui, je le savais, c'est la raison pour laquelle j'ai écrit "C de base".
Personnellement, je ne trouve pas que ce soit une bonne idée de l'enseigner aux débutants.
Mais je me pose une question : comment ça se passe au point de vue utilisation de la mémoire.
Avec alloc et free (ou new et delete en C++), on savait exactement où on réservait de la mémoire et où on la libère. Idem avec un tableau alloué dans une fonction, là, la réservation de la mémoire est codée par la compile.
Peut-être le compilateur génère tout seul le couple alloc+free, ou alors la mémoire est simplement perdue. Bref, j'aimerais bien savoir comment ça se passe.
Merci d'avance.
PS mon compilateur ne sait pas que c'est autorisé.
Bonjour à tous
Je confirme.
Cette ligne ressemble à s'y méprendre à une ligne basic, mais le comportement est très différent, en effet.
Sans dévoiler le pot aux roses, il faut savoir que les opérations se décomposent chronologiquement ainsi:
1- assignation de maVariable = int;
2- exécution du contenu des accolades;
3- le else sera ignoré et déclenchera (peut-être) une erreur;
Je te laisse trouver l'erreur d'écriture.
Je pense qu'il faut en effet commencer par apprendre a s'en passerPersonnellement, je ne trouve pas que ce soit une bonne idée de l'enseigner aux débutants.
Oui, c'est çà, l'allocation et la désallocation sont automatiques: https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.htmlPeut-être le compilateur génère tout seul le couple alloc+free, ou alors la mémoire est simplement perdue. Bref, j'aimerais bien savoir comment ça se passe.
Bonjour,
le type long est un type entier. Il est équivalent au type 'int' sur des systèmes où ce dernier est codé sur 4 octets en mémoire.
Si vous voulez mettre des données génériques dans une variable, je ne vois que les chaines de caractères (ASCII):
Une fois que vous aurez initialisé le contenu de 'maVariable' avec unCode:char maVariable[32]; // tableau de 32 octets pour 31 caractères maxi (toute chaine ASCII se terminant par l'octet nul)
vous devrez interpréter le contenu de 'maVariable' caractère par caractère pour connaître le type de la donnée entrée.Code:scanf("%s", maVariable);
Pour vous simplifier le travail, commencez par écrire 3 fonctions prototypées comme suit :
À noter: NE PAS LIRE les caractères au-delà de la taille de la chaine entrée. À ce titre on se rappellera, que le dernier octet de la chaine de caractères vaut 0.Code:bool isString(char maVariable); // Renvoie 'true' si le premier caractère est alphabétique; 'false' sinon bool isFloat(char maVariable); // Renvoie 'true' si il existe un point décimal (code ASCII : '.' ou 56) ou une virgule (code ASCII : ',' ou 54); Sinon, renvoie 'false'; bool isInteger(char maVariable);// Renvoie 'true' si tous les caractères sont des chiffres décimaux, sinon 'false'.
Cordialement
le paramètre devrait plutôt être "char* maVariable" ou "char maVariable[]"
Oui, tout à fait, j'ai oublié les crochets :
MerciCode:bool isString(char maVariable[]); // Renvoie 'true' si le premier caractère est alphabétique; 'false' sinon bool isFloat(char maVariable[]); // Renvoie 'true' si il existe un point décimal (code ASCII : '.' ou 56) ou une virgule (code ASCII : ',' ou 54); Sinon, renvoie 'false'; bool isInteger(char maVariable[]);// Renvoie 'true' si tous les caractères sont des chiffres décimaux, sinon 'false'