VC Category

c++:《数据结构》二分查找法

In: VC

 1 // ch09_02.cpp : 二分查找法
 2 //
 3 
 4 #include "stdafx.h"
 5 #include <iostream>
 6 #include <cstdlib>
 7 using namespace std;
 8 
 9 int bin_search(int data[50],int val);
10 int _tmain(int argc, _TCHAR* argv[])
11 {
12     int data[50];
13     int val=1;
14     for (int i=0;i<50;i++)
15     {
16         data[i]=val;
17         val+=rand()%5+1;
18     }
19 
20     cout<<"数据内容:"<<endl;
21     for (int i=0;i<5;i++)
22     {
23         for (int j=0;j<10;j++)
24             cout<<i*10+j+1<<"-"<<data[i*10+j]<<" ";
25         cout<<endl;
26     }
27 
28     cout<<"请输入搜索键值:"<<endl;
29     while(1)
30     {
31         int num=0;
32         cin>>val;
33         if (val==-1)
34             break;
35         num=bin_search(data,val);
36         if (num==-1)
37             cout<<"没有找到"<<endl;
38         else
39             cout<<""<<num+1<<"处找到"<<data[num]<<endl;
40                 
41     }
42     cout<<endl;
43     system("pause");
44     return 0;
45 }
46 
47 int bin_search(int data[50],int val)
48 {
49     int low,high,mid;
50     low=0,high=49;
51     while(low<=high && val!=-1)
52     {    
53         mid=(low+high)/2;
54         if (val<data[mid])
55         {
56             cout<<val<<"介于位置"<<low+1<<"["<<data[low]<<"]"<<"及中间位置"<<mid+1<<"["<<data[mid]<<"]"<<endl;
57             high=mid-1;
58         }
59         else if(val>data[mid])
60         {
61             cout<<val<<"介于中间位置"<<mid+1<<"["<<data[mid]<<"]"<<"及最后位置"<<high+1<<"["<<data[high]<<"]"<<endl;
62             low=mid+1;
63         }
64         else 
65             return mid;
66     }
67     return -1;
68 }
69 
70 

C++:《数据结构》顺序查找法

In: VC

 1 // ch09_01.cpp : 《数据结构》顺序查找法
 2 //
 3 
 4 #include "stdafx.h"
 5 #include <iostream>
 6 #include <iomanip>
 7 #include <cstdlib>
 8 using namespace std;
 9 
10 
11 int _tmain(int argc, _TCHAR* argv[])
12 {
13     int data[80],val;
14     int find=0;
15     for (int i=0;i<80;i++)
16         data[i]=rand()%150+1;
17 
18     cout<<"==========数据内容:========="<<endl;
19     for (int i=0;i<10;i++)
20     {
21         for (int j=0;j<8;j++)
22             cout<<setw(2)<<i*8+j+1 <<" ["<<setw(3)<<data[i*8+j]<<"";
23         cout<<endl;
24     }
25 
26     cout<<"请输入搜索键值";
27     cin>>val;
28     while(val!= -1)
29     {
30         for (int i=0;i<80;i++)
31             if (val==data[i])
32                 cout<<""<<i+1<<"的位置找到了键值"<<data[i]<<endl;
33                 find++;
34                 break;
35     
36     }
37     if (find==0)
38         cout<<"没有找到键值.";
39     
40     cout<<"==========数据内容:========="<<endl;
41     for (int i=0;i<10;i++)
42     {
43         for (int j=0;j<8;j++)
44             cout<<setw(2)<<i*8+j+1 <<" ["<<setw(3)<<data[i*8+j]<<"";
45         cout<<endl;
46     }
47     system("pause");
48     return 0;
49 }

C++:比较三个数的大小(最基础版本)

