如何统计qbasic或c语言中单词每个字母出现的频率?
How to count frequency of each letter of word in qbasic or c language?
成功统计了每个字母,但字母顺序无法像在word中那样按顺序显示。
例如-输入单词-bbinood
输出=b2i1n1o2d1
这是我的 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
建议2个数组,每个26个(如果只考虑字母)那个数组
size_t counts[26] = {0};
然后是第二个数组`
char order[26] = {'[=11=]'};
然后对于输入字符串中的每个字母。
if( isalpha( str[i]) )
{
letter = tolower( str[i];
counts[ letter - 'a' ]++;
然后循环遍历 order
如果匹配找到什么都不做,否则用字母
替换 '\0'
打印输出将通过 order[] 循环,直到遇到 '\0' 或检查所有元素。
在每个订单[] != '\0':
putc( order[ element ]);
printf( "%d", counts[ element-'\a' ] );
有两种方法可以回答这个问题。
第一个是简单的 运行 长度编码方案,其中输入 cabc
结果为 c1 a1 b1 c1
。这样做的好处是您可以经常以相当低的内存要求来立即输出内容:
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
我构想的另一个解决方案将保留顺序并确定字符串中所有唯一字母的计数,对于输入 cabc
产生 c2 a1 b1
。这个解决方案有点复杂,需要更多的内存和更多的执行时间,但由于缺少重复的字母,它会产生更紧凑的输出:
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
第一个应该很容易转换为 QBASIC,但您可能需要使用帮助文件来了解 DIM
关键字以及如何使用它来创建数组。该算法假定数组从 1 而不是 0 开始。
好的,这是应该在 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
请注意,如评论中所述,大写和小写将被视为与此答案相同的字母。如果您希望将它们分开处理,只需删除或注释掉 inp$ = LCASE$(inp$)
行即可。希望这对您有所帮助!
成功统计了每个字母,但字母顺序无法像在word中那样按顺序显示。 例如-输入单词-bbinood 输出=b2i1n1o2d1
这是我的 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
建议2个数组,每个26个(如果只考虑字母)那个数组
size_t counts[26] = {0};
然后是第二个数组`
char order[26] = {'[=11=]'};
然后对于输入字符串中的每个字母。
if( isalpha( str[i]) )
{
letter = tolower( str[i];
counts[ letter - 'a' ]++;
然后循环遍历 order
如果匹配找到什么都不做,否则用字母
打印输出将通过 order[] 循环,直到遇到 '\0' 或检查所有元素。
在每个订单[] != '\0':
putc( order[ element ]);
printf( "%d", counts[ element-'\a' ] );
有两种方法可以回答这个问题。
第一个是简单的 运行 长度编码方案,其中输入 cabc
结果为 c1 a1 b1 c1
。这样做的好处是您可以经常以相当低的内存要求来立即输出内容:
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
我构想的另一个解决方案将保留顺序并确定字符串中所有唯一字母的计数,对于输入 cabc
产生 c2 a1 b1
。这个解决方案有点复杂,需要更多的内存和更多的执行时间,但由于缺少重复的字母,它会产生更紧凑的输出:
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
第一个应该很容易转换为 QBASIC,但您可能需要使用帮助文件来了解 DIM
关键字以及如何使用它来创建数组。该算法假定数组从 1 而不是 0 开始。
好的,这是应该在 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
请注意,如评论中所述,大写和小写将被视为与此答案相同的字母。如果您希望将它们分开处理,只需删除或注释掉 inp$ = LCASE$(inp$)
行即可。希望这对您有所帮助!