Algorithme_pascal

Fermé
mimi.2008 Messages postés 40 Date d'inscription samedi 9 février 2008 Statut Membre Dernière intervention 27 août 2010 - 9 févr. 2008 à 15:02
ballackacem Messages postés 58 Date d'inscription mardi 26 juin 2007 Statut Membre Dernière intervention 23 juin 2009 - 18 févr. 2008 à 11:41
Bonjour,
svp j ai besoin d'aide je ss encore debutante g besoin de resoudre cet algo en pascal:

soit un tableau T de N entier,on veut detrminer et afficher la Kiéme plus petit élément et l'indice de sa premiére apparatio dans le tableau T.

exemple:
soit le tableau T suivant:
5 2 7 2 1 4 9 4 1 1
pour k=3;
la 3éme élément minimal est 4 et l'indice de sa premiére apparation est 6.

MERCI D'AVANCE

S.V.P c'est urgance!

14 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
9 févr. 2008 à 15:06
Pas bien de faire des double posts ^^.

Déjà, arrives-tu à faire l'exercice pour k=1, c'est-à-dire de récupérer l'élément minimal et sa position ?
0
ballackacem Messages postés 58 Date d'inscription mardi 26 juin 2007 Statut Membre Dernière intervention 23 juin 2009 2
9 févr. 2008 à 17:39
bon je ne souvien pas bien de programmation pascal mais je peux te donner l'idée .

ce programme n'est pas surement juste mais son idée est juste je croix.

peut etre il y a des erreurs mais a cause de mannque de temps je ne l'ai pas rivisé donc il faut bien le derouler .

mon idée est de trouver combien on a desc entiers differentes dans le tableau : par exemple dans ton exemple on a 6 sont 1 ,2,4,5,7,9.

donc on a besoin d'une fonction qui retire se nombre .

j'utilise un fonction de type boléenne qui retire si l'entier d'une colonne i existe deja entre T(1)EtT(i-1) ou non telque T est un tableau d'entiers.

fonction existe(l: integer,T:tab):boléen ;
debut
i:=1;existe:=vrai;
tantque(i<l) et faire
debut tantque
if T(i)=T(l) then existe:=faux ;
i:=i+1;
fintantque;

utilisant cette fonction on peut ecrire une autre fonction qui calcule enfin le nombre des entiers differentes.

fonction nombres (T:tab):entier;

debut

i:=0; nombres=1;

tantque(i<=N) faire
debuttantque
if existe (i,T)=faux nombres =nombres+1;

i=i+1;

fintantque

fin.

maintenat l'algorithme final

algo exos ;
debut
lire N ;
lire les elements de T;
k:=0;min:=T(1);
h:=nombres(T)



tantque(k<h-3) et (i<N)faire

debuttanque

si T(i)<min alors
debut si
k:=k+1;
j:=i;

finsi
i:=i+1;

fintantque

afficher ("le troisiéme petit element est "+T(i)),
afficher ("son position est "+j);


attention : peut etre il y a des erreurs en deroulement car je l'ai fait rapidement donc il gaut le corriger.

je vais le riviser prochainement !

cordialement
0
ballackacem Messages postés 58 Date d'inscription mardi 26 juin 2007 Statut Membre Dernière intervention 23 juin 2009 2
9 févr. 2008 à 17:39
bon je ne souvien pas bien de programmation pascal mais je peux te donner l'idée .

ce programme n'est pas surement juste mais son idée est juste je croix.

peut etre il y a des erreurs mais a cause de mannque de temps je ne l'ai pas rivisé donc il faut bien le derouler .

mon idée est de trouver combien on a desc entiers differentes dans le tableau : par exemple dans ton exemple on a 6 sont 1 ,2,4,5,7,9.

donc on a besoin d'une fonction qui retire se nombre .

j'utilise un fonction de type boléenne qui retire si l'entier d'une colonne i existe deja entre T(1)EtT(i-1) ou non telque T est un tableau d'entiers.

fonction existe(l: integer,T:tab):boléen ;
debut
i:=1;existe:=vrai;
tantque(i<l) et faire
debut tantque
if T(i)=T(l) then existe:=faux ;
i:=i+1;
fintantque;

