0
votes

Comment compter le nombre de même caractère en C?

J'écris un code A qui invite l'utilisateur à entrer une chaîne

&

Créer une fonction de type void qui imprime le caractère utilisé le plus

(comme dans l'endroit où il est apparu plus que tout autre)

&

montre également le nombre de fois qu'il était dans cette chaîne.

Voici ce que j'ai jusqu'à présent ... xxx

Je reçois aussi le mauvais résultat.

sortie:

entrez une chaîne Bonjour Le caractère le plus fréquent était: 'h' avec 2 occurrences 5 caractères ont été utilisés

doivent être

Le caractère le plus fréquent était: "L 'avec 2 occurrences 5 caractères ont été utilisés


15 commentaires

Veuillez corriger l'indentation de votre code. Ce n'est pas lisible tel quel.


@Eugenesh. Je contrôlais K, je ne sais pas si c'est mieux.


Veuillez adresser toutes vos avertissements de votre compilateur. Cela va nettoyer la plupart de vos problèmes. Si vous utilisez GCC, l'option -wall sera utile.


@JMQ Je reçois les mauvais chiffres sur ma sortie. Je vais les énumérer.


Le troisième paramètre de votre fonction la plus fraîche est déclaré comme un pointeur à un INT, mais vous ne le faites que comme une variable normale ....


Comment pourrais-je le réparer? Je lutte avec des pointeurs ..


Lire Ce .


Tout d'abord dans votre fonction lafrequent, vous devez vous reporter à la valeur pointue et non au pointeur lui-même en précédant le nom de la variable avec une étoile (*) comme * qty_pros_freq = tableau [0]; puis transmettez un pointeur sur un VaR sur votre fonction Call InT Ruls = 0; MOSTFREQUENT (compte, tableau et int, 0);


Résolvez un problème plus simple: donné une chaîne, créez un histogramme du nombre de caractères dans cette chaîne et imprimez-les.


"Créer une fonction qui est un type void que retourne le personnage utilisé le plus" oxymoron.


Je n'ai pas remarqué auparavant que vous avez également abusé de Pointet sur le premier et le dernier paramètre. Les premiers paramètres sont supposés être un pointeur à un int, mais vous passez l'int-lui-même sur l'appel. Si vous n'avez pas besoin de vos variables INT pour être mises à jour dans votre fonction principal, n'utilisez pas de pointeurs, il est inutile. De plus, pour les 3e et 4e paramètres, si vous n'avez pas besoin de passer une valeur spécifique, déclarez-les localement dans votre fonction.


@nobur les déclarer localement sous forme d'INTS?


Oui! Pour INT * QTy_PLOST_FREQ SONT INT NUM_COUNTS_ Vous passez une valeur statique 0 de Main. C'est un peu inutile. Pourquoi ne créez-vous pas seulement 2 INTS dans votre fonction initialisée avec 0.


d'accord ! Je n'ai pas remarqué les commentaires ... Est-ce que les devoirs de l'école? si oui! Essayez de modifier votre code par vous-même en utilisant ma réponse. N'oubliez pas que si votre fonction attend un pointeur (int * qty_prost_freq), vous ne pouvez pas l'aligner avec une valeur (0). Vous devez créer une variable et transmettre un pointeur à celui-ci (avec &). Dans la fonction, vous pouvez lire la valeur pointue à l'aide d'un préfixe étoile (* var)


@nobur que je l'ai compris. Merci de votre aide.


3 Réponses :


1
votes

Faisons-le court (les autres me corrigeront si j'écris quelque chose de mal ^ _ ^) Vous déclarez un Int comme ceci: xxx

l'utiliser comme ceci: xxx

Vous déclarez un pointeur comme celui-ci: < Pré> xxx

et utilisez la valeur pointue comme ceci: xxx

Si vous avez déclaré une variable et que vous devez transmettre un pointeur en tant que paramètres de fonction, Utilisez l'opérateur et l'opérateur comme ceci: xxx

ou simplement enregistrer son adresse dans un pointeur var: xxx

c'est les bases . J'espère que cela vous aidera ...


2 commentaires

Merci! J'ai compris ma réponse à ma question. Je vais le poster bientôt. Cela a aidé!


J'ai posté la solution à ma question ci-dessus.



1
votes

Le prototype de fonction que vous êtes censé utiliser semble inclure au moins un paramètre superflu. (Vous avez le nombre total de caractères disponible dans principal () ). Afin de trouver le caractère le plus souvent apparaissant (au moins le 1er des caractères qui se produisent ce nombre de fois), tout ce dont vous avez besoin pour fournir votre fonction est:

  1. la chaîne de caractères à évaluer;
  2. Un tableau de taille de sorte que chaque élément représente sur la plage de valeurs que vous souhaitez trouver le plus fréquent (pour les caractères ASCII 128, c'est bien, pour tous dans la plage de non signé Char , 256 fera); et enfin
  3. un pointeur pour renvoyer l'index dans votre matrice de fréquence qui contient l'index sur le caractère le plus fréquemment utilisé (ou le 1ère caractère d'un ensemble si plusieurs fois sont utilisés le même nombre de fois).

    Dans votre fonction, votre objectif est de boucler sur chaque caractère de votre chaîne. Dans la matrice de fréquence (que vous avez initialisé tout zéro), vous ferez mapper chaque caractère sur un élément de la matrice de fréquence et incrémenterez la valeur à cet élément chaque fois que le caractère est rencontré. Par exemple, pour "bonjour" , vous incrempériez: xxx

    ci-dessus, vous pouvez voir lorsque vous avez terminé, l'élément fréquence [' l ']; tiendra la valeur de 2 . Ainsi, lorsque vous avez terminé, vous venez de boucler sur tous les éléments en fréquence et de trouver l'index pour l'élément qui contient la plus grande valeur. xxx

    (qui est également pourquoi vous obtiendrez le premier de tous les caractères qui apparaissent de ce nombre de fois. Si vous passez à > = vous allez Obtenez le dernier de cet ensemble de caractères. En outre, dans votre personnage Comptez, vous ignorez le 6ème caractère, le '\ n' , qui convient parfaitement à une entrée à une seule ligne, mais pour une entrée multi-lignes que vous Besoin de considérer comment vous voulez gérer cela)

    Dans votre cas, mettez-le tout à fait, vous pouvez faire quelque chose de similaire à: xxx

    ( REMARQUE: En utilisant ISALPHA () Dans la comparaison, il gérera les deux caractères majuscules / minuscules, vous pouvez ajuster comme vous le souhaitez en vérifiant simplement les majuscules / minuscules ou simplement convertir tous les caractères à un cas ou un autre)

    Exemple d'utilisation / sortie xxx

    ( Note: Si vous Utilisez "heello" , vous recevrez toujours "le plus fréquent Char: E (survient 2 fois, 6 caractères utilisés)" en raison de 'e' Être le premier des deux personnages qui sont observés le même nombre de fois)

    Il existe de nombreuses façons de gérer les problèmes de fréquence, mais ils travaillent tous de la même manière. Avec des caractères ASCII, vous pouvez capturer à la fois le caractère le plus fréquent et le nombre de fois où il se produit dans un seul tableau de int et un int détenant l'index à l'endroit où le max se produit. . (Vous n'avez pas vraiment besoin de l'index non plus - il suffit d'économiser une boucle pour le trouver à chaque fois qu'il est nécessaire).

    Pour des types plus complexes, vous utiliserez généralement une structure simple pour contenir le compte et L'object. Par exemple, si vous recherchiez le mot le plus fréquent , vous utiliserez généralement une structure telle que: xxx

    alors vous utilisez simplement un tableau de struct wfreq de la même manière que vous utilisez votre tableau de int ici. Regardez les choses et laissez-moi savoir si vous avez d'autres questions.


0 commentaires

0
votes

Voici ce que je suis venu. J'ai foiré avec les pointeurs. xxx


1 commentaires

bon d'entendre. Juste un petit conseils pour raccourcir votre code: votre boîte peut zéro un tableau pendant la déclaration juste avec une ligne -> Char String [100] = {0};