Table de multiplication [Résolu/Fermé]

Signaler
Messages postés
9
Date d'inscription
samedi 15 novembre 2014
Statut
Membre
Dernière intervention
5 janvier 2015
-
Messages postés
609
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
24 juin 2016
-
bonsoir tout le monde je suis débutante en C j'ai écrit un programme qui affiche la table de multiplication de 6 7 8 9 avec la mise en forme suivante:
I 1 2 3 4 5 6 7 8 9 10
------------------------------------------
6 I 6 12 18 24 30 36 42 48 54 60
7 I 7 14 21 28 35 42 49 56 63 70
8 I 8 16 24 32 40 48 56 64 72 80
9 I 9 18 27 36 45 54 63 72 81 90
voilà le programme je sais pas ou se trouve le problème :
#include <stdio.h>
#include <stdlib.h>

int main()
{
int i,j;
char I;
printf(" I 1 2 3 4 5 6 7 8 9 10");
printf("--------------------------------");

printf("6789");
printf("IIII");

for(i=1; i<=10;i++)

{for(j=6; j<=9; j++)

{printf("%d%d",i*j);}

}

return 0;
}
et merci d'avance.

4 réponses

Messages postés
408
Date d'inscription
jeudi 26 septembre 2013
Statut
Membre
Dernière intervention
28 mai 2018
286
Coucou jeune aventurière !
Je pense que tu devrais d'abord commencer par l'algo puis ensuite faire le programme en c.

Exemple ALGO
Programme Multiplication

var:
	entier i <- 1
	entier j <- 6
	entier k <- 1
	entier l <- 1

debut
	Afficher ("I 1 2 3 4 5 6 7 8 9 10\n")
	Afficher ("--------------------------------\n")
	Tant que (j <= 9) faire
		Tant que (i <= 10) faire
			si (l <> 2) alors
				Afficher ("{}  ", j)
				incr l
			finsi
			k <- j*i
			Afficher ("{} ", k)
			incr i
		Fintantque
		Afficher ("\n")
		i <- 1
		l <- 1
		incr j
	Fintantque

fin


Puis ensuite, une fois que celà te semble correct, code le en langage c


int main ( int argc, char *argv[] )
{
	long i = 1 ;
	long j = 6 ;
	long k = 1 ;
	long l = 1 ;
 
	printf ( "I 1 2 3 4 5 6 7 8 9 10\n" ) ; 
	printf ( "--------------------------------\n" ) ; 
	while ( j <= 9 ) 
	{
		while ( i <= 10 ) 
		{
			if ( l != 2 ) 
			{
				printf ( "%d  " , j ) ; 
				l++ ;
			}
			k = j * i ;
			printf ( "%d " , k ) ; 
			i++ ;
		}
		printf ( "\n" ) ; 
		i = 1 ;
		l = 1 ;
		j++ ;
	}
 

	pause ( ) ;

	return 1 ;
 }


Voilà, si tu as des question, n'hésites pas !
Messages postés
9
Date d'inscription
samedi 15 novembre 2014
Statut
Membre
Dernière intervention
5 janvier 2015

a quoi sert main ( int argc, char *argv[] ) et quelle différence avec main()?
Messages postés
408
Date d'inscription
jeudi 26 septembre 2013
Statut
Membre
Dernière intervention
28 mai 2018
286
C'est pour plus tard (récupérer des valeurs et autre) ! Tu peux utiliser juste main() pour l'instant ! :)
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 756
Dans ce genre de code, il vaut mieux utiliser des boucles for qui sont plus lisibles.
Sinon, au niveau du code :
printf ( "%d " , j ) ;
Si j est un long, il faut mettre %ld pour afficher
De même pour les autres printf().

return 1 ;
Plutôt return 0; pour signaler que tout s'est bien déroulé.
Messages postés
9
Date d'inscription
samedi 15 novembre 2014
Statut
Membre
Dernière intervention
5 janvier 2015

bonjour Lerendra ,
notre prof nous dit tjrs que les algorithmes ne sont pas uniques et j'ai essayé de faire la même démarche qui ma conduit au programme que j'ai postulé je l'ai corrigé et ça marche et avec votre programme aussi merci infiniment .
Messages postés
408
Date d'inscription
jeudi 26 septembre 2013
Statut
Membre
Dernière intervention
28 mai 2018
286
Alors c'est pour le coefficient multiplicateur 6 7 8 !

6 I 6 12 18 24 30 36 42 48 54 60
7 I 7 14 21 28 35 42 49 56 63 70
8 I 8 16 24 32 40 48 56 64 72 80
9 I 9 18 27 36 45 54 63 72 81 90

J'ai mis une condition pour qu'il apparaît qu'une fois !
Sinon, sa donnerait :

6 I 6 6 6 12 6 18 6 24 6 30 6 36 6 42 6 48 6 54 6 60
7 I 7 7 7 14 7 217 28 7 35 7 42 7 49 7 56 7 63 7 70
8 I 8 8 8 16 8 24 8 32 8 40 8 48 8 56 8 64 8 72 8 80
9 I 9 9 9 18 9 27 9 36 9 45 9 54 9 63 9 72 9 81 9 90

Donc :
 if ( l != 2 ) 
{ 
printf ( "%d " , j ) ; 
l++ ; 
}

Sa donne en francais :
Je donne un entier l. Pour éviter que mon 6 (multiplicateur) se répète, je me une condition en sorte qu'il apparaisse qu'une fois. Une fois la condition passé, j'augmente l'entier l avec
 l++ ;
. Du coup, l devient égale à 2, il ne va donc pas rentrer dans la condition et donc plus afficher le 6 (multiplicateur) Une fois que la boucle est fini, il ne faut pas oublier de remettre l à 1,
l = 1 ;
pour qu'il puisse revenir dans la condition est afficher le 7 (multiplicateur). Et ainsi de suite.

Voilà ! :)
Messages postés
408
Date d'inscription
jeudi 26 septembre 2013
Statut
Membre
Dernière intervention
28 mai 2018
286
Les profs sont pas très performant ! Des fois, ils ont du mal a expliquer, voir même, ils savent même pas ou il y a une erreurs. Les Bases sont EXTREMEMENT important en C. Donc si jamais tu as un doute, un truc que tu comprend, un exo.
Tu es en quoi ? BTS ?
Messages postés
9
Date d'inscription
samedi 15 novembre 2014
Statut
Membre
Dernière intervention
5 janvier 2015

oui tu as raison ,je suis en fac de sciences 2 ème année branche informatique je suis entrain d'apprendre le C
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 756
Je te conseille plutôt de rester avec ton programme d'origine et de le corriger (ça sera plus formateur de comprendre ses erreurs, que de comprendre la logique d'un autre). D'autant que je trouve la lecture de ton programme plus claire que celle de while et de la variable l...
Regarde mon post #11 et n'hésite pas à dire ce que tu ne comprends pas.
Messages postés
9
Date d'inscription
samedi 15 novembre 2014
Statut
Membre
Dernière intervention
5 janvier 2015

je suis d'accord avec vous que dans tout ce qui est informatique il ne faut rien zapper et de mieux corriger son programme que chercher la solution d'un autre merci pour le lien
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 756
Bonjour,

printf("6789");
printf("IIII");

L'erreur vient de là principalement. Tu affiches 6789 puis IIII sans aller à la ligne.
Il faut prendre l'affichage ligne par ligne. Donc, 6 I 6 12 18 ...
Etc.

Attention, tu as mélangé les boucles for i et j. Il faut d'abord traiter les lignes (donc i=6 jusqu'à i=9) puis les colonnes (j=1 jusqu'à j=10).

{printf("%d%d",i*j);}
Tu peux faire for i=0 (au lieu de i=1).
Ensuite, dans le for j=6..., tu peux faire un if (i==0), on affiche "j" puis "I" sinon i*j.
Attention, ce n'est pas %d%d qu'il faut afficher mais simplement %d (i*j donne un int, donc %d).

Note : char I;
Ca ne sert à rien.

Ce qui donnerait après plusieurs corrections :
#include <stdio.h>

int main(void) {
    int i;

    printf("   I");
    for (i=1; i<=10; i++) {
        printf(" %2d", i);
    }
    printf("\n----------------------------------\n");

    for(i=6; i<=9;i++) {
        int j;
        printf("%2d I", i);
        for(j=1; j<=10; j++) {
            printf(" %2d",i*j);
        }
        putchar('\n');
    }

    return 0;
}
Messages postés
9
Date d'inscription
samedi 15 novembre 2014
Statut
Membre
Dernière intervention
5 janvier 2015

salut fiddy je vois que mon code nécessite beaucoup de correction merci beaucoup
mais pourquoi vous avez met putchar('\n'); au lieu de printf("\n")?
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 756
putchar('\n') fait la même chose que printf("\n"); c'est juste un peu plus performant. Mais si tu connais pas, ne t'embête pas et utilise printf("\n"); ;-)
Messages postés
9
Date d'inscription
samedi 15 novembre 2014
Statut
Membre
Dernière intervention
5 janvier 2015

merci beaucoup maintenant j'ai bien compris
Messages postés
408
Date d'inscription
jeudi 26 septembre 2013
Statut
Membre
Dernière intervention
28 mai 2018
286
J'avoue que son code est mieux. J'ai toujours eut un petit recule sur les boucles for (Même si elles sont extrêmement utilisé XD) J'ai voulu simplifier au maximum, vu qu'elle débute.
Messages postés
609
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
24 juin 2016
43
Oui, je te l'accorde for pour ce genre d'exercice est un peu extrême, de plus je me demande pas si avec mon exemple "pointeur" je n'ai pas compliqué les choses, enfin juste qu'elle comprenne c'est déjà ça
Messages postés
609
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
24 juin 2016
43
Bonjour
Moi je dirais qu'il est trop lourd comme algorithme ( celui de @Lerendra ) de plus deux boucles "Tant que" suffis pour réaliser le programme.
Dont une qui parcourra un tableau contenant les multiples
et la seconde qui se charge de faire la multiplication.
En plus claire cela donnerais le codes ci-dessous comme exemple ( attention en peut mieux faire en évitant l'utilisation des pointeurs )de plus j'ai volontairement opté pour cette démo en plus et mis les variables dans un tableau de façon à ne pas modifier le bloc d'instructions finales.
Mais j'ai une préférence pour le code de @fiddy qui est mieux conçu que le mien (+1)
à bientôt
#include <stdio.h>

int main( void ){

	//Variables
	unsigned int i = 0;
	unsigned int *p = NULL;
	unsigned int iTab[] = { 1, 6, 1, 1, 2 , 1, 2, 7 };
	p = iTab;	//Alias

	//
	printf( "NB\t|\t1 \t\t2 \t\t3 \t\t4 \t\t5 \t\t6 \t\t7 \t\t8 \t\t9 \t\t10\n" );
	printf( "\n" );

	while( *p ){

		printf( "[ %d ]\t", *p );
		while( (i++) != 10 ){
			printf( "\t%d\t", (i *(*p) ) );
		}

		i = 0;
		printf("\n");
		p++;
	}

	return( 0 );
}


à bientôt