[C#] Question de débutant

Question de débutant [C#] - C#/.NET managed - Programmation

Marsh Posté le 31-10-2007 à 13:48:10    

Bonjour à tous,
Je débute en C# et j'ai un petit soucis. Je dois faire un prog de gestion de note et de personne et j'ai une classe binom qui est composé de deux objet Student. Pour l'instant je pense avoir écrit une grosse connerie j'ai mi codé le lien comme ceci:
 
private Student []TabStudent = new Student[2];
 
J'ai fait du C++ et si j'avais eu à utiliser ce langage j'aurais mi des pointeurs...Apparemment en C# il n'y pas besoin de ces pointeurs MAIS dans mon cas je ne vois pas comment lier correctement un binom et deux Student. Pour l'instant comme je l'ai écrit il n'y a pas de lien entre les deux, je re-cré deux objets Student indépendant, je voudrais que quand je modifie le student cela soit répercuté dans la classe binom...j'attends donc vos avis pour m'éclairer un peu...J'ai essayé de faire avec des pointeurs mais apparemment ce n'est pas la bonne méthode à suivre...
 
Merci d'avance

Reply

Marsh Posté le 31-10-2007 à 13:48:10   

Reply

Marsh Posté le 31-10-2007 à 13:56:17    

Page 3 de ton manuel de C#

Reply

Marsh Posté le 31-10-2007 à 14:00:25    

Déjà chercher dans les manuels, j'ai pas trouvé ;)

Reply

Marsh Posté le 31-10-2007 à 14:41:20    

déjà je pige pas de quoi tu parles.
 
tu modifies ton OBJET (instance) et tu veux que ce soit récupéré dans ta CLASSE ????????
 
ça veut rien dire.
 
sinon, histoire de comprendre un peu les notions de références en C#, exécute ce petit exemple pour comprendre les mécanismes :
(roulé à la main sous les aisselles, c'est juste pour montrer comment ça marche)

Code :
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4.  
  5. namespace TestConsole
  6. {
  7.    class Program
  8.    {
  9.        static void Main(string[] args)
  10.        {
  11.            Personne pers = new Personne("Dupont", "Michel", 27);
  12.            Console.WriteLine(pers.ToString());
  13.            UpdatePersonne(pers, "Dupond" );
  14.            Console.WriteLine(pers.ToString());
  15.            KillPersonne(pers);
  16.            Console.WriteLine(pers.ToString());
  17.            NouvellePersonne(pers, "Dupuis", "Olivier", 42);
  18.            Console.WriteLine(pers.ToString());
  19.  
  20.            Console.ReadKey(true);
  21.        }
  22.  
  23.        static void UpdatePersonne(Personne p, string nom)
  24.        {
  25.            p.Nom = nom;
  26.            Console.WriteLine(p.ToString());
  27.        }
  28.  
  29.        static void KillPersonne(Personne p)
  30.        {
  31.            p = null;
  32.            Console.WriteLine("Personne est mort" );
  33.        }
  34.  
  35.        static void NouvellePersonne(Personne p, string nom, string prenom, int age)
  36.        {
  37.            p = new Personne(nom, prenom, age);
  38.            Console.WriteLine(p.ToString());
  39.        }
  40.    }
  41.  
  42.    class Personne
  43.    {
  44.        private string _nom, _prenom;
  45.        private int _age;
  46.  
  47.        public Personne(string Nom, string Prenom, int Age)
  48.        {
  49.            _nom = Nom;
  50.            _prenom = Prenom;
  51.            _age = Age;
  52.        }
  53.  
  54.        public string Nom
  55.        {
  56.            get
  57.            {
  58.                return _nom;
  59.            }
  60.            set
  61.            {
  62.                _nom = value;
  63.            }
  64.        }
  65.  
  66.        public string Prenom
  67.        {
  68.            get
  69.            {
  70.                return _prenom;
  71.            }
  72.            set
  73.            {
  74.                _prenom = value;
  75.            }
  76.        }
  77.  
  78.        public int Age
  79.        {
  80.            get
  81.            {
  82.                return _age;
  83.            }
  84.            set
  85.            {
  86.                _age = value;
  87.            }
  88.        }
  89.  
  90.        public override string ToString()
  91.        {
  92.            return string.Format("Personne : {0} {1} est agé de {2} ans.", _prenom, _nom, _age);
  93.        }
  94.    }
  95. }

Reply

Marsh Posté le 31-10-2007 à 14:58:24    

mais non, il a pas lu les bases sur les valuetype, les objets, l'allocation dynamique, etc

Reply

Marsh Posté le 31-10-2007 à 16:02:25    

Taz a écrit :

mais non, il a pas lu les bases sur les valuetype, les objets, l'allocation dynamique, etc


bah ouais, mais justement, avec l'exemple que je file, il va commencer à comprendre qu'il a besoin de lire un minimum de doc sur le sujet avant de chercher à aller plus loin ;)
 
ceci dit, je dois dire que moi j'ai mis un bout de temps à vraiment comprendre le principe du truc (surtout à savoir m'en servir et prévoir le comportement ;) spa évident -mais bon j'ai pas d'excuse, j'ai jamais acheté de bouquin :D-)

Reply

Marsh Posté le 31-10-2007 à 16:03:26    

MagicBuzz a écrit :


bah ouais, mais justement, avec l'exemple que je file, il va commencer à comprendre qu'il a besoin de lire un minimum de doc sur le sujet avant de chercher à aller plus loin ;)
 
ceci dit, je dois dire que moi j'ai mis un bout de temps à vraiment comprendre le principe du truc (surtout à savoir m'en servir et prévoir le comportement ;) spa évident -mais bon j'ai pas d'excuse, j'ai jamais acheté de bouquin :D-)


100 lignes d'exemple ne peuvent pas remplacer 3 lignes de définition.

Reply

Marsh Posté le 31-10-2007 à 16:05:41    

ça dépend, moi j'arrive à apprendre que par la pratique.
 
la doc ça aide, mais pour moi, c'est qu'une fois que je sais ce que j'attends de la doc : en gros j'ai un cas précis que je ne comprends pas, et là je lis la doc pour voir pourquoi. j'arrive pas à faire l'inverse :spamafote:
 
m'enfin bon spa nouveau, je fais tout à l'envers :D
 
le meilleur exemple, c'est en ce moment : je fais une appli de consultation d'un catalogue situé dans une base.
le client est fini fignolé et tout ça.
et là je suis en train de me rendre compte que j'ai aucun outil pour allimenter/maintenir la base, chuis en train d'en coder un :pt1cable:

Message cité 1 fois
Message édité par MagicBuzz le 31-10-2007 à 16:06:55
Reply

Marsh Posté le 31-10-2007 à 16:17:00    

MagicBuzz a écrit :

ça dépend, moi j'arrive à apprendre que par la pratique.


foutaise. Comme disait je-sais-plus-qui (Pascal / Descartes / Kamoulox) tu peux regarder autant que tu veux une flamme sans jamais arriver à saisir ce qui se passe.

Reply

Marsh Posté le 31-10-2007 à 16:18:31    

Rebonjour,
Alors pour essayer d'un peu plus vous expliquez mon problème:
Le code de mon Binom:

Code :
  1. class Binom
  2.    {
  3.        private float Note;
  4.        private String Commentaire;
  5.        private Student[] TabStudent = new Student[2];
  6.  
  7.        //Set
  8.        public void SetNote(float a) { Note = a; }
  9.        public void SetCommentaire(String a) { Commentaire = a; }
  10.        public void SetTestStudent(Student S1, Student S2) { TabStudent[0] = S1; TabStudent[1] = S2; }//Ecrase les deux etudiant d'un binom
  11.        public int SetStudent(Student S)
  12.        {
  13.            for (int i = 0; i < TabStudent.Length; i++)
  14.            {
  15.                if (TabStudent[i] == null)
  16.                {
  17.                    TabStudent[i] = S;
  18.                    return 0;
  19.                }
  20.            }
  21.            return 1;
  22.        }
  23.        //Get
  24.        public float GetNote() { return Note; }
  25.        public String GetCommentaire() { return Commentaire; }
  26.        public Student GetTabStudent(int i) { return TabStudent[i]; }
  27.    }
  28. }


 
