这个版本的主要更新如下
1.带代码编码检测功能,常见的编码都能自动检测分析出来,中文不再悲剧
2.带代码编码选择功能,机器也会出错,万一检测出错,还可以手动选择编码,双保险
3.支持更多代码文件,基本上常见不常见的代码都能高亮,而且无序保证代码后缀名,直接自动探测代码语言
然后就感谢以下开源项目带来的帮助:
http://code.google.com/p/google-code-prettify
http://cpdetector.sourceforge.net/
详情请查看官方更新页面
安静的做技术,宁静的搞摄影,平静的写文章
这个版本的主要更新如下
1.带代码编码检测功能,常见的编码都能自动检测分析出来,中文不再悲剧
2.带代码编码选择功能,机器也会出错,万一检测出错,还可以手动选择编码,双保险
3.支持更多代码文件,基本上常见不常见的代码都能高亮,而且无序保证代码后缀名,直接自动探测代码语言
然后就感谢以下开源项目带来的帮助:
http://code.google.com/p/google-code-prettify
http://cpdetector.sourceforge.net/
详情请查看官方更新页面
52 views

288 views
Arduino是什么?
不知道自己google去,简单的说就是一个给我这种嵌入式完全不懂的文盲来做机器人之流的电子小玩意的平台,开发很简单,就是类似与c语言的语法,上手极快,关键是还可以通过一定的手段和Andriod联动。
好吧,这次和Andriod无关,只是我突发奇想罢了。我一直希望有个小屏幕可以监视我的系统状态,比如CPU占用,内存占用等等。可惜最便宜的usb屏幕也要1000多块,太贵了,不实惠,于是就萌发用Arduino自己做一个。
设备很简单,就是一块Arduino的板子,一块LCD1602屏幕,一台MAC。我就只做了一个简单的CPU占用的东西,如图:
先说说我的思路吧,首先从Mac上通过一个程序读取到CPU占用率,然后通过串口发送到板子上,板子上缓冲一下,再输出到LCD屏幕。流程非常简单。不过问题还是蛮多。
首先,怎么读取CPU占用率?
我先是打算用Cocoa的系统函数来调用,查了半天Mac的资料后果断放弃,太复杂了,而且我Object-c又不是很熟悉。之后的想法是打算利用shell程序来完成,通过C和shell中的top命令交互来实现。这里有个小插曲,因为Linux下面其实读取这些可以直接去/proc/这个虚拟目录下读取,但是Mac这类系统是没有这个虚拟目录的,所以只能用top,而且Mac的top函数的参数又和Linux之类的GNU的top不同。总之折腾了很久,才有了下面这句销魂的shell命令
1 | $ top -n0 -l1 |
啥意思?很简单,就是不要显示进程,top执行一次就自动退出,就那么简单。至于为什么可以达到这样的效果,请有mac或者别的BSD系统的同学man top一下就好。
有了这个就方便的多了,c语言部分去掉串口通讯的就只很简单的一部分了,就是调用shell函数,返回,字符串处理,这几个问题。串口通讯的代码早就很熟悉了,最近一直开发这种东西(其实python下面串口通讯会简单的多,不过我比较熟悉C,所以还是选择了C)
关键代码如下:
1 2 3 4 | FILE *fp; char a[256]; fp=popen("top -n0 -l1","r"); fgets(a,sizeof(a),fp) |
之后的过程势如破竹,Arduino平台上的更加容易,就是简单的读写罢了。直接上代码就好:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); byte line = 0; // track which line of the display we are on void setup(){ // set up the LCD's number of columns and rows: lcd.init(); lcd.backlight(); // initialize the serial communications: Serial.begin(9600); lcd.setCursor(0,0); lcd.clear(); } void loop() { char input; while(Serial.available() > 0) { input = Serial.read(); switch(input) { case 0: // line feed lcd.clear(); break; default: if(input>31) lcd.print(input); } } } |
最后再上一个图~哈:
507 views
今天下午没课,正好想起一个比较蛋疼的事情可以做,就是玩c语言的main函数递归。
首先还是说一下我的编译环境,哪些用m$的c语言编译器的朋友可以忽略这个文章了,放心吧,正常情况下是编译不通过的。。。
我的gcc版本是4.2.1。
先贴上代码~
1 2 3 4 5 6 7 8 9 | #include<stdio.h> #define ____ int #define _o_ double #define _O_(x) printf("%c",x) #define ___(x) 1.0+1199.0*x/12.0-799.0*x*x/24.0+55.0*x*x*x/12.0-5.0*x*x*x*x/24.0 main(____ __) { _o_ _;if(!__)main(1);else if(__==6)return;else{_=___(__);_O_((____)(_+0.5));main(__+1);} } |
跑出来就是一个不换行的Hello
哈哈,这个代码看着很恶心吧。好吧,让我给你翻译一下~如果我把上述代码的define还有一些变量整理一下,那就是这样的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include<stdio.h> int main(int argc) { int x; double ans; if(argc==0) main(1); else{ x=argc; if(x==6) return; else{ ans=1.0+1199.0*x/12.0-799.0*x*x/24.0+55.0*x*x*x/12.0-5.0*x*x*x*x/24.0; printf("%c",(int)(ans+0.5)); main(x+1); } } } |
现在看明白了么?
关键就是这句
ans=1.0+1199.0*x/12.0-799.0*x*x/24.0+55.0*x*x*x/12.0-5.0*x*x*x*x/24.0;
这个通项正是有穷数列72,101,108,108,111的通项。那么我是如何得到这个表达式的呢?
很简单,用多项式的拉格朗日插值公式就可以解决这个问题。
先把公式贴上来。

