如何计算qbasic或c语言中每个单词的频率?

时间:2017-05-01 12:08:07

标签: logic qbasic

成功计算了每个字母,但字母顺序无法按字顺序显示。 例如 - 输入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

3 个答案:

答案 0 :(得分:2)

有两种方法可以解答这个问题。

第一种是简单的游程编码方案,其中输入404 Error导致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 的输入产生c2 a1 b1。这个解决方案有点复杂,需要更多的内存和更多的执行时间,但由于缺少重复的字母,它会导致更紧凑的输出:

cabc

第一个应该是直接转换为QBASIC,但您可能需要使用帮助文件来了解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 关键字以及如何使用它来创建数组。该算法假设数组从1开始,而不是0。

答案 1 :(得分:2)

好的,这里的代码应该适用于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$)行。希望这有帮助!

答案 2 :(得分:1)

建议2个数组,每个26个(如果只考虑字母字母)那个数组

size_t counts[26] = {0};

然后是第二个数组`

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

然后输入字符串中的每个字母。

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

然后循环浏览order如果匹配发现什么也不做,否则替换' \ 0'用信

打印输出将循环执行[],直到' \ 0'遇到或检查了所有元素。

在每个订单[]!=' \ 0':

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