Je me mets au C

Mon programme est désormais quasiment terminé (il ne me reste plus qu’à égayer tout ça avec un peu de texte - les licences, tout ça :unamused:).

Seulement, j’ai deux problèmes. Tout d’abord, il est impossible de faire de divisions.
J’obtiens toujours des résultats fous.

De plus, j’aimerai instaurer les divisions euclidiennes, avec un peu de modulo ! :laughing:

Voici ce code, si vous pouviez m’aider pour ces derniers détails, j’apprécierai grandement ! Merci à vous.

La compilation se passe normalement, sans aucune erreur.

[code]#include <stdio.h>

int main(int argc, int *argv[])

{
int nombre = 0;

printf("\n");
printf("-------------------------------------------\nBienvenue dans la calculatrice en console !     \n-------------------------------------------\n\n");
printf("Que souhaitez vous effectuer ?\n\n");
printf("1. Addition\n");
printf("2. Soustraction\n");
printf("3. Multiplication\n");
printf("4. Division\n");
scanf("%ld", &nombre);

printf("\n");

switch (nombre)
{
    case 1:
        printf("Vous souhaitez effectuer une addition.\n\n");
            int resultat1 = 0, nombre1 = 0, nombre2 = 0;
            printf("Entrez le premier nombre : ");
            scanf("%ld", &nombre1);
            printf("Entrez le deuxième nombre : ");
            scanf("%ld", &nombre2);
            
            resultat1 = nombre1 + nombre2;

            printf("%ld + %ld = %ld", nombre1, nombre2, resultat1);
            printf("\n\n");
        break;
    case 2:
        printf("Vous souhaitez effectuer une soustraction.\n\n");
            int resultat2 = 0, nombre3 = 0, nombre4 = 0;
            printf("Entrez le premier nombre : ");
            scanf("%ld", &nombre3);
            printf("Entrez le deuxième nombre : ");
            scanf("%ld", &nombre4);

            resultat2 = nombre3 - nombre4;
            
            printf("%ld - %ld = %ld", nombre3, nombre4, resultat2);
            printf("\n\n");
            break;
    case 3:
        printf("Vous souhaitez effectuer une multiplication.\n\n");
            int resultat3 = 0, nombre5 = 0, nombre6 = 0;
            printf("Entrez le premier nombre : ");
            scanf("%ld", &nombre5);
            printf("Entrez le deuxième nombre : ");
            scanf("%ld", &nombre6);

            resultat3 = nombre5 * nombre6;

            printf("%ld * %ld = %ld", nombre5, nombre6, resultat3);
            printf("\n\n");
            break;
    case 4: 
        printf("Vous souhaitez effectuer une division.\n\n");
            int resultat4 = 0, nombre7 = 0, nombre8 = 0;
            printf ("Entrez le dividande : ");
            scanf("%ld", &nombre7);
            printf("Entrez le diviseur : ");
            scanf("%ld", &nombre8);

            resultat4 = nombre7 / nombre8;

            printf("%ld / %ld = %ld"), nombre7, nombre8, resultat4;
            printf("\n\n");
            break;
    default:
        printf("Opération inconnue. Veuillez relancer le programme et saisir un nombre valide.");
            break;
}

    return 0;

}[/code]

tu définis toutes tes variables en tant qu’entier, donc tu ne peux pas avoir de résultat à virgule … Défini avec float
tes variables n’étant pas utiliser en soustraction quand tu fais une addtion, tu n’as donc aucun intérêt de défiir des variables différentes, qui te bouffent des ressources supplémentaires
D’un point de vue algorithme -> 1/20
D’un point de vue code C -> 1/20
Conclusion sur la copie :
Trop brouillon, on ne déclare pas des variables “à la volée” mais proprement en début de fonction, le code n’est pas assez automatisé, un tel utilitaire devrait recevoir les opérandes en ligne de commande, du style : ./calc 5*2

Hé bien c’est défini depuis le début : int. Non ?

Voila ce que ça donne avec float :

[code]Quel type de calcul souhaitez-vous effectuer ?

  1. Addition
  2. Soustraction
  3. Multiplication
  4. Division
    1

Vous souhaitez effectuer une addition.

Entrez le premier nombre : 2
Entrez le deuxième nombre : 5
2.0 */

#include <stdio.h>

int main(float argc, float *argv[])

