博文
最短路径 -- DijKstra算法(2007-11-25 18:14:00)
摘要:本程序以下面的图为例,求v0到其他各个顶点的最短距离。
运行结果:
本程序在运行时必须在其同目录中包含in.txt文件。
in.txt文件内容的说明:第一行为顶点个数,边数,以后各行是边及其权值。本例为:第一行 6 -- 六个顶点,8 -- 八条边,第二行 0 2 10,v0到v2有条权值为10的边,下面是以上面的图为例的in.txt的内容:
6 8
0 2 10
0 5 100
0 4 30
1 2 5
2 3 50
3 5 10
4 3 20
4 5 60
以下是主程序:
#include "stdio.h"
#include "stdlib.h"
#define INT_MAX 32767
#define INFINITY INT_MAX //最大值
#define MAX_VERTEX_NUM 20 //最大顶点个数
#define TRUE 1
#define FALSE 0
typedef struct ArcCell{
int adj;
}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct{
int vex[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum, arcnum;
}MGraph;
void printPath(int*, int); //打印一条路径
void output(MGraph*, int, int*, int*); //最后输出
void CreateMGraph(MGraph*); //从文件(in.txt)中读取数据,创建图的邻接矩阵
void ShortestPath_DIJ(MGraph*, int, int*, int*); //最短路径算法 -- DijKstra算法
int main(){
int P[MAX_VERTEX_NUM]; //路径向量
int D[MA......
让EditPlus编译c/c++程序(2007-05-12 10:51:00)
摘要:本文以EditPlus挂接Vc6.0为例,说明EditPlus的配置方法:
注:其中相关目录(E:\Program Files\.....)因情况而异。
工具/ 配置工具/
弹出参数选择窗口,“组名称”改为Debug c/c++,“添加工具”添加如下两个“应用程序”:
1、
菜单文本:编译
命令:"E:\Program Files\Microsoft Visual Studio\VC98\Bin\CL.EXE"
参数:"$(FilePath)"
起始目录:$(FileDir)
捕获输出:打勾
2、
菜单文本:运行
命令:$(FileNameNoExt)
参数:
起始目录:$(FileDir)
3、(可选)免得每次修改后都要先编译再执行。利用批处理来执行1和2中的命令。
菜单文本:编译运行
命令:"E:\Program Files\Microsoft Visual Studio\VC98\Bin\run.bat"
参数:"$(FileNameNoExt)"
起始目录:$(FileDir)
-----------------------------------------
run.bat文件内容如下:
@echo off
if exist %1.c cl.exe %1.c
if exist %1.cpp cl.exe %1.cpp
cls
%1.exe
pause
注意:在运行 run.bat 时有可能提示错误:“没有找到 mspdb71.dll ,因此这个……”,这是因为 cl.exe 运行时需要设置相关环境变量(INCLUDE 和 LIB)。设置方法如下:
以 .net 2003 位例:
环境变量的设置可参考下面文件的内容:
E:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin\sdkvars.bat
或直接将 sdkvars.bat 的内容拷贝到 run.bat 的首部。......
Microsoft Visual C++ 6.0 各类工程配置说明(三)(2007-04-23 14:36:00)
摘要:
小结:
1.MFC的使用方式对默认情况选择的Run-time library的影响(以Debug版本为例):
Not Using MFC //MLd:Debug Single-Threaded(静态连接LIBCD.LIB库)
Use MFC in a Shared DLL //MDd: Debug Multithreaded DLL(动态连接MSVCRTD.DLL库)
Use MFC in a Static DLL //MTd:Debug Multithreaded(静态连接LIBCMTD.LIB库)
2.如果不使用MFC,在Link一栏一般会连接一系列Windows API的库文件;如果使用MFC,这些连接库就会“消失”。
3.Debug版本一般会有_DEBUG的预定义,而Release版本则定义NDEBUG。
4.使用Shared MFC和Static MFC相比,前者一般多一个_AFXDLL的定义。默认使用的Run-time Library也不一样,前者为/MDd,后者为/MTd。
5.MFC的普通DLL项目比MFC的EXE项目,一般多_WINDLL和_USRDLL预定义;连接参数多一个/dll定义。而MFC扩展DLL项目与MFC普通DLL项目相比,预定义将_USRDLL换成了_AFXEXT。
6.不使用MFC的Win32 DLL与MFC DLL相比,预定义少了_WINDLL和_AFXDLL,而仅保留了_USRDLL。
7.不使用MFC的静态库有_LIB的预定义。
8.#include <afxwin.h> 和#include <windows.h>不能重复包含,前者用于MFC程序,后者用于程序。
9.为了去掉Windows头文件中很少用到的定义,一般在stdafx.h中,Win32程序会定义#define WIN32_LEAN_AND_MEAN,而MFC程序会定义#define VC_EXTRALEAN。
10.作为本文的应用,改变项目参数设置,实现不同类型项目之间的项目转换,如下:
MFC Exe <======> MFC DLL
......
Microsoft Visual C++ 6.0 各类工程配置说明(二)(2007-04-23 14:35:00)
摘要:
(4.2) Use MFC in a Shared DLL
预定义:与(4.1)相比,增加了_WINDLL,_AFXDLL的定义
编译参数:没有太大区别。
连接参数:/nologo /dll /incremental:yes /pdb:"Debug/Win32DllDemo.pdb" /debug/machine:I386/out:"Debug/Win32DllDemo.dll" /implib:"Debug/Win32DllDemo.lib" /pdbtype:sept
可以看出,(4.1) 里连接的很多库消失了,这时,项目4变成了类似于项目2中的设置。编程时需要注意,项目4的stdafx.h仅包含了<windows.h>,此时如果要用MFC的类,需要自己加入MFC的几个头文件(<afxwin.h>、<afxext.h>等),并且将#include <windows.h>和DllMain入口函数注释掉!
(4.3) Use MFC in a Static DLL
使用MFC DLL的方式Shared和Static之间的区别与上述项目类似,不再做比较。
5.Win32 Static Library项目
预编译头文件stdafx.h(可能没有这个文件):
不使用MFC,仅仅#define WIN32_LEAN_AND_MEAN,而如果使用MFC,内容如下:
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
#include <afx.h> #include <afxwin.h>
(5.1) Not Using MFC
预定义:WIN32,_DEBUG,_MBCS,_LIB,新出现了符号_LIB
编译参数:/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /Fp"Debug/W32StaPrehead.pch" /Yu"s......
Microsoft Visual C++ 6.0 各类工程配置说明(一)(2007-04-23 14:34:00)
摘要:
1. 基于对话框(/单文档/多文档)的MFC程序
#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <afxdisp.h> // MFC Automation classes
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
stdafx.h预编译头文件
afxext.h声明MFC一些扩展类(CBitmapButton、CControlBar、CSplitterWnd等)
afxdisp.h中声明了Ole的几个类(COleException、COleVariant等)
afxwin.h声明MFC封装的一些很基本的类(CWnd、CView、CButton、CDC等)afxdtctl.h声明几个控件类(CImageList、CMonthCalCtrl、CDateTimeCtrl等)Controls
afxcmn.h声明MFC一些控件(CListCtrl、CProgressCtrl、CToolTipCtrl等)
#include <afxcmn.h> // MFC support for Windows Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#endif // _AFX_NO_AFXCMN_SUPPORT
(1.1)Use MFC in a Shared DLL
De......
c语言--绘制正余弦曲线(2006-06-14 18:26:00)
摘要:问题分析:
在0~360度的区间内,一行中要显示两个点,而对一般的显示器来说,只能按行输出,即:输出第一行信息后,只能向下一行输出,不能再返回到上一行。为了获得题目要求的图形就必须在一行中一次输出两个“*”。
思路:
利用sin (x)和cos(x)的左右对称性;
利用反余弦函数asin和acos计算坐标(x,y)的对应关系。
程序如下:
#include"stdio.h"
#include"math.h"
void main()
{
double y;
int x,m;
/*先打印0到180度,利用sin (x)在0到90度的左右对称性,
序中利用反正弦函数asin计算坐标(x,y)的对应关系。*/
for(y=1;y>=0;y-=0.1) /*y为列方向,值从1到0,步长为0.1*/
{
m=asin(y)*10; /*计算出y对应的弧度m,乘以10为图形放大倍数*/
for(x=1;x<m;x++) printf(" ");
printf("*"); /*控制打印左侧的 * 号*/
for(;x<31-m;x++)printf(" ");
printf("*\n"); /*控制打印同一行中对称的右侧*号*/
}
/*再打印180到360度,利用cos (x)在90到270度的左右对称性,
序中利用反余弦函数acos计算坐标(x,y)的对应关系,
记得把横坐标x的值右移90度。*/
for(y=0;y>=-1;y-=0.1) /*y为列方向,值从0到-1,步长为0.1*/
{
m=acos(y)*10+15; /*计算出y对应的弧度m,乘以10为图形放大倍数,
x的值右移90度*/
for(x=1;x<m;x++)printf(" ");
printf("*"); /*控制打印左侧的 * 号*/
for(;x<92-m;x++......
C程语言序模式(2006-03-29 09:46:00)
摘要: 一个语言的程序设计有一些常用的基本模式,这些模式是许多人长期工作的总结。在这个语言的程序中到处可见。对于一些典型问题,采用适当的模式是最容易把程序写好、写正确的。在这里我们将从简单到复杂,分门别类地列处一些C程序模式,供大家参考。这里列出的东西选自各种材料(包括《从问题到程序》书中)。这里列出的东西是很初步的。如果你认为有些东西也很重要,请给我们提示。
在所有模式描述中,用$$符号括起来的一段段文字表示的是应该实际写出的东西。
有关解释如果写了页数,请参考《从问题到程序》书中相关的页。
简单输出程序模式:
#include <stdio.h>
int main () {
$一个或几个输出语句,例如printf("Hello, world!\n");$
return 0;
}
----------------------------------------------------
例:
#include <stdio.h>
int main() {
printf("Welcome\n");
printf("to\n");
printf("Beijing!\n");
return 0;
}
简单表达式计算模式:
#include <stdio.h>
int main() {
printf($ 格式描述串$, $一个或几个表达式$);
return 0;
}
---------------------------------------------------
注意:格式描述串中转换描述与参数个数一致,类型一致。
---------------------------------------------------
#include <stdio.h>
int main() {
&......
C语言测试:想成为嵌入式程序员应知道的0x10个基本问题(2006-03-10 10:04:00)
摘要: C语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为带面试者和被面试者提供许多有用信息,此外,撇开面试的压力不谈,这种测试也是相当有趣的。
从被面试者的角度来讲,你能了解许多关于出题者或监考者的情况。这个测试只是出题者为显示其对ANSI标准细节的知识而不是技术技巧而设计吗?这个愚蠢的问题吗?如要你答出某个字符的ASCII值。这些问题着重考察你的系统调用和内存分配策略方面的能力吗?这标志着出题者也许花时间在微机上而不上在嵌入式系统上。如果上述任何问题的答案是"是"的话,那么我知道我得认真考虑我是否应该去做这份工作。
从面试者的角度来讲,一个测试也许能从多方面揭示应试者的素质:最基本的,你能了解应试者C语言的水平。不管怎么样,看一下这人如何回答他不会的问题也是满有趣。应试者是以好的直觉做出明智的选择,还是只是瞎蒙呢?当应试者在某个问题上卡住时是找借口呢,还是表现出对问题的真正的好奇心,把这看成学习的机会呢?我发现这些信息与他们的测试成绩一样有用。
有了这些想法,我决定出一些真正针对嵌入式系统的考题,希望这些令人头痛的考题能给正在找工作的人一点帮住。这些问题都是我这些年实际碰到的。其中有些题很难,但它们应该都能给你一点启迪。
这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。为了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为你所用,请自行按你的意思分配分数。
预处理器(Preprocessor)
1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
我在这想看到几件事情:
•; #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
•; 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
•; 意识......
c/c++经典书籍(2006-03-10 09:55:00)
摘要:
1. 精彩网址
http://www.cfanclub.net/fav.htm
2.vc++技术内幕第四版 (潘爱民)
ftp://210.32.157.56/课件/c++primer/vc++技术内幕IV(潘爱民).rar
3.C++经典对话系列
中文:http://www.jka77.com/book/cvst_cn.chm
4.MFC Windows 程序设计(第二版)
英文版:http://www.jka77.com/book/progmfc2.chm
中文版:暂无,制作中...
5.Effective C++中文版:
http://dlb.pchome.net/development/reference/effectiveCplus.zip
6.More Effective C++中文版-zhc译
http://cable.pchome.net/development/reference/MEC0410.zip
7.More Effective C++中文版-候捷译
http://www.nethovel.com/resources/MoreEffectiveC++(WQ).zip
8.Essential C++中文版(全)-候捷译
http://www.nethovel.com/resources/Essential%20C++中文版(全).rar
9.深入浅出MFC 2/e
http://218.30.21.125:8084/ebook/programme/mfc2e.zip
10.代码大全中文版
http://www.delphidevelopers.com/docs/tecsubject/cc/CodeComplet110.zip
11.C++经典对话系列
中文:http://www.jka77.com/book/cvst_cn.chm
12.MFC Windows 程序设计(第二版)
英文版:http://www.jka77.com/book/progmfc2.chm
13.......
学好VC++的十大良好习惯(2005-09-15 13:29:00)
摘要:一、充分利用MSDN,因为我个人觉得它胜过任何一本编程参考书
MSDN是 Microsoft 当前提供的有关编程信息的最全面的资源,它包含微软最新的技术数据库,加上易学易用的全文检索功能,让您迅速找到任何您需要的技术参考数据,让您随时拥有与全世界菁英同步的技术,掌握最丰富的程序开发资源。我经常收到很多朋友的EMAILS,他们所提的问题往往都非常的简单,MSDN完全可以解答这些问题,但他们好象不太喜欢用,这是让我郁闷的地方,是因为英文不好呢,还是没有学会充分利用各种资源来解决问题的方法呢?
二、提高英文水平,养成多上英文网站多看英文资料多买老外原版英文书
有关程序员与英文水平的讨论已太多太多,我个人认为要成为程序员,高中的英语水平够了,甚至不懂英语的一些人,也同样可以成为较好的程序员,因为开发工具的发展将是越来越傻瓜,但如果你是仅仅满足于能运用某种工具开发某个软件模块,那是没话说了。真正热衷技术肯干钻研乐于接受挑战的程序员是不满足于现状的,他们总感觉有太多的未知,于是总在不停地学习,如今信息技术发展得太快,而大部分的技术最先出现的时候都是英文版本的,要几个月或者几年以后才有中文版本的书出来,因此要想跟上步伐,一定要努力提高自己的英文水平,这样才能同步跟上信息技术。
你可能担心自己的英语水平不行,没关系,刚开始多查字典,“万事开头难”,必须有持之以恒的精神,不久你就会发现计算机英语其实很容易的。何况很多英文技术站点确实比国内做得好啊!比如http://www.codeguru.com,http://www.codeproject.com,http://www.programmersheaven.com 等等。
三、加强自我管理,善于作自我总结,分析自已的优点及缺点
中国境内百分之八十以上的领导人在百分之八十以上的场合的讲话中都有类似的观点,所以在这里我是不多说了,反正这一条用在什么行业什么地方都不会有错的,人生最大的敌人不是就是自已吗?管好自已认清自已,那还有什么搞不定的?
四、养成良好的文档习惯
程序员大多都不喜欢写文档,我以前也是特讨厌,在我的思想里,所谓的文档就是一些废话,一句话硬是用十句话来代替的无聊透顶,就如同部分中文系男生的爱情表白,明明......