Sur cette ligne:  public void SetTestStudent(Student S1, Student S2) { TabStudent[0] = S1; TabStudent[1] = S2; }//Ecrase les deux etudiant d'un binom
 
je duplique l'étudiant et je voudrais que l'étudiant "pointe"  sur la case du tableau comme on le ferait naturellement en C++
 
Ps:Vous occupez pas des commentaires, de la doc j'en ai j'ai regardé dedans et rien ne parle de ce que je veux faire donc je demande conseil...


Message édité par Saubin le 31-10-2007 à 16:21:07
Reply

Marsh Posté le 31-10-2007 à 16:18:31   

Reply

Marsh Posté le 31-10-2007 à 16:21:43    

(déjà les bool ça existe)
 
Et non, tu n'écrases pas des étudiants, tu modifies des références. TabStudent est un tableau de référence à des Student.

Reply

Marsh Posté le 31-10-2007 à 16:31:33    

D'ac sauf que si je modifie l'étudiant S1, le même étudiant contenu dans TabStudent[0] n'est pas modifié et c'est à ça que j'aimerais arrivé.
(j'ai pas utilisé de bool :??:
 
Edit: Dsl taz j'ai mal lu ta réponse sur les bools)


Message édité par Saubin le 31-10-2007 à 17:24:32
Reply

Marsh Posté le 31-10-2007 à 17:22:48    

Plop.
 
Déjà, une petite remarque.
 
Tes méthodes Getxxx et Setxxx n'ont rien à faire sous forme de méthodes. Utilise des propriétés avec accesseurs :
 

Code :
  1. class Binom
  2. {
  3.    private int note;
  4.  
  5.    public int Note
  6.    {
  7.        get
  8.        {
  9.            return this.note;
  10.        }
  11.        set
  12.        {
  13.            this.note = value;
  14.        }
  15.    }
  16. }


 
Ensuite, plutôt que de retourner un int sur ton "SetStudent" (que je renommerais "AddStudent" ) lève une exception quand il n'y a plus de place. Plus propre je trouve.

Code :
  1. throw new Exception("Plus de place dans le binome !" );


 
Ou comme dit Taz, retourne un bool. Dans tous les cas, le int porte à confusion, on peut croire que c'est l'index où est inserré l'étudiant dans ton binome.
 
Sinon, ta phrase là, c'est une question ou ce qu'il se passe ? Parceque ça se comporte pas comme ça normalement.

Reply

Marsh Posté le 31-10-2007 à 17:37:10    

Merci MagicBuzz c'est très sympa les propriétés d'accesseurs c'est bien sympa!
 
Pour le SetStudent je suis entièrement d'accord mais mon prof est un peu...et il veut que des get et des set dans les class mais je send que je vais faire comme je le send il me saoule un peu avec ses principes à la c**

Reply

Marsh Posté le 31-10-2007 à 17:54:19    

Bah d'autant qu'utiliser les mécanismes du C# pour faire justement proprement des Get/Set, c'est quand même mieux que de multipliser les méthodes qui nuisent à la lisibilité de la classe (imagine une classe genre Form() avec que des propriétés accessibles par 2 méthodes à chaque fois...
 
Sinon, si tu as besoin de faire des copies complètes de tes objets (et donc ne plus bosser sur des références), voici un exemple :

Code :
  1. using System;
  2.  
  3. namespace TestConsole
  4. {
  5.    class Program
  6.    {
  7.        static void Main(string[] args)
  8.        {
  9.            ObjDeBase o1 = new ObjDeBase("toto", 1);
  10.            ObjDeBase o2 = o1;
  11.            o2.Val2 = 2;
  12.            Console.WriteLine(o1.Val2);
  13.  
  14.            ObjClonable o3 = new ObjClonable("titi", 3);
  15.            ObjClonable o4 = (ObjClonable)o3.Clone();
  16.            o4.Val2 = 4;
  17.            Console.WriteLine(o3.Val2);
  18.  
  19.            Console.ReadKey(true);
  20.        }
  21.    }
  22.  
  23.    public class ObjDeBase
  24.    {
  25.        private string _val1;
  26.        private int _val2;
  27.  
  28.        Exception myExeption = new Exception("Valeur 2 incorrecte" );
  29.  
  30.        public ObjDeBase(string valeur1, int valeur2)
  31.        {
  32.            this.Val1 = valeur1;
  33.            this.Val2 = valeur2;
  34.        }
  35.  
  36.        public string Val1
  37.        {
  38.            set
  39.            {
  40.                this._val1 = value;
  41.            }
  42.            get
  43.            {
  44.                return this._val1;
  45.            }
  46.        }
  47.  
  48.        public int Val2
  49.        {
  50.            set
  51.            {
  52.                if (value > 100 || value < 0)
  53.                    throw myExeption;
  54.                this._val2 = value;
  55.            }
  56.            get
  57.            {
  58.                return _val2;
  59.            }
  60.        }
  61.    }
  62.  
  63.    public class ObjClonable : ICloneable
  64.    {
  65.        private string _val1;
  66.        private int _val2;
  67.  
  68.        Exception myExeption = new Exception("Valeur 2 incorrecte" );
  69.  
  70.        public ObjClonable(string valeur1, int valeur2)
  71.        {
  72.            this.Val1 = valeur1;
  73.            this.Val2 = valeur2;
  74.        }
  75.  
  76.        public object Clone()
  77.        {
  78.            return this.MemberwiseClone();
  79.        }
  80.  
  81.        public string Val1
  82.        {
  83.            set
  84.            {
  85.                this._val1 = value;
  86.            }
  87.            get
  88.            {
  89.                return this._val1;
  90.            }
  91.        }
  92.  
  93.        public int Val2
  94.        {
  95.            set
  96.            {
  97.                if (value > 100 || value < 0)
  98.                    throw myExeption;
  99.                this._val2 = value;
  100.            }
  101.            get
  102.            {
  103.                return _val2;
  104.            }
  105.        }
  106.    }
  107. }

Reply

Marsh Posté le 31-10-2007 à 21:51:09    

Saubin a écrit :


Pour le SetStudent je suis entièrement d'accord mais mon prof est un peu...et il veut que des get et des set dans les class mais je send que je vais faire comme je le send il me saoule un peu avec ses principes à la c**


ridicule ce prof... les properties existent depuis le début dans C#, je vois pas pourquoi il ne veut pas les utiliser... encore un qui ne jure surement que par Java tiens...

Reply

Marsh Posté le 31-10-2007 à 22:55:56    

Harkonnen a écrit :


ridicule ce prof... les properties existent depuis le début dans C#, je vois pas pourquoi il ne veut pas les utiliser... encore un qui ne jure surement que par Java tiens...


Oui exactement il jure que pars java, d'ailleurs il ramène tout à java...

Reply

Marsh Posté le 31-10-2007 à 23:05:00    

faut lui dire que C# pallie à un truc assez pénible de Java : l'obligation de définir des getters et setters pour les variables membres (les fameux setMachin() et getMachin() bien lourdingues). les properties sont bien plus intuitives à lire que les accesseurs made in Java :sarcastic:

 

et si jamais la suite du programme consiste à utiliser des interfaces pour la programmation évenementielle (par exemple, comme Java et ses interfaces listeners à implémenter), alors parle lui donc des delegates...

 

y'a des jours ou j'ai envie de vitrifier le corps enseignant moi....


Message édité par Harkonnen le 31-10-2007 à 23:05:29
Reply

Marsh Posté le 01-11-2007 à 16:02:25    

^^, pas de soucis, on utilise des interfaces oui! Mais qu'est ce que tu apelles de la prog évenementielle? Je vais voir ce que c'est que les delegates ;)

