Faire une calculatrice avec C# [debutant] [Résolu]

jeanpierre691 19 Messages postés dimanche 1 novembre 2009Date d'inscription 4 novembre 2009 Dernière intervention - 1 nov. 2009 à 17:18 - Dernière réponse : anibro 7 Messages postés lundi 7 décembre 2009Date d'inscription 14 décembre 2009 Dernière intervention
- 7 déc. 2009 à 14:40
Bonjour.

J'essaye actuellement de faire une calculatrice a une ligne, c'est a dire faire par exemple sur une même ligne écrire 2 + 2 et une nous donne la réponse. Ou encore écrire 2 / 6 et il nous donne encore la réponse a la ligne suivante en écrivant : 2 / 6 = (réponse). Je suis débutant en C# et j'ai appris qu'il était assez complexe de faire un code pareille. J'utilise actuellement DOS pour compiler si cela peux vous aider. Pourriez vous me donner un exemple de ce genre de code afin de me mettre sur la bonne voie ou encore m'expliquer graduellement comment je dois m'y prendre pour le faire?


Rien de mieux que la joie ressentit lors d'une simple et bonne programmation!!
Afficher la suite 

Votre réponse

15 réponses

jeanpierre691 19 Messages postés dimanche 1 novembre 2009Date d'inscription 4 novembre 2009 Dernière intervention - 2 nov. 2009 à 05:36
0
Merci
Heu guys!! Personne veux bien me répondre. SVP aider moi. Je programme en C#, mais je programme en utilisant le programme textpad! J'essaye depuis ce matin de deviner comment m'y prendre mais je n'y arrive toujours pas . J'ai visité plusieurs sites, mais c'est toujours des calculatrices avec interfaces graphique qu'ils me donnent.


Rien de mieux que la joie ressentit lors d'une simple et bonne programmation!!
Commenter la réponse de jeanpierre691
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 2 nov. 2009 à 12:02
0
Merci
Bonjour,
La calculatrice, c'est l'exemple qui revient le plus souvent sur le site. Une petite recherche donnera probablement des réponses à toutes tes questions...


[hr]
-Blog-
-Site Perso-
Commenter la réponse de cs_Bidou
jeanpierre691 19 Messages postés dimanche 1 novembre 2009Date d'inscription 4 novembre 2009 Dernière intervention - 2 nov. 2009 à 12:33
0
Merci
Salut et merci pour ta réponse. Je me suis peut être mal exprimé, mais comme je l'ai dit, j'ai déjà fait une recherche et je trouve toujours des programmes comme par exemple le programme ci-contre.

Mais pour faire plus simple, je dirais que je voudrais juste faire un programme permettant d'additionner, de soustraire, de multiplier ou encore de diviser deux nombres au hasard choisi par l'utilisateur. Le programme poserait par exemple la question suivante :

"Veuillez donner votre opération :"

Et l'utilisateur donnerais comme réponse par exemple : "2 + 5", "6 - 3", "9 * 5" ou encore "8 / 2"

Puis, le programme se chargerait de faire le reste, c'est à dire donner la réponse au calcul tapé par l'utilisateur.