utilisant cette fonction on peut ecrire une autre fonction qui calcule enfin le nombre des entiers differentes.

fonction nombres (T:tab):entier;

debut

i:=0; nombres=1;

tantque(i<=N) faire
debuttantque
if existe (i,T)=faux nombres =nombres+1;

i=i+1;

fintantque

fin.

maintenat l'algorithme final

algo exos ;
debut
lire N ;
lire les elements de T;
k:=0;min:=T(1);
h:=nombres(T)



tantque(k<h-3) et (i<N)faire

debuttanque

si T(i)<min alors
debut si
k:=k+1;
j:=i;

finsi
i:=i+1;

fintantque

afficher ("le troisiéme petit element est "+T(i)),
afficher ("son position est "+j);


attention : peut etre il y a des erreurs en deroulement car je l'ai fait rapidement donc il gaut le corriger.

je vais le riviser prochainement !

cordialement
0
mimi.2008 Messages postés 40 Date d'inscription samedi 9 février 2008 Statut Membre Dernière intervention 27 août 2010 1
9 févr. 2008 à 22:14
oui j'ai compris ton idéé mais désolé c'est pas la bonne reponse en tout cas MERCI;

j'ai une autre idée :

-on va trier le tableau
au cas de notre example cet tableau devient:
1 1 1 2 2 4 4 5 7 9
puis on va eleminer les elements qui se repetent donc le tableau devient:
1 2 4 5 7 9
ensuite , d'apres l'exemple on va chercher la 3iéme element or k=3
donc on va ecrire (t[k])

mais j'ai trouvé du probleme dans l'elemenation.

S.V.P aidez moi !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
9 févr. 2008 à 23:34
Trier un tableau pour récupérer le kième élément plus petit ? Quelle perte de temps algorithmique.

Pourquoi ne pas créér un tableau buffer de taille k.
Ensuite tu parcours une seule fois le tableau (celui contenant par exemple 1 7 2 3 5 58 ). L'élément le plus petit, tu le stockes dans buffer[0], si tu trouves un autre élément petit mais plus grand que buffer[0], alors tu le mets dans buffer[1]. Etc,
En buffer[k], t'auras le kièeme élément petit.

Si tu veux récupérer en plus l'indice, à la place de stocker le nombre tu stockes l'indice dans le tableau.

Cordialement
0
ballackacem Messages postés 58 Date d'inscription mardi 26 juin 2007 Statut Membre Dernière intervention 23 juin 2009 2
10 févr. 2008 à 15:08
okey !
regarde bien !

Initialtableau est ton tableau initial.
Test ton tableau apres le tri d'ordre croissant comme tu a fait

on vas créer tableau R qui retient les entiers sans repetition
R(1):=T(1);
i:=2;j:=2;
while (i<=N)
begin
if T(i)<>T(i-1) then
begin if
R(j):=T(i);
j:=j+1;
endif;
i:=i+1;
end;

for i:=1 to j do
begin
writeln(R(i));
end ;

writeln('le k-iéme plus petit entier est'+ R(k)); .......affichage de resultat du k iéme petit élément

pour calculer dans quel colonne existe revenir au premier tableau initial et faire:

i=1;
while(Initialtableau(i)<>R(k))
begin
i:=i+1; .............. affichage de quel colonne apparaitre la premiére occurence de R(k)
end;
writeln('la premiere occurence de R(k)est dans la colonne'+i);

j'espere que j'ai eliminé ton probléme d'elimination

Amicalement et cordialement
0
mimi.2008 Messages postés 40 Date d'inscription samedi 9 février 2008 Statut Membre Dernière intervention 27 août 2010 1
10 févr. 2008 à 19:25
merci pour ton aide.

j'ai applique ton idée mais ca ne marche pas.
SVP traduise ton aidee en pascal de maniere claire et nette .
0
ballackacem Messages postés 58 Date d'inscription mardi 26 juin 2007 Statut Membre Dernière intervention 23 juin 2009 2
11 févr. 2008 à 14:48
ou est le probléme ? pourquoi il ne fonctionne pas !
est ce qu'il y a des erreurs dans l'affichage de resultats ?
je pense que l'algorithme deroule de façon qu'il donnes les resultats souhaités .peut etre tu a oublié des petites detailles dans la programmation !ou tu a aml placé le compteur ou une erreur de frappe !

Prend ton premier tableau Initialtableau de taille donnée N par exemple Initialtableau = 5 2 7 2 1 4 9 4 1 1 avec N =10;

créer un nouveau tableau T de méme taille N pour trier Initialtableau on trouve T =1 1 1 2 2 4 4 5 7 9 .

Créer un nouveau tableau R pour mettre les entiers sans répitions :

R[1]=T[1]=1;
donc R = 1;
i:=2;j:=2;
i=2<=10;
T[2]=1=T[1]=1 donc la condition if ici ne fonctionne pas donc i:=i+1 =3;

T[3]=1=T[2]=1 donc la condition if ici ne fonctionne pas donc i:=i+1 =4;

(T[4]=2)<>(T[3]=1) donc il entre dans les instructions de if , il donne R[j]=R[2]:=T[4]=2 donc R[2]:=2 et j:=j+1 donc j:=3 ;i:=i+1 i:=5; R=1 2

T[5]=2=T[4]=2 donc la condition if ici ne fonctionne pas donc i:=i+1 =6;

(T[6]=4)<>(T[5]=2) donc il entre dans les instructions de if , il donne R[j]=R[3]:=T[6]=4 donc R[3]:=4 et j:=j+1 donc j:=4 ;i:=i+1 i:=7; R=1 2 4

T[7]=4=T[6]=4 donc la condition if ici ne fonctionne pas donc i:=i+1 =8;

(T[8]=5)<>(T[7]=4) donc il entre dans les instructions de if , il donne R[j]=R[4]:=T[8]=5 donc R[4]:=5 et j:=j+1 donc j:=5 ;i:=i+1 i:=9; R=1 2 4 5

(T[9]=7)<>(T[8]=5) donc il entre dans les instructions de if , il donne R[j]=R[5]:=T[9]=7 donc R[5]:=7 et j:=j+1 donc j:=6 ;i:=i+1 i:=10; R=1 2 4 5 7

(T[10]=9)<>(T[9]=7) donc il entre dans les instructions de if , il donne R[j]=R[6]:=T[10]=9 donc R[6]:=7 et j:=j+1 donc j:=7 ;i:=i+1 i:=10; R=1 2 4 5 7 9 .

i=11 et 11>10 donc il arréte ici avec j=7 et R=1 2 4 5 7 9 .

la taille de tableau R est j-1 est non j ....hmmmm donc change la dans l'algorithme c'est a dire :

for i:=1 to (j-1) do ............j-1 est non j
begin
writeln(R[i]);
end ;

il affiche R =1 2 4 5 7 9

et quand il affiche le k-iéme plus petit element avec k=3 ;il va acceder a la cellule R[3];ici R[3]=4 ;

writeln('le k-iéme plus petit entier est'+ R(k)); il affiche 4 .

pour son position de premiere apparition il va au premier tableau Initialtableau = 5 2 7 2 1 4 9 4 1 1

il commence i:=1 ;
(Initialtableau[i]=Initialtableau[1]=5)<>4 donc i:=i+1 i:=1+1=2 ;i:=2;

(Initialtableau[i]=Initialtableau[2]=2)<>4 donc i:=i+1 i:=2+1=3 ;i:=3;

(Initialtableau[i]=Initialtableau[3]=7)<>4 donc i:=i+1 i:=3+1=4 ;i:=4;

(Initialtableau[i]=Initialtableau[4]=2)<>4 donc i:=i+1 i:=4+1=5 ;i:=5;

(Initialtableau[i]=Initialtableau[5]=1)<>4 donc i:=i+1 i:=5+1=6;i:=6;

(Initialtableau[i]=Initialtableau[6]=4)=4 donc il arréte ici avec i=6 dans la position est la sixiéme (i-éme);

il affiche aprés : la premiere occurence de R(k)est dans la colonne 6

c'est ça le deroulement de l'algorithme qui verifie qu'il est belle et bien juste ....donc a toi de l'implementer c'est tout .

