Inscription / Connexion Nouveau Sujet
Niveau algorithmique
Partager :

langage c

Posté par
smir
15-07-14 à 21:01

Bonsoir à tous
J'ai un exercice de langage C. Voici l'énoncé

Ecrire un algorithme appelé Table qui permet d'afficher la table de multiplication d'un nombre entier supérieur ou égal à 1 donné par l'utilisateur.
L'utilisateur doit pouvoir recommencer plusieurs fois s'il le désire.

Voici ma méthode
# include < stdio.h >
int main( )
{
int a, n , i , rep;
rep ='0';
while (rep == '0')
{
printf( " Donnez un entier dont vous voulez afficher la table " ) ;
scanf( "%d" , &a ) ;
for ( i = 1 ; i <= n ; i = i + 1 )
n = a * i
printf( " voulez vous afficher la table de multiplication d'un autre nombre O/N " ) ;
scanf( "%c" , &reponse ) ;
fflush (stdin);
rep = getchar ();
{
fflush (stdin);
getchar ()
return 0;
{
je voudrais savoir est ce que c'est bien fait. Sinon qu'est ce qui ne va pas.  



Posté par
Razes
re : langage c 16-07-14 à 00:23

Il y a des erreurs d'accolades (parfois inversées ou inexistantes),

Tu calcule n mais tu n'en fais rien.

Il faut rajouter des commentaires de temps en temps, par exemple pour expliquer les parametres.

Posté par
Razes
re : langage c 16-07-14 à 00:39

Il y a aussi un paramètre non déclaré : reponse

Confusion dans l'indice n

Posté par
Razes
re : langage c 16-07-14 à 00:57

essais ce bout de programme car je n'ai pas de compilateur.

# include < stdio.h >
# include < conio.h >

int main( ) {
  int Nombre, Produit , i, Imax, Choix;
  Imax = 10;
  do {
     clrscr() ;
     printf( " Donnez un entier dont vous voulez afficher la table " ) ;
     scanf( "%d" , &Nombre) ;
     printf(“ Table de multiplication du nombre %d\n“) ;
     for ( i = 1 ; i <= Imax; i = i + 1 ) {
         Produit = Nombre * i;
         printf("%d * %d = %d\n", Nombre, i, Produit);
     } /* Fin boucle de multiplication*/
     printf("Tapez ‘Q' ou ‘q' pour quitter ou une autre touche pour continuer.\n" ) ;
     Choix = getchar ();
  } while (Choix <>'Q' && Choix <>'q');
  exit(0);
}

Posté par
smir
re : langage c 16-07-14 à 02:59

Merci, j'ai testé le programme mais y a un problème à ce niveau: while (Choix <>'Q' && Choix <>'q');

Posté par
Razes
re : langage c 16-07-14 à 04:11

Remplace les opérateurs <> par != et dis moi ce qu'il en est.

Posté par
Razes
re : langage c 16-07-14 à 06:24

#include <stdio.h>
#include <conio.h>
main( ) {
  int Nombre, Produit , i, Imax, Choix;
  Imax = 10;
  do {
     clrscr() ;
     printf( " Donnez un entier dont vous voulez afficher la table " ) ;
     scanf( "%d" , &Nombre) ;
     printf(“ Table de multiplication du nombre %d\n“) ;
     for ( i = 1 ; i <= Imax; i = i + 1 ) {
         Produit = Nombre * i;
         printf("%d * %d = %d\n", Nombre, i, Produit);
     }; /* Fin boucle FOR de multiplication*/
     printf("Tapez ‘Q' ou ‘q' pour quitter ou une autre touche pour continuer.\n" ) ;
     Choix = getchar();
  } while (Choix !='Q' && Choix !='q'); /* Fin Boucle DO-WHILE*/
  return(0);
}

Posté par
jeveuxbientaider
re : langage c 16-07-14 à 12:44

Bonjour,

Avant de rédiger un programme dans n'importe quel langage, il est préférable de faire un brouillon à l'aide d'un algorithme ! Algobox permet ce genre de travail avec l'immense avantage de tester l'algo pour vérifier qu'on obtient bien ce qu'on veut



langage c

Posté par
jeveuxbientaider
re : langage c 16-07-14 à 12:58

Ce qui donne quand on tape 3 la première fois :

Posté par
jeveuxbientaider
re : langage c 16-07-14 à 12:59

pardon

langage c

Posté par
jeveuxbientaider
re : langage c 16-07-14 à 13:00

puis on a le loisir de choisir une autre table ou de taper 0 pour arrêter le programme !

2 variables , un minimum de lignes difficile de faire plus minimaliste et moins gourmand en mémoire !

Posté par
Razes
re : langage c 16-07-14 à 13:13

@jeveuxbientaider
Pour la boucle, vaut mieux utiliser l'instruction:
FAIRE
   .....
TANT-QUE

Qui ne figure pas dans Algobox.


Pourrais-tu tester le bout de programme, car je n'ai pas de compilateur. Merci

#include <stdio.h>
#include <conio.h>

main( )
{
  int Nombre, Produit , i, Imax, Choix;
  Imax = 10;
  do {
     /*clrscr() ;*/
     printf( " Donnez un entier dont vous voulez afficher la table " ) ;
     scanf( "%d" , &Nombre) ;
     printf("Table de multiplication du nombre %d\n", Nombre) ;
     for ( i = 1 ; i <= Imax; i = i + 1 ) {
         Produit = Nombre * i;
         printf("%d * %d = %d\n", Nombre, i, Produit);
     }; /* Fin boucle FOR de multiplication*/
     printf("Tapez ‘Q' ou ‘q' pour quitter ou une autre touche pour continuer.\n" ) ;
     Choix = getchar();
  } while (Choix !='Q' && Choix !='q'); /* Fin Boucle DO-WHILE*/
  return(0);
}

Posté par
jeveuxbientaider
re : langage c 16-07-14 à 13:36

Il me semble que l'algo que j'ai donné utilise les boucles

Pour ....
Fin pour

et

Tant que ....
Fin de Tant que ....

Je ne comprends pas ta question !  

Et je n'ai pas téléchargé de compilateur de langage C alors je ne peux pas te dire ! ...

Il était demandé un algo ... pas un programme en C  :

Citation :
Ecrire un algorithme appelé Table qui permet d'afficher la table de multiplication d'un nombre entier supérieur ou égal à 1 donné par l'utilisateur.
L'utilisateur doit pouvoir recommencer plusieurs fois s'il le désire.


Mon algo ne teste pas que n est bien un entier  et > 1 .... il est donc améliorable !

Posté par
Razes
re : langage c 16-07-14 à 14:15

@jeveuxbientaider
Effectivement l'algo utilise bien sûr la boucle TANT-QUE ...FAIRE et je trouve algobox bien et didactique, mais semble limité en fonctionnalité car pour cet exemple, je préfère utiliser la boucle FAIRE ... TANT-QUE car le test se fait en fin de boucle alors que pour TANT-QUE ...FAIRE, le test se fait en début de boucle.

La programmation en c offre plusieurs types de boucles

Boucle while correspond à

Tant que CONDITION FAIRE
     ....
FIN TANT QUE




Boucle  [i]do{ ... }while( ... );[/i] correspond à

FAIRE      
      ....
TANT QUE CONDITION




Si j'ai écris un programme, c'est parce que smir en a écrit un avec des erreurs, donc je suppose qu'il a un algorithme et qu'il est passé au stade programmation.

En ce qui concerne la longueur du programme, je préfère documenter le programme de façon qu'il soit didactique et compréhensible par autrui. Car il y a des programmeurs qui trouvent des difficultés à relire leur propre programme car il n'est pas documenté.

En ce qui concerne ton algorithme, il est très bien et tu peux constater qu'il calque sur le programme (car moi aussi j'ai fait un algorithme basé sur les fonctionnalité qu'offre le langage C.

Faisons avancer le Schmilblick

Posté par
jeveuxbientaider
re : langage c 16-07-14 à 14:38

Pour moi, écrire un programme sans avoir fait un algo (documenté ou pas) est une aberration ! Comme taper un calcul sur sa calculatrice sans l'avoir formulé de façon précise sur son brouillon ! On voit combien de collégiens se jeter sur leur calculatrice pour obtenir un résultat ! Et quand on leur demande de rédiger sur papier le calcul qu'ils font faire , 9 fois sur 10 c'est un calcul qui va arriver à une réponse fausse !

Posté par
jeveuxbientaider
re : langage c 16-07-14 à 14:40

Au fait : un programme calque un algo .... pas le contraire !

Posté par
lafol Moderateur
re : langage c 16-07-14 à 14:46

Bonjour

si je peux me permettre de chicaner

pour moi une table de multiplication n'est pas une succession de multiples

j'aurais préféré un affichage de la forme

Citation :
3\times 1 = 3
 \\ 3\times 2 = 6
 \\ \vdots
 \\ 3\times 10 = 30


ça ne doit pas être beaucoup plus compliqué (mais aucune idée de la syntaxe en C pour y arriver)

et je suis tout à fait d'accord avec jeveuxbientaider sur ce point : c'est un peu ridicule de passer à la traduction en langage quel qu'il soit un algorithme qui ne marche pas

si on n'a pas algobox, on fait à l'ancienne : un papier, un crayon, et on note à chaque ligne l'état des variables après chaque ligne de programme, pour quelques valeurs des paramètres demandés à l'utilisateur.
tant qu'on n'obtient pas ce qui est demandé, ça ne sert à rien de le coder.

Posté par
jeveuxbientaider
re : langage c 16-07-14 à 14:55

Modifiaction de la boucle Pour .... Fin Pour :



langage c

Posté par
jeveuxbientaider
re : langage c 16-07-14 à 14:56

Donne

langage c

Posté par
lafol Moderateur
re : langage c 16-07-14 à 14:56

ah ! ça me rappelle les cahiers de brouillons de quand j'étais à l'école primaire

Posté par
jeveuxbientaider
re : langage c 16-07-14 à 14:56

C'est tout aussi possible en C ...

Posté par
jeveuxbientaider
re : langage c 16-07-14 à 14:58

La page 4 de couverture des cahiers de brouillons ! j'en ai gardé pour faire des photocopies pour que les gamins que j'aide puissent faire un effort de mémoire !

Posté par
lafol Moderateur
re : langage c 16-07-14 à 15:02

j'ai toujours mes "cahiers mensuels" de l'école primaire .... certains problèmes de calcul qu'on nous donnait à faire au CE2 donneraient des cheveux blancs à bien des collégiens (et peut-être même à certains de nos récents bacheliers avec "menssion", comme ils sont allés s'en vanter sur twitter ...)

Posté par
jeveuxbientaider
re : langage c 16-07-14 à 15:07

On ne va pas faire du HS ... mais cet affichage est possible dans tous les langages, il suffit juste de traduire correctement l'algorithme !  

Posté par
smir
re : langage c 16-07-14 à 17:21

Bonjour, Razes le programme marche bien. Mais si on me demande d'entrer un nombre si je met 0 il m'affiche la table de multiplication de 0. Or l'énoncé précise ceci:la table de    multiplication d'un nombre entier supérieur ou égal à 1 donné par l'utilisateur

Posté par
lafol Moderateur
re : langage c 16-07-14 à 17:25

jeveuxbientaider t'a proposé un algo qui demande de taper 0 (et pas O) pour arrêter ...

Posté par
jeveuxbientaider
re : langage c 16-07-14 à 17:28

Dans un algo , on commencerait par faire un test sur la validité de ce sui et saisi ... un entier , > 1  (si n >1 et partie entère de n = n ...)  

Avec mon algo , si on saisit 0 au début , il s'arrête tout de suite puisqu'il commence par tant que n 0

Posté par
jeveuxbientaider
re : langage c 16-07-14 à 18:31

Avec mon algo , si on saisit 0 à la première demande alors, on ne rentre pas pas dans la boucle Tant que ... donc le programme s'arrête !

Pour vérifier que le nombre n saisi est bien un entier supérieur à 1

Il faudrait vérifier que n > 1 et que la partie entière de n soit égale à n  .... Je te laisse le soin de placer ces tests dans mon algo !

Posté par
jeveuxbientaider
re : langage c 16-07-14 à 18:33

Commencer par un programme sans avoir fait un algo ne mène à rien !

CQFD

Posté par
Razes
re : langage c 16-07-14 à 19:09

I y a du monde!!

Je n'ai jamais dit que je n'ai pas écrit l'algorithme, car le b.a.-ba dela programmation et c'est de mon algorithme que j'ai ces quelques lignes de programme

@smir
Si tu veux limiter la saisie, remplace la ligne scanf avec ce qui suit:
scanf("%n%*[1-10]", &Nombre);

Posté par
Razes
re : langage c 16-07-14 à 19:10

I y a du monde!!

Je n'ai jamais dit que je n'ai pas écrit l'algorithme, car c'est le b.a.-ba de la programmation et c'est de mon algorithme que j'ai écris ces quelques lignes de programme

@smir
Si tu veux limiter la saisie, remplace la ligne scanf avec ce qui suit:
scanf("%n%*[1-10]", &Nombre);

Posté par
Razes
re : langage c 16-07-14 à 19:26

@smir
Peux tu poster le résultat de l'exécution? Merci

Posté par
jeveuxbientaider
re : langage c 16-07-14 à 19:35

Moi y'en avoir déjà dit : moi y'en pas avoir de compilateur de C ... Toi te débrouiller à faire la bonne traduction de mon algo !

je n'ai jamais programmé en C et je ne sais pas où il faut mettre les bon trucs au bon endroit !

Ce que tu as faire, c'est juste de la traduction mot à mot pas trop difficile.

Je ne te demande pas de conjuguer en espagnol le verbe faire à l'imparfait du subjonctif !

Posté par
smir
re : langage c 16-07-14 à 23:55

Voici le résultat de l'exécution avec chiffre 0

langage c

Posté par
jeveuxbientaider
re : langage c 17-07-14 à 00:11

Bin tu as la table de multiplication de 0 .... supper ! Elle est jute !

Posté par
Razes
re : langage c 17-07-14 à 00:29

@jeveuxbientaider
Désolé de t'avoir demandé quoi que ce soit, je pensais que ce site constitue un endroit d'échange et de propositions afin d'aider ceux qui en ont besoin et pas un endroit où on essais d'imposer coute que coute sa vision.

Je t'avais dis sincèrement que ton algorithme était très bon, mais ceci ne diminue pas pour autant la qualité du mien et je ne suis pas intéressé par l'utilisation du tien. On peut avoir des divergences, des idées différentes et c'est là la richesse en confrontant les points de vues.

Dans mon algorithme, j'avais utilisé la boucle FAIRE ou REPETER ... TANT-QUE qui ne figure pas sur le site algobox, comme je l'avais posté à 14h15, au lieu de la boucle TANT-QUE ... FAIRE. La différence est la suivante.

Tu n'a jamais programmé en C. Avec ma modeste expérience (C, C++, BASIC, FORMS, DBASE, DBVISTA, PASCAL, FORTRAN, SMALLTALK, ADA, LISP, PROLOG, VISUAL BASIC, COBOL, ...) sur différents systèmes (VAX, UNIX, DOS et WINDOWS) je pense que j'ai une raison de défendre mon opinion sans minimiser la tienne.

langage c

langage c

Posté par
Razes
re : langage c 17-07-14 à 00:32

As tu modifié le scanf comme indiqué dans mon message de 19h10?

Posté par
jeveuxbientaider
re : langage c 17-07-14 à 00:46

Je t'ai juste répondu que je ne connaissais rien à la syntaxe de C , je ne sais pas où il faut mettre des { ou des } ou des , ou des ; ou d'autre trucs.

Si ton programme suit cet algo, il devrait répondre à tes questions ! Je n'ai rien jugé ni critiqué .... Même s'il semble que cet algo sort d'un site dont tu ne serais pas l'auteur ..... Mais bon ... bénéfice du doute ou de présomption d'innocence .... on est en démocratie !  

Posté par
jeveuxbientaider
re : langage c 17-07-14 à 01:04

Cet algo trouvé, quelque part sur le web, ne correspond pas vraiment  à ta question : donner les tables de multiplication d'un nombre n saisi qui soit un entier supérieur à 1 ....

Alors à toi de modifier l'algo pour y répondre .... A plus quand tu auras réfléchi !

Posté par
Razes
re : langage c 17-07-14 à 01:06

Mais vraiment, ce n'est pas possible.

C'est petit de dire cela. Affiche le lien alors.

langage c

Posté par
Razes
re : langage c 17-07-14 à 01:08

Si tu n'affiche pas le lien, présente tes excuses les plus plates.

Posté par
jeveuxbientaider
re : langage c 17-07-14 à 01:18

Jouer à la carte au trésor n'est plus de mon âge ...

La boucle Répéter .... je n'en ai jamais entendu parler ! depuis 50 ans que je suis dedans !  ....

C'est juste une autre façon d'écrire une boucle Tant que ....

Quelle que soit la forme .... il faut se demander ce qu'on obtient à la sortie de la boucle ...

Posté par
smir
re : langage c 17-07-14 à 01:19

Merci à vous deux, en tous cas moi j'ai bien bénéficié de vos différentes interventions.Et c'est ça l'objectif du site c'est de nous aider à avoir plusieurs méthodes et d'en choisir celles que nous sentons plus à l'aise.

Je reviens à Razes  j'ai bien modifié le scanf comme indiqué dans ton message de 19h10? mais j'obtiens toujours le même résultat

Posté par
Razes
re : langage c 17-07-14 à 01:21

@smir

Voici le programme rectifié pour éliminer le 0 et restreindre l'intervalle à [1,10]

#include <stdio.h>
#include <conio.h>

main( )
{
  int Nombre, Produit , i, Imax, Choix;
  Imax = 10;
  do {
     /*clrscr() ;*/
     printf( " Donnez un entier dont vous voulez afficher la table " ) ;
     do {
        scanf( "%d" , &Nombre) ;
     } while ( Nombre<1 || Nombre >10) ;  /* Fin Boucle DO-WHILE*/

     printf("Table de multiplication du nombre %d\n", Nombre) ;
     for ( i = 1 ; i <= Imax; i = i + 1 ) {
         Produit = Nombre * i;
         printf("%d * %d = %d\n", Nombre, i, Produit);
     }; /* Fin boucle FOR de multiplication*/
     printf("Tapez \'Q\' ou \'q\' pour quitter ou une autre touche pour continuer.\n" ) ;
     Choix = getchar();
  } while (Choix != 'Q' && Choix != 'q'); /* Fin Boucle DO-WHILE*/
  return(0);
}

Posté par
jeveuxbientaider
re : langage c 17-07-14 à 01:29

Et si l'utilisateur saisit 23,45 ou -67,89 que se passe-t-il ?

Posté par
Razes
re : langage c 17-07-14 à 01:37

Citation en gras.

"Jouer à la carte au trésor n'est plus de mon âge ..." tu te dégonfle, présente alors tes excuses.

La boucle Répéter .... je n'en ai jamais entendu parler ! depuis 50 ans que je suis dedans !  ....
C'est juste une autre façon d'écrire une boucle Tant que ....
Dans ce cas il te reste beaucoup à apprendre et pour t'aider voici quelques liens intéressants:
  http://www.developpez.net/forums/d831846/autres-langages/algorithmes/c-quoi-difference-entre-tant-repeter-tant/
  http://perso.limsi.fr/cecile/Enseignement/coursAlgo_V1.pdf
  http://davsi.free.fr/algorithme.pdf
  http://informatique.unidentified-one.net/documents/enseignantinfo/Ch.3_Les_structures_repetitives.pdf 

Quelle que soit la forme .... il faut se demander ce qu'on obtient à la sortie de la boucle ... l'algorithme est afficher, tu peux le faire tourner à la main.

J'ai du respect pour les gens âgés, un peu comme moi, mais je n'ai pas de pitié pour la diffamation gratuite.

Posté par
Razes
re : langage c 17-07-14 à 01:39

Nombre est un integer donc c'est un nombre entier.

Posté par
smir
re : langage c 17-07-14 à 07:35

Merci Razes, maintenant le programme fonctionne parfaitement

Posté par
jeveuxbientaider
re : langage c 18-07-14 à 22:04

C'est juste la suite de l'image postée avec Comparaison de boucles ... qui m'a fait douté ...

C'est vrai que je connais la boucle Répéter ... tant que ...

Mais comme je n'aime pas l'utiliser, je l'avais rayé de mes connaissances  ! Pourquoi rentrer au moins une fois dans une boucle  quand on peut faire autrement ! Chacun a le droit de ses favoris !

Posté par
Razes
re : langage c 19-07-14 à 00:13

@jeveuxbientaider
Bonsoir, la comparaison des boucles avec test avant ou test après existent partout et d'ailleurs, je t'ai envoyé des liens dont celui où la comparaison citée apparait clairement.

En algorithmique, il faut connaitre les deux. Parfois on est obligé de faire un traitement des données avant de les tester (Dans ce cas on utilise test après càd FAIRE...TANT-QUE) et parfois on teste les données avant de les traiter (Dans ce cas on utilise test avant càd TANT-QUE...FAIRE)

Pour moi, ce n'est pas question de favoris mais plutôt question de situation. Ils sont dans tous les langages:
Langage Pascal : http://pascal.developpez.com/cours/ptrau/?page=page_8

En ce qui concerne l'algorithme, c'est moi qui l'ai fait avec ses imperfections.



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !