SCILAB

SCILAB是一个类MATLAB软件,最近在做一个分齿算法,用到了它。

下面的代码是实现统计文本文件的某个字段功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
less80cnt=0;
datestr="20140703"
writecontent="";
rtmp="";
 
fpath="F:\132 data\line5\20140701-20140705\5\x\"+datestr;
flst=findfiles(fpath,"*.txt");
 
for fidx=1:size(flst,"r")
    fcontent=csvRead(fpath+"\"+flst(fidx),"\t",[],"string");
    for ridx=1:size(fcontent,"r")
        if(fcontent(ridx,1)=="80"&(fcontent(ridx,8)=="0"|fcontent(ridx,9)=="0"|fcontent(ridx,10)=="0"|fcontent(ridx,11)=="0"))
            rtmp=fcontent(ridx,1)+ascii(9)+fcontent(ridx,2)+ascii(9)+fcontent(ridx,5)+ascii(9)+fcontent(ridx,8)+ascii(9)+fcontent(ridx,9)+ascii(9)+fcontent(ridx,10)+ascii(9)+fcontent(ridx,11)++ascii(10)+ascii(13);
            writecontent=[writecontent;rtmp];
            disp(rtmp);
            less80cnt=less80cnt+1;
        end
    end
end
 
writecontent=[writecontent;"The motor of less 80 tooth in " + fpath + " has " + string(less80cnt)];
write("D:\Users\RD\Desktop\"+datestr+".txt",writecontent);

输出结果如下:

 80	201407032151430500105	5	2190	0	2303	2303
 
 
 80	201407032151430500105	10	0	0	2616	2616
 
 
 80	201407032206520500105	1	1971	0	2106	2106
 
 
 80	201407032213250500105	9	2558	0	2581	2581
 
 
 80	201407032227520500105	1	1935	1935	2331	0
 
 
 80	201407032235170500105	4	2266	2266	0	0
 
 
 80	201407032242260500105	7	2167	0	2364	2364
 
 
 80	201407032249590500105	2	0	0	0	0
 
 
 80	201407032249590500105	12	0	0	0	0
 
 
 80	201407032257020500105	8	1979	1979	0	0
 
 
 80	201407032305380500105	3	2349	0	2491	2491
 
 
 80	201407032312150500105	8	2396	2396	0	0
 
 
 80	201407032319170500105	6	0	0	2020	2020
 
 
 The motor of less 80 tooth in F:\132 data\line5\20140701-20140705\5\x\20140703 
 has 266

C语言实现九宫格

题目:
要求把1-9填入九宫格中,各方向的和均相等。

分析:
这个程序最重要的是如何找到1-9填入九宫格的所有组合

代码:

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
void grid_3x3()
{
	long num=123456789;
	int count=0;
	int x1,y1,z1,x2,y2,z2,x3,y3,z3;
	for(;num<=987654321;num++)
	{
		z3=num%10;
		if(z3==0)
			continue;
 
		y3=(num%100)/10;
		if(y3==0 || y3==z3)
			continue;
 
		x3=(num%1000)/100;
		if(x3==0 || x3==y3 ||x3==z3)
			continue;
 
		z2=(num%10000)/1000;
		if(z2==0 || z2==x3 || z2==y3 ||z2==z3)
			continue;
 
		y2=(num%100000)/10000;
		if(y2==0 || y2 == z2 || y2==x3 || y2==y3 ||y2==z3)
			continue;
 
		x2=(num%1000000)/100000;
		if(x2==0 || x2==y2 || x2 == z2 || x2==x3 || x2==y3 ||x2==z3)
			continue;
 
		z1=(num%10000000)/1000000;
		if(z1==0 || z1==x2 || z1==y2 || z1 == z2 || z1==x3 || z1==y3 ||z1==z3)
			continue;
 
		y1=(num%100000000)/10000000;
		if(y1==0 || y1 == z1 || y1==x2 || y1==y2 || y1 == z2 || y1==x3 || y1==y3 ||y1==z3)
			continue;
 
		x1=(num%1000000000)/100000000;
		if(x1==0 || x1==y1|| x1 == z1 || x1==x2 || x1==y2 || x1 == z2 || x1==x3 || x1==y3 ||x1==z3)
			continue;
 
		if(x1+y1+z1==x2+y2+z2 &&
			x2+y2+z2==x3+y3+z3 &&
			x3+y3+z3==x1+x2+x3 &&
			x1+x2+x3==y1+y2+y3 &&
			y1+y2+y3==z1+z2+z3 &&
			z1+z2+z3==x1+y2+z3 &&
			x1+y2+z3==x3+y2+z1)
		{
			count++;
			printf("-- %d --\n",count);
			printf("%d  %d  %d\n",x1,y1,z1);
			printf("%d  %d  %d\n",x2,y2,z2);
			printf("%d  %d  %d\n",x3,y3,z3);
			printf("\n");
		}
	}
 
	printf("Total: %d.\n",count);
}

输出:

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
-- 1 --
2  7  6
9  5  1
4  3  8
 
-- 2 --
2  9  4
7  5  3
6  1  8
 
-- 3 --
4  3  8
9  5  1
2  7  6
 
-- 4 --
4  9  2
3  5  7
8  1  6
 
-- 5 --
6  1  8
7  5  3
2  9  4
 
-- 6 --
6  7  2
1  5  9
8  3  4
 
-- 7 --
8  1  6
3  5  7
4  9  2
 
-- 8 --
8  3  4
1  5  9
6  7  2
 
Total: 8.

C语言实现个位数的四则运算

前提:
1,参与运算的数值为0-9的个位数
2,没有包含括号
3,输入的表达式是正确的
4,除法进行的是整除运算

代码:

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
long calc(char *str)
{
	long fst,snd,trd,idx=0;
	char fop,nop;
 
	fst=str[0]-48;
	fop=str[++idx];
	snd=str[++idx]-48;
	do
	{
		nop=str[idx+1];
 
		if(fop=='+'||fop=='-')
		{
			if(nop=='+'||nop=='-'||nop=='\0')
			{
				switch(fop)
				{
				case '+':fst+=snd;break;
				case '-':fst-=snd;break;
				case '*':fst*=snd;break;
				case '/':fst/=snd;break;
				}
				if(nop=='\0')
					break;
				fop=str[++idx];
				snd=str[++idx]-48;
			}
			else if(nop=='*'||nop=='/')
			{
				idx+=2;
				trd=str[idx]-48;
				snd=nop=='*'?snd*trd:snd/trd;
			}
		}
		else if(fop=='*'||fop=='/')
		{
			fst=fop=='*'?fst*snd:fst/snd;
			fop=str[++idx];
			snd=str[++idx]-48;
		}
		else
		{
			break;
		}
	}
	while(1);
 
	return fst;
}

演示:

1
2
3
4
5
6
6+8-3*4/2=8
4*5/2-9+5=6
1+2-3-4+5=1
4*2*3*9*5=1080
4*2*3-9+5/2=17
4+2-3*9/7+5-2=6

应用程序分类

做通用型软件没有出路,所以现在选择的是走按需订做的路子,这种方式的特点是归纳业务模式难、需求变化大、造价高。看在最后一点的面子上,不管想什么办法也得把合同签下。

程序分类的标准有很大,对于企业MIS来说,数据库是少不了的,根据企业的部署结构,分为本地和联网型:
一,本地型
此种类型指的是程序和数据库在同一台PC或者同一局域网(VPN也算),程序直接连接数据库,对数据库进行操作。
有些程序会允许多个客户端连接同一数据库,但一般情况各客户端对数据库的操作不会破坏数据完整性。

二,联网型
当本地型应用不能满足业务需求时,就要考虑联网型应用了。
1)纯在线型
此部署结构一般是指B/S结构,现阶段主流是Web应用。
它最大的特点是不需安装客户端,但同时也存在不能充分利用客户端PC资源的缺点。
编写此类型程序时,程序和数据库都处于服务器端。与本地型程序不同的是,它需要考虑并发状况。
另外需要特别指出的WPF的XBAP类型应用是一种伪在线型程序,它本质上还是本地型应用程序。

2)瘦客户端型
这种类型的应用程序可以弥补前两种类型的不足,这也意味着它更复杂、更高级。
一般来说,客户端只是对某一服务发出请求,并对结果进行呈现。服务端里封装了几乎所有的数据操作,并且对外提供服务。数据库一般都与服务端处于同一服务器或同一局域网。

