2017-05-01 3 views
-3

Compté avec succès chaque lettre, mais l'ordre alphabétique ne peut pas s'afficher séquentiellement comme dans word. Pour exemple- entrée mot-bbinood Sortie = b2i1n1o2d1Comment compter la fréquence de chaque lettre de mot dans la langue qbasique ou c?

Voici mon programme qbasic:

INPUT "Enter the string:", A$ 
n = LEN(A$) 

FOR i = 97 TO 122 

    FOR j = 1 TO n 
     IF CHR$(i) = MID$(A$, j, 1) THEN 
      count = count + 1 
     END IF 
    NEXT 
    FOR j = 1 TO n 
     IF (MID$(A$, j, 1) = CHR$(i)) THEN 
      PRINT CHR$(i), count 
      j = n 
     END IF 

    NEXT 

    count = 0 
NEXT 
+1

Pouvez-vous reformuler votre question? C'est assez difficile à comprendre. –

+0

question est facile à comprendre- Entrée: bbinnod puis la sortie doit être au format: b2i1n2o1 –

+1

@BododThakur, ce n'est pas à vous de dire aux gens que votre question est facile à comprendre. Si quelqu'un vous demande d'expliquer votre question mieux, juste pour cela. –

Répondre

2

Bon, voici le code qui devrait fonctionner dans Qbasic.

DEFINT A-Z 
DIM char(1 TO 255) AS STRING * 1 
DIM outp(1 TO 255) AS STRING 
INPUT "Type your string: ", inp$ 

'**** Comment out the following line if you want upper and lower cases 
'**** treated separately: 
inp$ = LCASE$(inp$) 

FOR i = 1 TO LEN(inp$) 
    char(i) = MID$(inp$, i, 1) 
NEXT i 

l = 0 
FOR i = 1 TO LEN(inp$) 
    k = 1 
    FOR j = 1 TO i - 1 
    IF char(j) = char(i) THEN GOTO skplet 
    NEXT j 
    l = l + 1 
    FOR j = i + 1 TO LEN(inp$) 
    IF char(j) = char(i) THEN k = k + 1 
    NEXT j 
    outp(l) = char(i) + LTRIM$(STR$(k)) 
skplet: 
NEXT i 

FOR i = 1 TO l 
    PRINT outp(i); 
NEXT i 

Notez que, comme le remarque dans le commentaire, majuscules et minuscules seront traités comme les mêmes lettres que cette réponse signifie. Si vous souhaitez les traiter séparément, supprimez ou commentez simplement la ligne inp$ = LCASE$(inp$). J'espère que cela t'aides!

+1

merci beaucoup –

1

suggèrent 2 tableaux, chaque 26 (si seulement compte tenu des lettres alphabétiques) ce tableau

size_t counts[26] = {0}; 

puis un second tableau `

char order[26] = {'\0'}; 

puis pour chaque lettre de la chaîne d'entrée.

if(isalpha(str[i])) 
{ 
    letter = tolower(str[i]; 
    counts[ letter - 'a' ]++; 

puis boucle à travers order si correspondance trouvée rien faire, remplacez les autres « \ 0 » avec lettre

imprimer serait boucle par ordre [] jusqu'à ce que ce soit « \ 0 » rencontré ou tous les éléments examinés .

A chaque ordre [] = '\ 0':

putc(order[ element ]); 
printf("%d", counts[ element-'\a' ]); 
+0

Désolé je n'ai pas compris-ma question est si l'entrée est: bbinnod alors la sortie devrait être: b2i1n2o1d1. –

+1

@BododThakur, je ne vais pas écrire le code pour vous. Cependant, j'ai mis en page toutes les étapes et quelques coupures de code. – user3629249

2

Il y a deux façons de répondre. Le premier est un schéma de codage simple, où l'entrée cabc donne c1 a1 b1 c1. Ceci a l'avantage que vous pouvez souvent les choses de sortie immédiatement avec une exigence de mémoire assez faible pour démarrer:

input-string := Get-Input 

(* nil is the representation of no characters here. *) 
last-char := nil 
count := 0 

For Each (char c) In input-string 
    If c = last-char Then 
     count := count + 1 
    Else 
     If last-char = nil Then 
      count := 1 
      last-char := c 
     Else 
      Display last-char, count 
      count := 1 
      last-char := c 
     End If 
    End If 
Loop 
If count != 0 Then 
    Display last-char, count 
End If 

L'autre solution que je concevais préservera l'ordre et déterminer les comptes de toutes les lettres uniques dans la chaîne, ce qui donne c2 a1 b1 pour une entrée de cabc. Cette solution est un peu plus complexe et nécessite plus de mémoire et souvent plus de temps d'exécution, mais il en résulte une sortie plus compacte en raison de l'absence de lettres répétées:

input-string := Get-Input 

(* 26 is the number of letters a-z. *) 
counts := Create-Array 26 
order-string := "" 

For Each (char c) In input-string 
    i := Locate-Char order-string, c 
    If i = 0 Then 
     order-string := order-string + c 
     counts [Length order-string] := 1 
    Else 
     counts [i] := counts [i] + 1 
    End If 
Loop 

For i := 1 To (Length order-string) 
    Display (Char-At order-string, i), counts [i] 
Loop 

Le premier devrait être facile à convertir en QBASIC, mais Vous devrez peut-être utiliser le fichier d'aide pour en savoir plus sur le mot clé DIM et sur la façon de l'utiliser pour créer un tableau. Cet algorithme suppose que les tableaux commencent à 1, et non à 0.

+0

Chrono Kitsune merci de m'aider –

+0

@BinodThakur Si ma réponse vous a aidé, n'hésitez pas à la mettre en colère et/ou à l'accepter. Bonne chance dans le futur :) –