【问题标题】:Count words without vowels in a given list in c计算c中给定列表中没有元音的单词
【发布时间】:2021-08-26 13:37:45
【问题描述】:

我正在尝试计算给定列表中不包含任何元音的单词。这是我的代码:

int noVowel(char * List[], int nSize){
int i, j, count = 0;

for(i=0; i<nSize; i++){
for(j=0; j<strlen(List[j]); j++){
        if(*List[j]!='a' || *List[j]!='e' || *List[j]!='i' || *List[j]!='o' || *List[j]!='u')
            count++;
    }
}
return count;}

List[] 是我必须检查的单词列表。 nSize 是 List[] 中列出的单词数。

我想请求帮助以返回不带元音的单词个数。由于我是编程新手,我为令人困惑的代码道歉。

【问题讨论】:

  • 代码有什么问题?请花一些时间阅读the help pages,阅读SO tour,阅读How to Ask,以及this question checklist。最后请学习如何edit您的问题以改进它们。
  • 作为猜测您可能遇到的问题,我建议您了解De Morgans's laws,了解如何否定或反转条件。
  • 另外:你有两个循环,但你从不使用i 索引。
  • 哦,是的,你总是检查List[j][0],当你应该检查List[i][j]时。
  • 尽量避免像for(j=0; j&lt;strlen(str); j++) 这样的事情,因为它通常会导致 O(N^2) 复杂度。 strlen() 必须遍历整个字符串才能找到它的结束字符。

标签: arrays c count word


【解决方案1】:

这里是您的代码的更正:

#include <stdio.h>
#include <string.h>

int isVowel(char c) {
    if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c =='u' || c =='y')
        return (1);
    else
        return (0);
}

首先,这是一个函数,它通过返回 1 来告诉您字符是否为元音(如果不是元音,则返回 0)。

int noVowel(char *List[], int nSize){
    int i, j, count = 0;
    
    for(i = 0; i < nSize; i++) {
        
        for(j = 0; j < strlen(List[i]); j++) {

            if (isVowel(List[i][j]) == 1)
                break ;
        }
        if (List[i][j] == '\0')
                count++;
    }
    return count;
}

其次,和你一样,我做了两个循环来遍历字符串中的所有字符。如果我找到一个元音,我会打断,这意味着我会跳出当前循环。如果我在第二个循环之外,我想知道我是否能够走到字符串的末尾。如果是,我没有找到任何元音,所以我可以增加我的 count int。

您在执行 2 个循环时出错。通过运行这个版本一个一个地显示字符,您应该会发现存在问题。

for(i=0; i<nSize; i++){
    for(j=0; j<strlen(List[j]); j++){
        printf("%c", List[i][j]);
    }
    printf("\n");
}

P.S.:缩进在编程中很重要,它使您的代码易于阅读。在我的学校,我们使用以下约定https://cdn.intra.42.fr/pdf/pdf/960/norme.en.pdf(您不应该应用他们提出的所有规则,但其中一些是好的做法)

【讨论】:

  • 我很感激!我想问一下,有没有其他的休息方式?另外,我试图通过仅使用一个函数(noVowel)来解决这个问题。如果没有 isVowel 函数,有没有办法做到这一点?
  • 是的,例如,代替“break”,您可以使用一个变量,如果您找到元音,您会更改该变量。该变量将帮助您确定是否应该增加计数。当然,您可以将 isVowel 函数的内容放入 if 语句中。
  • 我能够将 isVowel 函数放在 noVowel 函数中,但我不太习惯使用变量而不是 break。我初始化了 check = 0,如果有元音,则 check = 1。我在循环外添加了 check!=1 以及 List[i][j] == '\0' 这是正确的吗?
  • 你走在了正确的道路上,如果有些东西不工作,试着通过显示你的变量来调试它,看看它们的值是否符合你的预期。
  • 关于:for(j = 0; j &lt; strlen(List[i]); j++) { 这太复杂了。由于每个字符串都以 NUL 字节结尾,因此更好用:for( j = 0; List[i][j]; j++ ) {
猜你喜欢
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
相关资源
最近更新 更多