Reply

Marsh Posté le 01-11-2007 à 17:36:51    

j'aimerais bien éxécuter FXCop sur ton code, ca doit etre rigolo
 
[:blessure]


---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le 01-11-2007 à 18:19:20    

Ca ferait quoi?

Reply

Marsh Posté le 01-11-2007 à 19:00:54    

oh il serait sûrement très bavard....

Reply

Marsh Posté le 01-11-2007 à 19:03:13    

Ouki je vois ce que c'est, désolé y a un début à tout ça peut pas être parfait de suite ;)

Reply

Marsh Posté le 02-11-2007 à 09:35:35    

Lamarmotte a écrit :

oh il serait sûrement très bavard....


En parlant de ça.
 
Dans mon dernière exemple, j'avais fait hériter "ObjClonable" de "ObjDeBase" et de "IClonable".
 
Mais cet empaffé n'a jamais rien voulu compiler, comme quoi il n'avait pas de constructeur sans argument, après comme quoi il n'avait pas de constructeur avec deux arguments. Si je les créait, il plantait sur l'instanciation du truc en râlant que le type de base était merdé aussi ou je sais pas quoi... Du coup j'ai laissé tomber, mais ça me fends l'anus en deux ce truc.
J'ai oublié un truc ?
 

Code :
  1. public class ObjClonable : ObjDeBase, IClonable
  2. {
  3.    public object Clone()
  4.    {
  5.        return this.MemberwiseClone();
  6.    }
  7. }


 
