Imprimer un Histogramme basé sur des longueurs de mots (C)
C'est un K&R de l'exercice (1-13)...
"Écrire un programme pour imprimer un histogramme
de la longueur des mots dans son entrée.
Il est facile de tracer l'histogramme
barres horizontal; vertical
l'orientation est plus difficile."
La section sur les tableaux, et pour être honnête, je ne suis pas sûr de bien comprendre ce qui. Tout jusqu'à ce point a été assez facile à comprendre, ce n'était pas.
De toute façon je suis en train de faire un histogramme à barres horizontales en premier. Une fois que je suis arrivé que vers le bas, je vais essayer de la verticale, mais pour l'instant je ne suis même pas sûr où commencer avec la version simple. (J'ai dormi sur elle, se réveilla, et encore ne pouvait pas l'obtenir.)
J'ai dessiné un exemple de ce que le programme de sortie:
----------------------------------------------------------------
001|XX
002|XXXX
003|X
004|XXXXXXXXXX
005|XXXXXXXXXXXXXXXXXXXXXXXXX
006|XXXX
007|X
008|
009|XXXXXXXXX
010|XXX
>10|XXXX
----------------------------------------------------------------
Et a essayé de le casser (le programme) dans les sections. C'est ce que je suis venu avec:
- IMPRESSION DE LA BORDURE SUPÉRIEURE
- CATÉGORIE D'IMPRESSION, D'IMPRESSION X À CHAQUE FOIS QUE LA CONDITION EST VRAIE, L'IMPRESSION DE RETOUR À LA LIGNE,
RÉPÉTEZ.- IMPRESSION DE LA BORDURE INFÉRIEURE
Mais plus j'y pense, moins je pense qu'il en serait de travailler (parce que getchar()
passe par un caractère à la fois, et il ne serait pas en mesure de revenir jusqu'à mettre un X dans la bonne catégorie.) Ou...
... Je suis vraiment confus quant à comment je pourrais résoudre ce problème. Voici que j'ai été en mesure d'obtenir le code sage:
#include <stdio.h>
#define MAXWORDLENGTH 10
//print a histogram of the length of words in input. horizontal bar version
int main(void)
{
int c;
while ((c = getchar()) != EOF) {
}
return 0;
}
Quelqu'un pourrait-il aider à m'éclairer? Pas nécessairement avec le code, peut-être juste le pseudo-code, ou avec des "paroles de sagesse" à ce que je dois faire ou penser, ou quelque chose. Cela a été vraiment une grosse pierre sur la route et j'aimerais obtenir au-delà de ça :/.
(Je vais vérifier de retour dans 30 minutes)
J'aime la façon dont vous pensez! Il vous manque quelque chose, cependant. Voir ma réponse ci-dessous.
Ce genre de problème m'a rendu fou quand j'ai appris à programmer (je l'ai fait en C). La leçon, ce qui Kernighan répète souvent dans ses autres livres, est: penser en termes de données, pas de code.
OriginalL'auteur Matt2012 | 2010-10-21
Vous devez vous connecter pour publier un commentaire.
J'ai adoré le pseudo-code! Quelque bonne pensée, mais vous n'êtes pas de la commande de votre programme de droite.
Comme vous l'avez dit vous-même, vous ne pouvez pas lire le texte, revenir en arrière et imprimer un X dans une ligne particulière. Si nous établissons qu'il ne peut pas être fait, alors il n'y a pas d'autre choix que de connaître toutes les valeurs de l'histogramme à l'avance.
Donc, vous devriez penser à votre programme à l'aide de deux pièces (et vous allez faire ce genre de division dans pratiquement tous les programmes que vous écrivez): d'abord, une partie qui va faire des calculs, et puis une partie qui sera de sortie dans un format défini (l'histogramme).
Cette astuce devrait vous obtenir a commencé! Si vous avez besoin d'une assistance supplémentaire, commentaire ci-dessous.
Je suis d'accord bta. Je dois avouer que je ne m'attendais pas à tant d'informations de tout le monde (merci!), mais c'est un peu écrasante, donc je vais m'en tenir à cela pour le moment (je vais lire tout le monde finalement, si :-)) @Santiago Lezica - j'ai semi complété le code maintenant, à votre avis, comment est-il? fpaste.org/7ELL - suis-je sur la bonne voie?
Oui, vous l'êtes! Ça a l'air bon, une bonne structure. Deux choses: tout d'abord, pensez à ce que vous avez à faire lorsque l'ÉTAT de ==, et ce que vous devez lorsque les modifications de l'état à partir de début à la fin. Deuxièmement, prendre en compte le fait que votre texte pourrait ne pas terminer avec un blanc (espace, tabulation, saut de ligne) et que vous devez considérer le dernier mot de trop, quand vous trouvez les expressions du FOLKLORE.
Ah, juste remarqué, vous avez répondu :). Voici où j'en suis avec elle maintenant: fpaste.org/NRbh -- je vais prendre une pause (à remplacer certains windows), mais actuellement, je suis en utilisant des entiers et juste l'impression de le décompte des fins de test avant l'histogramme. J'ai remarqué un bug (je pense) pas de comptage le comptage correctement (c'est l'omission de mots je crois) que je vais essayer de le résoudre plus tard. Voulais juste vous montrer mes progrès!
Qui est à la recherche de bon! Dans votre version finale, je suppose que vous aurez envie d'utiliser un tableau de MAXWORDLENGTH entiers, en plus d'un autre nombre entier de mots qui dépassent la longueur. Ensuite, vous pouvez faire des mots[longueur]++ au lieu d'une, deux, etc. Aussi, vérifiez pour la 2ème boucle à l'intérieur de la 1ère: vous pensez que c'est nécessaire? Vous pouvez tout faire avec une seule boucle, la commutation entre deux états (IN/OUT).
OriginalL'auteur slezica
Je vous suggère de simplifier le problème en résolvant pour le cas d'un mot par ligne, de sorte que vous pouvez utiliser
fgets
. Voici comment "manger" les lignes trop longues.Puis, comme souvent, la structure de données est la clé pour résoudre le problème. La structure de données que vous avez besoin est un tableau utilisé comme tableau de fréquences:
Dans
freq[1]
, store le nombre de mots/lignes de longueur 1, dansfreq[2]
ceux de longueur 2, etc., et dansfreq[0]
ceux de longueur >10. Vous n'avez pas besoin de stocker les mots, car le reste du programme n'a besoin de leur longueur. L'écriture de l'histogramme doit être facile maintenant.J'espère que ce n'est pas trop de spoiler.
OriginalL'auteur Fred Foo
Le code ci-dessous affiche un histogramme horizontal en utilisant uniquement la boîte à outils de base fournis par le livre jusqu'à présent:
OriginalL'auteur edrik
ORIENTATION VERTICALE: Utilisant uniquement les outils que nous avons appris jusqu'à présent dans le livre. Et vous pouvez modifier la taille de la matrice, wc[50]. J'ai gardé le code valable pour les 50 mots.
Orientation horizontale devrait être assez simple. Je n'ai pas essayer si.
OriginalL'auteur Ketan
De l'histogramme des longueurs de mots, vous allez avoir besoin de connaître les longueurs de mots.
strtok
ou quelque chose de similaire?Vous devrez accumuler des données sur le nombre d'occurrences de chaque longueur se produire.
Vous aurez besoin à la sortie des résultats sous une forme agréable. C'est délicat, mais pas dur.
OriginalL'auteur dmckee
Je vais le lien de la réponse ci-dessous, mais puisque vous le demandez pour plus de détails la clé semble être ce
Utiliser un TABLEAU de longueurs je.e avez un tableau avec chaque élément initialisé à zéro assumer MAX wordlength à environ 30...
*avoir un drapeau, tandis que dans la parole et incrémenter un compteur à chaque fois qu'un espace n'est PAS rencontrée
*une fois sorti de la parole drapeau est "out" et le mot correspondant longueur de l'index de l'élément dans le tableau est incrémenté je.e si la longueur de mot de compteur est w_ctr utilisation
*utiliser le tableau comme un tableau de référence pour chaque ligne dans une boucle pour imprimer chaque ligne dans l'histogramme de sorte que vous pouvez utiliser le tableau et va maintenant être en mesure de déterminer la météo le " X " dans l'histogramme doit être inséré ou pas
EDIT: désolé, je n'ai pas lu la question, mais l'idée est plus simple pour les histogrammes et la même chose peut être utilisé.
après la dernière étape, il suffit d'imprimer l'histogramme horizontal jusqu'à ce que le compteur dépasse les wordlength imprimé
Fin
l'original est ici http://users.powernet.co.uk/eton/kandr2/krx113.html
CLC-wiki est aussi un lieu de voir les commentaires pour plus de détails.
Oui, c'est si j'ai ajouté votre lien, j'ai été simplement donner de la crédibilité de la source d'où j'ai appris cela il y a quelques temps.:)
OriginalL'auteur Siamore
OriginalL'auteur Dixith Reddy
Vous devez séparer votre 2 problèmes dans les fonctions, comme:
puis son facile dans votre main:
OriginalL'auteur user411313
La verticale de l'histogramme peut être imprimé, ligne par ligne, en passant par la gamme des longueurs de mots et la diminution de la longueur des mots à chaque itération. Un # est imprimé si la longueur du mot est toujours au-dessus de zéro, et un espace est imprimé quand il arrive à 0. Le retour à la ligne est imprimé après chaque itération.
Si longueurs[i] contient le nombre de caractères pour le mot je, et wordn est le nombre total de mots, alors la liste suivante sera d'impression à la verticale de l'histogramme:
Le code complet est ci-dessous:
OriginalL'auteur edrik
Bien que l'exercice est basé sur les Tableaux, j'ai essayé d'écrire à l'aide de la base de la boucle while et une instruction if. Je ne suis pas vraiment bon avec des Tableaux comme de maintenant, donc la pensée d'essayer cela. Je ne l'ai pas testé pour les bugs, mais il semble bien fonctionner pour la plupart des entrées.
Veuillez noter que ceci est une très simple morceau de code pour imprimer à l'horizontale, juste pour la compréhension de base de la structure.
OriginalL'auteur user3543921
OriginalL'auteur Aayush
La question a déjà été résolue à l'aide du tableau.
Le code ci-dessous affiche un histogramme horizontal, sans l'aide du tableau.
Avec la définition générale qu'un mot est une séquence de caractères qui
ne contient pas de blanc, tabulation ou retour à la ligne.
OriginalL'auteur Ravi
Voici l'exemple d'vertical simple Histogramme
OriginalL'auteur Saurav Jha
la saisie de votre nom [sans espaces, et < 50 caractères] : ThisIsAtestRun
la longueur de votre nom est 14
OriginalL'auteur Mandeep Singh