C#导入导出Office文档

为了减少对其它商业软件的依赖,对于像导入导出Office文档这样的功能,可以不使用PIA程序集,而像下面这样:
[crayon lang=”c#”]string strConn = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source='” + path.Trim() + “‘;Extended Properties=’Excel 8.0;HDR=Yes;IMEX=1′”;
OleDbConnection OleConn = new OleDbConnection(strConn);
OleConn.Open();
string strExcel = “Select * From [Sheet1$]”;
OleDbDataAdapter OleDA = new OleDbDataAdapter(strExcel, strConn);
DataTable table = new DataTable();
OleDA.Fill(table);[/crayon]
这样客户端不需要安装Office就可以读取Excel里的数据,其中连接字符串里的IMEX=1是指定混合类型的数据列均按文本来读取,据说可以解决数据列里有多个类型的数据时某些数据读取不出的问题。可惜的是,尝试后发现不起作用。

后来在某处看到一个新的解决方法:
[crayon lang=”c#”]修改HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\Engines\Excel的TypeGuessRows值为0,预设是8
其原理是Office会先读取每一列的前8行来决定每一个数据列的类型,所以如果前8行的资料都是数字,到了第9行以后出现的文字资料都会变成null,设为0即表示事先决定数据列的类型。[/crayon]
问题虽然解决了,但显示这不是一个好办法,这要求每个客户端都必须修改注册表,比起Office的装机量,使用PIA来读取Office文件或许是个更明智的选择:
[crayon]excel = new Excel.Application();
excel.Application.Workbooks.Open(path, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing);
Excel.Workbook wb = excel.Workbooks[1];

Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[“Sheet1”];
DataTable table = new DataTable();
for (int i = 0; i < ws.UsedRange.Columns.Count; i++) { DataColumn dc = new DataColumn(); dc.ColumnName = ((Excel.Range)ws.Cells[1, i + 1]).Value; table.Columns.Add(dc); } DataRow dr; for (int n = 1; n < ws.UsedRange.Rows.Count; n++) { dr = table.NewRow(); for (int m = 0; m < ws.UsedRange.Columns.Count; m++) { dr[m] = ((Excel.Range)ws.Cells[n + 1, m + 1]).Value; } table.Rows.Add(dr); }[/crayon]

作为程序员应有10项权利

1.每位程序员应该拥有一个安静的工作环境

2.每位程序员应该拥有听音乐的权利

3.每位程序员应该拥有一台高性能的PC

4.每位程序员可以选择适合自己的键盘和鼠标

5.每位程序员应该拥有良好的网络环境

6.每位程序员应该拥有两台或更多的监视器

7.每位程序员应该拥有一把舒适的椅子

8.每位程序员应该拥有合适的开发工具

9.每位程序员应该拥有PC管理员权限的权利

10.每位程序员每年至少有一次允许出席开发者讨论会