‘壹’ vc++6.0操作方法
VC++6.0上机操作指南
贵州大学计算机科学与技术学院
张志明
2006年9月
目录
1. Visual C++ 控制台应用程序上机实现步骤
2. MFC对话框应用程序实现举例
3. MFC单文档应用程序实现举例
4. 用32位调试程序了解类和对象的内存映象
1. Visual C++控制台应用程序(Win32 Console Application Project)
上机实现步骤
一. 单文件程序的实现
本教材中的程序在Visual C++环境下都是以Win32 Console Application 项目实现,而且都是单文件程序,即只含有一个源程序(.cpp)文件的C++程序。
一个单文件程序在Visual C++ IDE中的实现主要步骤是:(1)建立新项目(2)建立新文件(3)输入源代码(4)编译、连接,生成可执行程序文件。以上步骤均可在Visual C++的Wizard指导下通过对话框交互输入完成。
1. 建立新项目:
每个C++程序的实现都要建立一个项目。所谓项目是一个文件生成过程的管理单位,项目名称就是最后实现的可执行文件的名称,一个项目就是与生成这个可执行程序文件相关的所有源文件和中间文件的集合,存放在以项目名称命名的文件夹中。
图1 Microsoft Visual C++ 6.0系统初始界面
执行菜单命令File>New,打开New对话框:
图2 打开New对话框
在New对话框的Project选项卡中选择Win32 Console Application选项,然后输入项目存放位置项目名称后确定。
图3 输入项目位置和名称
在Win32 ConsoleApplication-Step 1 of 1对话框中选择An empty project,完成后返回。系统弹出新建项目信息报告对话框。
图4 Win32 ConsoleApplication-Step 1 of 1对话框
图5 新建项目信息报告
2. 建立新文件:
再一次执行菜单命令File>New,打开New对话框,在File选项卡中选择C++ Sourse File选项,然后输入源程序文件名。完成后系统打开源程序(.cpp)文件编辑窗口。
图6 在New对话框输入源程序文件名
3. 输入源代码:
此时即可在源程序(.cpp)文件编辑窗口输入源程序代码。
图7 源程序(.cpp)文件编辑窗口
4. 生成和运行可执行程序文件:
11从源程序文件生成可执行文件,需要经历编译,连接两步,在VC++6.0编程环境中可以有以下几种操作方式:
(1)打开Build (编译)菜单,先执行Compile命令,接着再执行Build命令。
(2)打开Build (编译)菜单,执行Rebuilde All命令。
(3)打开Build (编译)菜单,直接发出Execute 执行命令,一次性完成编译、连接和启动程序执行的任务。
(4)直接单击“!”(BuildExecute)命令按钮,一次性完成编译、连接和启动程序执行的任务。
图8 Build (编译)菜单
图9 程序运行结果
打开工程文件夹可以找到该工程的所有工作文件。
打开工程文件夹中的Debug子文件夹,可以找到生成的可执行(.exe)文件。
二. 多文件程序的实现
一个较大型C++程序,有时需要包含多个源程序文件。一种常见的情况是将类的定义放在头(.h)文件中,将类的实现或对类的访问放在源(.cpp)文件中。
多文件程序的实现与单文件程序的实现方式需要经历同样的步骤,不同的是,在编译之前需要利用新建文件对话框逐一将所有需要的文件追加到项目中。
1. 建立新项目:
2. 建立新文件:
(1)加入和编辑头文件:
在New对话框,在File选项卡中选择C/C++ Header File选项,然后输入头文件名。完成后系统将打开源程序(.h)文件编辑窗口。
(2)加入和编辑源程序文件
打开New对话框,在File选项卡中选择C++ Sourse File选项,然后输入源程序文件名。完成后系统打开源程序(.cpp)文件编辑窗口。
注意:在源程序文件中应该用文件包含命令将头文件包含进来。如下例源程序文件s719.cpp的第一行:#include"h719.h"
3. 生成和运行可执行程序文件:
步骤同单文件程序的生成和执行。
#
2.MFC对话框应用程序实现举例
本指导书给出3个MFC对话框应用程序的实现实例,例1为求三科平均成绩的简单程序,例2为实现一个具有四则运算功能的简单计算器,例3为一个彩票机程序(提供手动摇号和自动摇号两个彩票机程序版本)。
通过这些程序可以达到以下目的:
掌握AppWizard的使用方法。
掌握Workshop中各种视图的使用和在不同视图之间切换的方法。
学会利用控件工具箱中的控件定制对话框界面。
学会控件变量及其他类成员变量的设置。
学会消息映射的概念和操作方法。
学会查看和编辑代码。
学习编译、运行和调试对话框应用程序。
例1.实现一个求三科平均成绩的MFC对话框应用程序。假设运行时的界面如下:
实现步骤:
1. 在Visual C++ 6.0工作开发环境中,New对话框中选择MFC AppWizard [exe]项目,输入项目名称并指定存放位置。
2. 在MFC Wizard Step1选择Dialog(基本对话)程序类型,在MFC Wizard Step2中输入对话框标题“求平均成绩”。
AppWizard对话结束后打开对话框编辑窗口如下:
3. 定制界面:添加控件、设置属性
删除对话框模板中原有的“确定”按钮和内容为“TODO: 在这里设置对话控制。”的Static Text控件。
在控件工具箱中取一个Group Box控件,调整适当大小,鼠标右键单击该控件边框,在弹出的下拉菜单中打开属性对话框。将Group Box控件标题由“Static”改为“求平均分”。
在Group Box中添加4个Static Text控件,按同样方法修改它们的标题属性为“成绩1”、“成绩2”、“成绩3”和“平均分”。
在Group Box中添加4个Edit Box控件,打开属性对话框的Extended Styles选项卡中将它们设置为文本右对齐(Right Aligend Text)方式。其中第4 个Edit Box控件的Styles属性设置为Read-only。
在Group Box中添加一个按钮Button1,打开属性对话框将按钮的标题属性改为 “计算平均分”。
鼠标右键单击“取消”按钮边框,在弹出的下拉菜单中打开属性对话框。将按钮标题改为“退出”。
设计完成的界面如图,其中控件属性列表如下:
控件
ID号
标题
属性
Group Box
IDC_STATIC
求平均分
Static Text
IDC_STATIC
成绩1
Static Text
IDC_STATIC
成绩2
Static Text
IDC_STATIC
成绩3
Static Text
IDC_STATIC
平均分
Edit Box
IDC_EDIT1
Align text:Right
Edit Box
IDC_EDIT2
Align text:Right
Edit Box
IDC_EDIT3
Align text:Right
Edit Box
IDC_EDIT4
Align text:Right;Read-only
Button
IDC_BUTTON1
计算平均分
Button
IDCANCEL
退出
4. 添加成员变量
单击View(查看)>ClassWizard(建立类向导)菜单进入ClassWizard,打开Member Variables选项卡:为4 个Edit Box控件设置对应的变量:
同样的方法为其它3个Edit Box控件设置变量:
控件ID
变量名
变量类型
数值范围
IDC_EDIT1
m_S1
int
0~100
IDC_EDIT2
m_S2
int
0~100
IDC_EDIT3
m_S3
int
0~100
IDC_EDIT4
m_Sav
CString
5. 添加消息映射(两条消息)
进入ClassWizard,打开Messages Maps选项卡,在Object Ids中选择CAverageDlg,在Messages中鼠标单击WM_INIDIALOG,在Member functions中出现生成的消息映射成员函数OnInitDialog提示:
在Object Ids中选择IDC_BUTTON1,在Messages中鼠标单击BN_CLIKED,在弹出对话框中单击OK按钮:在Member functions中出现第二个生成的消息映射成员函数OnButton1。
6. 添加代码
在ClassWizard中双击OnInitDialog函数,打开代码编辑器中的OnInitDialog()函数代码,找到其中的 // TODO: Add extra initialization here,加入下面的黑体字给出的3行代码:
BOOL CDlgDlg::OnInitDialog()
{
CDialog::OnInitDialog();
…;
// TODO: Add extra initialization here
m_Sav="0.00";
m_S1=m_S2=m_S3;
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
}
在ClassWizard中双击OnButton1()函数,打开代码编辑器中的OnButton1()函数代码,找到其中的 // TODO: Add extra initialization here,加入下面的黑体字给出的4行代码:
void CDlgDlg::OnButton1()
{
// TODO: Add extra initialization here
UpdateData();
double ave=(double)(m_S1+m_S2+m_S3)/3.0;
m_Sav.Format("%6.2f",ave);
UpdateData(FALSE);
}
7. 编译运行程序:
注释:
UpdateData()函数的作用是允许更新控件变量,
UpdateData(FALSE) 禁止更新控件变量的值。
例2.设计MFC对话框应用程序,实现一个具有四则运算功能的简单计算器。
1. 新建项目:
2. 定制界面:
(1) 修改MFC AppWizard自动创建的对话框项目模板。删除模板上自动创建的三个控件。
(2) 加入“简单计算器”、“请输入数据:”、“结果”三个静态文本框和相应的3个编辑框。
(3) 加入一个Group Box,标题修改为“请选择运算符:”,并在其中放入4个Radio Button将标题分别改为“+”、“-”、“*”、“/”。
(4) 继续用鼠标从工具箱中向对话框添加和3个按钮控件,更改按钮的标题为“计算”、“清除”、“关闭”。
3. 添加变量
本例中用到以下4个CSimpleCalcDlg类的成员变量:
变量类型
名称
float
m_N1
float
m_N2
float
m_ Result
char
Operator
用ClassWizard为编辑框添加变量:m_N1, m_N2, m_Result
变量char Operator的添加方法:
在WorkSpace中进入ClassView视图, 鼠标右键单击CSimpleCalcDlg, 在菜单中选择“Add Member Variable…”
然后在弹出的对话框的输入变量类型和名称:
4. 添加消息映射
用ClassWizard为按钮控件添加消息映射:
继续用ClassWizard为Radio Button控件添加消息映射:
5. 加入单击按钮时的事件响应代码
在实现文件(cpp文件)中加入单击按钮时的事件响应代码。(双击一个按钮可直接进入函数编辑)
//选择运算符
void CSimpleCalcDlg::OnRadio1()
{ Operator='+'; }
void CSimpleCalcDlg::OnRadio2()
{ Operator='-'; }
void CSimpleCalcDlg::OnRadio3()
{ Operator='*'; }
void CSimpleCalcDlg::OnRadio4()
{ Operator='/'; }
//计算
void CSimpleCalcDlg::OnButton1()
{
UpdateData();
switch(Operator)
{
case '+':
m_Result=m_N1+m_N2;
break;
case '-':
m_Result=m_N1-m_N2;
break;
case '*':
m_Result=m_N1*m_N2;
break;
case '/':
if(m_N2 == 0 )
MessageBox("除数不能为零!");
else
{
m_Result = m_N1/m_N2;
break;
}
default:
m_Result=m_N1+m_N2;
}
UpdateData(FALSE);
}
//清除
void CSimpleCalcDlg::OnButton2()
{
UpdateData();
m_N1=0;
m_N2=0;
m_Result=0;
UpdateData(FALSE);
}
//关闭
void CSimpleCalcDlg::OnButton3()
{ CDialog::OnOK(); }
6. 编译运行程序
例3. 彩票机程序:
本例给出手动摇号和自动摇号两个彩票机程序版本。
1. 彩票机界面:
定制含有7个Edit Box 、1个Progress(进度条)和3侦探按钮控件的对话框界面如下:
2. 设置变量:
(1) 设置进度条变量:
(2) 设置7个编辑框变量:
(3)添加类成员变量m_x:
3. 消息映射:
在ClassWizard中产生OnInitDialog、OnButton1、OnButton2、OnOK四个消息映射函数:
4. 添加代码:
//初始化
BOOL CLotusDlg::OnInitDialog()
{
CDialog::OnInitDialog();
……
// TODO: Add extra initialization here
m_x=0;
m_pProg.SetRange(0,70);
srand((unsigned)time(NULL));
return TRUE; // return TRUE unless you set the focus to a control
}
(一)手动摇号
//手动摇号,每按一次摇号按钮出一个号
void CLotusDlg::OnButton1()
{
// TODO: Add your control notification handler code here
switch(m_x/10)
{
case 0:
m_N1=rand()%36+1;
m_pProg.SetPos(m_x+=10);
break;
case 1:
m_N2=rand()%36+1;
m_pProg.SetPos(m_x+=10);
break;
case 2:
m_N3=rand()%36+1;
m_pProg.SetPos(m_x+=10);
break;
case 3:
m_N4=rand()%36+1;
m_pProg.SetPos(m_x+=10);
break;
case 4:
m_N5=rand()%36+1;
m_pProg.SetPos(m_x+=10);
break;
case 5:
m_N6=rand()%36+1;
m_pProg.SetPos(m_x+=10);
break;
case 6:
m_N7=rand()%36+1;
m_pProg.SetPos(m_x+=10);
break;
}
UpdateData(FALSE);
}
void CLotusDlg::OnButton2()
{
// TODO: Add your control notification handler code here
m_x=0;
m_N1=0;
m_N2=0;
m_N3=0;
m_N4=0;
m_N5=0;
m_N6=0;
m_N7=0;
UpdateData(FALSE);
m_pProg.SetPos(1);
}
void CLotusDlg::OnOK()
{
CDialog::OnOK();
}
(二)自动摇号
将前面实现的手动摇号程序修改为自动定时摇号。
添加OnTimer消息映射函数:
//按摇号按钮启动摇号
void CLotusDlg::OnButton1()
{
SetTimer(1,2000,NULL);
}
void CLotusDlg::OnButton2()
{
m_x=0;
m_N1=0;
m_N2=0;
m_N3=0;
m_N4=0;
m_N5=0;
m_N6=0;
m_N7=0;
UpdateData(FALSE);
m_pProg.SetPos(0);
KillTimer(1);
}
void CLotusDlg::OnTimer(UINT nIDEvent)
{
switch(m_x/10)
{
case 0:
m_N1=rand()%36+1;
m_pProg.SetPos(m_x+=10);
break;
case 1:
m_N2=rand()%36+1;
m_pProg.SetPos(m_x+=10);
break;
case 2:
m_N3=rand()%36+1;
m_pProg.SetPos(m_x+=10);
break;
case 3:
m_N4=rand()%36+1;
m_pProg.SetPos(m_x+=10);
break;
case 4:
m_N5=rand()%36+1;
m_pProg.SetPos(m_x+=10);
break;
case 5:
m_N6=rand()%36+1;
m_pProg.SetPos(m_x+=10);
break;
case 6:
m_N7=rand()%36+1;
m_pProg.SetPos(m_x+=10);
break;
}
UpdateData(FALSE);
CDialog::OnTimer(nIDEvent);
}
void CLotusDlg::OnOK()
{
KillTimer(1);
CDialog::OnOK();
}
5. 注释:
(1)产生随机数的方法
函数unsigned int rand() 产生随机数。
函数void srand(unsigned int seed) 设定随机数产生器的种子,其中seed为随机数产生器的种子,本例中用系统时钟当前值作随机数种子:
srand((unsigned)time(NULL));函数的
表达式rand()%36+1产生1-36之间的随机数
(3) 定时器的使用方法
定时器的使用涉及OnTimer、SetTimer、KillTimer三个函数。
SetTimer用于设定定时时间和启动定时器,其中第一个参数是定时编号,第二个参数是定时的毫秒数。本例中将1号定时器定时时间设定为2秒:
SetTimer(1,2000,NULL);
定时器启动以后将持续工作,每到达一次定时时间即启动一次OnTimer消息函数的执行。KillTimer的作用是停止指定定时器的工作。
3.
MFC单文档应用程序实现举例
创建单文档应用程序的一般步骤:
利用AppWizard创建单文档应用程序框架。
在文档类中声明保存文档数据所需要数据对象。
完成文档类的OnNewDocument函数,初始化新文档。
完成文档类的Serialize函数,保持和加载文档数据。
完成视类的OnInitialUpdate函数,初始化显示。
完成视类的OnDraw函数,显示当前文档内容。
在视类中加入可以使用户编辑文档数据所需的代码。
本实验指导通过以下4 个实验循序渐进演示创建单文档应用程序的基本操作,在前一个例子中演练过的操作,在后面的中出现时不再重复描述。
例1 一个简单的单文档应用程序——记事本程序
例2 简单文本和图形输出
例3 利用定时器输出滚动字幕
例4 文档串行化编程
例1.
一个简单的单文档应用程序——记事本程序
1. 只要在AppWizard的Step 6将Base Class设置为EditView,AppWizard就自动完成了一个记事本程序的设计:
2. 运行程序,即可测试记事本的各种功能:
3.说明:
(1)打开Workshop中的Class视图,可以看到,一个简单的单文档应用程序向导自动建立五个类:
向导自动建立的类
相应源文件
其他源文件
相应头文件
其他头文
‘贰’ 用记事本怎么编辑、运行C语言
1、首先要配置环境变量,在系统变量path中添加MSDevBin 和 VC98Bin路径。是你所安装vc6.0的bin目录。以及设置环境变量include为 ...VC98Include 。是你所安装vc6.0的路径的include目录。不理解的话自己可以网络一下。学过java的话一般都配置过环境变量。
2、然后再在桌面上,新建记事本重命名为hello.c
3、打开记事本输入如下代码,保存并关闭。
#include <stdio.h>
int main(){
printf("hello world!");
return 0;
}
4、打开命令行界面,用cd指令定位到桌面,如下图所示。你的可能输入的命令不一样。此时,输入dir可以看到你桌面的说有文件和目录。
‘叁’ 如何使用vc6,编译多个工程
比如你有2个工程吧
这2个工程分别为在a, b目录, 工程名为a, b
a里面有个a.dsw
b里面有个b.dsw
你把这个两个目录放在一个c目录下
把a.dsw和b.dsw剪切到c目录下
用记事本打开a.dsw和b.dsw
把b.dsw中 与工程有关的那几行
类似于以下的
###############################################################################
Project: "b"=.\b\b.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
复制到a中的中间位置, 也就是在
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################
前面
保存后 双击a.dsw, 里面就有2个工程了
当然这是整合工程的方法, 新建多工程时, 直接在选项里选添加到xx工程就行了
‘肆’ 电脑怎么编程序程序员如何在电脑上编程的
❶ 电脑程序编制怎么弄啊
编写程序需要用软件,一般的软件有VB,还有C语言等很多类型。如果你只是编写一些简单的启动程序,你可以打开记事本输入代码,然后保存,再修改一下文件的格式就可以了,可以改成BAT等。不如说移动磁盘里的autorun.inf
文件就是一个简单的程序文件,你可以用记事本
打卡
里面的文件看看
❷ 电脑怎么写程序
以在 Windows 操作系统下,编写一个 C 语言源程序为例,首先必须要在电脑上安装一个 C语言编译器(例如:Microsoft Visual Studio C++),然后进入该编译环境,在该环境中编写 C 语言源程序、编译 C 语言源程序、调试该程序、直到最后生成可执行的二进制文件(*.EXE)。
❸ 电脑怎么编写简单程序
这是最简单的了~~
❹ 程序员如何在电脑上编程的
说到如何在电脑上编程。首先需要知道下面这个问题的答案:“程序到底是什么?”计算机程序是指令集,它告诉计算机如何执行特殊的任务。VB~VC~VF~C~C#~C++~JAVA~.NET~这些都是编程 ASP~CGI~PHP~JSP这些是WEB编程。。 虽然都是编程,但编出来的程序可是不一样的。 目标是什么?开发?创业?还是去公司上班?还是业余爱好? 如果想业余编小程序,推荐VB~VC~容易上手。简单。也蛮强大。 如果想学好了去企业上班,推荐C++~~~.net~~~JAVA之类的大型项目开发。 如果想做网站,就学ASP~CGI~PHP~JSP,这4个就JSP最最最难,先学ASP。现在是人工智能时代,国家出台了很多政策鼓励人工智能发展,无人超市、无人驾驶、无人银行、AI人脸识别层出不穷,我觉得以后人工智能渗透的领域肯定也会越来越多,所以我推荐让孩子学习python语言,python语言适合做人工智能的开发。简单容易上手,学好了以后对学习、出国留学、就业什么的也会有好处。首先,工程师根据你的需求给你一个合适的方案,这个方案包括硬件搭建、软件架构。 然后,在你满意的方案下为你选用设备 最后,程序员按照你的要求编写软件 各种设备有自己的命令解释器,程序员写出来的软件是可以按照机器能解读的编码编写的,这些不需要用户知道,用户只要知道怎么使用,怎么维护就可以了,如果知道的更多,那就可以成了开发者
❺ 电脑怎么打开编程
编辑程序让电脑执行的过程就叫编程。
编程语言很多,具有代表性的计算机语言有Java,BASICC,C++,VB,VF,SQL,网页编程JSP,ASP,PHP。Java是目前应用最广泛的编程语言之一,大学中则常常以C语言作为编程的入门语言。
很多软件都可以编程,主要有eclipse,MicrosoftVisualStudio,MicrosoftVisualBasic,MicrosoftSQLServer等等。
❻ 怎么去报电脑编程序
题主是想问怎么去编写电脑程序吧?编写程序简单步骤如下:
1、桌面空白处右击2,新建3,文本文档,4,新建文本文档的图标。
2、修改txt文件的扩展名,右键-重命名。将.txt改为.vbs,修改成.vbs后看到图标变了,这就说明你的系统能够识别他成一个vbs脚本程序。
3、根据需要在里面写代码了,右键-编辑文件,直接就可以像编写文本文件一样在里面写代码了。
4、然后在里面输入一句弹出简单对话框的代码。
5、之后关闭文件并且保存,可以在编辑的时候直接按CTRL+S保存再关闭,然后去直接双击刚才新建的文件,就会弹出一个对话框来了。这只是系统自带的一个脚本语言。
6、这只是系统只带的一个脚本语言,如果要编一些其他的程序就需要装对应的代码编辑器了。例如C#就得装visualstudio,java的、、eclipse等等。
❼ 笔记本电脑如何编程
笔记本电脑要想编程,首先要先选择编程语言,然后安装上编程语言工具软件就可以了,如果没有学过编程,可以用中文的"易语言"。
❽ 如何在电脑编写一个小程序,输出字符串
在电脑编写一个小程序,输出字符串,就找相应的软件开发工具。
例如:在这里我们借助的软件是Visual C++6、0。打开软件,先新建一个工程,在新建一个C++源文件,这些你听起来可能有点陌生,不要担心,你只需要按照下面操作就好。在建好文件之后,在源文件处,输入下列代码#includeusing namespace std;voidmaincout<<"我的第一个程序!"<<endl;然后编译这个程序,点击右上角有红色边框的按钮。最后运行这个程序,点击右上角的红色框里的按钮,看看运行结果。
❾ 你怎么在电脑上编程,而不用任何软件
40267">
我从编程写软件学到的 7 件事,其实学习编程不难,写软件也不你那,就看我们如何看待了!
我正在一点一点的从一个工程师转型为管理者。别弄错了,虽然我在转管理,但我仍然在每天写代码。不过我发现自己在会议和电话中会花越来越多的时间去分析讨论,试着去组织团队,并且为全局部署而不是具体战术而烦恼。
当然这不是一件坏事。高层次的决策往往比单个的类和函数的细节更有影响。让一个团队更有效率,比仅仅让自己更有生产力有更高的杠杆作用。但我想我已经从我多年来的编程中吸取到了一些经验。我希望大部分经验可以应用于管理方面。
1、没有规定(rules),只有公案(koans)
译注:公案(Koan)有五种重要的涵义: 作悟禅的工具; 作考验的方法; 作权威的法范; 作印证的符信; 作究竟的指点。)
举个例子:DRY,意思是“不要重复你自己”。作为软件的基本规则这很好理解,因为很多话可以证明:“我做 X 是因为它没有重复。”这说得通,不是吗?如果你有两个或者两个以上部分的代码在做相同的事情,说明你正在浪费。而且如果当你需要改变它们其中一个的时候,你可能也需要改变其他的,并且你很可能会忘记这么做。当它们不同步时,你会得到一个怪异的 bug。因此很显然你不能重复你自己。
然而,在使用了几年之后,人们开始怀疑它的普遍适用性。假如你的两个方法中包含相同的代码块,所以你将其拿出来形成一个单独的函数。通常那些方法会开始朝不同的方向发展…接着你发现自己要在函数中加入更多的参数,很可能为结果立了更多 flags……然后下一个接手的程序员会因为分离出来的函数以及它所带的特定的参数和结果,而出现认知负载。你会意识到如果当初允许自己重复,并让两块代码自然的发展为不同的个体,你生成的代码将会更简单直观。
这意味着 DRY 不好吗?当然不是!通常在合适的环境下使用 DRY 是正确的…好吧,也许。我个人的经验是:“重复一次是可以的,超过一次就不太好了…当然这取决于所处的环境。”因为所有事都取决于环境。DRY 的目的并不是为了 DRY。如果你迷信于此,小孩儿,那你还有太多要学。DRY 的目的为了让你了解 DRY。那当然不是规定,仅仅是公案。
(让我重申一遍:我在讨论的是软件。在我的经验中,硬件规定的确更倾向于是我们所理解中的规定。这就是我为什么要从电气工程转到软件的原因)
细想我最喜欢的两个计算机科学“定律”。第一:“计算机科学中没有一个问题是不能通过添加另一层抽象来解决的!”这句话完全正确吗?当然不。这在现象学上是正确的吗?实际上,的确是。这是否意味着抽象是解决任何问题的正确途径?不,不是。它是一个公案,可以启发思想。
还有我历来最喜欢的:“第一优化定律:不要这样做。第二优化定律(对专家而言):不要又这样做。”这显然是一个公案,却称自己为法规。是时候让你的代码运行的更快吗?不。是时候让你的代码运行的更快吗?还不是。什么意思?意思是要考虑到时间,复杂性,认知负载,具体结果,生活意义,人类存在的意义。并且三思而后行,小孩儿。但不要花太长时间,我们还有工作要做。
2、要想得到他人的信任,先信任他人
这不仅仅针对于管理者。虽然它对管理者尤其重要。信任是你真正拥有的唯一价值。如果你的公正、判断、理解、诚实不被信任。接下来你组织的成员将把你视为祸害并绕着你走。然而,如果你是个有能力但不被信赖的开发者,你可能还有一些价值。虽然你在每个决定上做的努力都会被大大消减。
不过更重要的一点是:一个团队的成员需要互相信任。当 Natascia 说:“我来解决那个问题单(ticket)”,你必须相信她会去做。当你说:“Peter 能在截止时间前完成的。”,你必须相信那会实现。当某人说,“我有一个疯狂的点子”,他们必须信任他们会被尊重和认真对待,尽管那点子的确很疯狂。
你是如何建立和得到信任的?答案很简单:你去信任他人。你相信那个说他可以学会这个新库并且在周一前会整合完的人。你相信那个说他需要提前离开,因为家里有事而会错过明天工作的人。你相信那些想在截止日期前一个月休假的人,因为他们觉得自己已经开始筋疲力尽了。你相信说想要解决难题的初级程序员。
但你不总是正确的。有些时候人在工作上存了坏心。你需要揭露这些人的真面目,让他们尽早离开。有时候你要信任那些真心想成功的人,虽然他们会失败。但违反常识的是,长远来看这通常是个胜利。因为那些人会记住你的信任,他们会尽一切努力来报答你。
3、简单比优雅重要的多
我也喜欢紧凑优雅的代码。我喜欢灵活的框架,有如此多抽象层次随时待命,无论抛出什么改变的需求都能解决。我喜欢使用位向量、位位移、略微复杂的数据结构和不太流行且古怪的小语言特性,但在特定环境下十分实用。
然而你并不只是为了你自己写代码。即使它只是个“原型”。(我已经记不清我有多少“原型”在多次对层操作和润色的过程中出现问题。)而且你不仅仅是为了解决当前的问题编写它。你正在为了下一个接手的开发者可以使用它来解决下一个问题而编写。把你写到那五行代码扩充为十行可以增强其可读性,你知道吗,也许扩展为十五行效果会更好。
你可以提前尝试并用灵活且充满抽象的框架解决它们。但是也许预言不是你的强项,也许你关于下一个问题的概念的想法完全是错误的。也许仅仅编写足够简单的代码才是最佳选择。有一个命名约定和一个编码风格,让它读起来像英语一样。也许不是添加一个类,而是下一个开发者在试图跟随你的控制流程时必须保持另一个文件的开放。你应该用愚蠢的方式,不雅的方式,简单的方式。
4、动力比大多数事都重要
我们都曾见过这种情况。一周里每个人都在检查代码,构建显而易见的雏形,每天不断增加特性,测试覆盖率越来越高。疏忽也随着生产的想法和解决方案而出现。不知怎么的下一周所有事都变得缓慢起来。关于 A 的决定,会影响到 B、C和 D。当人们可以运行D、E 和 F 时,它们不是逻辑序列发展上的一部分。于是需要做更多的假设,认知负载加重,你不得不模拟出一堆东西来写出非模仿代码。一些人需要做这个决定。
或许不是决定会瘫痪,是你上周所做的一切都在错误的基础上,是一个“地震多发区”的技术负债。你需要停止所有事返回并重构它。而且你必须马上开始,因为等的时间越长,事情会变得越糟糕。没人想看到这种事发生 。但他们宁愿现在面对也比下个月知道的好。让暴风雨来的更猛烈些吧。
也许上周每个人都拼劲全力,现在实在撑不住了。你知道该怎样吗?得让他们休息一下,每个人,休息一整天。我保证,这会给你接下来的“长跑”节省时间。
I我们很难定义、衡量以及说明动力。但它在软件开发中是真实存在的东西。而且它的缺失会成为造成首要影响,导致我们需要去解决很多根本问题。别忽略它,也别期望或假装它会神奇地回来。察觉警报并迅速采取行动。
5、与和你互补而不是像你一样的人一起工作
每当我看到人们根据“文化契合度”来找人的时候,我就会拼命翻白眼。你知道大多单一栽培会发生什么吗?他们遭遇了他们不知如何解决的病原体,然后嗝屁死翘翘了。
你不会希望你的所有开发者、设计者、 QA人员、产品人员、销售人员和执行官是彼此的克隆人。你肯定不想。每个人都有自己的长处和短处、优点和缺点。你想要雇佣的是他们的长处,让其他人的长处弥补他们的短处。
比如说我,写代码非常快,擅于沟通,读写文章都奇快。我在任何时候都能熟悉很多编程语言和框架。我理解东西透彻且迅速,有丰富的经验。然而我还是一个在特定领域、框架和语言缺乏深刻专研、精通掌握的全才。我是一个真正从别人身上获益的建筑师,跟踪所有需要,在骨骼构建好之后添加肉体和润色。我还是个 UX 盲(等一下,你说那些还没对齐?),这一直被当作同事之间的玩笑。
像我这样的人非常难找到也是及其被需要的。但一个由我和九个像我一样的克隆人组成的公司是从一开始就注定要失败的。唔,我们会把很多事情做好,但只需要一个集中的盲点,一个灾难性的空隙就足以毁灭公司。大多数人承认有些事情他们做不好,另一些人可能需要照应。这些人往往是寻找“文化契合度”的人,并试图雇佣和他们一样的人。真令人哭笑不得。
6、任何决定都比没决定强
别犹豫,当你拿不准主意时,去做就好了。当然,这可能不适用在生产代码的时候。但它可以应用于除此之外在软件开发里的任何方面。我们在历史上发展最快的行业里工作。我们生活在以指数形式发展的世界里。时间不等人,别浪费它。
这与低级决策的高级讨论一样真实。在高水平的讨论里,比如“我们应该实现特性 A 还会说 B?我们要用哪种方式实现呢,X 还是 Y?“,常常会产生这样的对话,”让我们先跳过这个…下周再对它进行讨论…“,或者更阴险的,”让我们先研究一下其他人做了什么再来讨论一次。“这样的问题极少情况下会有正确答案。大多时候,像这么说才是正确的,”我会在今天之前决定尝试哪一个,这样我们就可以明天开始行动了。
甚至 A 选项基本上是错误选择,开始进行 A 大概也比啥都不做强。这和直觉是相悖的,但它通常也是正确的。以实际上手的方式去理解 A 的本质是一个更好的办法,这个道理始终是正确的。这样的理解可能会引导你做出更好的决定。
对于低级决策,那就更应该如此了。“规范没有说明我们应该如何处理错误条件 X,或者错误信息应该是什么。”(规范似乎是为一个有抱负的乌托邦写的,在这种乌托邦中,错误条件和独角兽一样罕见。)“我知道,我只是想插一句,回去问问他们在这种情况下想做什么!”
这非常诱人。如果你这么做,没人能指责你哪里做错了。但这么做是错误的。宁愿继续自己做决定,尽管有些鲁莽,也不要什么都不做等着问别人。让它们在你做已经写好的程序和你学到的教训里迭代,虽然你知道这并不完美,也好过从头开始错误认知。它们和项目将会变得更好。快速尝试,快速改变方向。
7、保持谦虚,但要自信
你不需要所有的答案。甚至是我也不得不勉强承认我不会有全部的答案。可恶,我甚至连它们的大多数也没有,不过我有自信,只要给我足够的时间和精力,我能弄清楚大部分。并且你也可以。
我们无法都成为 Jeff Dean(谷歌大牛)、中本聪(比特币创始人) 或是 Margaret Hamilton(登月计划中的女程序员)。我们在一个充斥着真正的天才和自称天才的地方工作。没人知道所有的事情,每个人都敏锐地意识到他们所不知道的一切。幸运的是,大多数情况下,我们不是科学家。我们的工作不是去寻找新突破。我们的工作是实践他人的发现,使东西运转,希望服务于人们真正想要的东西。也许你永远不会发明任何东西,像是布隆过滤器或默克尔树。不过大多与你共事的人们也不会。而且这不是重点,重点是使用布隆过滤器和默克尔树,亦或是在它们之上建个抽象层,来实际的完成它们。
所以假设你懂的会比在座的人都多是错误的,就算你觉得他们违背直觉的想法很疯狂,他们的语言选择很糟糕。假设人家比你懂的多也是错误的,即使真是那样,也没关系。世界上多的是聪明人因为一些不可思议的原因什么实际东西也没做出来。(开个廉价的玩笑╮(╯▽╰)╭:这就是为什么我们有学术界的原因。)
如果你真的做出了一些东西,在面对那些令人眼花缭乱的理论知识,或是和你相似甚至比你做的更糟糕的人时大可不必谦虚。在一天结束之时,正是那些在战壕中的开发者——构建、测试和开发了代码的人,真正做了事情。话说那些发现自己远离战壕的人,那些没有和你一起并肩作战的逃兵,你有权利鄙视他们。并且向你的伙伴致敬,而不是上司。
原文标题:做好这7件事 让你学编程写软件不在难
原文链接:http://www.epx365.cn/peixun/software/201840267.html
‘伍’ 可以用记事本进行编程吗
跟我学做记事本-编程实例
用VB做一个记事本实在不很复杂,我们完全可以通过向导来很方便地做出来。但本文只打算讨论用手动方法制作记事本,旨在向VB初学者展示:学VB原来是如此容易!
通过阅读、研究本文并按本文所述进行尝试,初学者将学到很多东西,如怎样使用RichText控件来打开和保存文件,怎样制作菜单、工具栏和状态栏以及如何对其编写代码等。
第一章 让我们的记事本马上运行
急于求成是初学者共有的心愿。那好,请按如下三个步骤做,我们的愿望立即就可以实现!
步骤一:绘制界面。
新建一个标准EXE工程,将其Caption属性改为“超级记事本”,点击Icon属性给它找个合适的Icon图标。单击菜单“工程”-“部件”,在弹出的“部件”对话框里找到Microsoft
RichText Box 6.0和公共对话框Microsoft Common Dialog 6.0并选中它们,单击“确定”按钮。这时左边的工具栏上出现了我们刚才新添的两个控件了。在窗体上绘制RichText
Box和Commn Dialog,其中RichText Box的大小和位置可不用理睬,我们将在代码中处理它,当然,有必要把它的ScrollBar属性设为2-rtfVertical,这样在打开和编辑文件时垂直滚动条才可用。
步骤二:编辑菜单。
按Ctrl+E调出菜单编辑器,我们来做如下几个菜单:
一.文件菜单:
文件(第一层) mnuFile
新建(第二层) mnuNew
打开(第二层) mnuOpen
保存(第二层) mnuSave
- (第二层) mnuFileSep (分隔线)
退出(第二层) mnuExit
二.编辑菜单:
编辑(第一层) mnuEdit
复制(第二层) mnuCopy
剪切(第二层) mnuCut
粘贴(第二层) mnuPaste
- (第二层) mnuEditSep (分隔线)
全选(第二层) mnuSelecAll
三.搜索菜单:
搜索(第一层) mnuSearch
查找(第二层) mnuFind
查找下一个(第二层) mnuFindOn
四.帮助菜单:
帮助(第一层) mnuHelp
使用说明(第二层) mnuUsage
关于(第二层) mnuAbout
(注:各菜单项的快捷键请自行设置)
好了,其它的菜单项以后再根据需要添加。现在进入:
步骤三:编写代码。
'声明查找变量
Dim sFind As String
'声明文件类型
Dim FileType, FiType As String
'初始化程序
Private Sub Form_Load()
'设置程序启动时的大小
Me.Height = 6000
Me.Width = 9000
End Sub
'设置编辑框的位置和大小
Private Sub Form_Resize()
On Error Resume Next '出错处理
RichTextBox1.Top=20
RichTextBox1.Left=20
RichTextBox1.Height = ScaleHeight-40
RichTextBox1.Width = ScaleWidth-40
End Sub
'新建文件
Private Sub mnuNew_Click()
RichTextBox1.Text = "" '清空文本框
FileName = "未命名"
Me.Caption = FileName
End Sub
'打开文件
Private Sub mnuOpen_Click()
CommonDialog1.Filter = "文本文档(*.txt)|*.txt|RTF文档(*.rtf)|*.rtf|所有文件(*.*)|*.*"
CommonDialog1.ShowOpen
RichTextBox1.Text = "" '清空文本框
FileName = CommonDialog1.FileName
RichTextBox1.LoadFile FileName
Me.Caption = "超级记事本:" & FileName
End Sub
'保存文件
Private Sub mnuSave_Click()
CommonDialog1.Filter = "文本文档(*.txt)|*.txt|RTF文档(*.rtf)|*.rtf|所有文件(*.*)|*.*"
CommonDialog1.ShowSave
FileType = CommonDialog1.FileTitle
FiType = LCase(Right(FileType, 3))
FileName = CommonDialog1.FileName
Select Case FiType
Case "txt"
RichTextBox1.SaveFile FileName, rtfText
Case "rtf"
RichTextBox1.SaveFile FileName, rtfRTF
Case "*.*"
RichTextBox1.SaveFile FileName
End Select
Me.Caption = "超级记事本:" & FileName
End Sub
'退出
Private Sub mnuExit_Click()
End
End Sub
'复制
Private Sub mnuCopy_Click()
Clipboard.Clear
Clipboard.SetText RichTextBox1.SelText
End Sub
'剪切
Private Sub mnuCut_Click()
Clipboard.Clear
Clipboard.SetText RichTextBox1.SelText
RichTextBox1.SelText = ""
End Sub
'全选
Private Sub mnuSelectAll_Click()
RichTextBox1.SelStart = 0
RichTextBox1.SelLength = Len(RichTextBox1.Text)
End Sub
'粘贴
Private Sub mnuPaste_Click()
RichTextBox1.SelText = Clipboard.GetText
End Sub
'查找
Private Sub mnuFind_Click()
sFind = InputBox("请输入要查找的字、词:", "查找内容",
sFind)
RichTextBox1.Find sFind
End Sub
'继续查找
Private Sub mnuFindOn_Click()
RichTextBox1.SelStart = RichTextBox1.SelStart + RichTextBox1.SelLength + 1
RichTextBox1.Find sFind, , Len(RichTextBox1)
End Sub
'使用说明
Private Sub mnuReadme_Click()
On Error GoTo handler
RichTextBox1.LoadFile "Readme.txt", rtfText '请写好Readme.txt文件并存入程序所在文件夹中
Me.Caption = "超级记事本:" & "使用说明"
Exit Sub
handler:
MsgBox "使用说明文档可能已经被移除,请与作者联系。",
vbOKOnly, " 错误信息"
End Sub
'关于
Private Sub mnuAbout_Click()
MsgBox "超级记事本 Ver1.0 版权所有(C) 2001 土人",vbOKOnly,"关于"
End Sub
'设置弹出式菜单(即在编辑框中单击鼠标右键时弹出的动态菜单)
Private Sub RichTextBox1_MouseDown(Button As Integer, Shift As Integer, X As
Single, Y As Single)
If Button = 2 Then
PopupMenu mnuEdit, vbPopupMenuLeftAlign
Else
Exit Sub
End If
End Sub
'防止在切换输入法时字体自变(感谢王必成先生提供此方案)
Private Sub RichTextBox1_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeySpace Then
RichTextBox1.SelFontName = CommonDialog1.FontName
End If
End Sub
至此,我们的记事本可以编译使用了。点击菜单“文件”-“生成XXX.EXE”,回到桌面运行我们的记事本看看,是不是颇有成就感?
当然,这样的记事本还比较粗糙,我们还需要做些工作,请看下一章。
第二章 美化程序界面
多数字处理软件都有工具栏和状态栏。工具栏和状态栏除了能美化我们的程序使其更具有专业性质外,还给用户带来操作上的便利。现在我们就来做一做这两样东西。
一.工具栏
(一)制作工具栏
单击“工程”-“部件”,选中Microsoft Windows Common Control 6.0并确定。这时,我们要用到的控件就出现在左边的工具栏上了。
要做工具栏,首先需要一个叫ImageList的控件来装载图像。在程序界面上添加它,然后右键单击此控件,左键单击“属性”,弹出“属性页”对话框的“图像”,再单击“插入图片”就可以一次性装载图片了(如不满意,以后还可以添加)。图片可在C:Microsoft
Visual _W95下选择(这里假设你的VB安装在C盘下)。注意了:在插入图片时给每一张图片注明关键字,以便在引用图片时不至于混乱。如插入“新建”的图片,我们在“关键字”栏注明“New”。
图片有了,接下来在程序界面添加工具栏(ToolBar)。添加后工具栏就出现在菜单下面,右键单击它,选择“属性”,在弹出的“属性页”对话框中的“通用”项作些设置,主要如下两项:
1.“图像列表”:选择ImageList1
2.“样式”:根据喜爱选择1-trbStandard或者2-trbFlat
继续点击“属性页”的“按钮”选项,插入若干按钮。按钮有多种样式,请根据需要设置。这里请一定注意:每一个与用户操作有关的按钮都必须注明关键字、装载图片,如“新建”按钮,在“关键字”项注明“新建”,在“图像”项键入“New”(即ImageList1中的图片关键字),需要的话还可以在“工具提示文本”项填入适当的提示语。
(二)编写工具栏的按钮代码
工具栏按钮的代码编辑很简单,可以按照下面的格式去编写:
Private Sub ToolBar1_ButtonClick(ByVal Button As MSComctlLib.Button)
On Error Resume Next '出错处理
Select Case Button.Key '按关键字选择
Case "新建"
mnuNew_Click '等于菜单项“新建”被单击
Case "打开" '等于菜单项“打开”被单击
mnuOpen_Click
'......(继续编写其它按钮的代码)
End Select
End Sub
完成后试运行一下我们的程序,我们发现,有了工具栏之后,程序变得漂亮多了,只是有一个问题:打开一个较长的文档后,编辑框的下拉滚动条向上的箭头不见了。原因是:工具条占用一定的空间。解决方法:将“设置编辑框的位置和大小”中的RichTextBox1.Top
= 20 和 RichTextBox1.Height = Me.ScaleHeight - 40分别改为RichTextBox1.Top =
380,RichTextBox1.Height = Me.ScaleHeight - 400即可。
二.状态栏
(一)制作状态栏
状态栏的英文名字叫StatusBar,在窗体上添加它后会默认出现在窗体的最下方。用鼠标右键点击它,调出“属性页”对话框,单击“窗格”项,插入一些窗格,可以将各个窗格的“样式”设置为:
0-sbrText 显示文本,需编写代码
1-sbrCaps 显示大小写状态,无需编程
2-sbrNum 显示NumLock键开关状态,无需编程
3-sbrIns 显示Insert键状态,无需编程
4-sbrScr1
5-sbrTime 显示时间,不编程时时间不会随系统时钟变化
6-sbrDate 显示日期,无需编程
注意:加进状态栏后需将Form_Resze中的RichTextBox1.Height =
Me.ScaleHeight - 400改为RichTextBox1.Height = Me.ScaleHeight - 600。
(二)状态栏根据其“样式”属性决定用不用编写代码(如上文所述)。下面举些例子,读者可以认真揣摩,从而达到举一反三的效果。
例一:用户选取了“新建”后,让第一个窗格显示:“目前状态:正在打开文件《……》”。请将下面代码写进“打开”菜单里面:
StatusBar1.Panels(1).Text = "目前状态:正在打开文件"
& "《" &CommonDialog1.FileTitle & "》"
例二:让第三个窗格显示时间并让时间跟随系统时钟变化。
首先,给程序加一个Timer控件,将其Interval属性设为1000。然后:
在Form_Load过程加入:StatusBar1.Panels(1).Text = Time;然后给Timer控件编写代码:
Private Sub Timer1_Timer()
If StatusBar1.Panels(3).Text <> CStr(Time) Then
StatusBar1.Panels(3).Text = Time
End If
End Sub
例三:当编辑框的文本发生变化时让第一个窗格显示:“正在编辑文档:文件名”。
Private Sub RichTextBox1_Chang()
StatusBar1.Panels(1).Text = "正在编辑文档:" &
CommonDialog1.FileName
End Sub
辛苦了那么久,我们现在已经拥有一个象模象样的记事本了。这个记事本由于用了RichText控件,理论上它能打开和编辑任意大的文档,使用起来的确比Windows自带的记事本方便得多。当然,还有一些其它的功能需要添加和完善,这就靠你慢慢去完成了。
‘陆’ 在什么软件下可以编写makefile,比如编写c语言可以在VC6.0下编写,那么makefile可以在那里写呢。
vc6直接就可以直接导出你正在编辑的工程的make文件。
菜单:Project->ExportMakefile...打开导出makefile对话框,选择你要导出makefile的工程,点OK,就会在你工程目录下生成工程名.mak文件,如图:
你可以用文本编辑器直接修改.mak文件,但一般情况下没必要自己去修改,直接在vc6里配置好工程的相关信息,导出成.mak文件即可。
执行.mak文件的话,打开命令提示符,cd到.mak文件所在位置,然后输入:
nmake/fmak文件名回车
即可开始编译链接程序,效果和你在VC6里build是一样的。