In: VC

 1 #include "stdafx.h"
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int _tmain(int argc, _TCHAR* argv[])
 6 {
 7     int a,b,c;
 8     cin>>a;
 9     cin>>b;
10     cin>>c;
11 
12     if (a>b)
13     {
14         if (a>c)
15         {
16             if (b>c)
17                 cout<<"大到小排列为"<<a<<b<<c;
18             else
19                 cout<<"大到小排列为"<<a<<c<<b;
20         }
21         else
22             cout<<"大到小排列为"<<c<<a<<b;
23     }
24     else if (b>c)
25     {
26             if (a>c)
27                 cout<<"大到小排列为"<<b<<a<<c;
28             else
29                 cout<<"大到小排列为"<<b<<c<<a;            
30     }
31     else
32         cout<<"大到小排列为"<<c<<b<<a;    
33     cout<<endl;
34     
35     system("pause");
36     return 0;
37 }

 PS:本人连这都琢磨了很久很久,实在难以启齿,留这代码自己有用。

估数字游戏程序(C++实现)

In: VC
 1 
 2 #include "stdafx.h"
 3 #include <stdlib.h> 
 4 #include <time.h> 
 5 #include <iostream> 
 6 using namespace std;
 7 
 8 void main() 
 9 
10     int a,b,c; 
11     char sss; 
12     srand(time(NULL)); 
13     do 
14     { 
15         cout<<"开始新的一局猜数游戏!"<<endl; 
16         a=rand()%100+1
17         c=0
18         cout<<"提示:被猜数介与1和100之间。"<<endl; 
19         do 
20         { cout<<"猜猜……"
21         cin>>b; 
22         if(b <a) 
23             cout<<"你猜的太小了!再想想……"<<endl; 
24         else if(b>a) 
25             cout<<"你猜的太大了!再想想……"<<endl; 
26         c++
27         } 
28         while(b!=a&&<=6); 
29         if(b==a) 
30             cout<<"太好了,你猜对了!你一共猜了"<<c<<"次。"<<endl; 
31         else 
32             cout<<"很遗憾,你出局了!"<<endl; 
33         cout<<"想再来一次吗?(Y/N)--"<<endl; 
34         cin>>sss; 
35     } 
36     while(sss=='y'||sss=='Y'); 
37     cout<<"游戏结束!"<<endl; 
38 

VC++操纵EXCEL的方法集

In: VC

突然忘了自己要VC操作EXCEL干吗了。所以暂时收录下。记起来了再看。

=================================================

第一种方法,简单的,用CDatabase实现. 程序是一个基于对话框的,步骤:

    A,为了避免代码重复,设置下面几个全局变量(类范围的),要引入头文件<afxdb.h>

              CDatabase m_db;                     //数据库
             CString m_dbdriver;                 //要生成的EXCEL文件的目录
             char m_path[MAX_PATH];       //获取路径用的数组
               CString m_strdir;                      //包括EXCEL文件名在内的路径名.
               CString m_strsql;                    //SQL命令语句,用m_db可直接执行.

B,在OnInitDialog方法中,生成一个xls文件,并插入两条记录,可在TRY语句中进行,因为这里面要创建一张表,当再次启动程序时,会有异常发生,说表已经存在了,这时就避免了重复创建和插入.代码如下:

m_dbdriver="MICROSOFT EXCEL DRIVER (*.XLS)";
 GetCurrentDirectory(MAX_PATH,m_path);
 m_strdir=m_path;
 m_strdir+="//test.xls";             //上面初始化各个变量.
 m_strsql.Format("DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB="%s";DBQ=%s",m_dbdriver,m_strdir,m_strdir);
 TRY
 { 
  if (m_db.OpenEx(m_strsql,CDatabase::noOdbcDialog))
  {
   m_strsql="Create Table OdbcExl(Name Text,Age Number,Gener Text)";
   m_db.ExecuteSQL(m_strsql);
   m_strsql="Insert Into OdbcExl(Name,Age,Gener) Values('Bob',34,'Male')";
   m_db.ExecuteSQL(m_strsql);
   m_strsql="Insert Into OdbcExl(Name,Age,Gener) Values('Jane',23,'Female')";
   m_db.ExecuteSQL(m_strsql);

   m_db.Close();
  }
 
 }
 CATCH_ALL(e)
 {
 // e->ReportError();
  m_db.Close();
  return FALSE;
 }
 END_CATCH_ALL;

