• 读者层次:初学刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用。我们先定义一些常见类型变量借以说明 int i = 100;long l = 2001;float f=300.2;double d=12345.119;...

    转载自:http://www.vckbase.com/study/article/data_convert.htm

    读者层次:初学

    刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用。

    我们先定义一些常见类型变量借以说明

    int i = 100;
    long l = 2001;
    float f=300.2;
    double d=12345.119;
    char username[]="程佩君";
    char temp[200];
    char *buf;
    CString str;
    _variant_t v1;
    _bstr_t v2;

    一、其它数据类型转换为字符串

    • 短整型(int)
      itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制
      itoa(i,temp,2); ///按二进制方式转换
    • 长整型(long)
      ltoa(l,temp,10);
    • 浮点数(float,double)
      用fcvt可以完成转换,这是MSDN中的例子:
      int decimal, sign; 
      char *buffer; 
      double source = 3.1415926535; 
      buffer = _fcvt( source, 7, &decimal, &sign ); 
      运行结果:source: 3.1415926535 buffer: '31415927' decimal: 1 sign: 0
      decimal表示小数点的位置,sign表示符号:0为正数,1为负数
    • CString变量
      str = "2008北京奥运";
      buf = (LPSTR)(LPCTSTR)str;
    • BSTR变量
      BSTR bstrValue = ::SysAllocString(L"程序员"); 
      char * buf = _com_util::ConvertBSTRToString(bstrValue); 
      SysFreeString(bstrValue); 
      AfxMessageBox(buf); 
      delete(buf);
    • CComBSTR变量
      CComBSTR bstrVar("test"); 
      char *buf = _com_util::ConvertBSTRToString(bstrVar.m_str); 
      AfxMessageBox(buf); 
      delete(buf); 
    • _bstr_t变量
      _bstr_t类型是对BSTR的封装,因为已经重载了=操作符,所以很容易使用
      _bstr_t bstrVar("test"); 
      const char *buf = bstrVar;///不要修改buf中的内容 
      AfxMessageBox(buf); 

    • 通用方法(针对非COM数据类型)
      用sprintf完成转换
      char  buffer[200];
      char  c = '1';
      int   i = 35;
      long  j = 1000;
      float f = 1.7320534f;
      sprintf( buffer, "%c",c);
      sprintf( buffer, "%d",i);
      sprintf( buffer, "%d",j);
      sprintf( buffer, "%f",f);
      

    二、字符串转换为其它数据类型
    strcpy(temp,"123");

    • 短整型(int)
      i = atoi(temp);
    • 长整型(long)
      l = atol(temp);
    • 浮点(double)
      d = atof(temp);
    • CString变量
      CString name = temp;
    • BSTR变量 
      BSTR bstrValue = ::SysAllocString(L"程序员"); 
      ...///完成对bstrValue的使用
      SysFreeString(bstrValue); 
    • CComBSTR变量
      CComBSTR类型变量可以直接赋值
      CComBSTR bstrVar1("test");
      CComBSTR bstrVar2(temp);
    • _bstr_t变量
      _bstr_t类型的变量可以直接赋值
      _bstr_t bstrVar1("test"); 
      _bstr_t bstrVar2(temp); 

    三、其它数据类型转换到CString
    使用CString的成员函数Format来转换,例如:

    • 整数(int)
      str.Format("%d",i);
    • 浮点数(float)
      str.Format("%f",i);
    • 字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值
      str = username;
    • 对于Format所不支持的数据类型,可以通过上面所说的关于其它数据类型转化到char *的方法先转到char *,然后赋值给CString变量。

    四、BSTR、_bstr_t与CComBSTR

    • CComBSTR 是ATL对BSTR的封装,_bstr_t是C++对BSTR的封装,BSTR是32位指针,但并不直接指向字串的缓冲区。
      char *转换到BSTR可以这样: 
      BSTR b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上comutil.h和comsupp.lib
      SysFreeString(bstrValue); 
      反之可以使用
      char *p=_com_util::ConvertBSTRToString(b);
      delete p;
      具体可以参考一,二段落里的具体说明。

      CComBSTR与_bstr_t对大量的操作符进行了重载,可以直接进行=,!=,==等操作,所以使用非常方便。
      特别是_bstr_t,建议大家使用它。

     

    五、VARIANT 、_variant_t 与 COleVariant

    • VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。
      对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:
      VARIANT va;
      int a=2001;
      va.vt=VT_I4;///指明整型数据
      va.lVal=a; ///赋值

      对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:

      Byte bVal; // VT_UI1.
      Short iVal; // VT_I2.
      long lVal; // VT_I4.
      float fltVal; // VT_R4.
      double dblVal; // VT_R8.
      VARIANT_BOOL boolVal; // VT_BOOL.
      SCODE scode; // VT_ERROR.
      CY cyVal; // VT_CY.
      DATE date; // VT_DATE.
      BSTR bstrVal; // VT_BSTR.
      DECIMAL FAR* pdecVal // VT_BYREF|VT_DECIMAL.
      IUnknown FAR* punkVal; // VT_UNKNOWN.
      IDispatch FAR* pdispVal; // VT_DISPATCH.
      SAFEARRAY FAR* parray; // VT_ARRAY|*.
      Byte FAR* pbVal; // VT_BYREF|VT_UI1.
      short FAR* piVal; // VT_BYREF|VT_I2.
      long FAR* plVal; // VT_BYREF|VT_I4.
      float FAR* pfltVal; // VT_BYREF|VT_R4.
      double FAR* pdblVal; // VT_BYREF|VT_R8.
      VARIANT_BOOL FAR* pboolVal; // VT_BYREF|VT_BOOL.
      SCODE FAR* pscode; // VT_BYREF|VT_ERROR.
      CY FAR* pcyVal; // VT_BYREF|VT_CY.
      DATE FAR* pdate; // VT_BYREF|VT_DATE.
      BSTR FAR* pbstrVal; // VT_BYREF|VT_BSTR.
      IUnknown FAR* FAR* ppunkVal; // VT_BYREF|VT_UNKNOWN.
      IDispatch FAR* FAR* ppdispVal; // VT_BYREF|VT_DISPATCH.
      SAFEARRAY FAR* FAR* pparray; // VT_ARRAY|*.
      VARIANT FAR* pvarVal; // VT_BYREF|VT_VARIANT.
      void FAR* byref; // Generic ByRef.
      char cVal; // VT_I1.
      unsigned short uiVal; // VT_UI2.
      unsigned long ulVal; // VT_UI4.
      int intVal; // VT_INT.
      unsigned int uintVal; // VT_UINT.
      char FAR * pcVal; // VT_BYREF|VT_I1.
      unsigned short FAR * puiVal; // VT_BYREF|VT_UI2.
      unsigned long FAR * pulVal; // VT_BYREF|VT_UI4.
      int FAR * pintVal; // VT_BYREF|VT_INT.
      unsigned int FAR * puintVal; //VT_BYREF|VT_UINT.
    • _variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
      使用时需加上#include <comdef.h>
      例如:
      long l=222;
      ing i=100;
      _variant_t lVal(l);
      lVal = (long)i;

    • COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:
      COleVariant v3 = "字符串", v4 = (long)1999;
      CString str =(BSTR)v3.pbstrVal;
      long i = v4.lVal;

    六、其它一些COM数据类型

    • 根据ProgID得到CLSID
      HRESULT CLSIDFromProgID( LPCOLESTR lpszProgID,LPCLSID pclsid);
      CLSID clsid;
      CLSIDFromProgID( L"MAPI.Folder",&clsid);
    • 根据CLSID得到ProgID
      WINOLEAPI ProgIDFromCLSID( REFCLSID clsid,LPOLESTR * lplpszProgID); 
      例如我们已经定义了 CLSID_IApplication,下面的代码得到ProgID
      LPOLESTR pProgID = 0;
      ProgIDFromCLSID( CLSID_IApplication,&pProgID);
      ...///可以使用pProgID 
      CoTaskMemFree(pProgID);//不要忘记释放 

    七、ANSI与Unicode
    Unicode称为宽字符型字串,COM里使用的都是Unicode字符串。

    • 将ANSI转换到Unicode
      (1)通过L这个宏来实现,例如: CLSIDFromProgID( L"MAPI.Folder",&clsid);
      (2)通过MultiByteToWideChar函数实现转换,例如:
      char *szProgID = "MAPI.Folder";
      WCHAR szWideProgID[128];
      CLSID clsid;
      long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));
      szWideProgID[lLen] = '\0'; 
      (3)通过A2W宏来实现,例如: 
      USES_CONVERSION; 
      CLSIDFromProgID( A2W(szProgID),&clsid);
    • 将Unicode转换到ANSI
      (1)使用WideCharToMultiByte,例如:
      // 假设已经有了一个Unicode 串 wszSomeString... 
      char szANSIString [MAX_PATH]; 
      WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL ); 
      (2)使用W2A宏来实现,例如:
      USES_CONVERSION;
      pTemp=W2A(wszSomeString);

    八、其它

    • 对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如:
      LPARAM lParam;
      WORD loValue = LOWORD(lParam);///取低16位
      WORD hiValue = HIWORD(lParam);///取高16位

    • 对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:
      WORD wValue;
      BYTE loValue = LOBYTE(wValue);///取低8位
      BYTE hiValue = HIBYTE(wValue);///取高8位

    • 两个16位数据(WORD)合成32位数据(DWORD,LRESULT,LPARAM,或WPARAM)
      LONG MAKELONG( WORD wLow, WORD wHigh );
      WPARAM MAKEWPARAM( WORD wLow, WORD wHigh ); 
      LPARAM MAKELPARAM( WORD wLow, WORD wHigh );
      LRESULT MAKELRESULT( WORD wLow, WORD wHigh ); 

    • 两个8位的数据(BYTE)合成16位的数据(WORD)
      WORD MAKEWORD( BYTE bLow, BYTE bHigh ); 

    • 从R(red),G(green),B(blue)三色得到COLORREF类型的颜色值
      COLORREF RGB( BYTE byRed,BYTE byGreen,BYTE byBlue );
      例如COLORREF bkcolor = RGB(0x22,0x98,0x34);

    • 从COLORREF类型的颜色值得到RGB三个颜色值
      BYTE Red = GetRValue(bkcolor); ///得到红颜色
      BYTE Green = GetGValue(bkcolor); ///得到绿颜色
      BYTE Blue = GetBValue(bkcolor); ///得到兰颜色

    转载于:https://www.cnblogs.com/CBDoctor/archive/2011/11/04/2236288.html

    展开全文
  • VC维度

    2014-04-04 20:48:59
    Vc维度是针对某个分类器而言。Vc维度与分类器的复杂度有关。在学习分析时候,把分类器看做是来自于某类分类器集合,从而进行误差分析。直观来讲,分类器的复杂度正比于它所在的集合的元素个数,而元素个数与参数的...

    转载自:http://blog.csdn.net/tianguokaka/article/details/16868567

    Vc维度是针对某个分类器而言。Vc维度与分类器的复杂度有关。在学习分析时候,把分类器看做是来自于某类分类器集合,从而进行误差分析。直观来讲,分类器的复杂度正比于它所在的集合的元素个数,而元素个数与参数的个数由关。例如某个分类器有d个参数,每个参数由32位表示,那么可以推得分类器集合包含了个不同的元素,也就是参数越多分类器复杂度越高。但这仅仅是最直观的理解,如何精确定义分类器的复杂度?这就涉及到了vc维度。

    可以直观定义vc维度是单个分类器可最多分类的数据点的个数(隐含条件是不要求对在同一直线的点的分类)。下面举例图解:

    在二维空间上,一个线性分类器的vc维度是3,因为它可以准确对任意三个点进行正确分类,无论它们如何排列。需要强调的是,不要求对共线的情况分类。



    但是线性分类器无法对四个点进行准确分类,即使它们不共线,如下图。


    要想分类这四个点,单个线性分类器是不行的。

    所以线性分类器vc维度是3.

    展开全文
  • 数据结构》实验一:  VC编程工具的灵活使用 一..实验目的  复习巩固VC编程环境的使用,以及C++模板设计。 1.回顾并掌握VC单文件结构程序设计过程。 2.回顾并掌握VC多文件工程设计过程 3.掌握VC程序调试...

    《数据结构》实验一:      VC编程工具的灵活使用

    一..实验目的

         复习巩固VC编程环境的使用,以及C++模板设计。

    1.回顾并掌握VC单文件结构程序设计过程。

    2.回顾并掌握VC多文件工程设计过程

    3.掌握VC程序调试过程。

    4.回顾C++模板和模板的程序设计。

    二.实验时间

       第二周第二次课。2个学时。

    三.实验内容

    1. 设计一个单文件结构程序完成从键盘输入两个数,输出二者的“和”和“积”的结果。要求如下:

    1)设计函数来计算“和”和“积”,在主函数中调用,并能考虑重载函数,使整数和小数均能计算。

    2)分别使用单步调试和断点调试来调试程序。并多次运行力求熟练调试方法。

    2.使用函数的模板来实现上述功能。

    3.使用一个类来实现上述功能。要求:

      1)使用类模板

      2)使用多文件:类的声明有头文件中;类的函数定义一个源文件中,在主程序文件中设计主函数程序,在实例化输出结果。

    四.参考资料

        实验教程P159-170.

    五.实验报告

    1.在博客中先写上实习目的和内容,然后分别上传三个程序代码。插入调试关键结果截图。

    2.写一个博文,总结重载和模板的知识点。

    展开全文
  • 什么是数据结构 数据结构是对计算机内存(亦或是计算机磁盘)的数据的一种安排。数据结构包含数组、链表、二叉树、栈、哈希表等等。 什么是算法 算法是对数据结构的各种处理。例如查找一条特殊的数据项或对数据进行...

    什么是数据结构

    数据结构是对计算机内存(亦或是计算机磁盘)的数据的一种安排。数据结构包含数组、链表、二叉树、栈、哈希表等等。

    什么是算法

    算法是对数据结构的各种处理。例如查找一条特殊的数据项或对数据进行排序。

    各数据结构之间的优缺点对比

    数据结构 优点 缺点
    数组 插入快,如果知道下标,可以非常快的存取 查找慢,删除慢,大小固定
    有序数据 比无序数组查找快 删除和插入慢,大小固定
    提供后进先出的存取 存取其他项很慢
    队列 提供先进先出的存取 存取其他项很慢
    链表 插入快,删除快 查找慢
    二叉树 查找、删除、插入都很快(如果数保持平衡) 删除算法复杂
    红-黑树 查找、删除、插入都快。树总是平衡的。 算法复杂
    2-3-4树 查找、删除、插入都快。树总是平衡的。类似的树对磁盘存储有用。 算法复杂
    哈希表 如果关键字已知则存取极快。插入快 删除慢,如果不知道关键字则存取也很慢,对空间使用不充分
    插入、删除快,对最大数据项的存取很快 对其他数据项存取慢
    对现实世界建模 有些算法慢且复杂
    展开全文
  • 最近打算自学数据结构,于是就在网上淘了两本书,一本是清华大学出版社出的严蔚敏老师的数据结构,一本是程杰的大话数据结构。直接看严老师的那一本实再是很吃力。于是我就先看大话的内容后,在深入的看严老师的书。...
    最近打算自学数据结构,于是就在网上淘了两本书,一本是清华大学出版社出的严蔚敏老师的数据结构,一本是程杰的大话数据结构。直接看严老师的那一本实再是很吃力。于是我就先看大话的内容后,在深入的看严老师的书。大话数据结构写的非常有意思,语言很口语化,对于有些概念都用一些通俗的语言描述,看着不累,但是个人觉得其内容的深度太低,只适合了解一下基础的概念。想深入的学习,还是严老师的那本书。所以个人觉得两本书一起看会比较好。楼主之前学过C语言,但是学的很烂,最近也在复习C 的一些知识。数据结构用的多的C的知识是指针,结构体,还有函数。都是C的精华内容。这几天看完了线性表的内容,于是就想写几个程序。找到的大多程序都只是给了一个算法,对于我这样的菜鸟来说,程序是跑不起来的。于是最终找到的高一凡老师写的严蔚敏老师那本书的所有算法的具体实现。是可以直接在VC下运行的程序代码。看后自己写了一个含有头节点的单链表的生成和打印输出程序。有关单链表生成的插入发法主要有两种。头插法,和尾插法。这里我用的尾插法。下面是程序的代码
    /************************************************************************/
    /* 本程序实现含有头结点的单链表的建立和数据域元素的输出
    
    2012年7月8日0:14:05                                 */
    /************************************************************************/
    #include < stdio.h >
    #include < malloc.h >
    typedef int ElemType ;
    
     typedef struct  LNode // 线性表的单链表存储结构
    {
      ElemType data;
      struct LNode *next;
    } LNode,*Pnode; // 这样以后LNode 相当于struct LNode Pnode 它表示的是结构体的数据类型。Pnode 相当于struct LNode *
     
     /*线性表创建函数*/
      Pnode creat_linklist(void)
    {
       int i;   //循环的计数参数
       int tem; // 暂时存储用户输入节点的数据域的值
       int len; //创建线性表的长度
       Pnode phead,pnew,ptail;// 定义三个节点 phead 表示头结点,pnew 表示新生成的节点,ptail表示尾节点。
       phead = (Pnode)malloc(sizeof(LNode));// 为头结点分配一段内存
       ptail = phead;// 让头节点指向尾节点,利用尾插法建立链表。
       ptail ->next = NULL;//尾节点后继指向空
       
       printf("请输入需要生成单链表节点的个数:len = ");
       scanf("%d",&len);
      
      for (i = 0;i < len; i++ )
      {
       printf("请输入单链表的第%d个节点的值:",i+1);
       scanf("%d",&tem);
       pnew = (Pnode)malloc(sizeof(LNode));//生成一个新节点
       pnew->data = tem;//将用户输入的值赋给新节点的数据域
       ptail->next = pnew ;//尾插法的实现
       pnew->next=NULL;
       ptail = pnew;
       
      }
     return phead;
    }
    /* 线性表遍历输出*/
     void traverse_linklist (Pnode phead)
     {
       Pnode p = phead->next;
       
       while (NULL != p)
       {
    	   printf(" %d ", p->data);
    	   p = p->next;
       }
      
       return;
     }
    
     int main(void)
      {
          Pnode phead = NULL;
    	  phead = creat_linklist();
          traverse_linklist(phead);
          return 0;
      }
    

    这里解释一下什么是尾插法。首先分配三个节点,头结点Phead,尾节点Ptail,以及新生成节点Pnew.首先给头结点和尾节点分配内存,然后让头节点和尾节点相等。

    在新节点生成之后另Ptail的后继继节点尾Pnew,语句为Ptail->next= Pnew: 然后把Pnew后继指向空节点 Pnew->=NULL; 然后另Ptail=Pnew;

    这样就把Pnew 挂在了Phead 的后面。


    这以后每次循环之后 Ptail 总是指向链表的尾部

    所以这种发法叫做尾插法


    展开全文
  • 数据结构实验1

    2014-09-24 18:23:32
    数据结构》实验一:VC编程环境灵活应用 分类: 《数据结构》 2014-09-02 09:22 461人阅读 评论(9) 收藏 举报 《数据结构》实验一: VC编程工具的灵活使用 一..实验目的  复习巩固VC编程环境...
  • 数据结构环境准备vc6.0
  • 数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑 链接☛☛☛《数据结构》课本源码合辑 习题集全解析 链接☛☛☛《数据结构题集》习题解析合辑 ★相关...
  • 支持向量机方法是建立在统计学习理论的VC 维理论和结构风险最小原理基础上。 置信风险: 分类器对 未知样本进行分类,得到的误差。 经验风险: 训练好的分类器,对训练样本重新分类得到的误差。即样本误差...
  • 数据结构》实验一: VC编程工具的灵活使用 一..实验目的  复习巩固VC编程环境的使用,以及C++模板设计。 1.回顾并掌握VC单文件结构程序设计过程。 2.回顾并掌握VC多文件工程设计过程 3.掌握VC...
  • 数据结构课程设计报告 一、实训目的 通过课程设计,学会运用数据结构知识,针对具体应用,自己设计合理数据结构,确定存储结构,并能设计具体操作算法,选择使用具体语言进行实现。掌握C++较复杂程序的组织和设计...
  • 1.回顾并掌握VC单文件结构程序设计过程。 2.回顾并掌握VC多文件工程设计过程 3.掌握VC程序调试过程。 4.回顾C++模板和模板的程序设计。 二.实验时间  第二周第二次课。2个学时。 三...
  • 实验一
  • 分享一下数据结构的上机题答案,全部亲测通过,整理了一下,希望给正在学习数据结构的童鞋一些帮助,先上一张图,说明一下是哪本书:(注:我是用VS2012写的,用VC的同学需要稍微改一下。)然后,下载地址::第二章...
  • 数据结构》实验一: VC编程工具的灵活使用 一..实验目的  复习巩固VC编程环境的使用,以及C++模板设计。 1.回顾并掌握VC单文件结构程序设计过程。 2.回顾并掌握VC多文件工程设计过程 3.掌握VC程序调试...
  • 相同的对齐方式下 ,结构体内部数据 定义的顺序不同 ,结构体整体占据内存空间也 不同 ,如下: 设结构体如下定义: struct A {  int a;  char b;  short c; }; 结构体A中包含了4字节长度的int一个,1...
  • 解释一下vc维的本质和结构风险最小化。 VC维在有限的训练样本情况下,当样本数 n 固定时,此时学习机器的 VC 维越高学习机器的复杂性越高。VC 维反映了函数集的学习能力,VC 维越大则学习机器越复杂(容量越大)。 ...
  • 结构化风险最小、VC维到SVM的理解 ,理解SVM背后的数学原理!
  • 上学时没学过数据结构和算法,于是现在有机会就自学。下面是我最近在等待进入项目组期间,花了1小时学习了一下迷宫问题。下面是我学习时找到的一篇课程设计的报告,然后自己先看懂,然后又在VC6.0下运行了。 迷宫...
  • 数据结构》实验一: VC编程工具的灵活使用  一..实验目的  复习巩固VC编程环境的使用,以及C++模板设计。 1.回顾并掌握VC单文件结构程序设计过程。 2.回顾并掌握VC多文件工程设计过程 3....
1 2 3 4 5 ... 20
收藏数 80,302
精华内容 32,120