gpt4 book ai didi

objective-c - 缺少此练习的附加逻辑

转载 作者:行者123 更新时间:2023-11-30 15:20:20 26 4
gpt4 key购买 nike

编写一个基本程序来计算字符串中的单词数。我更改了原始代码以解决单词之间的多个空格。通过将一个变量设置为当前索引,将一个变量设置为前一个索引并比较它们,我可以说“如果当前索引是空格,但前一个索引包含空格以外的内容(基本上是一个字符),那么增加字数”。

int main(int argc, const char * argv[]) {
@autoreleasepool {
//establishing the string that we'll be parsing through.
NSString * paragraph = @"This is a test paragraph and we will be testing out a string counter.";

//we're setting our counter that tracks the # of words to 0
int wordCount = 0;

/*by setting current to a blank space ABOVE the for loop, when the if statement first runs, it's comparing [paragraph characterAtIndex:i to a blank space. Once the loop runs through for the first time, the next value that current will have is characterAtIndex:0, while the if statement in the FOR loop will hold a value of characterAtIndex:1*/

char current = ' ';

for (int i=0; i< paragraph.length; i++) {

if ([paragraph characterAtIndex:i] == ' ' && (current != ' ')) {
wordCount++;
}
current = [paragraph characterAtIndex:i];

//after one iteration, current will be T and it will be comparing it to paragraph[1] which is h.

}
wordCount ++;
NSLog(@"%i", wordCount);
}
return 0;
}

我尝试添加“或”语句来说明“;”等分隔符“,“和 ”。”而不是仅仅看一个空间。它不起作用......从逻辑上讲,我不知道我能做什么来解释任何不是字母的东西(但最好将其限制为这四个分隔符 - . , ; 和空格。

最佳答案

解决此类问题的标准方法是构建一个有限状态机,您的代码不完全是一个,但很接近。

不要考虑比较以前和当前的角色,而是考虑状态 - 您可以从两个开始,在一个单词中不在一个单词中词

现在,对于每个状态,您都需要考虑当前角色在操作和状态更改方面的含义。例如,如果状态是不在单词中并且当前字符是字母,则操作是增加单词计数并且下一个状态是在单词中

在(Objective-)C 中,您可以使用enum 来构建一个简单的有限状态机,以在循环内给出状态名称和case 语句。在伪代码中,这类似于:

typedef enum { NotInWord, InWord } State;

State currentState = NotInWord;
NSUInteger wordCount = 0;

for currentChar in sourceString
case currentState of
NotInWord:
if currentChar is word start character -- e.g. a letter
then
increment wordCount;
currentState = InWord;

InWord:
if currentChar is not a word character -- e.g. a letter
then
currentState = NotInWord;
end case
end for

以上只是原始算法的一个步骤 - 根据状态而不是前一个字符来重新类型转换它。

现在,如果您想变得更聪明,您可以添加更多状态。例如“卡兰的问题”有多少个单词?二。因此,您可能希望在单词中允许有一个撇号。要处理这个问题,您可以添加一个状态 AfterApostrope ,其逻辑与当前 InWord 相同;并修改 InWord 逻辑,以包括如果当前字符是撇号,则下一个状态是 AfterApostrope - 这将允许单词中出现一个撇号(或其结尾,这也是有效的) )。接下来您可能需要考虑连字符等...

要测试某个角色是否属于特定类型,您有两个简单的选择:

  • 如果这只是一个练习,并且您愿意坚持使用 ASCII 字符范围,则可以使用诸如 isdigit()isletter() 等函数等等

  • 如果您想处理完整的 Unicode,您可以使用 NSCharacterSet 类型及其预定义的字母、数字等集。

请参阅上述两种选择的文档。

HTH

关于objective-c - 缺少此练习的附加逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30086072/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com