Rechercher : dans
Par :

Tableaux

Dernière réponse le 21 nov 2005 à 22:18:30 johan, le 19 nov 2005 à 15:43:21 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « tableaux » dans :
Tableaux HTML Voir Utilisation de tableaux Il est souvent utile de présenter des informations mieux structurées qu'avec des listes. Les tableaux permettent de les afficher en lignes et en colonnes. Les tableaux sont définis comme étant des suites de lignes. Un...
SQL - Modification de table Voir Modification de table Il est possible de supprimer une table grâce à la clause DROP, il existe aussi des commandes moins extrêmes permettant L'ajout de colonnes La modification de colonnes La suppression de colonnes Enfin, il est possible...
SQL - Création de table Voir Le SQL, comportant un langage de définition de données (LDD), permet de créer des tables. Pour cela, il utilise le couple de mots clés CREATE TABLE. La création de tables Le création de tables se fait à l'aide du couple de mots-clés CREATE...
Manipulations élémentaires des tableaux sous MatLab VoirSommaire I. Stockage des tableaux II. L'indexation linéaire II.1. Accéder à un élément d'un tableau en utilisant l'indexation linéaire II.2. Passer d'une indexation à l'autre II.2.1. La fonction ind2sub II.2.2. La fonction sub2ind III. La...
Inverser les éléments d'un tableau -Récursivité- VoirVoici une procédure récursive qui permet d’inverser les éléments d’une partie d’un tableau compris entre la position p et n : Procedure Inverser (Var t : Tab; p, n : Integer); Var aux : Real; Begin If p < n Then ...
Trier un tableau sans utiliser la fonction sort VoirTrier un tableau sans utiliser la fonction sort D'abord on initialise une variable $max avec la 1ère valeur de tableau. Ensuite on va faire une boucle tant que le tableau contient encore des éléments. C'est avec la fonction splice qui a le rôle...
Télécharger Tables multimédia VoirEn général les enfants ont tendance à ne pas vouloir étudier et les parents perdent parfois patience à leur apprendre. Peut-être qu’il est temps d’essayer quelque chose de plus pratique avec plus résultats. Tables multimédia donne la possibilité...
Javascript - Les tableaux VoirIntroduction à la notion de tableau Les variables de Javascript ne permettent de stocker qu'une seule donnée à la fois. Or, étant donné qu'il est souvent utile de manipuler de nombreuses données, le concept de variable se révéle parfois...
Tableau de bord VoirNotion de tableau de bord Un tableau de bord est une représentation graphique synthétique d'un ensemble d'indicateurs donnant à un responsable tous les éléments lui permettant de prendre visuellement et rapidement des décisions. Compte-tenu de sa...
LaTeX - Gestion des tableaux VoirCréation de tableaux Les tableaux permettent une meilleure structuration du document, ce qui rend le document plus compréhensible et plus lisible. LaTeX fournit un environement pour créer des tableaux de façon simple : tabular. Un tableau se...

1

Jamel_AlBatal, le 19 nov 2005 à 19:29:40

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 ;-)

Répondre à Jamel_AlBatal

2

johan, le 19 nov 2005 à 20:51:10

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...

Répondre à johan

3

scol30, le 19 nov 2005 à 21:43:03

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

Répondre à scol30

4

johan, le 19 nov 2005 à 21:55:15

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...

Répondre à johan

5

scol30, le 19 nov 2005 à 22:27:52

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

Répondre à scol30

6

johan, le 19 nov 2005 à 22:36:07

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 .

Répondre à johan

7

scol30, le 19 nov 2005 à 23:04:01

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

Répondre à scol30

8

johan, le 19 nov 2005 à 23:11:18

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...

Répondre à johan

9

johan, le 20 nov 2005 à 12:56:39

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 _ ?

Répondre à johan

10

scol30, le 20 nov 2005 à 18:59:56

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

Répondre à scol30

11

johan, le 20 nov 2005 à 19:41:53

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 :-(

Répondre à johan

12

johan, le 20 nov 2005 à 23:35:34

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 .

Répondre à johan

13

scol30, le 21 nov 2005 à 07:49:29

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

Répondre à scol30

14

johan, le 21 nov 2005 à 13:53:53

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 ...

Répondre à johan

15

scol30, le 21 nov 2005 à 14:17:56

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

Répondre à scol30

16

johan, le 21 nov 2005 à 16:35:58

#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 :-)

Répondre à johan

17

scol30, le 21 nov 2005 à 20:29:04

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

Répondre à scol30

18

johan, le 21 nov 2005 à 21:15:02

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 :-)

Répondre à johan

19

scol30, le 21 nov 2005 à 21:40:14

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;
}

Répondre à scol30

20

scol30, le 21 nov 2005 à 22:14:05

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

Répondre à scol30
Collection CommentÇaMarche.net