IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Turbo Pascal Discussion :

Remplissage de tableau [TPW]


Sujet :

Turbo Pascal

  1. #1
    Candidat au Club
    Inscrit en
    Février 2013
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Remplissage de tableau
    Salut
    j'ai besoin d'aide svp, je veux créer ce programme

    Nom : prog.PNG
Affichages : 14170
Taille : 87,8 Ko

    J'arrive à faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    program devoir;
    uses wincrt;
    type tab=array [1..30] of integer;
     
    var  a,K,N:integer; t,ts:tab;
     
     
     
     
    procedure saisie(var t:tab;K,N:integer);
    var i:integer;
     
    begin
    repeat
    write('donnez N : ');
    readln(N);
    until N in [5..30];
    repeat
    write('donnez K : ');readln(K);
    until K in [2..N-1] ;
    for i:=1 to N do
    begin
    repeat
    write('t[',i,']=');
    readln(t[i]);
    until t[i]>0;
    end;
    for i:=1 to N do
    write(t[i],'|'); writeln(' ');
    end;
     
     
    procedure remplirts(var K,a:integer;ts:tab);
    var s,i,j:integer;
     
    begin
    s:=0;
    a:=1;
    for j:=1 to N-K+1 do
    begin
    for i:=a to K do
    begin
    s:=t[i]+s;
    end;
    ts[j]:=s;a:=a+1;K:=K+1;
    end;
    end;
     
     
    procedure afficherts(N,K:integer;ts:tab);
    var i:integer;
    begin
    for i:=1 to N-K+1 do
    write(ts[i],'|');
    end;
     
     
    begin
    saisie(t,K,N);
    remplirts(K,a,ts);
    afficherts(K,N,ts);
    end.
    mais quand je fais la compilation j'obtiens

    Nom : compi.PNG
Affichages : 9859
Taille : 20,4 Ko

    J'ai beau chercher où je me suis trompé mais en vain. help :s
    Merci d'avance.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 282
    Points : 939
    Points
    939
    Par défaut
    Je ne sais pas si j'aurai le temps de te suivre jusqu'au bout, mais déjà :
    - Ton code doit être lisible, donc :
    -- places-le entre les balises de code : bouton # à l'édition du message,
    -- indentes correctement, cela permet de voir des problèmes, ou de voir ce qui est inutile.
    Cela donne (programme non corrigé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    program devoir;
    uses wincrt;
    type tab=array [1..30] of integer;
     
    var a,K,N:integer; t,ts:tab;
     
     
    procedure saisie(var t:tab;K,N:integer);
    var i:integer;
     
    begin
    	repeat
    		write('donnez N : ');
    		readln(N);
    	until N in [5..30];
    	repeat
    		write('donnez K : ');readln(K);
    	until K in [2..N-1] ;
    	for i:=1 to N do
    		begin
    			repeat
    				write('t[',i,']=');
    				readln(t[i]);
    			until t[i]>0;
    		end;
    	for i:=1 to N do
    		write(t[i],'|');
    	writeln(' ');
    end;
     
     
    procedure remplirts(var K,a:integer;ts:tab);
    var s,i,j:integer;
     
    begin
    	s:=0;
    	a:=1;
    for j:=1 to N-K+1 do
    	begin
    		for i:=a to K do
    			begin
    				s:=t[i]+s;
    			end;
    		ts[j]:=s;a:=a+1;K:=K+1;
    	end;
    end;
     
     
    procedure afficherts(N,K:integer;ts:tab);
    var i:integer;
    begin
    	for i:=1 to N-K+1 do
    		write(ts[i],'|');
    end;
     
     
    begin
    	saisie(t,K,N);
    	remplirts(K,a,ts);
    	afficherts(K,N,ts);
    end.
    - Je mets un "begin … end" lorsqu'il y a plusieurs instructions. Une boucle est "une seule" instruction, donc dans "for…begin…repeat…", le begin est a priori inutile.
    - Si je lis rapidement ton programme tel qu'indenté, je ne comprends pas pourquoi ton tableau t s'affiche sur une seule ligne. Avec la bonne indentation, je comprends plus vite.
    - Donne un nom plus rapide à comprendre aux procédures : "remplir_ts" au lieu de "remplirts". Ce n'est pas grand chose, mais ça aide.
    - La procédure saisie : ton tableau est déclaré en paramètre variable, mais pas les entiers qui suivent : pourquoi ? ton "var" de paramètre s'arrête au premier ";", il ne va pas jusque ")" ! (ou alors quelque chose a changé depuis que je n'en ai plus fait ?)
    - Idem procédure "remplirts" : k est en "var", or il n'a aucune raison de l'être; pourquoi passer le paramètre "a" alors qu'il ne sert que dans la procédure, "a" devrait plutôt être une variable locale à la procédure, isn't-it ?
    - Procédure "remplirts" : le "for i:=a" me gêne, serait-ce plutôt "for i:=j" ? du coup, on se demande si "a" a vraiment une utilité.
    - Procédure "remplirts" : pour "K" est-il passé en variable ? une fois affecté, il n'est pas censé changer de valeur ! Et pire, il change justement de valeur encours de route. "K" représente ton "plateau", la largeur imposé de l'intervalle de sommation, il n'a donc a priori aucune raison de changer.

    Ceci dit, tu est déjà bien avancé.
    J'espère ne pas avoir dit de bêtise, je fais cela vite fait.
    poke 1024,0; poke 214,214

  3. #3
    Candidat au Club
    Inscrit en
    Février 2013
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    merci AdmChiMay pour votre temps, vous m'avez vraiment aidé j'ai corrigé presque tout ce que vous m'avez dites .
    néanmoins mon problème le plus important c'est le remplissage de ts j'obtiens toujours 0 :/ .

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 282
    Points : 939
    Points
    939
    Par défaut
    Quand on ne voit pas, le mieux est de faire des traces à l'écran (pour ce genre de taille de programme, car sinon, la prochaine étape c'est le debugger).

    Par exemple : tu as lu t (et phonétiquement ça reste valable ), alors tu l'affiches. Pour le coup, tu gardes le begin-end autour du while, et tu ajoutes une 2è commande : writeln ( 'vous avez rentré t[',i,'] = ', t[i]); . Cela te permet de faire de la vérification à la volée.
    Ou alors, juste avant de sortir de la procédure, tu affiches n, k, et le tableau. Ce code, tu pourras :
    - le mettre en commentaire une fois que c'est correct,
    - le recopier à l'entrée de la procédure suivante, pour vérifier que les paramètres n'ont pas été cabossés par le transit.

    Tu fais la même chose juste après avoir affecté ts[j]. Voir même tu writeln ta somme s en cours de calcul.

    Déjà, tu sauras si tes données sont passées correctement d'une procédure à l'autre. C'est comme cela qu'on s'aperçoit très vite que quelque chose aurait dû passer en var ou pas, ou bien que l'on a affecté quelque chose au mauvais moment. Bref, c'est le debug, mais sans l'outil qui fait avancer le programme pas-à-pas et t'affiches tout seul le contenu de toutes les données.

    Essayes, bidouilles, pendant la journée, et re-postes ton programme modifié ce soir, je repasserai jeter un oeil.

    L'avantage du Pascal, c'est que le nombre d'erreurs possibles est généralement limité, c'est une première étape d'apprentissage. Et d'une manière générale, afficher les données qu'on vient de recevoir, puis afficher celles qu'on est censé renvoyer, ça repère déjà pas mal de problèmes. Et après, tu mets cet affichage en commentaire une fois que c'est correct.

    p.s. : pour le listing, j'avais mis en forme à coups de tabulations sous Notepad++, mais ça peut faire large à l'affichage selon les réglages. Autre solution : des paquets de 2 à 4 espaces.
    poke 1024,0; poke 214,214

  5. #5
    Candidat au Club
    Inscrit en
    Février 2013
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 3
    Points : 3
    Points
    3
    Par défaut enfin :/
    voià ce que j'ai pu corriger , pour le traitement j'ai commis une erreur TREEES STUPIDE " dans l'appel de la procedure afficher j'ai inverser le n et le k c'est pourquoi le programme me donne la valeur 0....
    le programme est loin d'etre parfait mais celui-là au moins donne le résultat correcte..


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    program devoir;
    uses wincrt;
    type tab=array [1..30] of integer;
     
    var k,n:integer; t,ts:tab;
     
    procedure saisie(var t:tab;var k:integer;var n:integer);
     var i:integer;
      begin
       repeat
        write('donnez n : ');
        readln(n);
       until n in [5..30];
     
       repeat
        write('donnez k : ');readln(K);
       until K in [2..n-1] ;
     
       for i:=1 to n do
        begin
         repeat
          write('t[',i,']=');
          readln(t[i]);
         until t[i]>0;
         end;
     
      end;
     
     
    function somme(t:tab;a:integer;b:integer):integer;
     var i,s:integer;
      begin
      s:= 0 ;
       for i:=a to b do
        s:= s+t[i];
      somme :=s;
      end;
     
    procedure remplir_ts(t:tab;n,k:integer;var ts:tab);
     var i:integer;
     
      begin
       for i:=1 to n-k+1 do
       begin
        ts[i] :=somme(t,i,k);
       k:=k+1;
       end;
      end;
     
    procedure afficher_ts(n:integer;k:integer;ts:tab);
    var i:integer;
    begin
    	for i:=1 to n-k+1 do
    		write(ts[i],'|');
    end;
     
    begin
    	saisie(t,k,n);
     
    	remplir_ts(t,n,k,ts);
    	afficher_ts(n,k,ts);
    end.


    MERCI encore AdmChiMay!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme de remplissage de tableau (ecrasement de donnees)
    Par roulia_rousset dans le forum Langage
    Réponses: 4
    Dernier message: 05/06/2008, 15h44
  2. Réponses: 3
    Dernier message: 13/03/2008, 10h46
  3. remplissage de tableau
    Par goeps dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 05/05/2007, 11h56
  4. [Débutant] Problème de création et de remplissage de tableau
    Par pinggu dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 24/05/2006, 16h50
  5. [JComboBox] Remplissage avec tableau de String
    Par linkit dans le forum Composants
    Réponses: 2
    Dernier message: 26/05/2005, 22h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo