A ceux qui ont appris le langage Basic... Aide !

Réponses à toutes vos questions après le Bac (Fac, Prépa, etc.)
zeoioui
Membre Naturel
Messages: 13
Enregistré le: 12 Jan 2014, 19:21

A ceux qui ont appris le langage Basic... Aide !

par zeoioui » 04 Avr 2014, 17:50

Bonjour à tous,
J'apprends à programmer seul depuis quelques semaines via un manuel de Quick Basic, et je bute sur une instruction, un artifice de calcul à trouver ...
Soit une suite, un tirage aléatoire de N numéros compris entre 1 et 10. Par exemple :

5 1 2 3 3 4 6 5 7 \ 7 8 n... ( n1 = No 5 , n2 = No 1 , n9 = No 7 etc...)

Je veux savoir quand intervient le cas de figure suivant : 7 numéros sur 10 sont sortis, manque 3 Nos , à quel rang et lesquels ?
Schématiquement, si je compare n 1 ( No 5 ) avec n 2 ( No 1 ) et s'ils sont différents, alors deux numéros sur dix sont bien présents. Parallèlement, je peux placer un compteur borné à 7, ( C = 7 ) et tant que n de n+1 , le compteur va s'incrémenter de 1 jusquà atteindre 7. Si n = n+1 , le compteur ne bouge pas et l'analyse continue.

Le problème se pose à moi quand je dois comparer n 7 ( No 6 ) avec n 8 ( No 5 ) :
n 7 n 8 mais n 8 ( No 5 ) est déjà sorti en n 1 ( répétition du No 5 )
Je cherche donc une instruction, une routine, un algo. qui permette de coder :
Si n n+1 et de tous les n précédents, soit de n-1 jusqu'au premier n ( numéro ) tiré, alors mon compteur peut fonctionner juste, jusqu'à C = 7.
IF n n+1 AND n de tous les " n " précédents THEN C = C + 1
Dans l'exemple de tirage que je donne, c'est arrivé à n 9 ( No 7 ) que tous les Nos entre 1 et 10 sont sortis, sauf trois, les Nos 8 , 9 et 10. et cela se présente au 9 ème rang. ( n 9 )
Les instructions sur les chaînes " LEFT$ " , " MID$ " , auraient pu le faire mais c'est pour les chaînes de caractères ( et je veux rester en numérique )
J' ai lu qu'il existait une instruction " MAT " qui permet de lire tous les éléments d'un tableau plutôt qu'un seul élément à chaque fois, mais cette instruction ne fonctionne qu'avec BASIC + et je travaille avec Quick Basic !
Je peux aussi construire un second tableau contenant 10 éléments ( T = 1 , 2 , .... 10 ) et par comparaison et soustraction, je peux réduire T de 10 éléments à 3 éléments, ceci m'indiquerait que 7 Nos sur 10 sont bien sortis.
Pour finir, est ce qu'une instruction du genre : n n-1 step -1 permettrait de remonter, d'analyser tous les n précédents, jusqu'au premier n1 ?

Avez-vous une idée, un conseil pour résoudre mon problème en restant sur le langage Basic.
En espérant une suite, salutations à tous.



Pythales
Habitué(e)
Messages: 1162
Enregistré le: 05 Déc 2005, 14:54

par Pythales » 04 Avr 2014, 20:08

Si j'ai compris ton problème :
Tu définis un tableau tab à 10 éléments.
Tu initialises ton tableau à 0.
Chaque fois que tu tires un nombre I parmi les N tu fais tab(I)=1.
Il est facile ensuite d'exploiter le tableau.

zeoioui
Membre Naturel
Messages: 13
Enregistré le: 12 Jan 2014, 19:21

par zeoioui » 04 Avr 2014, 20:40

Pythales a écrit:Si j'ai compris ton problème :
Tu définis un tableau tab à 10 éléments.
Tu initialises ton tableau à 0.
Chaque fois que tu tires un nombre I parmi les N tu fais tab(I)=1.
Il est facile ensuite d'exploiter le tableau.


Oui, en définissant un tableau,on résout le problème comme je le suggérais à la fin de mon message mais je me demandais si on pouvait faire l'économie de plusieurs instructions via une formule du genre n n-1 step -1
Est-ce qu'on peut écrire " n n-1 step -1 " et est-ce que ça permettrait de remonter, d'analyser tous les n précédents, jusqu'au premier n1 ?
Peut-on éviter un tableau ?
Merci Pythales.
Zéoioui.

