Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序设计课程中的代码段问题_C - Fatal编程技术网

C程序设计课程中的代码段问题

C程序设计课程中的代码段问题,c,C,我正在网上学习C语言课程,以下是作业: 你还在进行语言研究!这一次,你想 编写一个程序,找出一个单词中有多少个字母出现多次 给个词。您的程序应该从输入中读取一个单词,然后 按字母顺序(按ASCII码)对单词的字母进行排序。 接下来,您的程序应该遍历单词和的字母 将每个字母与后面的字母进行比较。如果两者相等 另一种方法是,将计数器增加1,确保继续向前跳 足够使出现两次以上的字母不被计算在内 再一次。您可以假设从输入中读取的单词没有 超过50个字母,而且这个词都是小写的 他们提供的解决方案是: #i

我正在网上学习C语言课程,以下是作业:

你还在进行语言研究!这一次,你想 编写一个程序,找出一个单词中有多少个字母出现多次 给个词。您的程序应该从输入中读取一个单词,然后 按字母顺序(按ASCII码)对单词的字母进行排序。 接下来,您的程序应该遍历单词和的字母 将每个字母与后面的字母进行比较。如果两者相等 另一种方法是,将计数器增加1,确保继续向前跳 足够使出现两次以上的字母不被计算在内 再一次。您可以假设从输入中读取的单词没有 超过50个字母,而且这个词都是小写的

他们提供的解决方案是:

#include <stdio.h>
int main(void)
{
    char word[51];
    int length = 0;
    int i, j;
    char swap;
    int repeats = 0;

    scanf("%s", word);

    while (word[length]!='\0')
    length++;

    //Sort the word by alphabetical order    
    for(j=0;j<length-1; j++) {
        for(i=0;i<length-1;i++) { 
            if (word[i] > word[i+1]) {
                swap = word[i];
                word[i]   = word[i+1];
                word[i+1] = swap;
            }
        }
    }

    i = 0;

    //Check for repeating characters in the sorted word
    while (i<length-1) {
        if (word[i]==word[i+1]) {
            repeats++;
            j=i+2;

            //Continues through the word until it reaches a new character
            while (j<length && word[i]==word[j]) 
                j++;
            i = j;
        } else {
            i++;
        }
    }

    printf("%d", repeats);

    return 0;
}
#包括
内部主(空)
{
字符字[51];
整数长度=0;
int i,j;
字符交换;
int repeats=0;
scanf(“%s”,单词);
while(单词[长度]!='\0')
长度++;
//按字母顺序对单词排序

对于(j=0;j假设你的单词是打印在纸上的,你通过纸板上的一个小孔检查它。你一次只能看到两个字母

首先,看单词的开头。相同的字母?如果不是,移动1个位置并重复。如果是:

你发现了一个重复的字母。现在你应该找到重复跑的终点。要做到这一点,请将你的检查孔移到重复跑的终点

有几种方法可以正确地进行这种移位。它们的实现方式是直到两个可见字母中的第一个与前面发现的重复字母不同。要做到这一点,首先应该移位2个位置,因为在代码中的该位置,您知道这两个字母是相同的。但您可以移位1个位置相反,这也是正确的


另一个正确的实现方法是移动,直到在孔中看到两个不同的字母。这可能更容易实现,更直观。

尤其是“+2”
在这一点上,字符
i
i+1
被确定为相等。接下来的循环从下一个字符开始,即
i+2
,并向前检查是否有更多的连续字符与
i
i+1
相同。这是大多数问题的关键(尤其是像这样的性格问题)就是拿出一张8.5x11的纸,用大写字母写下这个单词。然后在每次迭代过程中手动通过代码标记当前正在操作的字符。这种方法适用于几乎所有的逻辑问题。你可以比在文本编辑器中尝试操作框更快地绘制和删除。谢谢你你的回答。你介意解释一下为什么代码下面几行是“i=j”吗?我意识到我也不明白其中的逻辑。