【问题标题】:Counting Alphabetic Characters That Are Contained in an Array with C用 C 计算数组中包含的字母字符
【发布时间】:2011-01-24 20:42:05
【问题描述】:

我在处理一个我已经处理了很长一段时间的家庭作业问题时遇到了问题。 我不知道这个问题的确切原因,需要对此进行一些澄清,并朝着正确的方向努力。

问题来了:

(2) 使用单个下标计数器数组解决此问题。该程序使用使用 C 初始化功能定义的字符数组。该程序计算每个字母字符 a 到 z 的数量(仅计算小写字符)并打印一份报告(在一个整洁的表格中)找到的每个小写字符的出现次数。只打印至少出现一次的字母的计数。也就是说,如果计数为零,则不打印。不要在您的解决方案中使用 switch 语句。注意:如果 x 是 char 类型,则 x-‘a’ 是 x 中字符的 ASCII 码与字符 ‘a’ 之间的差异。例如,如果 x 包含字符 'c',则 x-'a' 的值为 2,而如果 x 包含字符 'd',则 x-'a' 的值为 3。使用以下字符串提供测试结果:

“这是练习 (2) 的文本示例。”

到目前为止,这是我的源代码:

#include<stdio.h>

int main() {

    char c[] = "This is an example of text for exercise (2).";
    char d[26];
    
    int i;
    int j = 0;
    int k;
    
    j = 0;

    //char s = 97;

    for(i = 0; i < sizeof(c); i++) {
        for(s = 'a'; s < 'z'; s++){
            if( c[i] == s){
                
                k++;
                printf("%c,%d\n", s, k);
                k = 0;

            }
        }
    }
    return 0;
    
}

如您所见,我目前的解决方案有点乏力。 谢谢你的帮助,我知道网上的每个人都不一定喜欢帮助别人做作业。 ;P

【问题讨论】:

    标签: c search arrays char


    【解决方案1】:
    char c[] = "This is an example of text for exercise (2).";
    int d[26] = {0}, i, value;
    
    for(i=0; i < sizeof(c) - 1; i++){ //-1 to exclude terminating NULL
       value = c[i]-'a';
       if(value < 26 && value >= 0) d[value]++;
    }
    
    for(i=0; i < 26; i++){
       if(d[i]) printf("Alphabet-%c Count-%d\n", 'a'+i, d[i]);
    }
    

    已更正。感谢 caf 和 Leffler。

    【讨论】:

    • 谢谢,我明白我是如何试图使答案复杂化的。
    • 此解决方案写入数组 d 的定义边界之外。
    • 这有问题 - 空格、括号、数字、点(和终端 NUL)呢?
    • 它仍然在数组之外写入 - c[i] - 'a' 可能是负数(例如 'T'' ')。
    • @nvl:你应该使用isalphaislower
    【解决方案2】:

    问题的目的是让您弄清楚如何有效地将'a''z' 之间的字符转换为 0 到 25 之间的索引。您显然可以为此假设 ASCII(尽管 C 标准不保证任何特定的字符集),它具有有用的属性,即字符 'a''z' 的值是连续的。

    完成此操作后,您可以增加数组d 中的相应插槽(请注意,您需要将该数组初始化为全零,这可以简单地使用char d[26] = { 0 }; 完成。最后,您将扫描数组 d 并打印大于零的计数以及相应的字符(这将涉及反向转换 - 从索引 0 到 25 到字符 'a'通过'z')。

    【讨论】:

      【解决方案3】:

      幸运的是,您似乎不需要生成可在 EBCDIC 机器(大型机)上运行的解决方案。

      您的内部循环需要替换为条件:

      if (c[i] is lower-case alphabetic)
          increment the appropriate count in the d-array
      

      完成字符串后,您需要一个循环来扫描 d 数组,打印出与条目对应的字母和与之关联的计数。

      您的 d-array 使用 'char' 进行计数;这对于练习来说是可以的,但您可能需要使用更大的整数类型来实现通用解决方案。您还应该确保将其初始化为全零;很难从随机垃圾中获取有意义的信息(并且该语言不保证除了垃圾之外的任何东西都会在存储 d-array 的堆栈上)。

      【讨论】:

        【解决方案4】:
        char c[] = "This is an example of text for exercise (2).";
        char d[26];
        int i;
        int j;
        
        for(i = 0; i < 26; i++)
        {
            d[i] = 0; // Set the frequency of the letter to zero before we start counting.
            for(j = 0; j < strlen(c); j++)
            {
                if(c[j] == i + 'a')
                    d[i]++;
            }
            if(d[i] > 0) // If the frequency of the letter is greater than 0, show it.
                printf("%c - %d\n", (i + 'a'), d[i]);
        }
        

        【讨论】:

          【解决方案5】:

          .

          for(s = 'a'; s < 'z'; s++){ 
              j=0;
              for(i = 0; i < sizeof(c); i++) { 
                   if( c[i] == s )
                      j++;
              }
              if (j > 0)
                  printf("%c,%d\n", s, j); 
          }
          

          【讨论】:

          • 你确定吗?你试过运行它吗?
          • 我运行了它,if 语句中缺少一些括号,但除了一些小的语法错误之外,它很好。
          • OK - 我把缩进当作准确的,让自己感到困惑。不喜欢 K&R 放置牙套的另一个原因。
          • 此算法扫描字符串 26 次。对于短字符串,这不是问题。如果必须从文件中读取数据,或者如果字符串大小为数兆字节,那么与只扫描一次数据的解决方案相比,这可能是个问题。但这是看待问题的一种有趣的替代方法 - 对于每个有趣的字符(字母),计算它出现的次数,并打印字符和出现的次数。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-01
          • 1970-01-01
          • 2010-11-23
          • 1970-01-01
          • 1970-01-01
          • 2017-07-18
          • 1970-01-01
          相关资源
          最近更新 更多