至于这个公式是怎么推导出来的,你可以看看这篇论文,讲解的很详细,这里就不复制过来了,哈哈
http://www.lw23.com/pdf_d659df85-fb38-47e6-ac02-147a12d2bab3/lunwen.pdf
有了这个通项就简单了,只要不断递归main函数,理论上可以答应出任意的函数出来。
ps:我求通项的时候用Mathematica来计算的,毕竟当数据多了,展开是个很麻烦的事情。。。然后又先用python写了个函数验证了通项正确后才改写成c的本身递归模式。囧
165 views
380 views
1,038 views
1 2 3 4 5 6 7 8 9 10 11 12 | /* * bmpRW.h * bmp2ascii * * Created by zerob13 on 6/30/10. * Copyright 2010 __MyCompanyName__. All rights reserved. * */ #include<string.h> #include <stdio.h> #include<stdlib.h> int BmpRead(char*,unsigned char *,BITMAPINFOHEADER *); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | /* * bmpRW.cpp * bmp2ascii * * Created by zerob13 on 6/30/10. * Copyright 2010 __MyCompanyName__. All rights reserved. * */ #include "Typedef.h" #include "bmpRW.h" int BmpRead(char* fp,unsigned char *pimage,BITMAPINFOHEADER *bb){ BITMAPFILEHEADER *bmpfh; //bmp文件头指针 BITMAPINFOHEADER *bmpih; //bmp文件信息头指针 unsigned char *data; //bmp文件数据指针 int i=0; int IMAGE_SIZE; /* bmp文件头读取 */ FILE *file=fopen(fp,"rb+"); bmpfh=(BITMAPFILEHEADER*)malloc(sizeof(BITMAPFILEHEADER)); if(!bmpfh) { printf("Memory not enough!\n"); exit(1); } fseek(file,sizeof(short),SEEK_SET); fread(bmpfh,sizeof(BITMAPFILEHEADER),1,file); /* bmp文件信息头读入 */ bmpih=(BITMAPINFOHEADER*)malloc(sizeof(BITMAPINFOHEADER)); if(!bmpih) { printf("Memory not enough!\n"); exit(1); } fseek(file,sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET); fread(bmpih,sizeof(BITMAPINFOHEADER),1,file); /* bmp文件数据读入 */ IMAGE_SIZE=(bmpih->biSizeImage); data=(unsigned char*)calloc(IMAGE_SIZE,sizeof(char)); if(!data) { printf("Memory not enough!\n"); exit(1); } fseek(file,bmpfh->bfOffBits,SEEK_SET); fread(data,IMAGE_SIZE,1,file); fclose(file); for(i=0;i<IMAGE_SIZE;i++ ) { *(pimage+i)=*(data+i); } memcpy(bb,bmpih,sizeof(BITMAPINFOHEADER)); free(data); free(bmpih); free(bmpfh); return IMAGE_SIZE; } |
1 2 3 4 5 6 7 8 9 10 | /* * buff2asc.h * bmp2ascii * * Created by zerob13 on 7/1/10. * Copyright 2010 __MyCompanyName__. All rights reserved. * */ void buff2asc(int ,int ,int ,unsigned char *,char ansmap[][Max_W]); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | /* * buff2asc.c * 转换ascii函数 * * Created by zerob13 on 7/1/10. * Copyright 2010 __MyCompanyName__. All rights reserved. * */ #include"Typedef.h" #include"bmpRW.h" #include "buff2asc.h" void buff2asc(int size,int h,int w,unsigned char *buffer,char ansmap[][Max_W]){ int i,j,k; i=j=0; for(k=0;k<size;k+=3) { if(buffer[k]!=255){ ansmap[i][j++]=' '; } else{ ansmap[i][j++]='@'; } if(j==w) { while(k%4){ //bmp文件每行必须%4为0 k++; //否则要用0x00补足 } //故这里要通过这个去掉补足用的0x00 j=0; i++; } } return ; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | /* * Typedef.h * bmp2ascii * This file includes all types about bmp. * Created by zerob13 on 6/30/10. * Copyright 2010 __MyCompanyName__. All rights reserved. * */ typedef short WORD; typedef int DWORD; typedef unsigned int LONG; typedef char BYTE; #define Max_W 800 #define Max_H 800 /* *位图文件头 * */ typedef struct tagBITMAPFILEHEADER { //WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER; /* *位图信息头 * */ typedef struct tagBITMAPINFOHEADER{ DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; } BITMAPINFOHEADER; /* *颜色表 */ typedef struct tagRGBQUAD { BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; } RGBQUAD; /* *位图信息 * */ typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; } BITMAPINFO; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | /* * main.c * 主函数部分 * * Created by zerob13 on 7/1/10. * Copyright 2010 __MyCompanyName__. All rights reserved. * */ //头文件部分 #include"Typedef.h"//bmp文件类型的头文件 #include"bmpRW.h"//bmp文件读写头文件 #include"buff2asc.h"//转换为ascii的头文件 int main (int argc, char * const argv[]) { unsigned char *buffer;//缓冲区,用于储存图片色彩矩阵 int size;//图片大小 BITMAPINFOHEADER *bmpih;//图片信息头,用于获取图片分辨率 int w,h;//图片分辨率 char fp[2048],fp2[2048];//输入文件,输出文件的地址 char ansmap[Max_H][Max_W];//输出ascii矩阵 int i,j; FILE *out;//输出文件指针 //获取空间 buffer=(unsigned char*)malloc(3*Max_W*Max_H); bmpih=(BITMAPINFOHEADER*)malloc(sizeof(BITMAPINFOHEADER)); //判断工作模式,图片地址是否已经从参数中输入 if(argc==1){ printf("please input your file:)\n"); scanf("%s",fp); }else{ if(argc==2) { strcpy(fp,argv[1]); }else{ printf("Error\n"); exit(1); } } //生成输出文件 strcpy(fp2,fp); strcat(fp2,"-answer.txt"); out=fopen(fp2,"w+"); //读入数据 size=BmpRead(fp,buffer,bmpih); i=0;j=0; h=bmpih->biHeight; w=bmpih->biWidth; //转换图像 buff2asc(size,h,w,buffer,ansmap); //输出结果 for(i=h-1;i>=0;i--) { fwrite(ansmap[i],sizeof(ansmap[i]),1,out); for(j=0;j<w;j++) { printf("%c",ansmap[i][j]); } puts(""); fwrite("\n",sizeof("\n"),1,out); } fclose(out); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 | CC=gcc bmp2ascall:main.o bmpRW.o buff2asc.o $(CC) -o $@ $^ buff2asc.o:buff2asc.c bmpRW.h Typedef.h buff2asc.h $(CC) -c $< bmpRW.o:bmpRW.c bmpRW.h Typedef.h $(CC) -c $< main.o:main.c bmpRW.c buff2asc.c bmpRW.h Typedef.h buff2asc.h $(CC) -c $< clean: rm main.o bmpRW.o buff2asc.o |
125 views
新手,比较简单,凑合看看~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 | /* Copyright (C) 2010 zerob13 <zerob13@gmail.com> */ #include <iostream> #include<time.h> #include<stdlib.h> #include<stdio.h> #include<string.h> using namespace std; #define MAXNUM 1023;//种群范围 #define NUMLEN 10//种群编码长度 #define STNUM 200//种群个体数目 #define PC 0.007//变异率 #define AGE 100//迭代种群代数 double Fsun;//储存所有值的和 void itoa(int a,int ans[])//输入整数a,和数组ans,然后,a的二进制会存放在ans里。(当然你也可以直接用系统自带的itoa) { int i,j; int co=0; while(a!=1&&a){ ans[co++]=a%2; a/=2; } if(a) { ans[co++]=1; } for(i=0,j=NUMLEN-1;i<j;j--,i++) { ans[i]^=ans[j]; ans[j]^=ans[i]; ans[i]^=ans[j]; } } int atoi2(int ans[])//输入二进制数组返回整数值 如数组ans[]={0,0,0,0,0,1,0,1},就会返回5 { int an=0,i; for(i=0;i<NUMLEN;i++) { an+=ans[i]*(1<<(NUMLEN-1-i)); } return an; } void getrand(int ra[])//获取1~MAXNUM的随机初始种群 放在你输入的数组ra[]中 { srand(time(NULL)); for(int i=0;i<STNUM;i++) { ra[i]=1+rand()%MAXNUM; } } void getP(double P[])//获取0~1随机数 放在你输入的数组P[]中,作为选择概率用 { srand(time(NULL)); for(int i=0;i<STNUM;i++) { P[i]=double(rand()%10000)/10000.0; } } int getValue(int va)//获取适应度 { return va*va; } double getchoseP(int va)//获取选择概率 { return (double)va/Fsun; } void creatAP(double P[],double AP[])//获取积累概率 { int i,j; for(i=0;i<STNUM;i++) { AP[i]=0.0; for(j=0;j<=i;j++) { AP[i]+=P[j]; } } return ; } int getPcNum()//获取变异位数 { return (int)(PC*NUMLEN*STNUM); } void Exchange(int ans[STNUM][NUMLEN])//交叉运算 { int i,j,k,c; k=getPcNum(); for(i=0;i<STNUM-1;i+=2) { for(j=NUMLEN-5;j<NUMLEN;j++) { ans[i][j]^=ans[i+1][j]; ans[i+1][j]^=ans[i][j]; ans[i][j]^=ans[i+1][j]; } } while(k--){ c=rand()%(NUMLEN*STNUM); ans[c/NUMLEN][c%STNUM]^=1; } return ; } int main (int argc, char * const argv[]) { int ans[STNUM][NUMLEN]; int ra[STNUM]; int rb[STNUM]; int i,j; double P[STNUM]; double AP[STNUM]; double Cp[STNUM]; int maxx,maxn; int flag=0; memset(ans,0,sizeof(ans)); for(Fsun=0,i=1;i<512;i++) { Fsun+=getValue(i); } maxx=0; maxn=0; getrand(ra); for(i=0;i<STNUM;i++){ if(maxx<getValue(ra[i])) { maxx=getValue(ra[i]); maxn=ra[i]; } } while(flag<AGE) { flag++; for(i=0;i<STNUM;i++) { Cp[i]=getchoseP(getValue(ra[i])); } creatAP(Cp,AP); getP(P); for(i=0;i<STNUM;i++) { for(j=0;j<STNUM;j++) { if(j==0) { if(P[i]<=AP[j]) { rb[i]=ra[j]; break; } }else { if(P[i]<=AP[j]&&P[i]>AP[j-1]){ rb[i]=ra[j]; break; } } } itoa(rb[i],ans[i]); } Exchange(ans); for(i=0;i<STNUM;i++) { ra[i]=atoi2(ans[i]); if(getValue(ra[i])>maxx) { flag=0; maxn=ra[i]; maxx=getValue(ra[i]); } } } printf("%d\n",maxn); return 0; } |
275 views
一直希望在android上看代码~不过貌似一直没找到好的软件~
所以嘛,自己动手丰衣足食啦~~~
0.1版本只支持java/c/c++高亮(因为自己对这几个语言比较熟悉。。。)
写了两天,基本上能用了。
截图如下~
APK文件我也发上来吧,喜欢的朋友可以拿去用~
Codereader 0.1.apk
313 views
这次的人工智能布置了一个作业,就是用遗传算法求出y=x^2在x属于[1~511]之间的最大值。要用到随机数,二进制转换之类的功能。
所以就随手写了几个,方便需要的朋友拿去使用。
核心算法部分我删掉了。就提供我写的几个小函数,方便大家专注与核心代码的书写。
itoa是用来转换一个整数到二进制的
atoi是把二进制转化成整数的
getrand是用来获取随机初始种群的
getP是用来获取选择概率的
上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | /* Copyright (C) 2010 zerob13 <zerob13@gmail.com> */ #include <iostream> #include<time.h> #include<stdlib.h> #include<stdio.h> #include<string.h> using namespace std; #define MAXNUM 511;//种群范围 #define NUMLEN 8//种群编码长度 #define STNUM 6//种群个体数目 void itoa(int a,int ans[])//输入整数a,和数组ans,然后,a的二进制会存放在ans里。(当然你也可以直接用系统自带的itoa) { int i,j; int co=0; while(a!=1&&a){ ans[co++]=a%2; a/=2; } if(a) { ans[co++]=1; } for(i=0,j=NUMLEN-1;i<j;j--,i++) { ans[i]^=ans[j]; ans[j]^=ans[i]; ans[i]^=ans[j]; } } int atoi(int ans[])//输入二进制数组返回整数值 如数组ans[]={0,0,0,0,0,1,0,1},就会返回5 { int an=0,i; for(i=0;i<NUMLEN;i++) { an+=ans[i]*(1<<(7-i)); } return an; } void getrand(int ra[])//获取1~MAXNUM的随机初始种群 放在你输入的数组ra[]中 { srand(time(NULL)); for(int i=0;i<STNUM;i++) { ra[i]=1+rand()%MAXNUM; } } void getP(double P[]){//获取0~1随机数 放在你输入的数组P[]中,作为选择概率用 srand(time(NULL)); for(int i=0;i<STNUM;i++) { P[i]=double(rand()%10000)/10000.0; } } void _test_itoa(int ans[])//测试函数 { itoa(5,ans); for(int i=0;i<NUMLEN;i++) { printf("%d",ans[i]); } puts(""); } void _test_NUM(int ans[])//测试函数 { _test_itoa(ans); printf("%d\n",atoi(ans)); } void _test_rand(int ra[],double P[])//测试函数 { getrand(ra); getP(P); for(int i=0;i<STNUM;i++) { printf("%4d",ra[i]); } puts(""); for(int i=0;i<STNUM;i++) { printf("%lf ",P[i]); } puts(""); } int main (int argc, char * const argv[]) { int ans[NUMLEN]; int ra[STNUM]; double P[STNUM]; memset(ans,0,sizeof(ans)); _test_NUM(ans); _test_rand(ra,P); return 0; } |
181 views