Attention : dans la programmation il y ades conditions et des testes a faire par exemple dans ton exemple il faut signaler que k doit existe par exemple pour ton exemple pour k>6 il n'existe pas un resultat cad si tu dire le huitiéme petit element et on a sauf six entiers dans Initialtableau qu'elles se repétent ou par exemple si tu demande un k plus grand que la taille de tableau ; donc il faut bien connaitre le nombre de repitions d'abord et apres faire des conditions selon k ... ou bien ..... ou bien ....

Amicalement et cordialement .
0
mimi.2008 Messages postés 40 Date d'inscription samedi 9 février 2008 Statut Membre Dernière intervention 27 août 2010 1
11 févr. 2008 à 20:36
SVP j'ai besoin une resolution en pascal parce que je rien compris

                
0
ballackacem Messages postés 58 Date d'inscription mardi 26 juin 2007 Statut Membre Dernière intervention 23 juin 2009 2
12 févr. 2008 à 16:09
Okey !

program kiemin;

uses crt;

var tab: array [1..100] of integer; ...of ou OF ou Of je ne me rappéle pas bien

tab1 : array [1..100] of integer;

tab2 : array [1..100] of integer;

N, k,i,j,c:integer ;

BEGIN


readln (N); ...........la taille du tableau ;

lire (tab);..........procedure qui lit les element des tab ;

afficher (tab)........procedure qui affiche les element des tab ;

readln (k);

for i:=1 to N do
begin

tab1[i]:=tab[i]; ..........copier les elements de tab dans le tableau tab1

end ;

trier (tab1)..........................procedure de tri de tab1 par ordre croissant

afficher (tab1)

tab2[1]:=tab1[1];
i:=2;j:=2;
while (i<=N)
begin
if tab1[i]<>tab1[i-1] then
begin
tab2[j]:=tab1[i]; .........ici nous remplissons le tableau tab2 par les entiers de tab1 sans repition
j:=j+1;
endif;
i:=i+1;
end;

afficher (tab2); ................procedure qui affiche les element des tab 2

writeln('le k-iéme plus petit entier est'+ tab2[k]);
c:=1;
while(tab1[i]<>tab2[k]))
begin
c:=c+1; .............. affichage de quel colonne apparaitre la premiére occurence de tab2[k];
end;

writeln('la premiére apparition de'+k+'iéme entier minimal est dans la colonne'+c);

END;

est ce que c'est claire comme ça ? cas de problémes dis moi !

cordialement et amicalement .
0
Comme tu es une débutante du pascal qui ets quand même un langage très simple, je te conseille d'essayer de ton côté et de ne pas employer le copier coller.

En effet, il te suffit de faire une variable qui va se déplacer dans ton tableau, de lire la valeur qu'elle contient. Si elle est plus petite que celle que tu as en mémoire tu remplace celle que tu as par celle ci sinon tu regardes dans la cellule d'apres ^^ jusqu'au Nième nombre de ton tableau.
0
ballackacem Messages postés 58 Date d'inscription mardi 26 juin 2007 Statut Membre Dernière intervention 23 juin 2009 2
13 févr. 2008 à 11:45
c:=1;
while(tab1[i]<>tab2[k])).....................................erreur.
begin
c:=c+1; .............. affichage de quel colonne apparaitre la premiére occurence de tab2[k];
end;

writeln('la premiére apparition de'+k+'iéme entier minimal est dans la colonne'+c);
désolé ici j'aifait un erruer

remplacer par while(tab[c]<>tab2[k]))......c-a-d tab a la place de tab1 et c a ala place de i

cordialement et amicalement.
0
mimi.2008 Messages postés 40 Date d'inscription samedi 9 février 2008 Statut Membre Dernière intervention 27 août 2010 1
17 févr. 2008 à 16:17
MERCI ballackacem pour votre aide;
ET pour pepe prend votre reponse et mouiller bien apres le boir:parce que je n'utilise pas le copie coller.
0
ballackacem Messages postés 58 Date d'inscription mardi 26 juin 2007 Statut Membre Dernière intervention 23 juin 2009 2
18 févr. 2008 à 11:41
de rien mimi.2008 .pas de souci ! et envoyez a chaque fois ou tu es besoin d'aide !

Cordialement et amicalement !
0