{
);
printf("-------------------------------------------\n\n");
printf(“Quel type de calcul souhaitez-vous effectuer ?\n\n”);
printf(“1. Addition\n”);
printf(“2. Soustraction\n”);
printf(“3. Multiplication\n”);
printf(“4. Division\n”);
scanf("%ld", &nombre);

printf("\n");

switch (nombre)
{
    case 1:
        printf("Vous souhaitez effectuer une addition.\n\n");
            float resultat1 = 0, nombre1 = 0, nombre2 = 0;
            printf("Entrez le premier nombre : ");
            scanf("%ld", &nombre1);
            printf("Entrez le deuxième nombre : ");
            scanf("%ld", &nombre2);
            
            resultat1 = nombre1 + nombre2;

            printf("%ld + %ld = %ld", nombre1, nombre2, resultat1);
            printf("\n\n");
        break;
    case 2:
        printf("Vous souhaitez effectuer une soustraction.\n\n");
            float resultat2 = 0, nombre3 = 0, nombre4 = 0;
            printf("Entrez le premier nombre : ");
            scanf("%ld", &nombre3);
            printf("Entrez le deuxième nombre : ");
            scanf("%ld", &nombre4);

            resultat2 = nombre3 - nombre4;
            
            printf("%ld - %ld = %ld", nombre3, nombre4, resultat2);
            printf("\n\n");
            break;
    case 3:
        printf("Vous souhaitez effectuer une multiplication.\n\n");
            float resultat3 = 0, nombre5 = 0, nombre6 = 0;
            printf("Entrez le premier nombre : ");
            scanf("%ld", &nombre5);
            printf("Entrez le deuxième nombre : ");
            scanf("%ld", &nombre6);

            resultat3 = nombre5 * nombre6;

            printf("%ld * %ld = %ld", nombre5, nombre6, resultat3);
            printf("\n\n");
            break;
    case 4: 
        printf("Vous souhaitez effectuer une division.\n\n");
            float resultat4 = 0, nombre7 = 0, nombre8 = 0;
            printf ("Entrez le dividande : ");
            scanf("%ld", &nombre7);
            printf("Entrez le diviseur : ");
            scanf("%ld", &nombre8);

            resultat4 = nombre7 / nombre8;

            printf("%ld / %ld = %ld"), nombre7, nombre8, resultat4;
            printf("\n\n");
            break;
    default:
        printf("Opération inconnue. Veuillez relancer le programme et saisir un nombre valide.");
            break;
}

    return 0;

}[/code]

@debianhadic : wavesound n’a vu que les édition à l’écran, il faudras qu’il bosse la gestion des NTCTS ou les fonctions pour améliorer ça.
Ensuite j’ai jamais compris pourquoi certains prog’ déclarent toutes les variables dès le début, ça pompe tout l’espace mémoire dès le début.

Je sais que c’est pas bien, mais je me suis amusé avec la calculette :

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{

if (argc!=1)
	{
	printf("%f\n",!strcmp("+",argv[2])?atof(argv[1])+atof(argv[3]):!strcmp("-",argv[2])?atof(argv[1])-atof(argv[3]):!strcmp("x",argv[2])?atof(argv[1])*atof(argv[3]):!strcmp("/",argv[2])?atof(argv[1]) / atof(argv[3]):0.0);
	}
else puts("usage : calc 7 x 2\n");
}

Par contre le symbol * en ligne de commande linux n’aime pas il faut lui substituer x (minuscule)
donc une fois compiler, tu renomme a.out en calc et tu fais
calc 5 x 3 (en n’oubliant pas les espaces) :wink:

maintenant que je fais plus de PHP ou d’ASP ou de JavaScript on utilise eval(), je ne me souviens pas avoir vu quelque chose de ce genre en C ?

C’est corrigé, dites moi ce que vous en pensez.

[code]/* SimpleCCalculator 1.0 (05/07
GNU General Public License 2.0 */

#include <stdio.h>

int main(int argc, int *argv[])