=> Aucune idée de pourquoi ça veut pas compiler ! Une idée ?

Reply

Marsh Posté le 02-11-2007 à 15:51:10    

bonjour g un gros pb je comprend rien au tableau qqn peut m'expliquer pourquoi ce prog par exempl ne foncionne pas c'est un programme qui est cense saisir des donnéé au clavier dans un tableau et apres on peux chercher l'adresse d'une valeur ou pas #include<stdio.h>
#include<stdlib.h>
 
int main(void)
{
    int i,x,Case;
   
    int Tab[10];
    for(i=0;i<10;i++)
    {
     printf("Valeur %d :\n",i+1);
     scanf("%d",& Tab[i]);
     }
    printf("entrez la valeur du nombre a rechercher:\n" );
    scanf("%d",&x);  /**X=...**/
    for(i=0;i<10;i++);
    {
     if(Tab[i]==x)
      {
       Case=i;
       printf( "la valeur est presente en posisition%d\n",Case);
      }
      else
      {printf("le nombre est absent\n" );}
    }
     
system("pause" );
return 0;
}

Reply

Marsh Posté le 02-11-2007 à 15:57:36    

Multipost [:florentg]


Message édité par Elmoricq le 02-11-2007 à 15:57:46
Reply

Marsh Posté le 02-11-2007 à 17:52:09    

greg0488 a écrit :

bonjour g un gros pb je comprend rien au tableau qqn peut m'expliquer pourquoi ce prog par exempl ne foncionne pas c'est un programme qui est cense saisir des donnéé au clavier dans un tableau et apres on peux chercher l'adresse d'une valeur ou pas #include<stdio.h>
#include<stdlib.h>
 
int main(void)
{
    int i,x,Case;
   
    int Tab[10];
    for(i=0;i<10;i++)
    {
     printf("Valeur %d :\n",i+1);
     scanf("%d",& Tab[i]);
     }
    printf("entrez la valeur du nombre a rechercher:\n" );
    scanf("%d",&x);  /**X=...**/
    for(i=0;i<10;i++);
    {
     if(Tab[i]==x)
      {
       Case=i;
       printf( "la valeur est presente en posisition%d\n",Case);
      }
      else
      {printf("le nombre est absent\n" );}
    }
     
system("pause" );
return 0;
}


 
quelle est ta question sur le C# ?


---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le 02-11-2007 à 20:17:19    

et moi ? pkoi ça hérite pas ?

Reply

Marsh Posté le 11-11-2007 à 11:01:08    

parce que tu codes avec des moufles ? :D


---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed