Tableaux

Fermé
johan - 19 nov. 2005 à 15:43
 johan - 21 nov. 2005 à 22:18
bonjour à tous , dans ce code :

nl=0
while ( ( a = getchar() ) != EOF ) {
if ( a == ' ' || a == '\n' || a == '\t' )
nl=0
else
nl++;
nlettre[nl]++;
}

le nlettre[nl]++ , çà veut dire que on incrémente la case du tableau qui a pour valeur , la valeur de la variable nl , c'est çà?
merci

20 réponses

Jamel_AlBatal
19 nov. 2005 à 19:29
Salut

C'est tout a fait ca, mais en d'autres termes on pourrait tout simplement dire que "nlettre[nl]++" comptabilise (ici en incrémentant) le nombre de lettres contenues dans la ligne numero "nl"

Humm je sais pas si c'est plus clair, mais en tout cas t'avais raison ;-)
0
d'accord , bon maintenant j'ai un petit soucis d'affichage , mon programme doit afficher ceci :

1: ___
2:__
3:__________
4:______
5:__
6:_________
7:______
8:_______
9:___
10 :_________

tu vois , c'est un histogramme , le caractère '_' est utilisé pour dessiner l'histogramme , et la taille de la barre correspond au nombre de fois ou un mot de 1 lettre est présent , ou un mot de 2 lettres est présent..., donc je dois utiliser printf ici , mais coment faire pour afficher tout ceci...
0
scol30
Messages postés
22
Date d'inscription
samedi 19 novembre 2005
Statut
Membre
Dernière intervention
2 décembre 2005

19 nov. 2005 à 21:43
pour faire un printf tu as seulement besoin de faire un while sur chaque valeur du tableau et de faire
printf("_");


Quelque chose comme ça
int i =0;
int val = tab[0];

while(i!=INDEXMAXTAB) {
  printf("_");
  val--;
  if(val==0) {
    printf("\n"); 
    i++;
    val = tab[i];
  }
}


C'est probablement pas le plus beau code mais ca marche plutôt bien je crois.

Stef
0
je n'ai jamais vu INDEXMAXTAB , j'ai pas le droit de l'utiliser , j'ai juste printf et je ne comprends pas bien la démarche , c'est gentil de m'aider , mais je préfèrerai des indices que du code tout fait , sinon je progresse pas...
0
scol30
Messages postés
22
Date d'inscription
samedi 19 novembre 2005
Statut
Membre
Dernière intervention
2 décembre 2005

19 nov. 2005 à 22:27
La variable INDEXMAXTAB indiquait juste la valeur max du nombre d'élément que tu as dans ton tableau.
tab[40] ici 40

Pour la démarche:
ton but et de faire printf autant de fois que les int pointés par tab[i]

val = tab[0]; ici tu réccupères la valeur à tab[0]

tant que tu n'as pas atteinds le dernier index de ton tableau
printf _
val -- ; tu décrémentes val
si tu a val == 0 tu sais que tu as printé toutes les valeurs de tab[i], tu dois donc aller à la ligne et printer les valeurs de l'index suivant.

aller à la ligne
incrémenter index tableau


Voila,
Dis moi si tu veux + d'explications,

Stef
0

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

Posez votre question
je ne comprends vraiment pas , le but de l'exo c'est de faire un programme qui affiche la longueur des mots reçu en entrée , donc à l'écran je dois avoir çà comme résultat :

1: __
2:_____
3:___
4:____
5:_____
6:___
7:

çà veut dire qu'il y a 2 mots de 1 caractère , 5 mots de 2 caractères , 3 mots de 3 caractères , 4 mots de 4 caractères5 mots de 5 caractères , 3 mots de 6 caractères , et 0 mots de 7 .

est ce que si je fais çà çà peut marcher :

printf("1:\n"; nl * _ );

je crois pas , car le n * _ , çà veut pas dire nl * longueur de _ , puis je vais devoir me taper 7 écriture de printf .
0
scol30
Messages postés
22
Date d'inscription
samedi 19 novembre 2005
Statut
Membre
Dernière intervention
2 décembre 2005

19 nov. 2005 à 23:04
de toute façon tu n'as pas d'autres choix que d'afficher le nombre de _ que tu retrouves dans ton tableau.
Le printf te permet juste de faire l'affichage d'une donnée dans un format précis.

Donc tu dois utiliser un itérateur qui va te permettre de balayer tous les éléments de ton tableau et d'afficher pour chacun d'eux _.

Pour cela tu as plusieurs possibiolités, boucle for, while et surement beaucoup d'autres.

Stef
0
alors en français mon algorithme donne donc :

tant que je ne suis pas arrivé à la valeur 7 de mon tableau , j'affiche '_'

mais comment faire pour que 1 corresponde à _ , que 2 corresponde à __ , que 3 à ___ , bref comment multiplier à longueur du _ en fonction de la taille de la variable dans le tableau...
0
je pense après avoir relu tes messages avoir compris l'algo , mais ce que je ne comprends vraiment pas c'est comment le _ sera multiplié en fonction de la taille de la variable du tableau , si à la case 1 du tableau j'ai nl qui vaut 3 , comment afficher ___ au lieu de _ ?
0
scol30
Messages postés
22
Date d'inscription
samedi 19 novembre 2005
Statut
Membre
Dernière intervention
2 décembre 2005

20 nov. 2005 à 18:59
Ce que je te conseille c'est de prendre l'exemple suivant et de l'écrire entièrement en écrivant tout se qui se passe a chaque étapes.
Prenons l'exemple suivant qui résulte de ton traitement de la chaine de caractère:
tab[3] = {2, 3, 4}
cela donne
tab[0] = 2
tab[1] = 3
tab[2] = 4

avant la boucle while tu mémorises tab[0] dans val. Ta boucle while elle se terminera quand tu auras balayé tous les index de ton tableau, dans notre cas 3.

1ere itération
print _
val-- = 1
test if false
test while false
print _
val-- = 0
test if true => incrémente index tab et val =tab[1) = 3
aller à la ligne

A la fin de cette itération tu a bien afficher
__

Maintenant tu es à la ligne suivante le test du while est false donc tu recommence la même méthode sauf que maintenant val = tab[1] = 3

Voila
Stef
0
j'ai pas le droit d'utiliser les mots false .... , j'ai uniquement droit à printf c'est tout , rien d'autre ( hormis les boucles ... ) .

Donc moi je veux que quelquechose ( je sais meme pas ce que c'est ) , parcours mon tableau , mon tableau fait 10 cases , il se nomme int nlettre[10] , donc je dois nommer une variable qui parcours le tableau? ok , je la nomme i , int i;

int i;

ensuite j'affiche le caractère _ , ( je vois vraiment pas pq )

printf("_")

comment coder en C une variable qui parcourt , ensuite comment dire en C par exemple :

i est à la case 1 , i lit la valeur de la variable dans la case 1 , et printf affiche cette valeur sous forme de barre multipliée par la valeur , putin là je nage complètement , stp essaye d'employer un minimum de mots car je débute vraiment et je commence franchement à m'énerver sur cet exercice car je croyais avoir compris mais je nage encore plus .
Merci de ta patience :-(
0
que penses tu de ce code ( je galère avec les { } :

for ( int j = 0; j < 10; j++)
{
printf("%d :", j);
for ( int i=0; i<nlettre[j]; i++)
{
printf("_");
}
}

ya un soucis dans les { à en regarder l'affichage sous emacs...

ici i et j sont des variables justes utilisées par la boucle , donc je ne les ai pas déclaré au départ .
0
scol30
Messages postés
22
Date d'inscription
samedi 19 novembre 2005
Statut
Membre
Dernière intervention
2 décembre 2005

21 nov. 2005 à 07:49
C'est une des autres facon que je comptait te presenter pour resoudre ton probleme. Ton cobde me parait plutot bien. Le seul inconvenient est que tu ne geres par le retour a la ligne quand tu as fini de traiter les index de ton tableau.

Pour cela tu as juste a ajouter
printf("\n"); au bon endroit et c'est bon.


Pour ce qui est des {, ton soucis n'est pas dans le bout de code que tu as mis.

A+
Stef
0
voici le code complet du programme qui affiche l'histogramme des longueurs des mots rencontrés en entrée , ya forcément un problème avec les { } :


#include  <stdio.h>

int main(void)

{
int a;
int nlettre[10];
int nl = 0;

while ( ( a = getchar() ) != EOF ) 
{
if ( a == ' ' || a == '\n' || a == '\t' )
nl=0
else
nl++;
nlettre[nl]++;
}


for ( int j = 0; j < 10; j++)

printf("%d :", j);

for ( int i=0; i<nlettre[j]; i++)

printf("_");

return 0;



il manque forcément des { } quelquepart , je ne sais pas où les placer car je n'ai jamais fait 2 boucles for à la suite , ( j'ai demandé de l'aide pour écrire ces 2 boucles mais on m'a pas trop expliqué le principe de 2 boucles for ) , ceci dit je comprends fort bien le principe de 1 boucle , while ou for , mais un for dans un for j'ai jamais vu ...
0
scol30
Messages postés
22
Date d'inscription
samedi 19 novembre 2005
Statut
Membre
Dernière intervention
2 décembre 2005

21 nov. 2005 à 14:17
Le principe des boucles for imbriquees ou non et toujours le meme. Tu dois mettre entre accolades le code correspondant a toutes las actions qui doivent etre accomplies dans ta/tes boucles. Il est dit que si 1 seule action doit etre effectuee il n'y a pas besoin d'accolade neanmoins les mettre te permet d'etre sur de ne rien oublier

Dans ton cas:
for ( int j = 0; j < 10; j++) {
  printf("%d :", j);

  for ( int i=0; i<nlettre[j]; i++) {
    printf("_");
  }
}


Penses par contre a ajouter un printf("\n"); dans ton code pour aller a la ligne.

Stef
0
#include  <stdio.h>

int main(void)

{
int a;
int nlettre[10];
int nl = 0;

while ( ( a = getchar() ) != EOF ) 
{
if ( a == ' ' || a == '\n' || a == '\t' )
nl=0
else
nl++;
nlettre[nl]++;
}


for ( int j = 0; j < 10; j++)
{
printf("%d :", j);

for ( int i=0; i<nlettre[j]; i++)
{
printf("_");
}
}
return 0;
}

return 0;


j'ai bien fait ce que tu m'as dit pour les accolades , et à la copilation j'ai ceci :

ligne 21 : 'for' loop initial declaration used outside C99 mode
ligne 24: 'for' loop initial declaration used outside C99 mode

je savais bien qu'il y allait avoir une erreur car mon code dans emacs n'est pas bien aligné dans les boucles for :-)
0
scol30
Messages postés
22
Date d'inscription
samedi 19 novembre 2005
Statut
Membre
Dernière intervention
2 décembre 2005

21 nov. 2005 à 20:29
Ton problème de compilo vient du fait qu'en C tu ne peut pas déclarer la variable de boucle for dans la déclaration du for. Donc

int i;
for(i=0;i <... ; i++)

De plus attention car dans ton dernier code tu as un return 0; à la fin qui risque de poser problème à la compil.

Voila,
Stef
0
oh la la , mdr on va jamais yarriver , ave ce code ( bon ) :

#include  <stdio.h>

int main(void)

{
int a;
int nlettre[10];
int nl = 0;

while ( ( a = getchar() ) != EOF ) 
{
if ( a == ' ' || a == '\n' || a == '\t' )
nl=0
else
nl++;
nlettre[nl]++;
}

int j;
for ( j = 0; j < 10; j++)
{
printf("%d :", j);
int i;
for (  i=0; i<nlettre[j]; i++)
{
printf("_");
}
}
return 0;
}



avec çà j'obtiens un défilement de _ _ _ _ _ _ _ _ qui ne s'arrête jamais :-)
0
scol30
Messages postés
22
Date d'inscription
samedi 19 novembre 2005
Statut
Membre
Dernière intervention
2 décembre 2005

21 nov. 2005 à 21:40
premier conseil, initialises ton tableau car par défaut les valeur associées aux index de ton tableau peuvent êre très importante.
for  ( j = 0; j < 10; j++) {
    nlettre[j]=0;
  }

ensuite c'est bon je crois. Voila tout le code reformaté chez moi qui fonctionne
#include  <stdio.h>

int main(void) {
  int a, i, j;;
  int nlettre[10];
  int nl = 0;


  for  ( j = 0; j < 10; j++) {
    nlettre[j]=0;
  }
  while ( ( a = getchar() ) != EOF) {
    if ( a == ' ' || a == '\n' || a == '\t' )
      nl=0;
    else
      nl++;
    nlettre[nl]++;
  }

  for ( j = 0; j < 10; j++) {
    printf("%d :", j);
    for (  i=0; i<nlettre[j]; i++) {
      printf("_");
    }
  }
  return 0;
}
0
scol30
Messages postés
22
Date d'inscription
samedi 19 novembre 2005
Statut
Membre
Dernière intervention
2 décembre 2005

21 nov. 2005 à 22:14
Je viens de reprendre le code car il y avait quelques petits soucis avec la prise de la phrase en utilisant getchar (chez moi j'utilisais un tableau char tab[]. Voila ce que ça donne:
#include  <stdio.h>

int main(void) {
  int a;
  int nlettre[10];
  int pl =0, nl = 0;
  int  i, j, k;
  char tc[80];

  for  ( j = 0; j < 10; j++) {
    nlettre[j]=0;
  }
  a = getchar();
  while ( a != '\n' ) {
    tc[k]=a;
    if (  tc[k] == ' ' ||  tc[k] == '\n' ||  tc[k] == '\t' )
      nl=0;
    else
      pl = ++nl;
    if(nl == 0)
      nlettre[pl]++;
    k++;
    a=getchar();
  }
  nlettre[pl]++;

  for ( j = 0; j < 10; j++) {
    printf("%d :", j);
    for (  i=0; i<nlettre[j]; i++) {
      printf("_");
    }
    printf("\n");
  }
  return 0;
}


Je l'ai testé en écrivant la phrase suivante:
je suis a ecole dans un pré avec des oiseaux

résultat:
0 :
1 :_
2 :__
3 :__
4 :___
5 :_
6 :
7 :_
8 :
9 :


Voila,
Stef
0
je te remercie vraiment pour toute ton aide et ta patience , mais j'abandonne le C , j'en ai marre , tu as vu tu as rajouté pleins de variables , tu as carrément changé la condition dans le while , je ne comprends stri ctement plus rien , merci pour tout encore .
0