{
int nombre = 0;

printf("\n");
printf("-------------------------------------------\n");
printf("SimpleCCalculator 1.0 (05/07/07)\n");

printf("GNU General Public License 2.0\n");
printf("-------------------------------------------\n\n");
printf("Quel type de calcul souhaitez-vous effectuer ?\n\n");
printf("1. Addition\n");
printf("2. Soustraction\n");
printf("3. Multiplication\n");
printf("4. Division\n");
scanf("%d", &nombre);

printf("\n");

switch (nombre)
{
    case 1:
        printf("Vous souhaitez effectuer une addition.\n\n");
            float resultat1 = 0, nombre1 = 0, nombre2 = 0;
            printf("Entrez le premier nombre : ");
            scanf("%f", &nombre1);
            printf("Entrez le deuxième nombre : ");
            scanf("%f", &nombre2);
            
            resultat1 = nombre1 + nombre2;

            printf("%f + %f = %f", nombre1, nombre2, resultat1);
            printf("\n\n");
        break;
    case 2:
        printf("Vous souhaitez effectuer une soustraction.\n\n");
            float resultat2 = 0, nombre3 = 0, nombre4 = 0;
            printf("Entrez le premier nombre : ");
            scanf("%f", &nombre3);
            printf("Entrez le deuxième nombre : ");
            scanf("%f", &nombre4);

            resultat2 = nombre3 - nombre4;
            
            printf("%f - %lf = %f", nombre3, nombre4, resultat2);
            printf("\n\n");
            break;
    case 3:
        printf("Vous souhaitez effectuer une multiplication.\n\n");
            float resultat3 = 0, nombre5 = 0, nombre6 = 0;
            printf("Entrez le premier nombre : ");
            scanf("%f", &nombre5);
            printf("Entrez le deuxième nombre : ");
            scanf("%f", &nombre6);

            resultat3 = nombre5 * nombre6;

            printf("%f * %f = %f", nombre5, nombre6, resultat3);
            printf("\n\n");
            break;
    case 4: 
        printf("Vous souhaitez effectuer une division.\n\n");
            float resultat4 = 0, nombre7 = 0, nombre8 = 0;
            printf ("Entrez le dividande : ");
            scanf("%f", &nombre7);
            printf("Entrez le diviseur : ");
            scanf("%f", &nombre8);

            resultat4 = nombre7 / nombre8;

            printf("%f / %f = %f", nombre7, nombre8, resultat4);
            printf("\n\n");
            break;
    default:
        printf("Opération inconnue. Veuillez relancer le programme et saisir un nombre valide.\n\n");
            break;
}

    return 0;

}[/code]

Tu pourrais diminuer le nombre d’appel à printf :wink:

salut wavesound, WAOU! ta as déjà fait beaucoup de choses.
:astonished:
Par contre j’ai peur que tu te bloques, tu essaies d’écrire une nouvelle langue alors que tu ne sais pas bien encore la parler. Si tu tapes du code sans savoir à quoi sert la syntaxe tu vas pas aller loin :exclamation:
je vois que tu ne fais aucun commentaire sur ton code, là tu sais à quoi il sert mais dans 6 mois tu le sauras toujours? :wink:

Tu as raison, je vais régler un peu ça.

[quote=“rodmov”]Par contre j’ai peur que tu te bloques, tu essaies d’écrire une nouvelle langue alors que tu ne sais pas bien encore la parler. Si tu tapes du code sans savoir à quoi sert la syntaxe tu vas pas aller loin (!)
je vois que tu ne fais aucun commentaire sur ton code, là tu sais à quoi il sert mais dans 6 mois tu le sauras toujours? :wink:[/quote]
Bonne idée, je vais aussi voir ce que je peux faire ! :slightly_smiling:

Par contre, je m’emmelle les pinceaux sur les int, les float…

Si quelqu’un pouvait m’expliquer plus en détails, précisément mais simplement, quoi taper à quel endroit, et surtout pourquoi, ça serait grandement apprécié.

C’est encore flou dans ma tête tout ce vocabulaire. Même si j’arrive à faire des choses avec.

[quote=“debianhadic”]Je sais que c’est pas bien, mais je me suis amusé avec la calculette. :

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{

if (argc!=1)
	{
	printf("%f\n",!strcmp("+",argv[2])?atof(argv[1])+atof(argv[3]):!strcmp("-",argv[2])?atof(argv[1])-atof(argv[3]):!strcmp("x",argv[2])?atof(argv[1])*atof(argv[3]):!strcmp("/",argv[2])?atof(argv[1]) / atof(argv[3]):0.0);
	}
else puts("usage : calc 7 x 2\n");
}

[/quote]
En effet, il n’y a aucun intérêt de faire quelque chose comme cela, c’est direction la poubelle.
En plus, tu aurais séparé proprement comme Wavesound l’a fait, cela aurait été plus facile à lire, et ce n’est pas certains que cela aurait pris plus de place code. Si tu voulais montrer un exemple constructif, tu aurais pu mettre en évidence des pointeurs de fonctions !

Tu peux aussi utiliser l’option o de gcc !

[quote=“Anoyzthen”]et puisque t’as bien compris le python aussi, je te conseille d’apprendre les deux. tu verras que pour la manipulation de chaines ( ce que tu aimes bien faire ne ce moment ) le C va vite devenir super lourdingue.(…)[/quote]+1, et là, pour loe traitement de chaine, tu va te mettre au perl :smiling_imp:

[quote=“wavesound”]
Si quelqu’un pouvait m’expliquer plus en détails, précisément mais simplement, quoi taper à quel endroit, et surtout pourquoi, ça serait grandement apprécié.

C’est encore flou dans ma tête tout ce vocabulaire. Même si j’arrive à faire des choses avec.[/quote]

Ben moi je te recommande toujours le python avec le livre qui est réalisé pour les débutants. Tu es jeune tu as le temps d’apprendre :wink:

Ouais, je sais bien, mais j’ai attaqué le C là. 8)

C’est très intéressant.

Quelqu’un pourrait il, s’il a le temps, améliorer mon code en commentant les améliorations afin de me faire comprendre quelques notions ? :slightly_smiling:

[quote=“wavesound”]
Par contre, je m’emmelle les pinceaux sur les int, les float…

Si quelqu’un pouvait m’expliquer plus en détails, précisément mais simplement, quoi taper à quel endroit, et surtout pourquoi, ça serait grandement apprécié.

C’est encore flou dans ma tête tout ce vocabulaire. Même si j’arrive à faire des choses avec.[/quote]

un petit tutorial bien sympathique pour comprendre les bases.
http://www.cppfrance.com/tutoriaux/INTRODUCTION-LANGAGE-CPLUSPLUS_697.aspx

// On n’a pas besoin d’autre chose que de stdio.h

int main(void)

{ // Début main
int nombre = 0;
n\n1. Addition\n2. Soustraction\n3. Multiplication\n4. Division\n");
scanf("%d", &nombre);

printf("\n"); // Fin menu

switch (nombre)
{
    case 1: // Début addition
        printf("Vous souhaitez effectuer une addition.\n\n");
            float resultat1 = 0, nombre1 = 0, nombre2 = 0; // On utilise float pour les nombres décimaux
            printf("Entrez le premier nombre : ");
            scanf("%f", &nombre1);
            printf("Entrez le deuxième nombre : ");
            scanf("%f", &nombre2);
            
            resultat1 = nombre1 + nombre2;

            printf("%f + %f = %f", nombre1, nombre2, resultat1);
            printf("\n\n");
        break; // Fin addition
    case 2: // Début soustraction
        printf("Vous souhaitez effectuer une soustraction.\n\n");
            float resultat2 = 0, nombre3 = 0, nombre4 = 0; // On utilise float pour les nombres décimaux
            printf("Entrez le premier nombre : ");
            scanf("%f", &nombre3);
            printf("Entrez le deuxième nombre : ");
            scanf("%f", &nombre4);

            resultat2 = nombre3 - nombre4;
            
            printf("%f - %lf = %f", nombre3, nombre4, resultat2);
            printf("\n\n");
            break; // Fin soustraction
    case 3: // Début multiplication
        printf("Vous souhaitez effectuer une multiplication.\n\n");
            float resultat3 = 0, nombre5 = 0, nombre6 = 0; // On utilise float pour les nombres décimaux
            printf("Entrez le premier nombre : ");
            scanf("%f", &nombre5);
            printf("Entrez le deuxième nombre : ");
            scanf("%f", &nombre6);

            resultat3 = nombre5 * nombre6;

            printf("%f * %f = %f", nombre5, nombre6, resultat3);
            printf("\n\n");
            break; // Fin multiplication
    case 4: // Début division
        printf("Vous souhaitez effectuer une division.\n\n");
            float resultat4 = 0, nombre7 = 0, nombre8 = 0; // On utilise float pour les nombres décimaux
            printf ("Entrez le dividande : ");
            scanf("%f", &nombre7);
            printf("Entrez le diviseur : ");
            scanf("%f", &nombre8);

            resultat4 = nombre7 / nombre8;

            printf("%f / %f = %f\n\n)", nombre7, nombre8, resultat4); 
            break; // Fin division
    default: // Début default (utilisé si 1, 2, 3 ou 4 n'est pas saisi à l'invite)
        printf("Opération inconnue. Veuillez relancer le programme et saisir un nombre valide.\n\n");
            break; // Fin default
}

    return 0;

} // Fin main[/code]

