以下是小编为大家准备的字符转点字符点阵的函数及示例,本文共7篇,仅供参考,欢迎大家阅读。本文原稿由网友“shmilus”提供。
篇1:字符转点字符点阵的函数及示例
函数|示例
写程序的时候突然想到的方法,感觉简单又好用,一个实用函数,所以发出来,下面是这个函数:
function txtToPosArr(dt:String, w:Number, h:Number):Array {
/*
* author: fanflash(www.fanflash.cn)
* date: -5-14
* info: 将文字转为点阵诸存
* -----Parameters-------
* dt: 要转换成字符串的字符
* w: 两点像素点之间的横轴间距
* h: 两点像素点之间的纵轴间距
* note: 如果想增加点的密度,可以把文本字号设置大些
*/
//检查参数的可用性
w = (w != undefined) ? w : 0;
h = (h != undefined) ? h : 0;
var t_txt:TextField = _root.createTextField(“txtToPosTxt”, _root.getNextHighestDepth, -500, -500, 100, 100);
//设置文本
t_txt.autoSize = true;
t_txt.multiline = false;
t_txt.wordWrap = false;
t_txt.selectable = false;
t_txt.text = dt;
t_txt._visible = false;
//生成图片数据
var txtBmp:flash.display.BitmapData = new flash.display.BitmapData(t_txt._width, t_txt._height, false, 0xffffff);
txtBmp.draw(t_txt);
//创建文字数组
var t_arr:Array = new Array();
var pix:Number;
for (var y = 0; y
for (var x = 0; x
if (txtBmp.getPixel(x, y) != 0xffffff) {
t_arr.push({x:x+x*w, y:y+y*h});
}
}
}
//删除创建的文字
t_txt.removeTextField();
txtBmp.dispose();
return t_arr;
}
原理很简单,利用BITMAP类把黑色的点选出来,因为白色的是背景,所以只要是黑色的点,那么都是笔划和线条了.下面是一个用此函数的示例程序:
源程序:
//welcome to www.fanflash.cn
System.useCodepage = true;
Stage.scaleMode = “noScale”;
Stage.showMenu = false;
function main() {
var t:Array;
ok_btn.onPress = function() {
removeMC();
t = txtToPosArr(input_txt.text, 4, 4);
for (var i in t) {
createMC(t.x, t.y);
}
};
}
function txtToPosArr(dt:String, w:Number, h:Number):Array {
/*
* author: fanflash(www.fanflash.cn)
* date: 2007-5-14
* info: 将文字转为点阵诸存
* -----Parameters-------
* dt: 要转换成字符串的字符
* w: 两点像素点之间的横轴间距
* h: 两点像素点之间的纵轴间距
* note: 如果想增加点的密度,可以把文本字号设置大些
*/
//检查参数的可用性
w = (w != undefined) ? w : 0;
h = (h != undefined) ? h : 0;
var t_txt:TextField = _root.createTextField(“txtToPosTxt”, _root.getNextHighestDepth(), -500, -500, 100, 100);
//设置文本
t_txt.autoSize = true;
t_txt.multiline = false;
t_txt.wordWrap = false;
t_txt.selectable = false;
t_txt.text = dt;
t_txt._visible = false;
//生成图片数据
var txtBmp:flash.display.BitmapData = new flash.display.BitmapData(t_txt._width, t_txt._height, false, 0xffffff);
txtBmp.draw(t_txt);
//创建文字数组
var t_arr:Array = new Array();
var pix:Number;
for (var y = 0; y
for (var x = 0; x
if (txtBmp.getPixel(x, y) != 0xffffff) {
t_arr.push({x:x+x*w, y:y+y*h});
}
}
}
//删除创建的文字
t_txt.removeTextField();
txtBmp.dispose();
return t_arr;
}
import flash.filters.GlowFilter;
import mx.transitions.Tween;
import mx.transitions.easing.*;
function createMC(x:Number, y:Number) {
//点陈坐标偏移
x += 50;
y += 150;
//补间动画样式
var tweenFun:Function = Back.easeOut;
var d:Number = _root.getNextHighestDepth();
var _mc:MovieClip = _root.attachMovie(“dot”, “dot”+d, d);
_mc.cacheAsBitmap = true;
//_mc.filters = [new GlowFilter(Math.round(Math.random()*0xffffff))];
_mc.filters = [new GlowFilter(0xffffff)];
_mc._x = Math.random()*Stage.width;
_mc._y = Math.random()*Stage.height;
var xt:Number = 1+Math.round(Math.random()*2);
var yt:Number = 1+Math.round(Math.random()*2);
new Tween(_mc, “_x”, tweenFun, _mc._x, x, xt, true);
new Tween(_mc, “_y”, tweenFun, _mc._y, y, yt, true);
}
function removeMC() {
for (var m in _root) {
if (_root[m]._name.substr(0, 3) == “dot”) {
_root[m].removeMovieClip();
}
}
}
main();
源程序下载:点击这里下载源文件
篇2:C++ 中字符大小写转换的函数
首先判断
如果是小写:
if(islower(str[i]))
把小写字母变成大写字母,函数就是toupper
str[i] = toupper(str[i]);
else
如果是大写字母,变成小写字母函数是:tolower
str[i] = tolower(str[i]);
检测大写字母是:isupper
检测小写字母是:islower
大写------->小写:tolower
小写-------->大写:toupper
例子
代码:
#include
#include
#include
#define MAXN 21
using namespace std;
char str[MAXN];
int main()
{
cin>>str;
for(int i = 0; i < strlen(str); i++)
{
if(islower(str[i]))
str[i] = toupper(str[i]);
else if(isupper(str[i]))
str[i] = tolower(str[i]);
}
cout<
return 0;
}
篇3:妙用Excel隐藏函数Phonetic合并区域字符
朋友抱怨Excel中链接文本的函数Concatenate并不方便,不能轻松地将一个区域内的文本一股脑地链接在一起,但是Office中有一些隐藏函数,这些隐藏函数常常会带给我们一些惊喜,比如Excel中的一个隐藏函数Phonetic就能够方便地将文本链接在一起。
编注:CONCATENATE 函数简介
适用范围: Microsoft Office SharePoint Server , Windows SharePoint Services 3.0
功能:将多个文本字符串合并为一个文本字符串。
语法:CONCATENATE(text1,text2,...)
Text1, text2,... 1 到 30 个将要合并为单个文本项的文本项。这些文本项可以是文本字符串、数字或列引用。
Phonetic函数的帮助文件解释为“该函数只适用于日文版”,按理说,它不应该出现在中文版Excel中。可事实上,它一直存在,只是没人使用过它,因为此函数是用来提取日文文本字符串中的拼音字符的。
一个偶然的机会,我发现此函数可以用在中文版Excel中。在D1单元格输入公式=PHONETIC(A1:C4),得到的结果正是我们梦寐以求的“合并区域字符”。在中文版Excel中使用此函数时,帮助文件中的说明(如果reference为单元格区域,则返回区域左上角单元格中的furigana文本字符串,
如果reference为不相邻单元格的区域,将返回错误值#N/A)纯属“误导”。
微软在线帮助:
PHONETIC函数
适用范围: Microsoft Office Excel
功能:提取文本字符串中的拼音 (furigana) 字符。该函数只适用于日文版。
语法:PHONETIC(reference)
Reference 为文本字符串或对单个单元格或包含 furigana 文本字符串的单元格区域的引用。
说明
如果 reference 为单元格区域,则返回区域左上角单元格中的 furigana 文本字符串。
如果 reference 为不相邻单元格的区域,将返回错误值 #N/A。
以下是此函数的一个实例。比较表二中数据是否有与表一数据完全重复。在J2单元格输入公式=SUM((PHONETIC(OFFSET($A$2:$D$2,ROW($1:$5),))=PHONETIC(F3:I3))*1)按三键(CTRL+SHIFT+ENTER)结束录入,向下复制公式,如表二数据与表一有完全重复,则公式结果会大于等于1,否则为0。
进一步测试发现,此函数会将区域引用中的逻辑值、错误值、数值、公式全部忽略。此特性可以很容易区分文本与结果为文本的公式。,单元格B10输入公式=IF(ISTEXT(A10)*(PHONETIC(A10)=“”),“公式”,“文本”),单元格是文本的显示为“文本”,是公式的显示为“公式”。
篇4:妙用Excel隐藏函数Phonetic合并区域字符
有些朋友抱怨Excel中链接文本的函数Concatenate并不方便,不能轻松地将一个区域内的文本一股脑地链接在一起,但是Office中有一些隐藏函数,这些隐藏函数经常会带给我们一些惊喜,比如Excel中的一个隐藏函数Phonetic就能够方便地将文本链接在一起。
Phonetic函数的帮助文件解释为“该函数只适用于日文版”,按理说,它不应该出现在中文版Excel中。可事实上,它一直存在,只是没人使用过它,因为此函数是用来提取日文文本字符串中的拼音字符的。
一个偶然的机会,我发现此函数可以用在中文版Excel中。在D1单元格输入公式=PHONETIC(A1:C4),得到的结果正是我们梦寐以求的“合并区域字符”。在中文版Excel中使用此函数时,帮助文件中的说明(假如reference为单元格区域,则返回区域左上角单元格中的furigana 文本字符串,
假如reference为不相邻单元格的区域,将返回错误值#N/A)纯属“误导”。
以下是此函数的一个实例。比较表二中数据是否有与表一数据完全重复。在J2单元格输入公式=SUM((PHONETIC(OFFSET($A$2:$D$2,ROW($1:$5),))=PHONETIC(F3:I3))*1)按三键 (CTRL+SHIFT+ENTER)结束录入,向下复制公式,如表二数据与表一有完全重复,则公式结果会大于等于1,否则为0。
进一步测试发现,此函数会将区域引用中的逻辑值、错误值、数值、公式全部忽略。此特性可以很轻易区分文本与结果为文本的公式。,单元格B10输入公式=IF(ISTEXT(A10)*(PHONETIC(A10)=“”),“公式”,“文本”),单元格是文本的显示为“文本”,是公式的显示为“公式”。
篇5:LeetCode Roman to Integer 罗马字符转数字 解题报告
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
把一个给定的罗马字符转为数字,首先要了解罗马字符表示的规则。
一,_R底止灿7,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。
二,在^大的_R底值挠疫上^小的_R底郑表示大底旨有底郑例如:VI(6),VIII(8),LV(55=50 + 5),LX(60=50 + 10)
三,在^大的_R底值淖筮上^小的_R底郑表示大底旨跣底郑例如:IX(9),XL(40=50 - 10),XC(90=100 - 10)
四,左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV。
五,左pr不可跨越一位怠1热纾99不可以用IC(100 - 1)表示,而是用XCIX([100 - 10] + [10 - 1])表示。
解题思路,有二条处理逻辑:
一,判断当前字符是否比next字符小,如果小的话需要用下一个字符减去当前字符加到最终结果字符身上,
二,否则的话,就把当前字符直接加到最终结果字符。
下面是AC代码:
public class Solution {HashMap
篇6:Lua判断字符串中包含中文字符的方法和计算字符串宽度函数
这篇文章主要介绍了Lua判断字符串中包含中文字符的方法和计算字符串宽度函数分享,需要的朋友可以参考下
一、判断字符串中包含中文字符的方法
遍历数组,对每个字节使用string.byte(),发现有大于127的,就是汉字,可以参照下面的代码,
二、计算字符串宽度函数
代码如下:
-- 计算字符串宽度
local str = “Jimmy: 你好,世界!”
local fontSize = 20
local lenInByte = #str
local width = 0
for i=1,lenInByte do
local curByte = string.byte(str, i)
local byteCount = 1;
if curByte>0 and curByte<=127 then
byteCount = 1
elseif curByte>=192 and curByte<223 then
byteCount = 2
elseif curByte>=224 and curByte<239 then
byteCount = 3
elseif curByte>=240 and curByte<=247 then
byteCount = 4
end
local char = string.sub(str, i, i+byteCount-1)
i = i + byteCount -1
if byteCount == 1 then
width = width + fontSize * 0.5
else
width = width + fontSize
print(char)
end
end
print(“总宽度: ”..width)
篇7:对一个字符数组连续用gets函数出现的问题(缓冲区内容补充)
昨天调试程序(见下面代码)遇到下面一个问题:
#include
咦!!!我还没从键盘输入字符串,他怎么就执行下一步了呢???????
对代码进行调试:
此时内存:
再点击下一步:
咦??????数组中的“----->>0 <<-----”哪来的???百思不得其解!
查阅大量资料原来和缓冲区有关,首先了解下缓冲区:
C++编程对缓冲区的理解
什么是缓冲区
缓冲区又称为缓存,它是内存空间的一部分,也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。
缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
为什么要引入缓冲区
我们为什么要引入缓冲区呢?
比如我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。
又比如,我们使用打印机打印文档,由于打印机的打印速度相对较慢,我们先把文档输出到打印机相应的缓冲区,打印机再自行逐步打印,这时我们的CPU可以处理别的事情。
现在您基本明白了吧,缓冲区就是一块内存区,它用在输入输出设备和CPU之间,用来缓存数据。它使得低速的输入输出设备和高速的CPU能够协调工作,避免低速的输入输出设备占用CPU,解放出CPU,使其能够高效率工作。
缓冲区的类型
缓冲区 分为三种类型:全缓冲、行缓冲和不带缓冲。
1、全缓冲
在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写。
2、行缓冲
在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。典型代表是键盘输入数据。
3、不带缓冲
也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。
缓冲区的刷新
下列情况会引发缓冲区的刷新:
1、缓冲区满时;
2、执行flush语句;
3、执行endl语句;
4、关闭文件。
可见,缓冲区满或关闭文件时都会刷新缓冲区,进行真正的I/O操作。另外,在C++中,我们可以使用flush函数来刷新缓冲区(执行I/O操作并清空缓冲区),如:
cout<
endl控制符的作用是将光标移动到输出设备中下一行开头处,并且清空缓冲区。
cout<
相当于
cout<<” ” <
通过实例演示说明
1、文件操作演示全缓冲
创建一个控制台工程,输入如下代码:
#include
上面这段代码很容易理解,已经在代码内部作了注释,
编写这段小代码的目的是验证WindowsXP下全缓冲的大小是4096个字节,并验证缓冲区满后会刷新缓冲区,执行真正的I/O操作。
编译并执行,运行结果如下:
此时打开工程所在文件夹下的test.txt文件,您会发现该文件是空的,这说明4096个字符“a”还在缓冲区,并没有真正执行I/O操作。敲一下回车键,窗口变为如下:
此时再打开test.txt文件,您就会发下该文件中已经有了4096个字符“a”。这说明全缓冲区的大小是4K(4096),缓冲区满后执行了I/O操作,而字符“b”还在缓冲区。
再次敲一下回车键,窗口变为如下:
此时再打开test.txt文件,您就会发现字符“b”也在其中了。这一步验证了文件关闭时刷新了缓冲区。
2、键盘操作演示行缓冲
先介绍getchar()函数。
函数原型:int getchar(void);
说明:当程序调用getchar()函数时,程序就等着用户按键,用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字符也放在缓冲区中)。当用户键入回车之后,getchar()函数才开始从键盘缓冲区中每次读入一个字符。也就是说,后续的getchar()函数调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才重新等待用户按键。
不知道您明白了没有,再通俗一点讲,当程序调用getchar()函数时,程序就等着用户按键,并等用户按下回车键返回。期间按下的字符存放在缓冲区,第一个字符作为函数返回值。继续调用getchar()函数,将不再等用户按键,而是返回您刚才输入的第2个字符;继续调用,返回第3个字符,直到缓冲区中的字符读完后,才等待用户按键。
如果您还没有明白,只能怨我表达能力有限,您可以结合以下实例体会。
创建一个控制台工程,输入如下代码:
#include
编译运行程序,会提示您输入字符,您可以交替按下一些字符,如下:您一直按下去,您就会发现当您按到第4094个字符时,不允许您继续输入字符。这说明行缓冲区的大小也是4K。此时您按下回车键,返回第一个字符’a’,如下图:继续敲一下回车键,将缓冲区的其它的字符全部输出,如下图:
3、标准错误输出不带缓冲如错误输出时使用:
cerr<<”错误,请检查输入的参数!”;
这条语句等效于:fprintf(stderr, ”错误,请检查输入的参数!”);
好了,就说到这吧,祝您好运,希望能对您有所帮助。
虽然有些图片看不到,但是该博主的描述使我获益匪浅!!!
看到这里我们一开始的问题也就迎刃而解了:
scanf(%d,&i);执行次代码后,1赋值给了i-------->>>>>但换行符enter却留在了缓冲区,下次执行gets函数时,由于缓冲区存在内容,所以gets函数不再等待用户输入,而是直接从缓冲区读取内容。
由于gets功能如下:
''====0(值相等---->>>>ASCII的0为NULL),这也就是一开始查看内存,ASCII0存在的原因!!!