Robic
Membre Irrationnel
Messages: 1084
Enregistré le: 03 Mai 2013, 11:00

par Robic » 04 Avr 2014, 21:56

J'ai programmé en Basic il y a très longtemps, et même en Quick Basic (celui du MS-DOS). Je ne me souviens plus trop des instructions, mais je me souviens quand même que n < > n-1 step -1 n'existe pas (step, ça sert dans une boucle).

Cela dit, je n'ai pas compris grand chose. Tu pourrais peut-être être plus clair sur la description des données ? Mais je soupçonne que ton algorithme est tordu. Voici comment je procéderais : au fur et à mesure que je tire au sort un nombre, j'incrémente un tableau qui contient le nombre de ces nombres (en jargon : leur nombre d'occurrences). À la fin, je regarde combien de nombres ont une occurrence > 0. Si par exemple sept nombres ont une occurrence > 0, ça veut dire qu'il en manque trois. On peut même savoir lesquels : ceux qui ont une occurrence = 0.

L'algorithme ressemblerait à ça (en "pseudo-basic") :

/* On crée le tableau qui va compter les nombres : */
DIM compteur (1:10) /* tableau contenant le nombre de 1, le nombre de 2, etc. */
FOR i = 1 TO 10 /* on initialise ce tableau : tout le monde vaut 0. */
compteur( i ) = 0
NEXT i

/* À présent on va lire plein de nombres aléatoires : */
PRINT "Nombre de tirages ?"
INPUT ntirages
FOR i = 1 TO ntirages
x = Random(1,10) /* un nombre aléatoire entier entre 1 et 10. */
compteur( x ) = compteur( x ) + 1 /* on met à jour le compteur : une occurrence de plus pour x. */
NEXT i

/*On peut compter le nombre de nombres tirés : */
y = 0 /* nombre de nombres tirés (c'est lui qui vaudra par exemple 7 s'il manque trois nombres). */
FOR i = 1 TO 10
PRINT "Nombres de " ; i ; " : " ; compteur( i )
IF compteur( i ) > 0 THEN y = y + 1
NEXT i
PRINT "On a tirés " ; y ; " nombres différents."

PS : excellente idée d'apprendre un langage simple comme le Basic. Est-ce que ce langage est utilisable sous Windows ? En fait, je viens de trouver rapidement sur Internet une documentation (ça m'a aidé à écrire des choses qui ressemblent à du Basic...) et j'ai vu qu'on pouvait même faire des petits graphiqes avec. Même en Windows 7 ? Ça m'intéresserait pour dessiner des petites courbes sans passer par l'usine à gaz que représente la programmation sous Windows.

Avatar de l’utilisateur
Ben314
Le Ben
Messages: 21696
Enregistré le: 11 Nov 2009, 21:53

par Ben314 » 05 Avr 2014, 10:21

Salut,
Vu ton problème qui consiste, si j'ai bien compris, à compter combien de valeurs différentes sont dans ton tableau, il y a des tonnes de méthodes.
- La plus simple (et la plus rapide) est celle proposée par Pythales : tu parcours une fois le tableau et tu "coche" (avec des 0/1) dans un deuxième tableau ceux qui sont apparus.
- Si tu ne veut absolument pas utiliser de deuxième tableau, tu peut faire 2 boucles imbriquées : La première sur N qui est la valeur dont tu cherche la présence/absence dans ton tableau et la deuxième qui parcours le tableau à la recherche du N en question. Lorsque éventuellement tu trouve le N, tu met une variable "Trouvé" à 1 (qui était initialisée à 0 avant de commencer la deuxième boucle=. À la fin de la deuxième boucle, tu ajoute à un compteur 'NbTrouvé" la valeur de la variable "Trouvé".
- (Encore plus bourrin...) Tu trie ton tableau du plus petit au plus grand puis, une fois trié, tu le parcours une seule fois en regardant combien de fois tu as T[n+1]T[n].

De toute façon, à mon sens, quand tu fait de la programmation/algorithmique avant d'aller chercher des instructions "complexes" style MAT que tu vas utilise comme des "boites noires" (i.e. en ne sachant absolument pas comment elles fonctionnent), il me semble que le premier truc à se demander, c'est "à la main (i.e. sans ordi), je ferais comment ?"
Donc, si on te filait un papier avec une liste d'une centaine de nombres en vrac entre 1 et 100, tu ferais comment (à la main) pour trouver au plus vite les nombres qui ne sont pas dans la liste ?
Perso, je pense que je ferais... ce que préconise Robic...
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius

zeoioui
Membre Naturel
Messages: 13
Enregistré le: 12 Jan 2014, 19:21

par zeoioui » 05 Avr 2014, 12:08

Ok, il y a bien sûr plusieurs routines possibles mais je retiens ce que tu me conseilles Ben :
" Donc, si on te filait un papier avec une liste d'une centaine de nombres en vrac entre 1 et 100, tu ferais comment (à la main) pour trouver au plus vite les nombres qui ne sont pas dans la liste ?
Perso, je pense que je ferais... ce que préconise Robic... "
Je reviens vers vous plus tard pour vous exposer clairement mon exercice ( car c'est un exercice que je m'impose pour assimiler au mieux ) et merci de votre aide à tous...
@ plus tard, si je vous dérange pas trop. Zéoioui.

zeoioui
Membre Naturel
Messages: 13
Enregistré le: 12 Jan 2014, 19:21

par zeoioui » 05 Avr 2014, 12:30

Salut Robic,
De Windows 3.1 à Windows 98, il y avait un logiciel intégré de Quick Basic. A présent, c'est peut être Basic+ ( plus puissant que Basic) qui est disponible, sinon c'est C+
Effectivement, j'ai lu dans mon manuel que contrairement à ce qu'on pourrait penser, on peut quasiment tout coder avec Basic, graphes y compris. Les autres langages dérivent du Basic, on y retrouve la même logique de base. Bref, moi je suis sous windows 8 pro. qui propose C+ et visual basic je crois ( à vérifier ) mais je pense que ça vaut le coup d'istaller un Basic si W 8 pro. l'accepte. J'ai quelques exercices corrigés sur mon manuel qui traite des graphes et du dessin en Basic, si tu veux je te communique ces documents surprenants, possibles avec Basic.
@+ Zéoioui.

Robic
Membre Irrationnel
Messages: 1084
Enregistré le: 03 Mai 2013, 11:00

par Robic » 05 Avr 2014, 14:21

OK, donc tu n'utilises pas Quick Basic avec Windows si j'ai bien compris. Visual Basic, à une époque je m'y étais intéressé, mais c'est trop lourd pour moi.

deltab
Membre Rationnel
Messages: 806
Enregistré le: 18 Juin 2013, 09:12

par deltab » 05 Avr 2014, 15:30

Bonjour.

On peut écrire un programme que simule un pas négatif.
Si le nombre d'itérations dans la boucle est N, on lira le tableau à l'envers en posant K=N+p-I, I étant l'indice de la boucle et p le pas effectif (>0), on lit l'élément T(K) au lieur de T(I). Cette méthode nécessite que les vraies valeurs des éléments du tableau soient connues.

deltab
Membre Rationnel
Messages: 806
Enregistré le: 18 Juin 2013, 09:12

par deltab » 05 Avr 2014, 15:57

Robic.

Si tu as vraiment de faire tourner des programmes anciens incompatibles avec Windows 7, tu peux essayer d'installer Virtual PC (gratuit) de Microsoft qui permet de gérer un 2ème système d'exploitation comme une application sous Windows 7 (MS-DOS et 98 entre autres). Microsoft a bien prévu le XP mode (XP comme application sous 7even).

Avatar de l’utilisateur
Ben314
Le Ben
Messages: 21696
Enregistré le: 11 Nov 2009, 21:53

par Ben314 » 05 Avr 2014, 17:14

Sinon, si tu n'as pas commencé depuis longtemps, je me demande si le choix du basic comme premier langage est vraiment judicieux.
Ça semble un peu plus simple au premier abord (c'est pour ça qu'il a été inventé...), mais dans le Basic "standard", la (quasi) inexistence de fonctions et procédures (à part le malheureux "gosub/return") et le fait qu'on soit obligé d'utiliser des "goto" à cause de l'absence de marquages de "blocs" (les begin/end du pascal et les accolades du C) fait qu'à mon avis, on acquière de très mauvais réflexes de programmation.
Sans parler de l'absence de la notions de "pointeurs" qui empêche drastiquement de manipuler des structures de donnés un peu complexes.

Il y a 25 ans (quand c'était la mode du Basic), le choix de ce langage pouvait se comprendre (pour parler la même "langue" que les autres), mais aujourd'hui, je ne suis pas sûr que ce soit la bonne façon de commencer la programmation...

Il faudrait peut-être que les "forts en Info" te conseille un langage plus moderne (et moins pourri).
De toute façon, quelque soit le langage choisi, tu trouvera facilement des compilateurs/interpréteurs gratuits sur le Net (et un peu moins facilement des éditeurs de programmes gratuits et agréables à manipuler)

P.S. Perso, j'ai commencé par le BASIC, mais c'était il y a plus de 30 ans sur des APPLE ][ où le BASIC était dans la ROM donc on avais pas trop le choix.
L'étape suivant quasi obligatoire étant l'assembleur 6502 pour que ça rame "un peu moins".
Un seul "accumulateur" A (8 bit) et deux "registres" X et Y (8 bits chacun)... toute une époque...
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius

deltab
Membre Rationnel
Messages: 806
Enregistré le: 18 Juin 2013, 09:12

par deltab » 05 Avr 2014, 17:48

Bonjour.

Si tu as besoin vraiment d'apprendre un langage de programmation, laisse tomber le basic (comme te l'as suggéré Ben314) et attelles-toi à un langage récent de programmation. le système d'exploitation sous lequel tournaient les programmes anciens ne gérait pas le port USB (ou du moins celui j'ai utilisé (MS-DOS). L'impression ne pouvait se faire que via le port LPT (c'était le temps des imprimantes matricielles sous port LPT).

