【问题标题】:How to count frequency of each letter of word in qbasic or c language?如何计算qbasic或c语言中每个单词的频率?
【发布时间】:2017-05-01 12:08:06
【问题描述】:

已成功计算每个字母,但字母顺序无法像 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

【问题讨论】:

  • 你能改写你的问题吗?理解起来很混乱。
  • 问题很容易理解-输入:bbinnod,然后输出格式为:b2i1n2o1
  • @BinodThakur,你不能告诉人们你的问题很容易理解。如果有人要求您更好地解释您的问题,请直接回答。
  • 对不起,我承认我做错了。那么什么问题是计算单词的每个字母的频率和字母顺序应该在同一个单词字母中。例如,如果输入单词是-bbinnod,那么输出应该是b2i1n2o1d1。

标签: logic qbasic


【解决方案1】:

好的,这是应该在 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】:

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

    第一个是简单的行程编码方案,其中输入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。

    【讨论】:

    • @BinodThakur 如果我的回答对您有所帮助,请随时投票和/或接受它。祝你未来好运:)
    【解决方案3】:

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

    size_t counts[26] = {0};
    

    然后是第二个数组`

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

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

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

    然后循环通过order如果匹配发现什么都不做,否则用字母替换'\0'

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

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

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

    【讨论】:

    • 对不起,我不明白 - 我的问题是如果输入是:bbinnod 那么输出应该是:b2i1n2o1d1。
    • @BinodThakur,我不会为你编写代码。但是,我确实布局了所有步骤和一些代码片段。
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 2014-03-13
    相关资源
    最近更新 更多