7,763
社区成员
发帖
与我相关
我的任务
分享
//codegen.c
// 输入一组字符串,比如
// aa ss ddd dd 33 dd
// 然后自动生成一个函数 int A(const char*);
// 实现A("aa")返回0 A("ss")返回1 依次类推
#include <stdio.h>
int main(int argc,char **argv) {
int i;
if (argc<2) {
printf("%s p1 [p2 ...] [>result.c]\nGenerate code int A(const char *a); 0==A(\"p1\") 1==A(\"p2\") ...",argv[0]);
return 1;
}
//printf("#include <string.h>\n");
printf("int A(const char *a) {\n");
for (i=0;i<argc-1;i++) {
printf(" if (0==strcmp(a,\"%s\")) return %d;\n",argv[i+1],i);
}
printf(" return -1;\n");
printf("}\n");
return 0;
}
//C:\test\Debug>codegen.exe
//codegen.exe p1 [p2 ...] [>result.c]
//Generate code int A(const char *a); 0==A("p1") 1==A("p2") ...
//C:\test\Debug>codegen.exe aa ss ddd dd 33 dd
//int A(const char *a) {
// if (0==strcmp(a,"aa")) return 0;
// if (0==strcmp(a,"ss")) return 1;
……
Function gc1(a1 As Integer, b1 As Integer, c1 As Integer, d1 As Integer, e1 As Integer, f1 As Integer) As Integer
gc1 = 0
For i = 1 To 6
If Da(i) = 2 _
Or Da(i) = 3 _
Or Da(i) = 5 _
Or Da(i) = 6 _
Or Da(i) = 12 _
Or Da(i) = 13 _
Or Da(i) = 14 _
Or Da(i) = 16 _
Or Da(i) = 18 _
Or Da(i) = 26 _
Or Da(i) = 30 _
Or Da(i) = 32 Then
Cp(1, 1) = Cp(1, 1) + 1
End If
Next i
For i = 1 To 6
If Da(i) = 3 _
Or Da(i) = 5 _
Or Da(i) = 9 _
Or Da(i) = 10 _
Or Da(i) = 11 _
Or Da(i) = 12 _
Or Da(i) = 13 _
Or Da(i) = 20 _
Or Da(i) = 24 _
Or Da(i) = 25 _
Or Da(i) = 28 _
Or Da(i) = 32 Then
Cp(1, 2) = Cp(1, 2) + 1
End If
Next i
For i = 1 To 6
If Da(i) = 6 _
Or Da(i) = 8 _
Or Da(i) = 10 _
Or Da(i) = 13 _
Or Da(i) = 14 _
Or Da(i) = 15 _
Or Da(i) = 19 _
Or Da(i) = 24 _
Or Da(i) = 25 _
Or Da(i) = 26 _
Or Da(i) = 28 _
Or Da(i) = 30 Then
Cp(1, 3) = Cp(1, 3) + 1
End If
Next i
For i = 1 To 6
If Da(i) = 3 _
Or Da(i) = 8 _
Or Da(i) = 9 _
Or Da(i) = 11 _
Or Da(i) = 17 _
Or Da(i) = 18 _
Or Da(i) = 20 _
Or Da(i) = 26 _
Or Da(i) = 27 _
Or Da(i) = 28 _
Or Da(i) = 30 _
Or Da(i) = 31 Then
Cp(1, 4) = Cp(1, 4) + 1
End If
Next i
。。。
For i = 1 To 6
If Da(i) = 1 _
Or Da(i) = 2 _
Or Da(i) = 4 _
Or Da(i) = 7 _
Or Da(i) = 12 _
Or Da(i) = 14 _
Or Da(i) = 15 _
Or Da(i) = 17 _
Or Da(i) = 23 _
Or Da(i) = 24 _
Or Da(i) = 29 _
Or Da(i) = 32 Then
Cp(3, 98) = Cp(3, 98) + 1
End If
Next i
For i = 1 To 6
If Da(i) = 8 _
Or Da(i) = 9 _
Or Da(i) = 11 _
Or Da(i) = 13 _
Or Da(i) = 14 _
Or Da(i) = 18 _
Or Da(i) = 21 _
Or Da(i) = 23 _
Or Da(i) = 24 _
Or Da(i) = 29 _
Or Da(i) = 30 _
Or Da(i) = 32 Then
Cp(3, 99) = Cp(3, 99) + 1
End If
Next i
https://bbs.csdn.net/topics/380157851
请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。
意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。
试对比
图书馆(对图书的分类够结构化了吧)
和
搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索)
哪个处理信息更方便、更高效。
所以
与其费劲去重构代码让其看上去更简洁、更合理
不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。
结构越复杂,越难修改,越难除错。
有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。
程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George
前微软C#编辑器的开发主管Jay Bazuzi列出的一些有助于找到正确方向的问题;他觉得前同事们应该用这些问题来问自己;实际上不管在哪里工作的开发者们都应该经常问问自己这些问题:
◆“要保证这个问题不会再出现,我该怎么做?”
◆“要想少出些Bug,我该怎么做?”
◆“要保证Bug容易被修复,我该怎么做?”
◆“要保持对变化的快速响应,我该怎么做?”
◆“要保证我的软件的运行速度,我该怎么做?”
如果大多数团队都能不时问一下自己,必定会从中得益,因为这些都是真正强而有力的问题。
Public arrStdData(1 To 3, 1 To 99, 0 To 11) As Integer
这样的好处是不会“浪费空间”。
Public arrStdData(3, 99, 11) As Integer
2. 数据“动态更新接口”:
假设添加一个窗口,在其中画一个 TextBox 用于输入数据。画一个命令按钮,用于执行数据更新。
TextBox的 MultiLine设置为True(这个只能设计时设置);ScrollBars属性设置为2 --- 垂直滚动条。
TextBox控件的宽度足够大,要保证每行数据都能显示完,没必要用水平滚动条。
输入的数据格式是:
每一行是“一组数据(12个数)”,数据间用英文逗号分隔,如16中Call DataSplit( ) 中的每条数据一样;
输入的数据,第1行对应 Cp(1, 1)用的,第2行对应 Cp(1, 2)用的,第3行对应 Cp(1, 3)用的……
第99行对应 Cp(1, 9)用的,第100行对应 Cp(2, 1)用的……其余类推。
注意输入的文本数据,每行12个、必须有297行(更多的行忽略,不会引起异常)。
处理代码如下:
Option Explicit
Private Sub Command1_Click()
' 更新数据
Dim arrDataL() As String
Dim arrDataC() As String
Dim i&, j&, k&, w As Long
arrDataL() = Split(Text1.Text, vbCrLf)
w = 0&
For j = 1 To 3
For i = 1 To 99
arrDataC() = Split(arrDataL(w))
For k = 0 To 11
arrStdData(j, i, k) = Val(arrDataC(k))
Next
w = 1& + w
Next
Next
End Sub
3. 数据比较调用处理:
Private Function DataCompare(InBuff() As Integer, ByVal nValue As Integer) As Boolean
Dim i&, w As Long
w = UBound(InBuff())
For i = 0& To w
If (nValue = InBuff(i)) Then Exit For
Next
DataCompare = (i <= w)
End Function
Private Function gc1(a1 As Integer, b1 As Integer, c1 As Integer, _
d1 As Integer, e1 As Integer, f1 As Integer) As Integer
Dim arrData() As Integer
Dim i&, j&, k As Long
gc1 = 0
For j = 1 To 3
For i = 1 To 99
' 提取数据:
For k = 1& To 11
arrData(k) = arrStdData(j, i, k)
Next
' 数据对比及计数累加:
For k = 1 To 6
If DataCompare(arrData(), Da(k)) Then Cp(j, i) = Cp(j, i) + 1
Next
Next
Next
' 你的其它处理代码……
End Function