Débutant C : petit programme
Utilisateur anonyme
-
Onde2Choc Messages postés 299 Statut Membre -
Onde2Choc Messages postés 299 Statut Membre -
Salut,
je fais des exercices dans un livre pour apprendre le language C. La consigne est la suivante : "écrivez un programme affichant les codes numériques respectifs de Z et z"
Dans la réponse, il utilise une variable de type "char". Moi, dans mon programme ci-dessous, j'ai utilisé le type "int". Est-ce que c'est bon (en tt cas, ça marche... mais est-ce reglementaire, est ce moins bien ?). Pourquoi ont-ils déclarés une variable texte plus qu'une variable entière ?
Merci :-))
je reste sur le net pour la réponse...
françois
je fais des exercices dans un livre pour apprendre le language C. La consigne est la suivante : "écrivez un programme affichant les codes numériques respectifs de Z et z"
Dans la réponse, il utilise une variable de type "char". Moi, dans mon programme ci-dessous, j'ai utilisé le type "int". Est-ce que c'est bon (en tt cas, ça marche... mais est-ce reglementaire, est ce moins bien ?). Pourquoi ont-ils déclarés une variable texte plus qu'une variable entière ?
Merci :-))
je reste sur le net pour la réponse...
françois
A voir également:
- Débutant C : petit programme
- Logiciel montage vidéo débutant - Guide
- Logiciel de programmation pour débutant - Guide
- Formation sap débutant pdf - Forum Logiciels
- Apprendre le coran pour débutant (+ pdf) - Télécharger - Histoire & Religion
- Comment utiliser un ordinateur pour un débutant - Astuces et Solutions
11 réponses
Hello !
char, short, int et long sont tous des types entiers.
En principe, on peut toujours considérer que :
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
Par conséquent, un char est convertible en short qui est convertible en int, etc... donc afficher un char en tant que int est parfaitement correct même si on utilise des octets inutiles.
Même si rien n'oblige un compilateur C à ranger un char dans un seul octet, c'est depuis la nuit des temps la convention qui a été retenue par les compilateurs. L'introduction d'un nouveau type a été nécessaire pour les caractères codés sur plus d'un octet (Unicode, UTF...) : wchar_t.
char, short, int et long sont tous des types entiers.
En principe, on peut toujours considérer que :
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
Par conséquent, un char est convertible en short qui est convertible en int, etc... donc afficher un char en tant que int est parfaitement correct même si on utilise des octets inutiles.
Même si rien n'oblige un compilateur C à ranger un char dans un seul octet, c'est depuis la nuit des temps la convention qui a été retenue par les compilateurs. L'introduction d'un nouveau type a été nécessaire pour les caractères codés sur plus d'un octet (Unicode, UTF...) : wchar_t.
Quand tu stockes un caractère en mémoire, il est transformé en binaire. Donc ce n'est plus Z ou z, c'est quelque chose comme 10010110. Pour savoir comment restituer le caractère à l'écran, ton caractère est donc représenté en mémoire par son code ASCII (90 pour Z si je me souviens bien). donc si tu fais char lettre = 'Z'
puis printf(" %d et la valeur numérique de %c", lettre, lettre);, ton programme va afficher "90 est la valeur numérique de Z" car lorsque tu mets %d dans printf, le programme attend un nombre entier, il prend donc le code ASCII (90) et lorsque tu mets %c, le programme attend un caractère, il prend donc le symbole du code ASCII stocké (Z).
MORALITE : 1)lorsque l'on stocke un caractère en mémoire, seul son code ASCII est stocké.
2)selon les informations que l'on donne au programme, il traitera le caractère ou son code ASCII.
3)le code ASCII est un nombre entier, donc on peut déclarer une variable int et l'utiliser comme un caractère en l'initialisant avec le code ASCII de ce caractère.
4)je n'ai aucun talent pédagogique, je ferais mieux de ne pas devenir prof.
J'espère que tu as compris mes explications embrouillées...
BOOM !
Laissez se propager l'onde de choc...
puis printf(" %d et la valeur numérique de %c", lettre, lettre);, ton programme va afficher "90 est la valeur numérique de Z" car lorsque tu mets %d dans printf, le programme attend un nombre entier, il prend donc le code ASCII (90) et lorsque tu mets %c, le programme attend un caractère, il prend donc le symbole du code ASCII stocké (Z).
MORALITE : 1)lorsque l'on stocke un caractère en mémoire, seul son code ASCII est stocké.
2)selon les informations que l'on donne au programme, il traitera le caractère ou son code ASCII.
3)le code ASCII est un nombre entier, donc on peut déclarer une variable int et l'utiliser comme un caractère en l'initialisant avec le code ASCII de ce caractère.
4)je n'ai aucun talent pédagogique, je ferais mieux de ne pas devenir prof.
J'espère que tu as compris mes explications embrouillées...
BOOM !
Laissez se propager l'onde de choc...
En effet, j'ai pas très bien compris... enfin pas tout...
Tu me dit qu'une variable est stockée sous forme bianire, puis après tu me dis sous son code...
Tu peux me réexpliquer ?
Merci :-))
Tu me dit qu'une variable est stockée sous forme bianire, puis après tu me dis sous son code...
Tu peux me réexpliquer ?
Merci :-))
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
A tout caractère est associé une valeur numérique qui est stocké sous forme binaire en mémoire.Par exemple l'espace à pour valeur ASCII le nombre décimal 32 mais en mémoire il n'y aura que le nombre binaire 00100000 qui vaut également 32.
Hello !
Ce qui doit être bien clair :
Une variable de type char est pour un compilateur C un entier signé (presque) toujours compris entre -128 et 127 et rien d'autre. C'est le programmeur qui l'interprète comme un caractère codé (ASCII, EBCDIC, IA5...) en fonction du clavier utilisé par exemple, comme une suite de booléens, comme une suite de pixels d'écran, comme un entier crypté, etc etc...
À noter que le codage des caractères sur 7/8 bits est en voie de disparition. À terme, l'utilisation de codages 16 bits (Unicode, OEM, ISO) vont très nettement se généraliser.
Take care !
Ce qui doit être bien clair :
Une variable de type char est pour un compilateur C un entier signé (presque) toujours compris entre -128 et 127 et rien d'autre. C'est le programmeur qui l'interprète comme un caractère codé (ASCII, EBCDIC, IA5...) en fonction du clavier utilisé par exemple, comme une suite de booléens, comme une suite de pixels d'écran, comme un entier crypté, etc etc...
À noter que le codage des caractères sur 7/8 bits est en voie de disparition. À terme, l'utilisation de codages 16 bits (Unicode, OEM, ISO) vont très nettement se généraliser.
Take care !
Erratum :
À terme, l'utilisation de codages 16 bits (Unicode, OEM, ISO) va très nettement se généraliser.
À terme, l'utilisation de codages 16 bits (Unicode, OEM, ISO) va très nettement se généraliser.
C'est bizarre mais j'ai plutôt l'impression que ça commence à s'enliser l'Unicode surtout qu'il me semble les japonais ne veulent pas du 16 bits car il n'y a pas leurs glyphes locaux il faudrait adopter les 32 bits pour que tout le monde soit content (taille du code source * 4, le compilo va pas apprécier :-P). Aucun clavier à ce jour ne supporte l'Unicode > 8 bits. M'apprendra tu des choses à ce sujet?
Unicode supporte les deux jeux modernes des caractères Japonais. À savoir les Hiragana and katakana.
Pour consulter les glyphes :
http://www.unicode.org/charts/
Unicode a un gros avantage en étant choisi comme mapping standard des langages comme C++, Java, ... mais la concurrence est rude. C'est comme le système métrique, c'est bien pratique, mais cela n'empêche pas les anglo-saxons d'utiliser leur système propre. Les mappings de caractères existent par dizaines... Je pense qu'en passant à 48 bits, il y en aura sûrement des centaines ;)
Pour consulter les glyphes :
http://www.unicode.org/charts/
Unicode a un gros avantage en étant choisi comme mapping standard des langages comme C++, Java, ... mais la concurrence est rude. C'est comme le système métrique, c'est bien pratique, mais cela n'empêche pas les anglo-saxons d'utiliser leur système propre. Les mappings de caractères existent par dizaines... Je pense qu'en passant à 48 bits, il y en aura sûrement des centaines ;)
Ils n'y sont pas. Seuls ceux que je t'ai cité y figurent.
Des infos sur le codage des caractères Kanji sont fournies par :
http://kanji.free.fr/docs.php?doc=codage
Des infos sur le codage des caractères Kanji sont fournies par :
http://kanji.free.fr/docs.php?doc=codage
Information complémentaire (utile pour les débutants) :
Pour connaître les détails d'implémentation des types entiers (char, short...), consulter le fichier standard <limit.h>.
Exemple (extrait) :
#define CHAR_BIT <#if expression >= 8>
#define CHAR_MAX <#if expression >= 127>
#define CHAR_MIN <#if expression <= 0>
#define SCHAR_MAX <#if expression >= 127>
#define SCHAR_MIN <#if expression <= -127>
#define UCHAR_MAX <#if expression >= 255>
#define MB_LEN_MAX <#if expression >= 1>
À noter : la contradition apparente entre le nombre de bits pour coder un char (8) et les limites utiles (0 < < 127). Intéressant. Non ?
Pour connaître les détails d'implémentation des types entiers (char, short...), consulter le fichier standard <limit.h>.
Exemple (extrait) :
#define CHAR_BIT <#if expression >= 8>
#define CHAR_MAX <#if expression >= 127>
#define CHAR_MIN <#if expression <= 0>
#define SCHAR_MAX <#if expression >= 127>
#define SCHAR_MIN <#if expression <= -127>
#define UCHAR_MAX <#if expression >= 255>
#define MB_LEN_MAX <#if expression >= 1>
À noter : la contradition apparente entre le nombre de bits pour coder un char (8) et les limites utiles (0 < < 127). Intéressant. Non ?
je n'ai pas un super niveau parce-que j'ai commencé ya pas longtemps, mais j'ai compris ce que t'as marqué... en effet c'est pas mal...
puisque je vois que tu réponds à mes messages, pourrait tu continuer à répondre au message 'prb serveur ?' dans le même forum, ainsi que 'modem : on peut téléphoner' dans le forum matériel.
Merci d'avance :-)
je reste en ligne
françois
puisque je vois que tu réponds à mes messages, pourrait tu continuer à répondre au message 'prb serveur ?' dans le même forum, ainsi que 'modem : on peut téléphoner' dans le forum matériel.
Merci d'avance :-)
je reste en ligne
françois
Erratum :
Le fichier est limits.h et non limit.h, en C++ appelé au moyen de
#include <climits>
Take care !
Le fichier est limits.h et non limit.h, en C++ appelé au moyen de
#include <climits>
Take care !
Désolé de n'avoir pas été là hier pour expliquer ce que j'avais dit...
En gros, ton caractère est stocké en binaire. Or le binaire c'est des 1 et des 0, des chiffres quoi, pas des lettres. Donc il faut au préalable "convertir" ton caractère en nombres entiers. C'est comme multiplier A par 2, c'est impossible il faut d'abord convenir que A = 1 par exemple Et là, A * 2 = 1 * 2 = 2 = B (si B = 2). L'équivalent numérique de chaque caractère est appellé code ASCII, ou Unicode ou bien d'autres selon le code utilisé.
J'espère avoir été plus clair cette fois...
BOOM !
Laissez se propager l'onde de choc...
En gros, ton caractère est stocké en binaire. Or le binaire c'est des 1 et des 0, des chiffres quoi, pas des lettres. Donc il faut au préalable "convertir" ton caractère en nombres entiers. C'est comme multiplier A par 2, c'est impossible il faut d'abord convenir que A = 1 par exemple Et là, A * 2 = 1 * 2 = 2 = B (si B = 2). L'équivalent numérique de chaque caractère est appellé code ASCII, ou Unicode ou bien d'autres selon le code utilisé.
J'espère avoir été plus clair cette fois...
BOOM !
Laissez se propager l'onde de choc...