C,其实上面已经达到了答题人的要求,但作为一个程序,这也太不像话了,于是我又稍微加了点不值一提的东西,在对话框上输入信息,再插入到EXCEL表中去,这一切都在按下"插入"按钮后发生:

 UpdateData();

 m_strsql.Format("DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB="%s";DBQ=%s", m_dbdriver,m_strdir,m_strdir);

 TRY
 { 
  if (m_db.OpenEx(m_strsql,CDatabase::noOdbcDialog))
  {
   m_strsql.Format("Insert into OdbcExl(Name,Age,Gener)Values('%s',%d,'%s')",m_name,m_age,m_gener);
   m_db.ExecuteSQL(m_strsql);
  }
 }
 CATCH_ALL(e)
 {
  e->ReportError();
 // db.Close();
 }
 END_CATCH_ALL;
 m_db.Close();

可以说,只要对CDatabase稍有了解,对SQL语句稍有了解,这个问题就很容易解决,如果要说这是一个针对Excel文件操作的方法,那是因为在OpenEx初始化数据库对象(不是"打开"哦)时用的文件后缀名为.xls而已,我们可以像在普通的数据库中一样进行其他操作,如用SELECT语句来读取EXCEL文件的内容等, 第一种方法完.

下面是第二种方法,这里涉及的原理要复杂一些了,传说中的OLE(对象链接与嵌入)技术在这里用上了,EXCEL.EXE作为一个组件服务器,应用程序作为客户端......,还是直接写过程吧,头晕晕的,只能平铺直述了.

A,从classwizard中add class处from type library,去office的安装目录下引入excel.exe(这是office 2003的选择,其他版本都是用olb文件),服务器就算引入了,这时会弹出对话框,要求加入一些类,这些类都是一些接口,里面有大量的方法,类的对象表征着excel文件的一个个部分,常用的有这几个_application,workbooks,_workbook,worksheets,_worksheet,Range,它们分别代表不同的意义._application代表了EXCEL服务器,workbooks表示整个Excel服务器(表现为一个.xls文件)里所有的表,(可以通过"新建"得到多个表,即MDI程序里的一个视窗一样,所有的视窗就是workbooks), _workbook就是一个表,相当于MDI中的一个视窗, worksheets表示所有的表单,每个表都可能有很多表单(建立一个Excel文件之后,打开,可以看到有sheet1,sheet2等,所有这些sheetn就组成了worksheets), _worksheet就表示一个表单, range表示元素的集合. 搞清楚上面这几个名词的意思非常重要.

B,在dlg.h中声明下面几个变量:

 _Application exlapp;   //组件服务器的各个classes
 _Workbook wbk;
 Workbooks wbks;
 _Worksheet wht;
 Worksheets whts;
 LPDISPATCH lpDisp;
 并在app.cpp的InitInstance方法中加入下面两句AfxInitOle(); AfxEnableControlContainer();

