[ c++ problème ]
#include <iostream.h>
#include <stdlib.h>
int aleat(float n1,float n2);
int aleat(float n1,float n2,float n3)
{
float m = n1*n2*n3 / n1 - (n2 + n3) - n1;
cout << m;
return 1;
}
int main(int argc,char* args)
{
float tab[3];
int indextab;
while (tab[indextab])
{
indextab++;
}
for(int i;i <= indextab;i++)
{
cout << "Entrez nombre : ";
cin >> tab[i];
}
aleat(tab[1],tab[2],tab[3]);
return 1;
}
30 réponses
La discussion porte sur la puissance en C++ et sur les erreurs fréquentes dans un exemple comprenant des opérateurs, des entrées/sorties et une fonction aléatoire. Des corrections portent sur l'utilisation d'en-têtes modernes (
-
ContributeurJe ne pense pas que ça soi la peine de lui prendre la tête avec ça.
Pour commencer, c'est plus leger de ce passer du std::
En plus ce n'es devenu obligatoire qu'avec la version 3 de gcc...
En plus c'est très facile à intégrer dans la suite.
dans ma verions, iostream.h inclue iostream et rajoute des using. Ce qui fait qu'au final ça ne change pas gran chose.
Mais c'est sur que dans la suite il faut s'habituer à utiliser les entete sans .h (même si je n'ai pas encore compris exactement pourquoi) -
ModérateurMerci MamiemanDo mais pour using namespace std il ne me sert à rien car cout,cin,cerr... fonctionnent sans.
Il sert à être standard.
Je mets iostream.h,string.h,stdlib.h et cela me suffit
Tu utilises un syntaxe obsolète et fortement déconseillé. Pas de .h dans le include, sinon ce n'est pas standard. C'est d'ailleurs de par le fait que tu mets le .h que tu n'as pas besoin de using namespace std. Il n'en reste pas moins que c'est très mal.
-->
1) Transforme tes cin cerr cout endl en std::cin std::cout ... std::endl (ou rajoute le using namespace std)
2) Vire le .h de tes include #include <iostream.h> --> #include <iostream.h> -
ModérateurOulà je crois que tu devrais commencer par faire quelques tutoriels saadam ;o)
const -> paramètre qui reste constant. Typiquement un paramètre de fonction qui n'évolue pas dans cette fonction.
short -> précise que l'entier est de valeur faible. Ca permet de réduire sa taille en mémoire.
using namespace std -> Bon là vu les questions précédentes on va faire simple. Normalement cout, cerr,... ça n'exite pas. Ca appartient à l'environement std et ça s'appelle donc std::cerr, std::cout. En toute rigueur on devrait donc toujours écrire std::cout std::cerr... mais comme c'est un peu lourd on peu utilise run using namespace.
Une procédure est un nom peu adapté au C++, on parle plutôt de fonction.#include <iostream> int f(double d){//la fonction prend en paramètre un double et retourne un entier std::cout<<"Mon double vaut"<<d<<std::endl; return 1;//l'entier retourné } int main(){ int mon_entier=0; mon_entier=f(3.5);//f retourne 1, donc mon_entier vaut 1 à la fin de l'instruction return 0; }
Quand tu auras appréhendé le concept d'objet tu verras qu'il existe des fonctions particulières, les méthodes... Et encore après tu verras qu'il existe des fonctions et des méthodes template. mais ça c'est pour beaucoup plus tard ;o) -
Et comment déclare-t-on une procédure ? Quelle est l'en-tête d'une procédure ?
-
ET "const" ? Et "short" ? Et "using namespace std"?
Merci -
ContributeurC'est étonnant que ton programme fonctionne.
moi quand je fait une fonction avec un type (ici char) le compilo me retourne une erreur comme quoi ma fonction ne retourne rien.
saadam avait l'air de vouloir récupérer une chaine de caractère par une fonction. Toi tu donne une fonction qui ne retourne rien. de plus en declarant char note, avec mon compilo la taille de la chaine de caractère est limité à 8. Tu as quoi comme compilo exotique?
Ensuite, un conseil n'es pas insultant. C'est juste un conseil, d'ailleur, si il pose une question sur le forum, c'est pour ça.
Pour les if, ta boucle fonctionne parfaitement lamij20 , un test sur 2 est inutil, c'est tout.
Et je ne sais pas tout, mais comme toi tu as l'air caller, répond à mes post sans réponse. Mais c'est sur, c'est moi facile que de critiquer.-
ModérateurSalut Char Snipeur,
Ca ne me derrange pas les corrections et les conseils au contraire je les acceptes, mais plutôt la manière de les donner.
moi quand je fait une fonction avec un type (ici char) le compilo me retourne une erreur comme quoi ma fonction ne retourne rien.
Ici tu as raison, de toute façon tu as lu à la fin de mon message En revanche c'est vrai pour return, j'ai omis de l'enlever.
.
Parce que en fait il ne s'agit pas d'une fonction mais d'un apel d'une procédure ( en fait chez moi j'ai utilisé main() pas int main() ), mais comme j'ai fait copier/coller du code du SAADAM tout simplement j'ai oublié de l'enlever.
Dans le cas de SAADAM pas besoin d'une fonction puisque il ne calcule rien du tout. Il veut tout simplement afficher à l'écran le résultat d'une interogation (au moins c'est ça que je vois) donc je crois qu'un apel d'une procédure ç'est suffisant.
Et concernant les if je n'ai fait que modifier l'opérateur || qui est plus approprié pour définir un interval, puisqu'en fait je préfere aussi ta méthode.
if(notes==0)...
if(notes<10)...
if(notes<15)...
Mais pour C'est étonnant que ton programme fonctionne. je dirai plutôt que c'est normal qu'il fonctionne (avec ou sans return - qui ne doit pas être present dans le code vu qu'il ne s'agit pas d'une fonction donc rien à retourner)
Et tout sais trés bien que si on veut on peut parler de ça beaucoup plus mais ça ne vaut pas le coup. On est toujours entrin d'apprendre et de corriger aujourd'hui les erreurs qu'on a fait hier.
Dissons que j'ai mal compris ta demarche.
A+ et bonne soirée
lami20j -
Contributeur@lami20jce que je trouve etrange, c'est de declarer une procedure avec un type char.
bonne soirée à toi aussi
-
-
ContributeurSalut,
Lamij, je croi que tu ne repond pas au problème !
et je ne pense pas que ton programme fonctionne, deja note ne retourne rien....
sadaam :
Je te conseil de déclarer :
char* note(float)
et d'implemeter:
char* note( float notes){...}
si ça ne marche pas, essaie avec const char* comme type.
Dans tout les cas, il ne faut pas changer le type d'une fonction entre sa declaration et son implementation.
derniere remarque, tout ce qui est derriere un return n'es jamais executer, tes break ne servent à rien !
derniere chose, dans tes if, fait
if(notes==0)...
if(notes<10)...
if(notes<15)...
sinon, ta boucle s'arrete au deuxième if pour les notes différentes de 0. Voila-
ModérateurSalut,
Lamij, je croi que tu ne repond pas au problème !
et je ne pense pas que ton programme fonctionne, deja note ne retourne rien....
Toi tu pense, moi je teste. Et tu sais quoi? Le programme fonctionne et j'ai bien repondu à son problème. ( un interval par exemple on le déclare avec quelque chose de genre a >= 0 && a <=10 , c'est à dire a est compris entre 0 et 10, c'étai une correction)
Je te conseil de déclarer :
char* note(float)
et d'implemeter:
char* note( float notes){...} Tu n'as pas remarquer qu'il n'a que 12 ans et à peine il arrive à comprendre la racine carré, Monsieur le Professeur?
sadaam
Je te conseil de déclarer :
Ca sonne un peut à insulte et déconsidération et ce n'est pas gentil de ta part.
En traduction ça donne quelque chose de genre.
Laisse tomber les conneries que t'a dit lamij (c'est lami20j) et écoute moi parce que moi je sais tout.
P.S. A propos c'est SAADAM, je constate que tu lit et tu comprends tout.
SAADAM tu peut tester la variante que je t'ai écrit, et qui n'est pas unique ni la meilleure.
Et en plus si jamais je voudrais récrire ton code moi aussi j'utiliserai peut être une autre façon de le faire.
En revanche c'est vrai pour return, j'ai omis de l'enlever.
Bonne soirée
-
-
et quelle est l'erreur dans :
#include <iostream.h> #include <stdlib.h> #include <string.h> char note(float note); int main() { float m=0.0; cout <<"Quelle est votre note?"; cin >>m; cout <<note((float)m); system("PAUSE"); return 0; } char[] note(float note) { if (note==0) { return "C'est nul";break; } if (note>0||note<=10){ return "Ce n'est pas bien du tout";break; } if (note>10||note<15){ return "C'est moyen";break; } if (note>=15||note!=20){ return "C'est très bien";break; } if (note==20) { return "C'est parfait.";break; } }-
ModérateurSalut,
essaie ça#include <iostream> #include <stdlib.h> // pas besoin #include <string.h> // pas besoin using namespace std; char note(float notes); int main() { float m=0.0; cout <<"Quelle est votre note? "; cin >>m; system("sleep 2"); // 2 sec pour afficher le resultat cout << note(float(m)); return 0; } char note(float notes) { if (notes == 0) { cout << "C'est nul\n"; } if (notes > 0 && notes <= 10){ cout << "Ce n'est pas bien du tout\n"; } if (notes > 10 && notes < 15){ cout << "C'est moyen\n"; } if (notes >= 15 && notes < 20){ cout << "C'est très bien\n"; } if (notes == 20) { cout << "C'est parfait.\n"; } }
-
-
salut. Et " call ". Comment peut-on l'utiliser ?
Parce que mon but est de me rapprocher le plus possible du language machine(sans utiliser l'assembleur)
. @+ -
-
Contributeurqu'apel tu un scalaire?
-
bonjour,
un switch est un équivalent de plus if imbriqués! il a l'avantage de rendre bcp plus lisible ton code
ex :
switch( val ou exp)
{
case a: // si val ou exp est égal à a alors
instructions //on fait les instructions
break; //on sort du swith
case b: //si val ou exp est égal à b alors
instructions //on fait les instructions
break; //on sort du swith
...
...
default: //dans le cas ou val ou exp n'est égal à aucun des case
//précédent alors
instructions //on fait les instructions par défault
break; //on sort du swith
//default est un cas optionnel t pa obligé de le mettre
}
val doit être un entier ou un char (car un char est un entier représenté par son code acsii
exp doit retourner un scalaire
voila bon courage!! -
par exemple tu veux choisir une tache a faire en fonction de l'info rentrée au clavier, par exemple en rentrant '1' j'execute une tache, en rentrant '2',une autre tache et ainsi de suite.
pour l'exemple ca se presente a peu pres comme ca:
touche=getch;
switch(touche)
{
case '1' : tache1(); ( tu peux mettre autant
d'instructions que tu veux)
printf("erreur"); -> c'est un exemple
case '2' : tache();
............. ->represente d'autres instructions
.............
..............
.
.
. ->d'autres choix possible
.
.
} -
Salut. Quelqu'un pourrait-il me donner un exemple d'utilisation de " switch " ? Parce que les information de mon manuel sont confuses.
merci -
Modérateurnon, donc c'est pour ça je crois.
pas besoin d'être désolé, tu as trés bien fait de le dire.
En fait c'est pour SAADAM
Euh merci mais dsl, j'ai 12 ans
a+ -
ok désolé .moi j'utilise %d pour les int voire unsigned int mais apres je prend l'instruction "cout" qui m'affiche ce que je veux.
au fait tu as un proc 64 bits??? juste pour savoir -
Modérateursi j'utilise
short int
unsigned short int
le résutat est celui attendu
-1
65535 -
en mettant j en unsigned, tu peux aussi mettre printf("%d",j);
ca marche aussi. -
ModérateurBonsoir SAADAM,
unsigned veut dire non signé.
Prenons le cas de la variable entier.val min val max int i - -2147483648 +2147483647 unsigned int i 0 2 puissance 32 -1 = 4294967295
En codage binaire ( dans l'exemple sur 16 bits) on a ça dans le cas signé (le 1er bit à gauche c'est pour le signe 0 pour + et 1 pour -):
Nombres positives0 111111111111111 pour + 32767 --------------------------- 0 000000000000010 pour + 2 0 000000000000001 pour + 1 0 000000000000000 pour 0 Nombres negatives 1 111111111111111 pour - 1 1 111111111111110 pour - 2 1 1111111111111101 pour -3 ---------------------------- 1 000000000000000 pour - 32768
Dans le cas unsigned (non signé) on a1111111111111111 pour + 65535 -------------------------- 1000000000000000 pour + 32768 0111111111111111 pour + 32767 --------------------------- 0111111111111111 pour + 1 0000000000000000 pour + 0
Exemple :# include <stdio.h> main() { int i; /*entier signé*/ unsigned int j; /*entier nonsigné*/ i = -1; j = i; printf("%d\n",i); printf("%u\n",j); /*%u c'est pour afficher le format non signé*/ } -
en fait le unsigned sert pour déclarer des variables non signées.
par exemple en déclarant un int la valeur pourra etre de -32768 à 32767, alors qu'en mettant unsigned int, le tout passe en positif, et tu pourras avoir des valeurs entre 0 et 65535.
- 1
- 2