probleme de pure débutant - C - Programmation
Marsh Posté le 31-05-2006 à 15:48:31
heu tu fais un scanf alors il attend que tu lui donne une valeur
Au lieux de recopier bêtement du code commence par lire un tutorial sur le C
Marsh Posté le 31-05-2006 à 15:51:17
fais un printf ("entrez votre code\n" );
puis scanf("%d",&choix);
Marsh Posté le 31-05-2006 à 17:28:17
sebou je suis en train de lire un tuto sur le C mais j'ai du mal c'est pourquoi je demande de l'aide or si je recopirai je ne vous demanderai pas de l'aide maintenant je vous demande une autre aide (merci antho j'ai réparer mon erreur mm si ce n'était pas tout a fait sa (bien que ce que tu mai di etait vrai)) la je vous demande pourquoi dans mon code les resultat sont toujour = a 0 si j'enleve le resultat = 0 c'est faut et si je met tout simplement resultat sa me fais des calcule faut du genre 45+5=2
merci de l'aide que vous m'apporter ^^
Marsh Posté le 31-05-2006 à 17:31:01
je voulais aussi savoir c'est normal que le C soit vachement dur pour moi (eleve de 1ere S) le C c'est dur pour tout le monde je suis trop jeune ou c'est que je suis pas fait pour l'informatique ^^?
Marsh Posté le 31-05-2006 à 17:45:47
resultat fait toujours zéro car tu ne fais pas l'opération
il faut mettre resultat=nombre1+nombre2;
(par exemple pour l'addition)
Marsh Posté le 31-05-2006 à 17:46:12
Si t'arrive pas à comprendre ca intuitivement t'es ptêtre pas "né" pour l'informatique, mais ca exclut pas qu'en bossant tu arrive à de bonnes choses. Mais faudra bosser un peu...
Marsh Posté le 31-05-2006 à 18:00:39
normal que resultat soit toujours égal à 0 : tu ne remplis jamais sa valeur.
il faut mettre des instructions du genre "resultat = nombre1 + nombre2;" avant tes printf.
Par ailleurs
1) tu devrais gérer les cas où l'utilisateur rentre une opération qui n'existe pas
2) il existe en C une structure switch qui t'aiderait sans doute à faire quelque chose de plus propre et plus lisible
Code :
|
EDIT: GRILLAID (et d'1/4 d'heure en plus...)
Marsh Posté le 31-05-2006 à 19:59:28
woard a écrit : je voulais aussi savoir c'est normal que le C soit vachement dur pour moi (eleve de 1ere S) le C c'est dur pour tout le monde je suis trop jeune ou c'est que je suis pas fait pour l'informatique ^^? |
Le C te donne assez de corde pour te pendre.
Si tu étudies ça par plaisir, il n'y a aucune raison pour que tu n'y arrives pas.
Si tu parles anglais, un tuto sympa:
http://beej.us/guide/bgc/output/html/index.html
Sinon,
http://www-clips.imag.fr/commun/be [...] NSI_C.html
Mais c'est plus formel.
Marsh Posté le 31-05-2006 à 20:04:32
franceso a écrit : normal que resultat soit toujours égal à 0 : tu ne remplis jamais sa valeur.
|
char c
Ne jamais utiliser de char ailleurs que dans une chaîne. C'est un coup à faire des conneries.
Marsh Posté le 31-05-2006 à 20:21:09
woard a écrit : le C c'est dur pour tout le monde je suis trop jeune ou c'est que je suis pas fait pour l'informatique ^^? |
L'âge n'a rien à voir. Et, en général, les élèves de S sont "généralement" cablés pour savoir facilement transformer la solution d'un pb en algorithme informatique.
Si tu veux savoir si t'es fait pour l'informatique, est-ce que t'as une calculatrice progammable ? Est-ce que tu prends plaisir à la programmer ?
Sinon, est-ce que tu fais un blocage sue le C pur ? Trop tôt pour le dire. Quand tu réussiras tout seul à faire des programmes fonctionnels et que tu les verras tourner, c'est là que tu verras si t'es fait pour ça (si tu as envie de continuer, etc)
Marsh Posté le 01-06-2006 à 08:55:16
simple_stupid a écrit : Ne jamais utiliser de char ailleurs que dans une chaîne. C'est un coup à faire des conneries. |
Pourquoi
Si tu fais gaffe, il n'y a aucune raison de faire des conneries...
Marsh Posté le 01-06-2006 à 12:24:38
franceso a écrit : Pourquoi |
Parce qu'aucune fonction ne prend ni ne renvoie de char.
On ne travaille pas avec des char: tu ne t'es pas demandé pourquoi les fonctions du style getchar() renvoient des int?
Marsh Posté le 01-06-2006 à 12:31:07
n'importe quoi, tu utilises char quand tu veux du moment que tu fais attention a la concordance des types.
c'est sur que faut pas faire char c = getchar() mais ca suffit de lire la doc (comme pour toute les fonctions), getchar renvoi EOF en cas d'erreur et le type de EOF est int
dans l'exemple de francesco je vois pas en quoi l'utilisation de char est dangereuse
Marsh Posté le 01-06-2006 à 12:42:16
skelter a écrit : n'importe quoi, tu utilises char quand tu veux du moment que tu fais attention a la concordance des types. |
Non.
Si les fonctions comme getchar retournent des int, c'est parce qu'ils doivent signaler une erreur possible, qui doit donc être distincte de toutes les valeurs de char possible. Donc si tu l'affectes à un char, tu te retrouves avec un overflow ou une troncature, et ça te donne de la merde.
En parlant de getchar, regarde le prototype de putchar: comme toutes ses soeurs, elle accepte un type int. Pourtant tu ne lui balances pas EOF là?
Les fonctions qui travaillent sur des caractères acceptent et renvoient des int, on travaille donc avec des int: elles les convertissent en unsigned char (et oui, le fait que char soit signed dépend de l'implémentation).
En plus, tu risques d'avoir plein de problèmes si tu les manipules (extension de signe, overflow, etc). Enfin, int est la taille d'un mot naturel de la machine (taille de ses registres), les calculs sont plus rapides, et demandent moins de boulot du compilateur.
Un dernier exemple: les constantes caractère sont de type int (essaie un sizeof('a') pour t'en convaincre).
Alors je ne vois vraiment aucune raison d'utiliser un char. A part pour se vautrer...
Marsh Posté le 01-06-2006 à 13:54:40
simple_stupid a écrit : Non. |
D'accord pour ce qui concerne l'alignement de la mémoire et la taille des registres : il est vrai qu'utiliser un int est plus efficace que d'utiliser un char.
Par contre, je vois toujours pas pourquoi on se vautrerait en utilisant des char. Mon exemple ne fait appel à aucune fonction du type getchar() / putchar(), ne fait aucune manipulation sur le caractère et je ne vois pas où il pourrait y avoir un risque de plantage.
Marsh Posté le 01-06-2006 à 14:09:42
franceso a écrit : D'accord pour ce qui concerne l'alignement de la mémoire et la taille des registres : il est vrai qu'utiliser un int est plus efficace que d'utiliser un char. |
Dans ton exemple, y'a rien à dire.
Mais c'est juste pour prendre de bonnes habitudes ;-)
Marsh Posté le 01-06-2006 à 14:17:01
Citation : Non. |
c'est ce que j'ai dit
Citation : Un dernier exemple: les constantes caractère sont de type int (essaie un sizeof('a') pour t'en convaincre). |
je sais et je vois pas ce que ca vient faire la
Citation : En plus, tu risques d'avoir plein de problèmes si tu les manipules (extension de signe, overflow, etc). |
si on considere un char comme un caractere je vois pas le probleme, et l'overflow arithmetique concerne tout les types entiers.
Citation : |
je vois toujours pas ce que ca vient faire la, si on considere un char comme un caractere je vois mal comment on peut se retrouver a faire du calcul en masse sur des vecteurs de char ??
Citation : En parlant de getchar, regarde le prototype de putchar: comme toutes ses soeurs, elle accepte un type int. Pourtant tu ne lui balances pas EOF là? |
et alors ? expliques moi en quoi ce code serait faux
char c = 'a';
putchar(c);
Marsh Posté le 01-06-2006 à 17:25:37
Citation : |
C'est bien.
Citation : |
Ah vraiment?
Citation : |
Et? T'as donc pas compris pourquoi il faut utiliser un int pour stocker la valeur de retour de getchar().
Citation : |
idem.
Citation : |
Ca te gènes pas d'affecter un int à un char (signed ou unsigned), pour qu'il soit passé à une fonction qui accepte un int, et qui le reconvertit en unsigned char?
Après si ça t'amuses d'utiliser des chars pour recevoir/passer des valeurs à des fonctions qui reçoivent des ints, c'est ton problème.
Le fait est que les constantes caractère sont des int, et toutes les fonctions qui manipulent des caractères attendent/renvoient des int.
Alors je ne vois vraiment pas la logique qui peut pousser à utiliser des char.
Marsh Posté le 01-06-2006 à 18:08:39
Citation : Ca te gènes pas d'affecter un int à un char (signed ou unsigned), pour qu'il soit passé à une fonction qui accepte un int, et qui le reconvertit en unsigned char? |
je demandais juste de m'expliquer en quoi ce code peux poser des problemes, ce que tu n'as pas fais
Citation : Après si ça t'amuses d'utiliser des chars pour recevoir/passer des valeurs |
je vois pas ou est le probleme de passer un char à une fonction prenant un int, surtout si il est convertit en 'unsigned char' derriere
pour le retour je n'ai jamais dit que je récupere dans un char un int, comme tu n'arrete pas de le repeter
Citation : Et? T'as donc pas compris pourquoi il faut utiliser un int pour stocker la valeur de retour de getchar(). |
ya rien a comprendre, getchar retourne un int, tu recuperes la valeur retour dans un int, apres si t'es heureux d'avoir compris que EOF converti en char peut etre confondu avec un autre char (sans blague) tant mieux pour toi
Citation : Alors je ne vois vraiment pas la logique qui peut pousser à utiliser des char. |
avoir un code plus cloisonner (donc plus robuste) et surtout plus proche de la sémantique (je l'ai dit 100x, un caractere est un caractere), mais cherches pas a comprendre, ca a pas l'air d'etre ce qui compte pour toi
Marsh Posté le 01-06-2006 à 18:16:32
simple_stupid a écrit : Si les fonctions comme getchar retournent des int, c'est parce qu'ils doivent signaler une erreur possible, qui doit donc être distincte de toutes les valeurs de char possible. Donc si tu l'affectes à un char, tu te retrouves avec un overflow ou une troncature, et ça te donne de la merde. |
En fait, la vraie raison, c'est que char n'est pas un type 'naturel'. Il n'y a pas de paramètres de type char. Il est automatiquement converti en int . Je confirme que char n'est utilise que pour les tableaux de char servant à faire des chaines.
Marsh Posté le 01-06-2006 à 18:22:23
skelter a écrit :
|
Moi, je dis pas que c'est faux, mais que c'est moins efficace que :
Code :
|
Marsh Posté le 01-06-2006 à 19:01:30
Code :
|
Lisible et efficace
Marsh Posté le 01-06-2006 à 19:01:49
skelter a écrit :
|
Bon, je n'ai envie ni de me fâcher avec toi, ni de perdre mon temps.
Je pense que c'est une mauvaise idée, et je ne crois pas être le seul (Emmanuel aussi apparemment). Après, chacun est libre de faire ce qu'il veut.
On arrête ici.
Marsh Posté le 01-06-2006 à 19:15:59
0x90 a écrit :
|
Pfff...
Code :
|
Là, c'est tiptop !!!
Marsh Posté le 01-06-2006 à 20:05:24
Sve@r a écrit : Pfff...
|
Sauf que ca marche pas
Marsh Posté le 01-06-2006 à 20:45:29
chrisbk avait raison : le C est une émanation de Satan !
Marsh Posté le 02-06-2006 à 23:14:30
Emmanuel Delahaye a écrit : Moi, je dis pas que c'est faux, mais que c'est moins efficace que :
|
Efficace en temps ? en espace ?
Je me permet une petite digression :
Ce problème est voisin de celui des calculs en float. Doit-on les utiliser sachant qu'il y a conversion en double ?
Je répond oui. Si on veut être efficace en espace -- voir dans certains cas en temps.
(sachant que ma réflexion n'inclu volontairement pas les problèmes de précision numérique).
Marsh Posté le 02-06-2006 à 23:27:39
++fab a écrit : Efficace en temps ? en espace ? |
En temps et en taille de code. Pas d'extension de signe, pas de troncature...
Citation : |
Ceci n'est pas un scoop :
Marsh Posté le 02-06-2006 à 23:34:35
Emmanuel Delahaye a écrit : En temps et en taille de code. Pas d'extension de signe, pas de troncature... |
Tu pourrais clarifier, en ce qui concerne l'extension de signe et la troncature ?
Citation : Le calculs sont faits en double. Toujours. |
Toujours ? Et en cas de vectorisation ?
Marsh Posté le 02-06-2006 à 23:58:35
++fab a écrit : Tu pourrais clarifier, en ce qui concerne l'extension de signe et la troncature ? |
Le type char n'est pas natif pour les calculs. Il est converti en int pour faire les calculs et reconvertit en char après le calcul.
char -> int : extension de signe : 0x82 -> 0xFF82
int -> char : troncature : 0xFF82 -> 0x80 : & 0xFF...
Citation : Le calculs sont faits en double. Toujours. |
Toujours ? Et en cas de vectorisation ?
Vectorisation ? Pas de ça en C.
Marsh Posté le 03-06-2006 à 00:11:59
Emmanuel Delahaye a écrit : |
Merci.
Citation : Vectorisation ? Pas de ça en C. |
Pas de vectorisation, mais un support direct pour la favoriser : restrict.
C'est au bon gré du compilateur selon le processeur ciblé. Et s'il y a un support harware pour effectuer des operations paralèlles sur des float, je serais étonné d'une conversion en double.
Marsh Posté le 03-06-2006 à 00:32:05
++fab a écrit : Pas de vectorisation, mais un support direct pour la favoriser : restrict. |
C'est possible, car C99 a des fonctions de calcul en float et en long double...
Marsh Posté le 03-06-2006 à 17:17:51
Citation : Le calculs sont faits en double. Toujours. |
tu veux dire que les operandes float sont toujours promues au moins en double (voir long double) ? mais les operations sur nombres reels au sein du cpu sont toujours faites avec le type reels le plus large (long double) ?
Marsh Posté le 03-06-2006 à 20:52:27
skelter a écrit :
|
Je rephrase.
En C90, les calculs en internes sont faits avec la meilleure précision possible (double).
Les fonctions standard ont une interface de type double.
Il est donc souhaitable que les types des données soient 'double', ça évite des conversions inutiles et coûteuses
En C99, il existe des de fonctions de calculs spécialisées pour float et long double.
Marsh Posté le 07-06-2006 à 00:40:26
Citation : tu veux dire que les operandes float sont toujours promues au moins en double (voir long double) ? |
Emmanuel à déjà répondu :
Citation : En C90, les calculs en internes sont faits avec la meilleure précision possible (double). |
à cause des fonctions standards C90, donc. Je ne sais pas ce qu'Emmanuel veux dire par "calculs en interne".
Citation : mais les operations sur nombres reels au sein du cpu sont toujours faites avec le type reels le plus large (long double) ?[/quotemsg] |
ça non, c'est le cas sur pentium, ou les flottants sont convertis sur 80 bits, mais ce n'est pas vrai en général.
Marsh Posté le 07-06-2006 à 00:53:34
Emmanuel Delahaye a écrit : En C90, les calculs en internes sont faits avec la meilleure précision possible (double). |
(voir mon interrogation ci-dessus)
Citation : Il est donc souhaitable que les types des données soient 'double', ça évite des conversions inutiles et coûteuses |
J'ai bien conscience d'être en contradiction avec la FAQ de fclc, mais si l'on ne fait pas appel aux fonctions standards C90 ?
Si on a l'intention de compiler ce code C avec un compilateur C++ pour profiter de la surcharge et éviter les conversions ?
Si on est dans le multimédia et qu'on veut profiter des instructions SIMD tel que SSE (éventuellement au lieu de SSE2) ?
Dans ces cas, ça me semble avoir un sens -- et ça ne me semble pas si rare, notament les 2 premiers points.
Citation : En C99, il existe des de fonctions de calculs spécialisées pour float et long double. |
Qui ne sont plus compatible C++, c'est pénible
Marsh Posté le 07-06-2006 à 01:03:52
Citation : ça non, c'est le cas sur pentium, ou les flottants sont convertis sur 80 bits, mais ce n'est pas vrai en général. |
possible, je ne sais meme plus ou j'ai vu ca
Code :
|
a quoi bon, le C n'est de toute facon pas compatible avec le C++, et t'u l'a dit, en C++ on as des surcharges
Marsh Posté le 08-06-2006 à 00:29:16
skelter a écrit : a quoi bon, le C n'est de toute facon pas compatible avec le C++, et t'u l'a dit, en C++ on as des surcharges |
On peut dire ce qu'on veut, il y a quand même un sous ensemble C compatible C++ pas si restreint que ça.
Vu qu'on a des surcharges en C++, on peut parfois améliorer le binaire d'un code C en le compilant en C++, en évitant donc les conversions.
C99 introduit la solution du pauvre avec cosf et cie, et au mieux oblige le compilateur C++ à utiliser la compatibilité C99. Au pire à ce que ça ne soit pas compilable en C++.
Marsh Posté le 31-05-2006 à 15:23:26
je suis vraiment un pur débutant et je voudrais savoir pourquoi mon programme ne se compile pas entierement il s'arrete a
1- addition 2-soustraction 3-division 4-multiplication 5- modulo
voici mon programme
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
long resultat = 0, nombre1 = 0, nombre2 = 0, choix = 0;
printf("choississez les nombre" );
scanf(" %d %d",&nombre1,&nombre2);
printf("choississez l'operation a faire \n" );
printf("1- addition 2-soustraction 3-division 4-multiplication 5- modulo" );
scanf("entrer votre choix %d",&choix);
if(choix==1)
{
printf ("%ld + %ld = %ld\n", nombre1, nombre2, resultat);
}
else if (choix==2)
{
printf ("%ld - %ld = %ld\n", nombre1, nombre2, resultat);
}
else if (choix==3)
{
printf ("%ld / %ld = %ld\n", nombre1, nombre2, resultat);
}
else if (choix==4)
{
printf ("%ld * %ld = %ld\n", nombre1, nombre2, resultat);
}
else if (choix==5)
{
printf ("%ld % %ld = %ld\n", nombre1, nombre2, resultat);
}
system("PAUSE" );
return 0;
}