-------------------------------------------------------------------------------------------------------------------------------
Rien de mieux que la joie ressentit lors d'une simple et bonne programmation!!
Commenter la réponse de jeanpierre691
MasterShadows 269 Messages postés lundi 1 mars 2004Date d'inscription 19 avril 2012 Dernière intervention - 2 nov. 2009 à 20:29
0
Merci
Salut, on va essayer de faire un truc tout simple (si c'est juste pour faire une op de type 2 + 3 et non 2+ 3 * 5 + 7...)

tu utilise la methode Readline de la classe console pour récupérer un format string :

string result = Console.Readline();
float computeResult = 0f;


Ensuite on part du principe que chaque opérande est séparer d'un espace, donc maintenant, on va splitter le string pour récupérer dans un tableau quelque chose comme ceci :


T[0] = x
T[1] = operateur
T[2] = y

string[] cal = result.Split(' ');


puis tu castes en float la 1ère et dernière valeur du tableau :

float r1;
float.TryParse(cal[0], out r1);

float r2;
float.TryParse(cal[2], out r2);


Et enfin tu teste l'opérande au milieu pour le calcul

switch(cal[1])
{
  case "+":
    computeResult = r1 + r2;
    break;

  case "-":
    computeResult = r1 - r2;
    break;

  case "*":
    computeResult = r1 * r2;
    break;

  case "/":
    computeResult = r1 / r2;
    break;
}


Et maintenant tu as juste à afficher le résultat...
Commenter la réponse de MasterShadows
jeanpierre691 19 Messages postés dimanche 1 novembre 2009Date d'inscription 4 novembre 2009 Dernière intervention - 3 nov. 2009 à 02:59
0
Merci
Salut MasterShadows et merci pour ta réponse.

Suite à ta réponse, j'ai fait le code ci-dessous et il compile bien. J'ai réussit a gérer certaines exception, mais pas toute. Par exemple, quand j'écris : pierre + paul , il me crée un problème. j'aimerais qu'il me dise par exemple qu'il faut mettre un nombre + un nombre. Puis imaginons que j'écrive juste paul, il faudrait aussi qu'il me dise que je dois entrez 3 termes. Dans le fond, ce serait une méthode un peu comme la méthode LireChar que j'ai fait ci-dessous.

J'aimerais aussi rendre mon problème un peu plus complexe. J'aimerais que si l'utilisateur rentre les string suivant :
- 2+2
- 2 + 2
- 2 + 2
que le programme soit capable de me donner une réponse (dans notre cas 4). Donc l'espace entre chaque colonnes de la matrice peux varier. Je pense utiliser la méthode Length, mais j'attendrais voir ce que tu me proposes.

Voici là ou je suis rendu à date : En attendant vos suggestions ...
using System;

namespace Dimitrie {
public class Program {
public static void Main () {
Introduction ();
}

public static void Introduction () {
char rep = LireChar ("Veuillez taper la lettre "a" pour passer a la suite : ", "a");
if (rep == 'a') {
Calculatrice ("Donner l'expression mathématique à calculer : ");
Main ();
}
}

public static void Calculatrice (string question) {
Console.WriteLine ();
Console.Write (question);
string result = Console.ReadLine ();
float computeResult = 0f;

//T[0] = x;
//T[1] = operateur;
//T[2] = y;

string [] cal = result.Split (' ');

float r1;
float.TryParse (cal[0], out r1);

float r2;
float.TryParse (cal[2], out r2);

switch(cal[1])
{
  case "+":
computeResult = r1 + r2;
break;

  case "-":
computeResult = r1 - r2;
break;

  case "*":
computeResult = r1 * r2;
break;

  case "/":
  	if (r2 == 0) {
  		Console.WriteLine ("{0} / {1} = Indéfini 
",r1, r2);
  		Main();
  	}	
else computeResult = r1 / r2;
break;
}

Console.WriteLine ("{0} {1} {2} = {3}\n", r1, cal[1], r2, computeResult);
}	

public static char LireChar (string question) {
do {
Console.Write (question);
string rep = Console.ReadLine ();
if (rep.Length == 1) return rep [0];
Console.WriteLine ("Erreur : Veuillez ne taper qu'un seul caractère\n");
} while (true);
}

public static char LireChar (string question, string caracterePermis) {
do {
char caractereLue = LireChar (question);
foreach (char ch in caracterePermis) 
if (ch == caractereLue) return caractereLue;
Console.WriteLine ("Erreur : "{0}" ne fait pas partie de "{1}".\n", caractereLue, caracterePermis);
} while (true);

}
}
}

Rien de mieux que la joie ressentit lors d'une simple et bonne programmation!!
Commenter la réponse de jeanpierre691
MasterShadows 269 Messages postés lundi 1 mars 2004Date d'inscription 19 avril 2012 Dernière intervention - 3 nov. 2009 à 10:17
0
Merci
Salut,

alors pour ça on va faire relativement simple, lorsque tu as récupérer le string contenant la formule, il te faut récupérer l'index où se trouve l'opérateur, pour cela écrit ceci :

int indexOfOperateur = GetPositionOperateur(ref result, new char[] { '+', '-', '*', '/' });


Ici on prend le paramètre result et on lui dit quels sont les opérateurs à prendre en compte.
Cette méthode va regarder chaque caractère de la phrase et rechercher l'opérateur. (Facile, il suffit juste de s'arrêter lorsque l'on a un opérateur et que l'on en a déjà trouvé 1)

/// <summary>
        /// 
        /// </summary>
        /// 


        /// 


        /// <returns></returns>
        static private int GetPositionOperateur(ref string result, char[] p)
        {
            int index = 0;

            foreach (char s in result)
            {
                // Recherche +,-,/,* dans la formule
                int k = s.ToString().IndexOfAny(p);

                if (k == 0 && index > 0)
                    break;
                else
                    index++;
            }

            return index;
        }



Ensuite si on a un operateur, on calcule le résultat sinon, on affiche un message d'erreur :

if (indexOfOperateur != -1)
                Calculer(ref result, ref indexOfOperateur);
            else
                Console.WriteLine("Erreur ! Il faut rentrer trois termes comme ceci : a +|-|*|/ b");


Et la méthode Calculer est quasiment celle que j'ai donnée à ceci près que TryParse étant booléen, on teste si la conversion a réussi.

static private void Calculer(ref string result, ref int indexOfOperateur)
        {
            float computeResult = 0f;
            string[] cal = new string[3];

            cal[0] = result.Substring(0, indexOfOperateur);
            cal[1] = result[indexOfOperateur].ToString();
            cal[2] = result.Substring(indexOfOperateur + 1);

            float r1;
            if (!float.TryParse(cal[0], out r1))
            {
                Console.WriteLine("Erreur le premier membre n'est pas un nombre");
                return;
            }

            float r2;
            if (!float.TryParse(cal[2], out r2))
            {
                Console.WriteLine("Erreur ! Le second membre n'est pas un nombre");
                return;
            }

            switch (cal[1])
            {
                case "+":
                    computeResult = r1 + r2;
                    break;

                case "-":
                    computeResult = r1 - r2;
                    break;

                case "*":
                    computeResult = r1 * r2;
                    break;

                case "/":
                    if (r2 == 0)
                    {
                        Console.WriteLine("{0} / {1} = Indéfini 
", r1, r2);
                        Main();
                    }
                    else computeResult = r1 / r2;
                    break;
            }

            Console.WriteLine("{0} {1} {2} = {3}\n", r1, cal[1], r2, computeResult);
        }


Maintenant ta calculatrice est capable de gérer ceci :

-2 + -2
-5-7
5--78
-5+-78
-5/-87
Commenter la réponse de MasterShadows
jeanpierre691 19 Messages postés dimanche 1 novembre 2009Date d'inscription 4 novembre 2009 Dernière intervention - 3 nov. 2009 à 14:17
0
Merci
Salut et encore merci pour ta réponse.

J'ai un petit problème avec cette partie du code :
if (indexOfOperateur != -1)
                Calculer(ref result, ref indexOfOperateur);
            else
                Console.WriteLine("Erreur ! Il faut rentrer trois termes comme ceci : a +|-|*|/ b");


Quand je tape par exemple "paul" comme string result, je ne reçois pas le message d'erreur marqué ci dessus.
Ceci dit, j'ai modifier la méthode "Calculatrice" de la manière suivante afin de pouvoir faire appelle à la méthode "Calculer". Cependant, la derniere ligne du code ne s'exécute jamais.
public static void Calculatrice (string question) {
Console.WriteLine ();
Console.Write (question);
string result = Console.ReadLine ();
int indexOfOperateur = GetPositionOperateur(ref result, new char[] { '+', '-', '*', '/' });
if (indexOfOperateur != -1) Calculer(ref result, ref indexOfOperateur);
else Console.WriteLine("Erreur ! Il faut rentrer trois termes comme ceci : a +|-|*|/ b");
}



Rien de mieux que la joie ressentit lors d'une simple et bonne programmation!!
Commenter la réponse de jeanpierre691
MasterShadows 269 Messages postés lundi 1 mars 2004Date d'inscription 19 avril 2012 Dernière intervention - 3 nov. 2009 à 15:08
0
Merci
C'est normal la methode GetPositionOperateur part du principe que la formule est bonne (a + b par exemple et non a+ ou +b)

Pour que cela fonctionne bien, on rajoute un flag pour savoir si on a trouvé un op, puis au moment de retourner le résultat, on regarde la valeur du flag et s'il vaut faux, on renvoie -1...

        static private int GetPositionOperateur(ref string result, char[] p)
        {
            int index = 0;
            bool found = false;
 
            foreach (char s in result)
            {
                int k = s.ToString().IndexOfAny(p);

                if (k == 0 && index > 0)
                {
                    found = true;
                    break;
                }
                else
                    index++;
            }

            return found ? index : -1;
        }


Maintenant, cela fonctionne...
Commenter la réponse de MasterShadows
jeanpierre691 19 Messages postés dimanche 1 novembre 2009Date d'inscription 4 novembre 2009 Dernière intervention - 3 nov. 2009 à 15:35
0
Merci
Re Salut,

Je viens de me rendre compte d'une autre erreur que pourrait faire l'utilisateur. Depuis que je travaille sur ce projet, je me rend compte qu'il n'est vraiment pas facile de programmer en C# et surtout de blinder le programme afin d'être sure d'avoir une solution a toutes les erreurs que pourrait faire l'utilisateur. La nouvelle erreur que j'ai trouvé est la suivante :

- 2 mange 2

Comment gérer cette erreur!!! Comment dire à l'ordinateur qu'il doit vérifier si cal[1] est bien égale a (+|-|*|/) avant de compiler la résultat selon les différentes cases émises? Reste encore le problème émis précédemment sur le fait que l'utilisateur pourrais taper un seul mot!


Rien de mieux que la joie ressentit lors d'une simple et bonne programmation!!
Commenter la réponse de jeanpierre691
jeanpierre691 19 Messages postés dimanche 1 novembre 2009Date d'inscription 4 novembre 2009 Dernière intervention - 3 nov. 2009 à 15:59
0
Merci
Edit :

Tout marche a merveille!!

Merci infiniment pour l'aide et le temps consacré a m'aider. Si vous me permettez de vous tutoyer, tu es quelqu'un de bien MasterShadows. J'espère rencontrer plus de personne comme toi sur le net.

Je me lance actuellement sur un autre projet sur lequel je rencontre encore quelques difficultés, même si c'est quelque chose qui à priori est facile.

Voici le lien pour y accéder.


Rien de mieux que la joie ressentit lors d'une simple et bonne programmation!!
Commenter la réponse de jeanpierre691
anibro 7 Messages postés lundi 7 décembre 2009Date d'inscription 14 décembre 2009 Dernière intervention - 7 déc. 2009 à 12:28
0
Merci
salut !!
je suis un nouveau et mon premier programme est le suivant:
On demande à l'utilisateur de saisir la taille d'un tableau, il saisi ensuite les nombres dans ce tableau, le programme affiche le maximum et le minimum de ces nombres, affiche les nombres premiers et la moyenne arithmétique de ces nombres
s'il vous plait aidez-moi!!!
Commenter la réponse de anibro
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 7 déc. 2009 à 13:27
0
Merci
Ok, j'ai bien compris ce que tu veux que ton programme fasse. Maintenant, question : quel est ton problème ?

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -
Commenter la réponse de krimog
anibro 7 Messages postés lundi 7 décembre 2009Date d'inscription 14 décembre 2009 Dernière intervention - 7 déc. 2009 à 13:37
0
Merci
mon problème est d'avoir un algorithme qui me permet de faire cela, mais j'ai tenté de le faire mais il me signal plusieurs erreurs que je ne comprend pas


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ProjetListeDesNombres
{
public class Nombres
{
private int i;
private int n;
private float Max;
private float Min;
private float Somme;
public Nombres()
{
}
// structure de la classe
public Nombres(int _n)
{
n = _n;
}
// public void Main()
//{
//}

// comportement de la classe
public void SaisieNombre()
{

Console.Out.WriteLine(" Quelle est la taille de votre tableau ?");
string n = Console.In.ReadLine();
string Nbres = new string[n];
int h;
int.TryParse(n, out h);
int m;
int.TryParse(Nbres[i], out m);
Console.WriteLine(" les valeurs du tableau sont: {0} ", Nbres[i]);
int h;
int.TryParse(n, out h);
for (int j = 0; j < n; j++)
{
Console.Out.WriteLine(" veuillez saisir le {0} nombre", i);
Nbres[i] = i++;
string ValeurLue = Console.In.ReadLine();
}

}

public void ValeurMinimale(int[] Nbres)
{
Max=0;
Min=0;
for (i = 1; i < n; i++)
{
if (Nbres[i] < Min)
{

Min = i;
}
if (Nbres[i] > Max)
{
Max = i;
}
Console.WriteLine(" le maximum est : {0} ", Max);
Console.WriteLine(" le mininmum est : {0} ", Min);


}
}


public void AvoirNombrePremier()
{

i = 1;
i = n;
while (n != i)
{
if ((n % i) = 0)
{
n = i;
Console.WriteLine(" ce nombre n'est pas premier");
}
else
Console.WriteLine(" c'est un nombre premier");
}
}



public void LaMoyenneArithmétique(int []Nbres)
{
Somme = Nbres[0];
Somme = Somme + Nbres[i];
Console.WriteLine(" la somme des valeurs est : {0} ", Somme);
Console.WriteLine(" la moyenne de la liste est : {0} ", ((Somme) / (n)));
}

}
}
Commenter la réponse de anibro
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 7 déc. 2009 à 14:18
0
Merci
Bon, sache tout d'abord que ça aide grandement quand tu PRECISES les erreurs que tu rencontres.
Ensuite, il y a des tonnes d'erreurs de conception dans ton code !
Enfin, ton code serait beaucoup plus lisible s'il était indenté et qu'il avait une coloration syntaxique. C'est à ça que sert le menu "code" au dessus de la zone de texte.

Quelques conseils : utilise des noms plus explicites. Fait des méthodes qui retournent des valeurs plutôt que d'écrire du texte.

Commençons par les champs dont tu auras besoin dans ta classe :
private int[] tabNombres; //Tableau qui contiendra tes nombres


Ensuite, la méthode pour créer et initialiser ce tableau
public void CreeTableau()
{
    // Taille du tableau
    Console.WriteLine("Quelle est la taille de votre tableau ?");
    string strTailleTableau = Console.ReadLine();
    int tailleTableau = int.Parse(strTailleTableau); // TryParse ne sert à rien si tu ne t'occupe pas de la gestion d'erreur
    
    // Création du tableau
    tabNombres = new int[tailleTableau];

    // Remplissage du tableau
    for (int i = 0; i < tailleTableau; i++)
    {
        Console.WriteLine("Veuillez entrer le {0}ème élément", i + 1);
        string strElement = Console.ReadLine();
        int element = int.Parse(strElement);
        tabNombres[i] = element;
    }
}


Maintenant, ta fonction qui retourne le min et celle qui retourne le max
public int GetMin() // Le tableau est un champ de la classe, inutile de le refournir
{
    if(tabNombre != null) // On vérifie qu'on a bien initialisé le tableau
    {
        int Min = tabNombre[0]; // On dit que le 1er est le minimum, puis on comparera avec chaque autre
        for (int i = 1; i < tabNombres.Length; i++)
        {
            if(tab[i] < Min) Min = tab[i];
        }
        return Min;
    }
    else
    {
        return 0;
    }
}
public int GetMax() // Le tableau est un champ de la classe, inutile de le refournir
{
    if(tabNombre != null) // On vérifie qu'on a bien initialisé le tableau
    {
        int Max = tabNombre[0]; // On dit que le 1er est le maximum, puis on comparera avec chaque autre
        for (int i = 1; i < tabNombres.Length; i++)
        {
            if(tab[i] > Max) Max = tab[i];
        }
        return Max;
    }
    else
    {
        return 0;
    }
}


De même, pour calculer la moyenne
public float GetMoyenne()
{
    if(tabNombre != null)
    {
        int somme = 0;
        for (int i = 0; i < tabNombre.Length; i++)
        {
            somme = somme + tabNombre[i];
        }
        return (float)somme/(float)(tabNombre.Length); // On "cast" en 
float pour que ce ne soit pas arrondi
    }
    else
    {
        return 0;
    }
}


J'ai déjà fait une très grosse partie de ton programme. Je te laisse faire la méthode qui permet de voir si un nombre est premier ou non, cependant, voici à quoi doit ressembler la 1ere ligne :
public bool EstPremier(int nombre)


A toi également de réfléchir à la façon d'utiliser mon code.

PS : il n'est pas impossible que mon code comporte quelques erreurs, je n'ai pas eu le temps de le tester.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé ! -
Commenter la réponse de krimog
anibro 7 Messages postés lundi 7 décembre 2009Date d'inscription 14 décembre 2009 Dernière intervention - 7 déc. 2009 à 14:40
0
Merci
je te remercie pour cette aide et tes conseils, je pense les utilisés afin de voir la où se trouvent mes erreurs en tout je te tiendrai au courant de mes aventures
Commenter la réponse de anibro

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.