CodeBrowser3.3版本发布

归类于程序人生 一条评论

这个版本的主要更新如下

1.带代码编码检测功能,常见的编码都能自动检测分析出来,中文不再悲剧

2.带代码编码选择功能,机器也会出错,万一检测出错,还可以手动选择编码,双保险

3.支持更多代码文件,基本上常见不常见的代码都能高亮,而且无序保证代码后缀名,直接自动探测代码语言

然后就感谢以下开源项目带来的帮助:
http://code.google.com/p/google-code-prettify
http://cpdetector.sourceforge.net/

详情请查看官方更新页面

http://www.zerob13.in/codebrowser/

52 views , , , ,

CodeBrowser2.6 新春特别版

归类于程序人生 20 条评论

下载地址:http://cid-d94239a09a81fece.office.live.com/self.aspx/.Public/CoderBrowser2.6.apk

更新如下:

  1. 修复了一些小bug
  2. 可以打开cxx,hpp等当时未考虑到的C语言源文件
  3. 修改了配色,大气的黑色背景强势回归
  4. 更新了高亮的js代码,速度略上升(基本上感觉不出来,囧)
  5. 缓存文件位置改变,不再是放在卡上,缓存放在了手机上,速度有提升

截图如下:

288 views , , , , , , ,

趣味玩意,用Arduino开发板做CPU监视器

归类于程序人生 14 条评论

Arduino是什么?
不知道自己google去,简单的说就是一个给我这种嵌入式完全不懂的文盲来做机器人之流的电子小玩意的平台,开发很简单,就是类似与c语言的语法,上手极快,关键是还可以通过一定的手段和Andriod联动。
好吧,这次和Andriod无关,只是我突发奇想罢了。我一直希望有个小屏幕可以监视我的系统状态,比如CPU占用,内存占用等等。可惜最便宜的usb屏幕也要1000多块,太贵了,不实惠,于是就萌发用Arduino自己做一个。
设备很简单,就是一块Arduino的板子,一块LCD1602屏幕,一台MAC。我就只做了一个简单的CPU占用的东西,如图:

IMG_9191

先说说我的思路吧,首先从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);       
    }
  }
 
}

最后再上一个图~哈:

IMG_9194

507 views , , , , ,

趣味:c语言递归main函数打印hello字样

归类于程序人生 7 条评论

今天下午没课,正好想起一个比较蛋疼的事情可以做,就是玩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 , , , , , , , , ,

CodeBrowser2.1

归类于程序人生 12 条评论

今天爆走了。。。
这个版本主要改变如下
1 修复了文件选择菜单的点选范围问题
2 支持返回按键返回上一层文件夹
3 支持在浏览代码的时候用返回按键返回到文件选择选择另外的代码文件
4 优化了稳定性,退出时会自动清楚掉进程
下面给出下载地址

猛击这里下载CodeBrowser2.1

380 views , , , , , ,

CodeBrowser——android上的代码阅读器

归类于程序人生 一条评论

这个也就是新的CodeReader了
版本号是1.6版本,依然只支持java和c语言的代码高亮
先上截图,再讲更新内容






主要的更新如下:

  • 改善了文件选择页面的界面
  • 优化了染色算法,速度加快
  • 去掉了webview,改用TextView实现高亮,无需写入临时文件
  • 修复了屏幕切换的bug,切换后无需重新选择文件
  • 下载地址如下
    猛击这里下载CodeBrowser1.6

    1,038 views , , , , , , ,

    Bmp2Asc 所谓的短学期设计

    归类于程序人生 参与评论

    话说2个礼拜前在学校是做短学期,然后做完了就回家去了~恩,现在都结束了,在清理电脑的时候发现了这个代码~
    反正也没什么用了,贴一下留作纪念吧
    程序很简单,就是一个把bmp图片转化成asc字符画的程序~
    三个.c文件三个.h文件~
    其实这几个.h文件写的不是很好,如果写一下#ifdef的话应该会更加好
    先是bmp文件读写的.h文件和.c

    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 ;
     
    }

    之后是比较重要的一个.h函数,定义了bmp文件的一些信息

    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;
    }

    最后是makefile~

    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上的代码浏览器

    归类于程序人生 2 条评论

    一直希望在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 , , , , ,

    顶部