C语言经典算法之统计单词数量

您所在的位置:网站首页 编写函数统计指定数字的个数的C语言 C语言经典算法之统计单词数量

C语言经典算法之统计单词数量

2024-07-10 13:14:34| 来源: 网络整理| 查看: 265

目录

前言

A.建议:

B.简介:

一 代码实现

二 时空复杂度

三 优缺点

A.优点:

B.缺点:

四 C语言的优缺点

前言 A.建议:

1.学习算法最重要的是理解算法的每一步,而不是记住算法。

2.建议读者学习算法的时候,自己手动一步一步地运行算法。

B.简介:

统计字符串中单词个数的C语言算法:遍历输入字符串,用标志变量记录当前是否在单词内。遇到空格时,若在单词内则退出单词状态;遇非空字符时,在非单词状态则切换到单词状态并计数加一。特别注意处理末尾无空格的单词。通过这种方式,根据空格将字符串分割成单词,并正确统计各单词间边界。

一 代码实现

在C语言中,统计一个字符串中的单词个数可以采用以下算法实现。假设输入的文本由空格分隔各个单词,并且不考虑标点符号和其他特殊字符的影响(如需处理这些情况,需要额外的逻辑)。以下是基于空格分割单词的简单算法:

#include #include int countWords(const char *str) { int wordCount = 0; // 初始化单词计数器为0 int inWord = 0; // 标记当前是否处于单词之中 for (size_t i = 0; str[i] != '\0'; ++i) { // 遍历整个字符串 if (str[i] == ' ') { // 当前字符为空格 if (inWord) { // 如果之前是在单词中,则遇到空格表示一个单词结束 inWord = 0; // 结束当前单词 } } else { // 当前字符不是空格 if (!inWord) { // 如果之前不在单词中,则开始新的单词 wordCount++; // 增加单词计数 inWord = 1; // 标记现在进入一个新的单词 } } } // 处理字符串末尾的情况:如果最后一个字符不是空格,它应该算作一个单词 if (inWord) wordCount++; return wordCount; } int main() { char input[1000]; // 假设有一个足够大的缓冲区来存储用户输入的字符串 printf("Enter a sentence: "); fgets(input, sizeof(input), stdin); // 获取用户输入 // 移除末尾的换行符,防止影响单词计数(fgets会将换行符包含在内) input[strcspn(input, "\n")] = '\0'; int numWords = countWords(input); printf("The number of words is: %d\n", numWords); return 0; }

此算法的核心思想是通过遍历字符串,用一个标志变量inWord来判断当前字符是否属于单词的一部分。当遇到空格时,更新该标志以表示已经离开单词;而遇到非空格字符时,在不在单词中时则增加单词计数并切换到单词状态。同时,考虑到字符串可能以单词结尾而非空格,所以在循环结束后还要检查一下inWord的状态,若还在单词中,则额外增加单词计数。

二 时空复杂度

时间复杂度(Time Complexity):统计单词个数的函数countWords遍历输入字符串中的每个字符,因此时间复杂度为O(n),其中n表示字符串的长度。

空间复杂度(Space Complexity):在该算法中,仅使用了固定数量的额外变量(例如wordCount和inWord),而对输入字符串并未创建新的副本或动态分配额外内存。所以,空间复杂度是O(1),即常数空间复杂度。另外,在主函数main中,我们定义了一个固定大小的缓冲区来存储用户输入,这部分的空间复杂度也是固定的,不影响整体的空间复杂度分析结果。

三 优缺点

A.优点:

简洁性与易读性:算法实现直观明了,逻辑简单易懂,通过遍历字符串中的字符并根据空格判断单词边界。

空间效率:代码中仅使用了固定数量的额外变量(wordCount和inWord),对输入字符串不进行复制或创建额外数据结构,因此空间复杂度低,适合处理大字符串。

时间效率:线性时间复杂度O(n),对于大多数情况下的单词计数任务,这种单遍扫描字符串的方式已经足够高效。

适用性广泛:该算法适用于以空格分隔的单词统计,能应对多数基本场景。

错误处理:针对fgets函数获取的用户输入末尾可能存在的换行符进行了特殊处理,保证了准确统计单词个数。

B.缺点:

局限性:该算法假设单词由空格分隔,无法处理包含标点符号、特殊字符以及连字符连接的复合词等情况。若需处理这些情况,需要扩展算法以识别更多类型的分隔符,并正确处理特殊词汇。

未考虑多语言支持:对于非英语或其他含有不同分隔规则的语言,该算法可能无法准确统计单词数。

没有容错机制:如果输入的是非文本内容或格式错误的字符串,程序可能会得到不正确的结果。

无缓存优化:在处理大量重复计算时,没有利用缓存优势,例如对于连续的多个空格,实际只需处理第一个空格即可。

灵活性不足:若要增加其他功能,如过滤特定类型的单词或统计特定类型单词的数量,需要对现有代码进行较大修改。

四 C语言的优缺点

优点:

高效性与执行速度:C语言是一种编译型语言,编译后的代码接近机器码,因此执行效率高,特别适用于系统软件、嵌入式开发、实时控制、设备驱动程序等需要高性能的领域。

简洁紧凑:C语言语法简洁明了,关键字数量有限,程序结构清晰,使得开发者能够快速地编写出高效的代码。

低级操作能力:C语言允许直接访问内存地址和进行位操作,可以对硬件进行底层控制,提供了强大的灵活性和操控能力。

可移植性:C语言标准规范保证了其在不同平台上的可移植性,只要遵循ANSI C或ISO C标准,编写的程序可以在多种计算机体系结构上编译和运行。

丰富的运算符与数据类型:C语言拥有丰富的运算符集和多种数据类型,能支持复杂的计算任务和灵活的数据处理。

广泛的库支持:C语言有一系列内置函数和标准库,如stdio.h、stdlib.h等,方便进行输入输出、文件操作、字符串处理等功能,并且用户也可以自定义函数库。

面向过程的结构化设计:C语言是典型的面向过程语言,强调模块化和结构化的程序设计,有利于程序的组织和理解。

学习基础:学习C语言有助于深入理解计算机原理,对于后续学习其他高级编程语言以及操作系统、计算机架构等方面的知识有很好的奠基作用。

缺点:

内存管理:C语言不提供自动内存管理机制,程序员必须手动分配和释放内存。这种手动管理容易导致内存泄漏和悬挂指针等问题,增加了潜在的错误源。

安全性问题:由于可以直接操作内存和使用指针,可能导致安全漏洞,例如缓冲区溢出,如果不谨慎处理输入和输出,可能会受到攻击。

代码复用和维护性:C语言本身不支持面向对象特性,对于大规模项目,代码的复用性和维护性相对较差,需要额外的设计和管理才能实现良好的模块化和扩展性。

异常处理:C语言没有内置的异常处理机制,错误处理相对原始,需要通过返回值或者全局变量等方式来检查错误状态。

字符串处理困难:C语言中字符串并不是内置类型,而是以字符数组的形式表示,操作起来不如某些现代语言便捷,容易引入bug。

调试难度:由于C语言的灵活性和底层性,一些错误可能隐藏得较深,在出现错误时往往需要花费更多的时间和精力去调试。

不适合大型应用:虽然可以通过精心设计实现大型项目,但相较于支持面向对象、函数式编程特性的现代语言,C语言在构建和维护大型复杂软件方面显得力不从心。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