zeoioui
Membre Naturel
Messages: 13
Enregistré le: 12 Jan 2014, 19:21

par zeoioui » 05 Avr 2014, 18:16

Ben314 a écrit:Salut,
Vu ton problème qui consiste, si j'ai bien compris, à compter combien de valeurs différentes sont dans ton tableau, il y a des tonnes de méthodes.
- La plus simple (et la plus rapide) est celle proposée par Pythales : tu parcours une fois le tableau et tu "coche" (avec des 0/1) dans un deuxième tableau ceux qui sont apparus.
- Si tu ne veut absolument pas utiliser de deuxième tableau, tu peut faire 2 boucles imbriquées : La première sur N qui est la valeur dont tu cherche la présence/absence dans ton tableau et la deuxième qui parcours le tableau à la recherche du N en question. Lorsque éventuellement tu trouve le N, tu met une variable "Trouvé" à 1 (qui était initialisée à 0 avant de commencer la deuxième boucle=. À la fin de la deuxième boucle, tu ajoute à un compteur 'NbTrouvé" la valeur de la variable "Trouvé".
- (Encore plus bourrin...) Tu trie ton tableau du plus petit au plus grand puis, une fois trié, tu le parcours une seule fois en regardant combien de fois tu as T[n+1]T[n].

De toute façon, à mon sens, quand tu fait de la programmation/algorithmique avant d'aller chercher des instructions "complexes" style MAT que tu vas utilise comme des "boites noires" (i.e. en ne sachant absolument pas comment elles fonctionnent), il me semble que le premier truc à se demander, c'est "à la main (i.e. sans ordi), je ferais comment ?"
Donc, si on te filait un papier avec une liste d'une centaine de nombres en vrac entre 1 et 100, tu ferais comment (à la main) pour trouver au plus vite les nombres qui ne sont pas dans la liste ?
Perso, je pense que je ferais... ce que préconise Robic...

Salut Ben,
Je repose mon exercice plus clairement et ce que j'ai pu coder:
Soit un sac contenant N boules ( 100 par ex. ) toute numérotées de 1 à 10. Il s'agit de tirer une boule du sac, au hasard, noter son numéro puis la remettre dans le sac. Au fil du tirage des boules dont je note le numéro,je recherche un signal particulier : signal = m'avertir quand 7 numéros sur 10 ont été tirés, et à quel moment cela se produit, donc à quel rang et quelles sont ces trois boules, ces trois numéros qui ne sont pas sortis.
Je vais donc simuler le tirage aléatoire en dimensionnant un tableau que j'appelle TIRAGE (N)
- DIM TIRAGE (N)
- FOR I = 1 TO N : TIRAGE (I) = 100 + INT (RND*10)
- RANDOMIZE

Jusqu’ici ici le programme donnera une suite aléatoire de 100 numéros compris entre 1 et 10. Par exemple soit le tirage :

5 1 2 3 3 4 6 5 7 \ 7 8 .... n

Première boule tirée, numéro 5, ( qui prend l'indice 1 et le premier No 7 qui sort, est à l'indice 9, au 9ème rang donc )
Le signal que je recherche, c'est à quel rang 7 numéros sur 10 sont sortis, autrement dit à partir de quel rang du tirage il reste trois numéros non sortis et quels sont ces numéros.
L'analyse manuelle montre que c'est au 9ème rang du tirage avec la boule numéro 7, que tous les Nos de 1 à 10 sont sortis sauf numéros 8, 9 et 10.
Le programme m'affichera plus tard : " Au 9ème tirage ou rang, Trois Nos absents x, y, et z "
Comment coder la recherche du signal ?
Je propose de placer un second tableau contenant 10 éléments, les dix numéros de 1 à 10. J'appelle ce tableau "TEMOIN "
Témoin = { 1,2,3,4,5,6,7,8,9,10 }
Je vais ensuite comparer chaque boule tirée dans TIRAGE (I) avec le tableau "Témoin" et chaque fois que la boule tirée appartient aussi à l'ensemble "Témoin" plus précisément à l'un des éléments du tableau "Témoin" , je retrancherai de " Témoin " le numéro de la boule tirée. Parallèlement, un compteur initialisé à 1, s'incrémentera de 1 à chaque soustraction d'un élément du tableau " Témoin ". Au bout de sept soustractions, il ne restera que trois numéros dans " Témoin " et le compteur sera à 7.
Je place donc mon tableau " Témoin " et un compteur C :
- DIM TEMOIN (10)
- TEMOIN = [ 1,2,3,4,5,6,7,8,9,10 ]
- C = 1
- IF TIRAGE (I) = TEMOIN (10) THEN C = C+1 ; TEMOIN (10) = TEMOIN (10) - TIRAGE (I) ELSE C = C
- NEXT I
Ou encore : Tant que Tirage (I) = Témoin (10) alors Compt. = Compt. + 1 ( avec les instructions " WHILE....WEND en Basic ) SINON Compt. ne bouge pas et Témoin ne change pas et continuer l'analyse un pas plus loin.
- NEXT I

Pour indiquer le rang en Basic, l'instruction c'est " INSTR "
- RANG = INSTR ( TIRAGE (I) , L i )
- PRINT RANG
- PRINT TEMOIN (10)

Mais je viens de réaliser en écrivant, que ma routine est fausse car le tableau Témoin est indicé tout comme le tableau Tirage et les comparaisons se réfèrent aux éléments indicés du tableau. Une case mémoire à l'indice 1 ira comparer la case mémoire indice 1 du tableau Témoin et donc l'indice 1 de Témoin n'est pas forcément égal à l'indice 1 du tableau Tirage; dans l'exemple donné, la première boule indicée 1 ( boule No 5 ) ne sera pas égale au numéro indicé 1 du tableau Témoin. Je raisonnais en pensant que la première boule tirée de Tirage (soit No 5) , pouvait trouver automatiquement son image, son équivalent dans le tableau Témoin !

Erreur de rigueur, normale quand on apprend je pense...
Je vais donc retrouver vos propositions de Tableaux et compteurs mais je n'ai pas encore bien compris leur logique; je vais donc décortiquer vos artifices de calcul pour comprendre et si je bloque, vous me donnerez bien un petit coup de pouce !
Cordialement. Zéoioui.

Robic
Membre Irrationnel
Messages: 1084
Enregistré le: 03 Mai 2013, 11:00

par Robic » 05 Avr 2014, 19:18

Est-ce que tu as besoin de savoir que 7 numéros sont sortis avant la fin du tirage complet, ou bien est-ce que peut attendre la fin du tirage complet ?

- Si c'est avant : il faut faire la vérification à chaque tirage de boule. Par exemple on peut définir un tableau compteur comme je l'ai fait : il va de 1 à 10, et compteur( i ) correspond au nombre de numéros i déjà tirés. Ce compteur doit bien sûr être incrémenté au fur et à mesure. Mais, de plus, après chaque tirage (donc à l'intérieur de la boucle principale), il faut le parcourir pour voir combien de numéros ont été tirés, c'est-à-dire combien d'éléments compteur( i ) sont > 0.

- Si c'est après, la vérification dont je parlais peut être faite après la boucle principale. C'est l'algorithme que j'ai fourni dans mon premier message.

Mais j'ai l'impression que tu as besoin du premier cas.

-----
Sinon, je ne suis pas d'accord pour décourager zeoioui d'apprendre le Basic. Du moins s'il s'agit juste d'une initiation à la programmation. C'est un langage qui contient un certain nombre de concepts utilisés dans tous les langages, par exemple les boucles conditionnelles ou les fonctions. Il est très loin de contenir tous les concepts, mais pour une simple initiation ça me semble suffire. Disons qu'il serait inutile, par contre, de devenir expert en Basic.

Avatar de l’utilisateur
Ben314
Le Ben
Messages: 21696
Enregistré le: 11 Nov 2009, 21:53

par Ben314 » 05 Avr 2014, 19:27

zeoioui a écrit:- DIM TIRAGE (N)
- FOR I = 1 TO N : TIRAGE (I) = 100 + INT (RND*10)
- RANDOMIZE
- Ton randomize, il faut le mettre AVANT les tirage au hasard, sinon il ne sert à rien (en résumé succin, le "randomize", il remue le sac dans lequel on va tirer des truc au hasard : le sac, il vaut mieux le remuer AVANT les tirages...)
- Je pense que c'est une faute de frappe, mais si tu veut des nombres entre 1 et 10 (compris), il faut mettre TIRAGE (I) = 1 + INT (RND*10) et pas 100+...


Concernant la suite,
Pour moi, le tableau TEMOIN, il sert à savoir si une boule a déjà été tirée ou pas.
Donc dans chaque case du tableau, il n'y aura que 2 valeurs possible, par exemple 0="pas encore tiré" et 1="déjà tiré". Et j'utiliserais aussi un compteur NBTIRE pour savoir, pour le moment, combien de boules différentes ont été tirées.

DONC : avant de tirer quoi que ce soit, on initialise le tableau TEMOIN avec des 0 partout (rien de tiré pour le moment) et le compteur NBTIRE lui aussi à 0.

Dans la boucle des tirages, on regarde si TIRAGE(i) a déjà été tiré en regardant si TEMOIN(TIRAGE(i)) vaut 1 ou pas.
S'il vaut 1, on ne fait rien (ce numéro a déjà été tiré) et, s'il vaut zéro, alors on augmente NBTIRE de 1 et on met 1 dans TEMOIN(TIRAGE(I))
Ensuite, on regarde si NBTIRE vaut 7 ou pas.
S'il ne vaut pas 7, on continue la boucle et, s'il vaut 7, on parcours le tableau TEMOIN pour savoir quelles sont les 3 cases du tableau qui valent 0 (i.e. quels sont les 3 nombres qui n'ont pas été tirés)

EDIT : j'avais pas vu le message de ROBIC. Il y a surement forte "redite" çi dessus...
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius

deltab
Membre Rationnel
Messages: 806
Enregistré le: 18 Juin 2013, 09:12

par deltab » 05 Avr 2014, 20:15

>> zeoioui

Comme mes souvenirs du basic sont très vagues, je te propose l'algorithme suivant (avec des instructions que je crois être du Basic).

Déclarer les 2 tableaux TM (pour TEMOIN) et TR (pout TIRAGE) de dimensions dm1=10 et dm2=100 (nombre de tirages)
TM(J) va contenir le nombre de fois qu'un numéro J est tiré
Initialiser tous leurs éléments à Zero
Faire les Dm2 tirages (boucle FOR I=1 TO DM2 ... NEXT I): TR(I)=numero tiré.
déclarer et initialiser un compteur C=1
(Faire) TANT QUE C <= dm2
Tm(tr(C))=Tm(tr(C))+1 ( TR(C) contient le numéro tiré)
calcul du nombre NNT de nombre non tiré. (un nombre J n'est pas tiré si TM(J)=0)
NNT=0
FOR K=K1 TO DM1
IF TM(K)=0
NNT=NNT+1
END IF
NEXT K
Si NNT=3
sortie de la boucle TANT QUE
END IF
C=C+1
FIN TANT QUE
IF Nnt=3
afficher le rang C, NNT et et la liste dles nombres non tirés
(une boucle FOR K=1 ... sur TM pour les détecter TM(K)=0)
ELSE
afficher autre message (NNT >3)
ENDIF

on pourra aussi opter pour un autre message indépendamment de la valeur de NNT.
afficher min(C,DM2), NNT et la liste des nombres non tirés
(une boucle FOR K=1 ... sur TM pour les détecter TM(K)=0)

On pourra modifier l'algorithme pour faire le tirage dans la boucle TANT QUE.

zeoioui
Membre Naturel
Messages: 13
Enregistré le: 12 Jan 2014, 19:21

par zeoioui » 06 Avr 2014, 09:58

Pytales, Robic, Ben et Deltab,
Merci à vous tous pour toute cette aide; je me mets au travail pour finir le programme en étudiant vos tableaux. Je vous tiendrai au courant quand je passerai à l'exécution mais faut que je trouve un logiciel de Basic à installer sur Windows 8 pro.
Une question : Quels langages utilisez-vous, C+ , Pascal ? et mon programme codé dans votre langage devient-il plus facile, moins lourd par rapport au Basic ? Par exemple,est-ce qu'on peut éviter les tableaux ou boules imbriquées pour trouver mes trois Nos absents via une formule qui analyse directement tous les n précédents à n-1 ?
Autre chose, j'ai pas bien compris Deltab quand tu m'as dit :

" On peut écrire un programme que simule un pas négatif.
Si le nombre d'itérations dans la boucle est N, on lira le tableau à l'envers en posant K=N+p-I, I étant l'indice de la boucle et p le pas effectif (>0), on lit l'élément T(K) au lieur de T(I). Cette méthode nécessite que les vraies valeurs des éléments du tableau soient connues. "


Que veux-tu dire quand tu dis : " Cette méthode nécessite que les vraies valeurs des éléments du tableau soient connues. "
A plus. Zéoioui.

Avatar de l’utilisateur
chan79
Membre Légendaire
Messages: 10330
Enregistré le: 04 Mar 2007, 19:39

par chan79 » 06 Avr 2014, 11:35

Juste histoire de faire fonctionner le vieux GWBASIC (avec ses lignes numérotées):

Image

On sort de la boucle dès que 7 numéros différents sont sortis

Image

Il semble, qu'en moyenne, il faille environ 11 tirages pour que 7 numéros sur les 10 soient sortis.
Ca doit pouvoir se démontrer ... :zen:

Robic
Membre Irrationnel
Messages: 1084
Enregistré le: 03 Mai 2013, 11:00

par Robic » 06 Avr 2014, 19:05

Par exemple,est-ce qu'on peut éviter les tableaux ou boules imbriquées pour trouver mes trois Nos absents via une formule qui analyse directement tous les n précédents à n-1 ?

Tu n'aimes pas les tableaux ? :zen: Tu sais, l'ordinateur calcule très vite, donc de ton côté tu dois juste te préoccuper de faire un programme facile à comprendre par un humain.

En programmation structurée, c'est à toi de créer la fonction qui va analyser tous les numéros, et une fois que cette fonction est créée, on ne se préoccupe plus de savoir si elle utilise des tableaux ou je ne sais quoi : on l'appelle, point. C'est un peu comme si tu inventais l'instruction dont tu as besoin. N'empêche qu'il faut la créer.

deltab
Membre Rationnel
Messages: 806
Enregistré le: 18 Juin 2013, 09:12

par deltab » 07 Avr 2014, 19:44

Bonjour

zeoioui a écrit:Pytales, Robic, Ben et Deltab,
Merci à vous tous pour toute cette aide;......

Autre chose, j'ai pas bien compris Deltab quand tu m'as dit :

" On peut écrire un programme que simule un pas négatif.
Si le nombre d'itérations dans la boucle est N, on lira le tableau à l'envers en posant K=N+p-I, I étant l'indice de la boucle et p le pas effectif (>0), on lit l'élément T(K) au lieur de T(I). Cette méthode nécessite que les vraies valeurs des éléments du tableau soient connues. "


Que veux-tu dire quand tu dis : " Cette méthode nécessite que les vraies valeurs des éléments du tableau soient connues. "
A plus. Zéoioui.

IL ne faut pas oublier que l'algorithme que j'ai propose, j'ai déclaré le tableau TR des tirages et ai affecté la valeur 0 à tous ses éléments, le tirage n'est pas encore fait et le tableau ne contient pas les nombres tirés .
On aurait pu mettre dans un autre tableau T1 le tableau T2 classé par ordre décroissant de l'indice
Si N est la dimension de T2, poser T1(j)=T2(N+1-j), le 1er élément T1(1) de T1 correspond bien au dernier élément T2(N) de T2 et son dernier élément T1(N) à T2(1)

 

Retourner vers ✯✎ Supérieur

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 6 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite