文档章节

一个很有意思的问题: 揭示了计算机程序问题的一般处理思路

FreeBlues
 FreeBlues
发布于 2013/08/21 18:43
字数 1310
阅读 345
收藏 4
点赞 0
评论 0

一个很有意思的问题: 揭示了计算机程序问题的一般处理思路

===

问题标题: 如何统计汉字的字数? 问题内容: 我想统计: "什么样的问题在 oschina 算是一个好问题?" 这个句子里面以oschina为分割总共有三部分: 什么样的问题在+ oschina +算是一个好问题? 现在想知道oschina前面有几个汉字?oschina有几个英文?oschina后面有几个汉字?不要直接去查找oschina字符串去计算啊,可以当作oschina是某个未知的英文单词,如何统计出来呢? ps.楼下的说我的表达能力有问题,看来我确实没有表达清楚:)再补充一下问题。 问题来源: http://www.oschina.net/question/583303_122530

===

这个问题的关键是如何让计算机区分汉字和英文, 具体分析就要涉及到中文和英文在计算机内部的表示方式, 那么一切以数字为准, 先把这段数据转换为数字格式, 如下代码:

(defparameter *字符串*  "什么样的问题在 oschina 算是一个好问题?")

(defun 字符串-数字(字符串)
  (dotimes (序数 (length 字符串))
      (print (char-code (elt 字符串 序数)))))

执行一下, 结果如下:

CL-USER> (字符串-数字 *字符串*)

20160 
20040 
26679 
30340 
38382 
39064 
22312 
32 
111 
115 
99 
104 
105 
110 
97 
32 
31639 
26159 
19968 
20010 
22909 
38382 
39064 
65311 
NIL
CL-USER> 

我们看到, 每一个文字字符都被转化为一个数字值, 这个数字值就是计算机内部对这个字符的表示, 也就是说数字值和文字字符之间存在着一种对应关系. 其实到这里问题基本就解决一多半了, 剩下的就是对这些数字值的操作了.

更简单的语句是:

(defun 字符串-数字向量 (字符串)	
  (map 'vector #'char-code 字符串))

与前面第一个函数的区别是, 本函数返回的结果是一个向量, 试试看:

CL-USER> (字符串-数字向量 *字符串*)
#(20160 20040 26679 30340 38382 39064 22312 32 111 115 99 104 105 110 97 32 31639 26159 19968 20010 22909 38382 39064 65311)
CL-USER> 

再试试日文:

CL-USER> (字符串-数字向量 "日本语:平假名にほんご")
#(26085 26412 35821 65306 24179 20551 21517 12395 12411 12435 12372)
CL-USER> 	

现在就一目了然了, 这个句子也由适合人类阅读的形式转化为适合计算机阅读的数字形式了, 代码写到这一步, 程序员需要了解的知识就是人类和计算机之间的契约了, 如什么样的数字代表什么样的文字符号等等诸如此类的约定. 我们一般都知道:

0~127 之间的数字表示制表打印控制字符,英文大小写字符以及英文标点符号, 也就是 ASCII 
超过127 的数字表示中文字符和全角标点符号等(如果使用其他字符集, 那么就是其他字符, 如日文)

剩下的操作就是对数字的比较,分类等操作了.

这个问题给我们的启示就是, 首先要把问题的表述形式变化为计算机能理解的数字形式, 然后再去翻找人类和计算机之间已经签订好的契约, 然后按照契约的规定来分析处理.

目前写了两个函数, 简单区分了一下英文(0~127 的数字)和非英文(大于 127 的数字), 如下:

(defun 字数统计函数 (字符串)
  (let ((汉字个数 0) (空格个数 0) (英文字母个数 0) (全角问号个数 0) (代码点 0)) 
    (dotimes (序数 (length 字符串)) 
	 (setq 代码点 (char-code (elt 字符串 序数)))
	 (cond
	   ((= 代码点 32)
	    (setf 空格个数 (1+ 空格个数)))
	   ((= 代码点 65311)
	    (setf 全角问号个数 (1+ 全角问号个数)))
	   ((> 代码点 127)
	    (setf 汉字个数 (1+ 汉字个数)))
	   ((and (> 代码点 0) (<= 代码点 127))
	    (setf 英文字母个数 (1+ 英文字母个数)))))
    (values "空格个数:" 空格个数 "全角问号个数:"全角问号个数 "汉字个数:" 汉字个数 "英文字母个数" 英文字母个数)))

(defun 字数统计函数-映射版 (字符串)
  (let ((汉字个数 0) (空格个数 0) (英文字母个数 0) (全角问号个数 0)) 
    (map 'vector  
	 #'(lambda (代码点) 
	     (cond
	       ((= 代码点 32)
		(setf 空格个数 (1+ 空格个数)))
	       ((= 代码点 65311)
		(setf 全角问号个数 (1+ 全角问号个数)))
	       ((> 代码点 127)
		(setf 汉字个数 (1+ 汉字个数)))
	       ((and (> 代码点 0) (<= 代码点 127))
		(setf 英文字母个数 (1+ 英文字母个数)))))
	 (map 'vector #'char-code 字符串))
    (values "空格个数:" 空格个数 "全角问号个数:"全角问号个数 "汉字个数:" 汉字个数 "英文字母个数" 英文字母个数)))

执行结果如下:

CL-USER> (字数统计函数 *字符串*)
"空格个数:"
2
"全角问号个数:"
1
"汉字个数:"
14
"英文字母个数"
7
CL-USER> (字数统计函数-映射版 *字符串*)
"空格个数:"
2
"全角问号个数:"
1
"汉字个数:"
14
"英文字母个数"
7
CL-USER> 

© 著作权归作者所有

共有 人打赏支持
FreeBlues
粉丝 94
博文 278
码字总数 487443
作品 0
其它
程序员
计算机模型与体系架构的发展——从图灵机到云计算机(2)

图灵机模型从来就不考虑通信在计算中会有什么用处。正相反,图灵还就是偏偏提到过如果把两(多)部机器相连接使之互相通信,则连接好的机器与单个一部机器没有任何两样!所谓没有任何两样是指...

晨曦之光
2012/03/09
0
0
Android端支持HTTP和HTTPS

作者:近乎团队 Android端的网络模块在程序开发中是至关重要的,今天我们来分享下Android端如何使用http和https 技术。 1 HTTP (Hypertext transfer protocol) 超文本传输 协议 是一个基于请...

小近
2014/10/22
14.5K
4
使用 fasthttp 时要注意的两个点

我们做的是聚合支付系统,使用的是fasthttp 作为http server, http client 也是使用fasthttp 1. 第一个问题出现的场景是我们使用fasthttp client 请求微信支付时报了这个err ErrConnectionCl...

fireblue火蓝
2017/12/16
0
0
【99JS】之二:路径自动调整

 上一篇,99给大家介绍了使用js控制“:nth-child()”的方法,今天99继续给大家介绍一个使用js自动调整路径的相关介绍,希望大家喜欢。 目标: 路径自动调整 需求是这样的:在javascript 开发...

石佛慈悲
2014/01/03
0
0
我们怎么来捕捉 Python 程序中的异常

一、错误和异常的区别 错误: 错误的核心是语法错误和逻辑错误,一个是程序员端的问题,本身书写的代码不符合Python的语法逻辑,还有一个错误是用户端产生的,它是由不完整的输入或者不合法的...

xjtuhit
06/05
0
0
2018-01-01 狗年的第一篇问题总结,URL不变的情况下,Glide加载图片不更新

序言 问题描述 触发条件 解决思路 查看glide缓存模块的wiki signature是什么 修改不了signature怎么办 总结 序言 发现这个问题源于17年最后一天的一个线上事故,昨晚八点多的时候后端哥们儿打...

fighting_goat
01/01
0
0
摘录:来自justjavac(迷渡)——代码之谜

第一章: C中为什么可以i = i + 1?因为=是赋值,注意这只是在大部分语言中这样,比如ST语言就是:=。于是既然=如果不是相等的话,那肯定有表示相等的,比如==或者===。不管是==还是=,「相等」...

cjs520
06/28
0
0
#ifndef、#def、#endif等宏是什么意思

Q 在编程中,经常看见: #ifndef #def #endif 以及其他的一些宏,不知这是什么意思? A回答: 你所遇到的这几个宏是为了进行条件编译。一般情况下,源程序中所有的行都参加编译。但是有时希望...

AlphaJay
2010/04/13
0
0
[NBOJ0032][Non-Decreasing Digits]

[题目要求] http://acm.bupt.edu.cn/onlinejudge/newoj/showProblem/showproblem.php?problem_id=32 [题目涉及的相关理论与算法] 递归思想 [题目中需要注意的地方] 有两个,一个是上限问题,...

小弘
2012/10/14
0
0
ajax 跨域获取数据jsonp使用

昨天帮同事从其他服务器传过来的json数据进行处理,遇到该问题。开始我的思路是用ajax直接请求把数据弄出来就OK了,然而出错了.原因是我使用的ajax 返回类型为json,默认ajax阻止跨服获取数据...

小小小蚂蚁
2014/07/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

使用爬虫实现代理IP池之放弃篇

啥叫代理IP以及代理IP池 概念上的东西网上搜索一下就好了,这里简单科普一下(大部分会读这篇文章的人,基本是不需要我来科普的),白话说就是能联网并提供代理访问互联网的服务器,它提供的...

一别丶经年
10分钟前
0
0
rabbitmq学习记录(五)交换机Exchange-fanout

之前学习的都是一条消息发给一个消费者,下面开始记录如何把一条信息发给多个消费者 这边我们用到了交换机Exchange 交换机模式:fanout 模式特点:生产者把消息发送给Exchange之后,Exchang...

人觉非常君
31分钟前
0
0
sqoop导入数据到Base并同步hive与impala

使用Sqoop从MySQL导入数据到Hive和HBase 及近期感悟 基础环境 Sqool和Hive、HBase简介 Sqoop Hive HBase 测试Sqoop 使用Sqoop从MySQL导入数据到Hive 使用复杂SQL 调整Hive数据类型 不断更新 ...

hblt-j
37分钟前
0
0
Dart 服务端开发 文件上传

clent端使用angular组件 upload_component.html form id="myForm" method="POST" enctype="multipart/form-data"> <input type="file" name="fileData"> <!-- file field --></form>......

scooplol
37分钟前
0
0
apache和tomcat同时开启,乱码问题

tomcat和apache同时开启,会走apache的转发,执行的是AJP/1.3协议。所以在tomcat的配置文件server中, <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" useBodyEncodingForU......

Kefy
53分钟前
0
0
使用ssh-keygen和ssh-copy-id三步实现SSH无密码登录 和ssh常用命令

ssh-keygen 产生公钥与私钥对. ssh-copy-id 将本机的公钥复制到远程机器的authorized_keys文件中,ssh-copy-id也能让你有到远程机器的home, ~./ssh , 和 ~/.ssh/authorized_keys的权利 第一步...

xtof
今天
0
0
orcale 查询表结构

SELECT t.table_name, t.colUMN_NAME, t.DATA_TYPE || '(' || t.DATA_LENGTH || ')', t1.COMMENTS FROM User_Tab_Cols t, User_Col_Comments t1WHERE t.table_name......

wertwang
今天
0
0
Java 之 反射

反射,剖析 Java类 中的 各个组成部分,映射成 一个个 Java对象,多用于 框架和组件,写出复用性高的通用程序。 测试类代码如下: class Person { private String name; public St...

绝世武神
今天
0
0
华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大

华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大!华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大! 在华为最新发布的nova 3手机上,抖音通过华为himedia SDK集成了60fps、超级...

华为终端开放实验室
今天
0
0
多 SSH Key 实现同一台服务器部署多 Git 仓库

本文以以下需求为背景,介绍详细的做法: 需在同一台服务器同时部署两个不同的 Github 仓库(对 Bitbucket 等 git 服务同样适用) root 用户可在远程登录 SSH 后附上预期的 SSH Key 进行 gi...

yeahlife
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部