Mais quel est le rapport entre les int suivants :

int main(int argc, int *argv[])

{
int nombre = 0;

[…]

switch (nombre)
{
    case 1:
        printf("Vous souhaitez effectuer une addition.\n\n");
            [b]int[/b] resultat1 = 0, nombre1 = 0, nombre2 = 0;

?

Qu’ont t-il à voir entre eux, peut-on les mélanger (c’est à dire utilisé un int derrière le main, un float dans les paranthèses après le main et un long au sein du main) ? C’est une question que je me pose et elle m’a l’air importante.

int précise le type de ce qui vient aprés.
Par exemple le premier precise que main est de type int, et va donc renvoyer un int (qui sera le résultat de la commande pour le shell, en ce qui concerne le main).
Le deuxiême dit que argc le nombre d’arguments passés, est un int, et int argv[] dit que la liste des arguments est un tableau de int (les crochets qui disent tableau sont mis aprés la variable qu’ils définissent comme tableau).
Le dernier int precise juste le type d’une des variables que tu utilises dans ta routine, puisqu’en c, tout doit être déclaré.
Voilà.
Tu es bien matinal :wink:

Tout d’abord, merci pour ta réponse rapide, tu es bien matinal toi aussi ! :laughing:

Est-ce qu’un int peut en “commander” d’autres ou est-ce qu’ils n’ont rien à voir entre eux ?

Est-ce que je n’aurai besoin du float (afin d’utiliser des nombres décimaux - voila pourquoi je l’ai utilisé dans le code de ma calculette - voir code plus haut) que dans ma routine ou bien il m’arrivera d’en avoir besoin derrière le main ou à l’intérieur des paranthèses du main(), ou encore lors du … nombre=0; juste après l’accolade ouvrante ?

Ce qui voudrait qu’il me faudrait parfois utiliser des nombres décimaux autre part que dans ma routine ?

D’autre part, comment savoir qu’elle variable (c’est bien ça ?) on va utiliser en fonction de la mémoire nécessaire à l’exécution de la tâche (par exemple, on va utiliser deux fois plus de mémoire avec un long qu’avec un int - d’après mon père - mais parfois un long n’est pas utile, un int suffit) ?

Edit : Ho je suis à 800 messages. :laughing:

[quote=“wavesound”]Tout d’abord, merci pour ta réponse rapide, tu es bien matinal toi aussi ! :laughing:[/quote]Bah non: justement, je suis arrivé en retard au boulot.[quote=“wavesound”]Est-ce qu’un int peut en “commander” d’autres ou est-ce qu’ils n’ont rien à voir entre eux ?[/quote]rien. Je ne vois pas ce que tu veux dire par “peut en commander”.
Chaque objet nommé (on dit variable) doit être typée pour être utilisée, c’est tout.[quote=“wavesound”]Est-ce que je n’aurai besoin du float (afin d’utiliser des nombres décimaux - voila pourquoi je l’ai utilisé dans le code de ma calculette - voir code plus haut) que dans ma routine ou bien il m’arrivera d’en avoir besoin derrière le main ou à l’intérieur des paranthèses du main(), ou encore lors du … nombre=0; juste après l’accolade ouvrante ?[/quote]Rien compris. C’est toi qui vois si ce que tu vas stocker dans ta variable ou renvoyer comme valeur d’une fonction (main c’est spécial ne peut être qu’un int) a besoin d’être déclaré en int en float, en real ou en mabtemescoulles si tu as déclaré avant ce type à toi.[quote=“wavesound”]Ce qui voudrait qu’il me faudrait parfois utiliser des nombres décimaux autre part que dans ma routine ?[/quote]Dans ton exemple, il n’y a pas d’autrepart.[quote=“wavesound”]D’autre part, comment savoir qu’elle variable (c’est bien ça ?) on va utiliser en fonction de la mémoire nécessaire à l’exécution de la tâche (par exemple, on va utiliser deux fois plus de mémoire avec un long qu’avec un int - d’après mon père - mais parfois un long n’est pas utile, un int suffit) ?[/quote]Voilà, c’est toi qui evalue si ton int va pouvoir être entre -32767 et +32767, ou si tu as besoin d’un type d’entier plus grand, qui prendra plus d’octets en mêmoire, même si au final il vaut zero.
Dis bonjour à ton père de ma part et dis lui que son fils est un furieux.