这两周在做一个软件作业,是要用VC实现一个迭代法.主界面有几个 Edit Control,其中2个 Edit Control负责读取输入的系数矩阵以及输出方程组的解,系数矩阵是二维浮点型数组A,方程组的解是一维浮点型数组b,这两个Edit Control我都设置为了CString类型了,并且分别与变量Matrix和vector关联,现在要怎样才能把Matrix和vector中的内容对应转换到A和b中哦?不知道都有哪些函数,所以无从下手,还请大家多多指点,谢谢先:)

解决方案 »

  1.   

    strtok
    atof
    sprintf
    应该就差不多了
      

  2.   

    //如果为ANSI编码,可以使用简单的atof
    CString str("1.234");
    double d=atof(str);
    //否则(UNICODE或者ANSI)使用万能的_tcstod
    TCHAR *pszStop;
    CString str(_T("1.234"));
    double d=_tcstod(str,&pszStop);
      

  3.   

    我的这两个矩阵的输入只有浮点数,只用atof就可以了吧?
      

  4.   

    使用 _tcstod 兼容性更好。
      

  5.   

    我的CString类型是用空格分隔的多个浮点数,这样怎么用_tsctod函数呢?查了MSDN都没查到这个函数的用法...
      

  6.   

    可以使用 AfxExtractSubString 或 _tcstok,依次从字符串中取出每个浮点数。
      

  7.   


    #include <stdlib.h>
    #include <stdio.h>void main( void )
    {
       char   *string, *stopstring;
       double x;
       long   l;
       int    base;
       unsigned long ul;
       string = "3.1415926This stopped it";
       x = strtod( string, &stopstring );                       //1
       printf( "string = %s\n", string );
       printf("   strtod = %f\n", x );                          //2
       printf("   Stopped scan at: %s\n\n", stopstring );
       string = "-10110134932This stopped it";
       l = strtol( string, &stopstring, 10 );
       printf( "string = %s", string );
       printf("   strtol = %ld", l );
       printf("   Stopped scan at: %s", stopstring );
       string = "10110134932";
       printf( "string = %s\n", string );
       /* Convert string using base 2, 4, and 8: */
       for( base = 2; base <= 8; base *= 2 )
       {
          /* Convert the string: */
          ul = strtoul( string, &stopstring, base );
          printf( "   strtol = %ld (base %d)\n", ul, base );
          printf( "   Stopped scan at: %s\n", stopstring );
       }
    }这是MSDN上给出的例子,1和2分别是转换和输出
    输出结果是strtod = 3.141593
    希望对你有帮助
      

  8.   

    我最近也在做矩阵算法方面的东西。
    下面这个函数就是把 Edit Control中的字符串转换为double型的矩阵值。
    // 将字符串转化为矩阵的值
    // 元素间的间隔为空格符
    // 矩阵各行间的间隔为换行回车符
    BOOL CMatrix::FromString(CString s)
    {
    int i, j, tempcols;
    if (s.IsEmpty())
    return false;

    CString sDelim = " ";
    CTokenizer tk(s, "\r\n");

    CStringList ListRow;
    CString sRow;
    while (tk.Next(sRow))
    {
    sRow.TrimLeft();
    sRow.TrimRight();
    if (sRow.IsEmpty())
    break;

    ListRow.AddTail(sRow);
    }
    // 行数
    m_nNumRows = ListRow.GetCount(); sRow = ListRow.GetHead();
    CTokenizer tkRow(sRow, sDelim);
    CString sElement;
    // 列数
    m_nNumColumns = 0;
    while (tkRow.Next(sElement))
    {
    m_nNumColumns ++;
    } // 检查维数
    POSITION pos = ListRow.GetHeadPosition();
    for (i = 1; i <= m_nNumRows; i++)
    {
    sRow = ListRow.GetNext(pos);
    CTokenizer tkRow(sRow, sDelim);
    tempcols = 0;
    while (tkRow.Next(sElement))
    {
    tempcols ++;
    }
    //ASSERT(m_nNumColumns == tempcols);
    if (m_nNumColumns != tempcols)
    {
    AfxMessageBox("Please check matrix dimensions !", MB_OK | MB_ICONINFORMATION);
    return false;
    }
    m_nNumColumns = tempcols;
    }

    // 初始化矩阵
    if (! Init(m_nNumRows, m_nNumColumns))
    return FALSE;

    // 设置值
    pos = ListRow.GetHeadPosition();
    for (i = 1; i <= m_nNumRows; i++)
    {
    sRow = ListRow.GetNext(pos);
    j = 1;
    CTokenizer tkRow(sRow, sDelim);
    while (tkRow.Next(sElement))
    {
    sElement.TrimLeft();
    sElement.TrimRight();
    double v = atof(sElement);
    SetElement(i, j, v);
    j ++;
    }
    }

    return TRUE;
    }
      

  9.   

    再问一个问题,我这个作业要求通过5个Edit Control读取数据然后通过一个算法将解输出到另一个Edit Control,那么和最后这个Edit Control关联的变量设置为Control类型还是Value类型呢?
      

  10.   

    干嘛不直接用CEDIT的double型呢
      

  11.   

    CEdit可以很方便地向double转换么?
      

  12.   

    单个数据可以直接关联数值类型的变量,你现在是想用一个Edit输入多个数据,就没法这样用了。
      

  13.   

    嗯,现在是先转化成char*再转化,但是貌似这里出了问题,检查代码又看不出来,调试也没发现问题所在...