C,这里我没有像上面一样完全用程序来生成一个Excel文件,而是在开始时就在当前目录下生成了一个Excel文件,在对话框上我设置了两个按钮,下面是"显示"按钮的代码:
 //创建Excel服务器
 if(!exlapp.CreateDispatch("Excel.Application"))
 {
  AfxMessageBox("无法启动Excel服务器!");
  return;
 }
 COleVariant  avar((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
 exlapp.SetVisible(TRUE);//使Excel可见
 exlapp.SetUserControl(TRUE);//允许其它用户控制Excel,否则Excel将一闪即逝.
 
 //Open an excel file
 char path[MAX_PATH];
 GetCurrentDirectory(MAX_PATH,path);
 CString strPath = path;
 strPath += "\VCOpExcel";

 wbks.AttachDispatch(exlapp.GetWorkbooks());
 
 lpDisp=wbks.Open(strPath,
  avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar);
 
 wbks.ReleaseDispatch();
 exlapp.ReleaseDispatch();

D,与上面第一种方法一样,可以插入记录:

 UpdateData();     //读入数据
 if (""==m_name)     //判断名字输入有效
 {
  MessageBox("Please input a right name");
  return;
 }
 if (0>=m_age||100<=m_age)  //判断年龄输入有效
 {
  MessageBox("Please input a right age");
  return;
 }

 char *p=strupr(_strdup(m_gener));
 if (strcmp(p,"FEMALE")&&strcmp(p,"MALE")) //判断性别输入有效
 {
  MessageBox("Please input a right gener");
  return;
 }
 

 Range range;
 Range usedRange;
 COleVariant  avar((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
 
 if(!exlapp.CreateDispatch("Excel.Application")) //启动服务器
 {
  AfxMessageBox("无法启动Excel服务器!");
  return;
 }
 char path[MAX_PATH];
 GetCurrentDirectory(MAX_PATH,path);
 CString strPath = path;
 strPath += "\VCOpExcel";
 wbks.AttachDispatch(exlapp.GetWorkbooks());
 lpDisp=wbks.Open(strPath,            //初始化.
  avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar,avar);
 wbk.AttachDispatch(lpDisp);
 whts.AttachDispatch(wbk.GetWorksheets());
 lpDisp=wbk.GetActiveSheet();
 wht.AttachDispatch(lpDisp);
 
 
 
 usedRange.AttachDispatch(wht.GetUsedRange());
 range.AttachDispatch(usedRange.GetRows());
 long iRowNum=range.GetCount();//已经使用的行数
 range.AttachDispatch(wht.GetCells());
 
 range.SetItem(COleVariant(long(iRowNum+1)),COleVariant(long(1)),COleVariant(m_name));
 range.SetItem(COleVariant(long(iRowNum+1)),COleVariant(long(2)),COleVariant(m_age));
 range.SetItem(COleVariant(long(iRowNum+1)),COleVariant(long(3)),COleVariant(m_gener));
 
 wbk.Save();
 wbk.Close(avar,COleVariant(strPath),avar);
 wbks.Close();
 exlapp.Quit();

第二种方法完.

==============================================================

 

如何访问Excel文件:  
   
  1、通过ClassWizard添加相关类:  
   
  ClassWizard->MessageMaps->AddClass->From   a   type   library  
  选择文件   Program   FilesMicrosoft   OfficeOfficeExcel8.olb(没有8就有9,只要安装了Office,总会有一个)  
  在上面的列表中选择类(可以多选,不能少选)  
  _Application  
  _Workbook  
  _Worksheet  
  Workbooks  
  Worksheets  
  Range  
   
  2、引用头文件  
   
  #include   "excel8.h"  
   
  3、在应用程序或对话框初始化中调用  
   
  CoInitialize(NULL);  
   
  4、添加代码  
   
  示例代码一:  
  读一Excel文件数据,按一定格式写入文本文件  
  (说明:没有读出行数和列数,固定为99*99)  
  void   Els2Txt()  
  {  
  CString   xls="c:\test.xls";  
  CString   txt="c:\test.txt";  
  COleVariant   covOptional((long)DISP_E_PARAMNOTFOUND,   VT_ERROR);    
  ////   操作对象、操作步骤  
  //   应用  
  _Application   oApp;  
  oApp.SetVisible(TRUE);  
  oApp.CreateDispatch("Excel.Application");  
  //   窗口  
  Workbooks   oBooks;  
  _Workbook   oBook;  
  oBooks   =   oApp.GetWorkbooks();  
  oBook   =   oBooks.Open(xls,  
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional);  
  //   表格  
  Worksheets   oSheets;  
  _Worksheet   oSheet;  
  oSheets   =   oBook.GetWorksheets();  
  oSheet   =   oSheets.GetItem(COleVariant((short)1));  
  //   数据  
  Range   oRange;  
  oRange   =   oSheet.GetCells();  
  //   字段  
          COleVariant   ItemID;  
          _Application   pApp;  
  //  
  COleVariant   row,   col,   value;  
   
  long   nRow=oRange.GetRow();  
  long   nCol=oRange.GetColumn();  
  CString   text,   temp;  
  nRow=99;  
  nCol=99;  
  BOOL   bNO;  
  int   NOCount=0;  
  CFile   file;  
  if(file.Open(txt,CFile::modeCreate|CFile::modeWrite))  
  {  
  for(int   r=1;r<=nRow&&NOCount<3;r++)  
  {  
  bNO=TRUE;  
  for(int   c=1;c<=nCol;c++)  
  {  
  row   =   (short)r;  
  col   =   (short)c;  
  ItemID   =   oRange.GetItem(row,col);  
  pApp.AttachDispatch(ItemID.pdispVal,TRUE);  
  text   =   pApp.GetValue();  
  if(text!="")  
  {  
  bNO=FALSE;  
  temp.Format(""%02d%02d",%s%c%c",r,c,text.GetBuffer(0),0x0d,0x0a);  
  //AfxMessageBox(temp);  
  file.Write(temp.GetBuffer(0),temp.GetLength());  
  }  
  }  
  if(bNO)NOCount++;  
  else   NOCount=0;  
  }  
  file.Close();  
  }  
  //    
  oApp.Quit();  
  oApp.ReleaseDispatch();  
  text.Format("处理完成:   %s",filename);  
  SetDlgItemText(IDC_EDIT4,text);  
  }  
   
  示例代码二:  
  胡乱打开一个文件,写入一些数据  
  void   Test()  
  {  
  COleVariant   covOptional((long)DISP_E_PARAMNOTFOUND,   VT_ERROR);    
  int   i,j;  
          CString   ssbuf;  
          COleVariant   x;                        
          COleVariant   y;  
          COleVariant   data;  
          COleVariant   ItemId;  
          _Application   pApp;                
          _Application   pXlsApp;  
          Workbooks   pXlsBooks;  
          Range   pXlsRange;  
   
           
          pXlsApp.CreateDispatch("Excel.Application");                  
          pXlsApp.m_bAutoRelease   =   TRUE;  
          pXlsApp.SetVisible(TRUE);                                                  
          LPDISPATCH   pWkBooks   =   pXlsApp.GetWorkbooks();                  
          CString   strFile   =   "C:\work\BOOK1.XLS";                            
          pXlsBooks.AttachDispatch(pWkBooks,TRUE);                          
          pXlsBooks.Open("c:\Book1.xls",  
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional,    
  covOptional);  
           
           
          LPDISPATCH   pCells   =   pXlsApp.GetCells();                                  
          pXlsRange.AttachDispatch(pCells,TRUE);  
   
           
          y   =   (short)1;  
          x   =   (short)1;  
          ItemId   =   pXlsRange.GetItem(y,x);                                                  
          pApp.AttachDispatch(ItemId.pdispVal,TRUE);  
          ssbuf   =   pApp.GetValue();      
   
  for(i=1;   i<11;   i++)  
  {  
  for(j=2;   j<11;   j++)  
  {  
  x   =   (short)i;  
  y   =   (short)j;  
  ssbuf.Format("%c%d",'A'+i-1,j);  
  data.SetString(ssbuf,VT_BSTR);  
  pXlsRange.SetItem(y,x,data);  
  }  
  }  
   
          pApp.DetachDispatch();                    
          pApp.ReleaseDispatch();                  
   
          pXlsRange.DetachDispatch();  
          pXlsRange.ReleaseDispatch();  
   
          pXlsBooks.Close();  
          pXlsBooks.DetachDispatch();  
          pXlsBooks.ReleaseDispatch();  
   
          pXlsApp.Quit();  
          pXlsApp.ReleaseDispatch();  
  }   
 

==================================================

 

想要通过ODBC直接读、写Excel表格文件,首先,应确保ODBC中已安装有Excel表格文件的驱动"MICROSOFT   EXCEL   DRIVER   (*.XLS)"。然后,可根据下面步骤进行:  
   
    1.   在StdAfx.h文件中加入:    
   
  #include   <afxdb.h>    
  #include   <odbcinst.h>  
   
    2.   通过ODBC直接创建Excel文件并在表中插入数据(暂定文件名:Demo.xls)   //创建并写入Excel文件  
  void   CRWExcel::WriteToExcel()  
  {  
      CDatabase   database;  
      CString   sDriver   =   "MICROSOFT   EXCEL   DRIVER   (*.XLS)";   //   Excel安装驱动  
      CString   sExcelFile   =   "c:\demo.xls";                                 //   要建立的Excel文件  
      CString   sSql;  
           
      TRY  
      {  
          //   创建进行存取的字符串  
          sSql.Format("DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB="%s";DBQ=%s",  
                                  sDriver,   sExcelFile,   sExcelFile);  
   
          //   创建数据库   (既Excel表格文件)  
          if(   database.OpenEx(sSql,CDatabase::noOdbcDialog)   )  
          {  
              //   创建表结构(姓名、年龄)  
              sSql   =   "CREATE   TABLE   demo   (Name   TEXT,Age   NUMBER)";  
              database.ExecuteSQL(sSql);  
   
              //   插入数值  
              sSql   =   "INSERT   INTO   demo   (Name,Age)   VALUES   (''MIKE'',26)";  
              database.ExecuteSQL(sSql);  
   
              sSql   =   "INSERT   INTO   demo   (Name,Age)   VALUES   (''TOM'',22)";  
              database.ExecuteSQL(sSql);  
   
              sSql   =   "INSERT   INTO   demo   (Name,Age)   VALUES   (''SMITH'',27)";  
              database.ExecuteSQL(sSql);  
          }              
   
          //   关闭数据库  
          database.Close();  
      }  
      CATCH_ALL(e)  
      {  
          TRACE1("Excel驱动没有安装:   %s",sDriver);  
      }  
      END_CATCH_ALL;  
  }  
   
    3.   通过ODBC直接读取Excel文件(暂定文件名:Demo.xls)   //   读取Excel文件  
  void   CRWExcel::ReadFromExcel()    
  {  
          CDatabase   database;  
          CString   sSql;  
          CString   sItem1,   sItem2;  
          CString   sDriver;  
          CString   sDsn;  
          CString   sFile   =   "Demo.xls";   //   将被读取的Excel文件名  
                                                                             
          //   检索是否安装有Excel驱动   "Microsoft   Excel   Driver   (*.xls)"    
          sDriver   =   GetExcelDriver();  
          if   (sDriver.IsEmpty())  
          {  
                  //   没有发现Excel驱动  
                  AfxMessageBox("没有安装Excel驱动!");  
                  return;  
          }  
           
          //   创建进行存取的字符串  
          sDsn.Format("ODBC;DRIVER={%s};DSN='''';DBQ=%s",   sDriver,   sFile);  
   
          TRY  
          {  
                  //   打开数据库(既Excel文件)  
                  database.Open(NULL,   false,   false,   sDsn);  
                   
                  CRecordset   recset(&database);  
   
                  //   设置读取的查询语句.  
                  sSql   =   "SELECT   Name,   Age   "                
                                "FROM   demo   "                                    
                                "ORDER   BY   Name   ";  
           
                  //   执行查询语句  
                  recset.Open(CRecordset::forwardOnly,   sSql,   CRecordset::readOnly);  
   
                  //   获取查询结果  
                  while   (!recset.IsEOF())  
                  {  
                          //读取Excel内部数值  
                          recset.GetFieldValue("Name   ",   sItem1);  
                          recset.GetFieldValue("Age",   sItem2);  
   
                          //   移到下一行  
                          recset.MoveNext();  
                  }  
   
                  //   关闭数据库  
                  database.Close();  
                                                             
          }  
          CATCH(CDBException,   e)  
          {  
                  //   数据库操作产生异常时...  
                  AfxMessageBox("数据库错误:   "   +   e->m_strError);  
          }  
          END_CATCH;  
  }  
   
    4.   获取ODBC中Excel驱动的函数   CString   CRWExcel::GetExcelDriver()  
  {  
          char   szBuf[2001];  
          WORD   cbBufMax   =   2000;  
          WORD   cbBufOut;  
          char   *pszBuf   =   szBuf;  
          CString   sDriver;  
   
          //   获取已安装驱动的名称(涵数在odbcinst.h里)  
          if   (!SQLGetInstalledDrivers(szBuf,   cbBufMax,   &cbBufOut))  
                  return   "";  
           
          //   检索已安装的驱动是否有Excel...  
          do  
          {  
                  if   (strstr(pszBuf,   "Excel")   !=   0)  
                  {  
                          //发现   !  
                          sDriver   =   CString(pszBuf);  
                          break;  
                  }  
                  pszBuf   =   strchr(pszBuf,   '''')   +   1;  
          }  
          while   (pszBuf[1]   !=   '''');  
   
          return   sDriver;  
  }

下载示例源代码

现在有很多软件都推出了试用版,其中就有一些是限定软件的使用次数的,我用MFC也写了一个类似的程序。其实很简单,只要在程序初始化时(InitInstance()函数中),加上以下几句:

unsigned char buffer[255]={0};
unsigned long length;
unsigned long type;
HKEY hKey;
RegOpenKey(HKEY_LOCAL_MACHINE,"Software\dm",&hKey); RegQueryValueEx(hKey,"Num",NULL,&type,buffer,&length); RegCloseKey(hKey);
int Count; Count = atoi((const char*)buffer); if(Count == 0) { RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE / \dm",&hKey); RegSetValueEx(hKey,"Num",0,REG_SZ,(const / unsigned char*)"5",strlen("5")); RegCloseKey(hKey); MessageBox(NULL,"最后用5次!","Hello",MB_OK); } else if(Count == 1) { MessageBox(NULL,"请注册!","Hello",MB_OK); return true; } else { char buf[255]={0}; Count -= 1; itoa(Count,buf,10); CString str; str.Format ("最后用%d次!",Count); MessageBox(NULL,str,"Hello",MB_OK); RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE / \dm",&hKey); RegSetValueEx(hKey,"Num",0,REG_SZ,(const / unsigned char*)buf,strlen(buf)); RegCloseKey(hKey); }

这时它就具有了使用次数的限制。其中程序中的5是准备让用户使用的次数,它可被你任意修改。大家可以看出来,程序其实就是在读写注册表,利用这种思路也可以作成读写文件,甚至是加密狗。总之没什么高深的,祝各位编程快乐!(Win2k+vc6.0下通过)

=================================

摘自网络

C++ string::substr()

In: VC, 转载精品

str1.substr(size_t   index,size_t   length)  
   
  第一个参数是起始位置,第二个参数是长度。(第二参数可省略)

========示例:========

string   str1   =   "   abcdefg";//空格加上一个字符串  
          cout   <<   str1.substr(0,3)<<   endl;  
          cout   <<   str1.substr(1,3)<<   endl;  
          cout   <<   str1.substr(0,3).size()   <<   endl;  
          cout   <<   str1.substr(1,3).size()   <<   endl;  

运行结果:
    ab  
  abc  
  3  
  3

VC: CRect::DeflateRect

In: VC

作用:缩小矩形的边长。

void   DeflateRect(int   x,int   y);  
  void   DeflateRect(SIZE   size);  
  void   DeflateRect(LPCRECT   lpRect);  
  void   DeflateRect(int   l,int   t,int   b);  
  参数:  
  x   指定要向左或向右移动CRect边的数量  
  y   指定要向上或向下移动CRect边的数量  
  size   指定CRect移动数量的SIZE或CSize。  
            cx   指定移动左右边的数;  
            cy   指定移动上下边的数;  
  lpRect   指向一个指定每边数量的RECT结构或者CRect。  
  说明:   DeflateRect   通过朝它的中心移动边以缩小CRect

====================

例子:CRect   rect(10,   10,   50,   50);  
             rect.DeflateRect(1,   2);     //两边缩小后的rect.left=11,rect.top=12, rect.right=49,rect.bottom=48

VC:Attach和Detach

In: VC, 转载精品

CWnd,CDC, Cxxx等都是MFC的类,这些类提供了很多成员函数来执行系统调用等操作,但是核心的类成员数据都是句柄,(包括窗口句柄,DC句柄,线程句柄等)   m_hWnd,m_hDC,m_hThread
 
    如果这些类对象的这些句柄为空,就表示无效对象。比如你 CWnd * pWnd = new CWnd,执行是合法的,但是没有Create就没有窗口句柄,基本上就是一个无效对象,只是系统内存申请了内存分配空间而已,很多操作都无法执行(debug模式下会出现断言错误窗口)。但是,假如你申请了一个CWnd,CDC的对象实体,可以使用Attach来指定一个有效的句柄付给这个对象。那么此对象就是Valid的了。你可能跟踪看看Attach的实现,其实就是给m_hxxx赋值,而Detach就是值复位。这2个操作没有申请内存释放内存操作,就是一个赋值而已,是不是成对使用看你代码的实际情况吧。只要理解了这2函数的意义就行了。

         其实CWnd,CDC等类就是多了一个包装,方便用户(程序开发者)使用,如果用SDK开发,完全可以实现一样的功能。句柄是操作系统内核对象,而窗口指针、DC指针是用户对象(由你的程序管理)。

解决外部符号错误:_main,_WinMain@16,__beginthreadex -!t'my`yK  
在创建MFC项目时, 不使用MFC AppWizard向导, 如果没有柚煤孟钅坎问? 就会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有: m1+4#'  
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main (gd){j  
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 OuR5T>>  
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 *_g+&Us1  
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex }t,6 oT  
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex <u%N(=9  
]wpN"w"  
1. Windows子系统设置错误, 提示: )WA5FzPLw  
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main *+oJ(e  
4f{'{1]\  
Windows项目要使用Windows子系统, 而不是Console, 可以这样设置: *^'y#/Dg  
z !DF-%3|  
[Project] --> [Settings] --> 选择"Link"属性页, Qo!  
在Project Options中将/subsystem:console改成/subsystem:windows   T`H.k"Y{  
Xn?{t*{  
2. Console子系统设置错误, 提示: vwK 7b0M  
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 4Y~E`L0,  
8%P ><"  
控制台项目要使用Console子系统, 而不是Windows, 设置: *Cl5Y':|h  
sipSn4_  
[Project] --> [Settings] --> 选择"Link"属性页, WveN']q\  
在Project Options中将/subsystem:windows改成/subsystem:console BR4C@Z  
1 vBkC&  
3. 程序入口设置错误, 提示: dy2$&$=  
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 sP.>uExt  
G- (k~1q  
通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口: r#~P5[aV  
Os hl6 i  
[Project] --> [Settings] --> 选择"Link"属性页, "1zk_#B*  
在Category中选择Output, p HGRL  
再在Entry-point symbol中填入wWinMainCRTStartup, 即可 >IC}SZ  
F)c[@\.dm  
4. 线程运行时库设置错误, 提示: X;t_- f  
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex AmiBqZTp  
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex sz 23_{c?  
oz! {Fd-  
这是因为MFC要使用多线程时库, 需要更改设置: L a-Y,1x](  
uAk>h^pbM  
[Project] --> [Settings] --> 选择"C/C++"属性页, '%ET|1#SO  
在Category中选择Code Generation, ;Y-M)k(  
再在Use run-time library中选择Debug Multithreaded或者multithreaded 0v~5<Y'Z  
咸鱼游侠(75374355) 12:11:11 <mW.@e5_  
其中, W_qa?Jv  
Single-Threaded                单线程静态链接库(release版本) Kh4w Q  
Multithreaded                  多线程静态链接库(release版本) |F]g[En 4  
multithreaded DLL              多线程动态链接库(release版本) s-'qYgA6p  
Debug Single-Threaded          单线程静态链接库(debug版本) _ 7w_./y  
Debug Multithreaded            多线程静态链接库(debug版本) <[ ePw  
Debug Multithreaded DLL        多线程动态链接库(debug版本) H8V/O9|(  
9^x@/  
单线程: 不需要多线程调用时, 多用在DOS环境下 /PJ|d5  
多线程: 可以并发运行 clUdag,C  
静态库: 直接将库与程序Link, 可以脱离MFC库运行 X]pEmHl  
动态库: 需要相应的DLL动态库, 程序才能运行 \n{&_:b+q  
release版本: 正式发布时使用 9J;ZZ/3  
debug版本: 调试阶段使用   k9

私人领地

将秉承抒发情感、祭奠生活、瞬间感触、永恒记录的十六字伟大写博精神。

支持Google!

小提示:"G.cn,值得信任" -- 通过 G.cn 上谷歌

最近评论

功能

  • 登录
  • 文章 RSS
  • RSS 评论
  • WordPress.org