MFC串口助手程序代码看不懂啊。。。求救。。。

//全局变量intLineHight[122];intLHTemp[120];CStringDTemp;intLineNum=0;intNextTime;intRightLeftNum=0;intcheck='n';intgogo=0;intspeed=9600;inttab=0;CStringFilePath="c:\data.txt";//画图函数//算法:运用LineTo函数把120个点连成折线voidCCommDlg::OnPaint(){inthoc;if(NextTime600stop==FALSE)hoc=600;elsehoc=NextTime;CStringTabStr="";CPaintDCdc(this);//用于绘制的设备上下文dc.GetNearestColor(RGB(128,0,0));//设备能显示的最接近crColor值dc.MoveTo(108,250);//移动到坐标if(NextTime=600stop==FALSE)//将点连成线for(inti=0;i(NextTime/5);i++){dc.LineTo(108+(5*i),250-LineHight[i]*5+99);//}elsefor(inti=0;i121;i++){dc.LineTo(108+(5*i),250-LineHight[i]*5+99);}TabStr.Format("%d",hoc/5-120);//X轴对应的时间坐标值,使时间对应数据改变SetDlgItemText(IDC_TAB1,TabStr);TabStr.Format("%d",hoc/5-100);SetDlgItemText(IDC_TAB2,TabStr);TabStr.Format("%d",hoc/5-80);SetDlgItemText(IDC_TAB3,TabStr);TabStr.Format("%d",hoc/5-60);SetDlgItemText(IDC_TAB4,TabStr);TabStr.Format("%d",hoc/5-40);SetDlgItemText(IDC_TAB5,TabStr);TabStr.Format("%d",hoc/5-20);SetDlgItemText(IDC_TAB6,TabStr);TabStr.Format("%d",hoc/5);SetDlgItemText(IDC_TAB7,TabStr);}voidCCommDlg::OnComm(){if(stop)return;//若暂停,不接受数据VARIANTm_input1;//定义VARIANT型变量,用于存放接收到的数据COleSafeArraym_input2;;//定义safearray型变量longlength,i;BYTEdata[600];//定义BYTE型数组CStringstr;//定义字符串if(m_Comm.GetCommEvent()==2)//接收缓冲区内有字符{m_input1=m_Comm.GetInput();//读取缓冲区内的数据,把接收到的数据存放到VARIANT型变量里m_input2=m_input1;//将VARIANT型变量转换为ColeSafeArray型变量length=m_input2.GetOneDimSize();//确定数据长度//.GetOneDimSize()是返回一维数组元素的个数,这个一维数组里面每个元素都是数组类型,依次存放到data[]中for(i=0;ilength;i++)m_input2.GetElement(i,data+i);//将数据转换为BYTE型数组,存在data[i]中。for(i=0;ilength;i++)//将数组转换为Cstring型变量{CFilefile;CStringtempstr;BYTEa=*(char*)(data+i);BYTEb=*(char*)(data+(++i));floatc=(float)a+(float)(b%10)/10;str.Format("%2.1f",c);//将c格式化if(str.GetLength()5)str="0"+str;str=str.Right(5);//从数组中提取5个字符m_ReceiveData+=str;//将刚采集的数加到编辑框中LineHight[121]=a;Display();//对数据显示前的处理//将数据保存到文件中if(m_ReceiveData.GetLength()=600)//600个字符刚好对应120个数据{CStdioFilereadfile;CStringreadstr,readstr2;if(readfile.Open(FilePath,CFile::modeRead)){while(readfile.ReadString(readstr))//逐行查询,至到文件尾{readstr2+=readstr;}readfile.Close();}if(file.Open(FilePath,CFile::modeCreate|CFile::modeReadWrite)){file.Write(readstr2,readstr2.GetLength());//原来的数据file.Write(m_ReceiveData,600);//写入新的120个数据file.Close();m_ReceiveData="";//清除编辑框内容break;}}}}UpdateData(FALSE);//更新编辑框内容}//对数据显示前的处理:将新数年据加到左边,原来的右移一位voidCCommDlg::Display(){if(NextTime=600stop==FALSE){LineHight[NextTime/5]=LineHight[121];}else{for(inti=0;i120;i++){LineHight[i]=LineHight[i+1];}LineHight[120]=LineHight[121];}NextTime=NextTime+5;this-Invalidate();return;}

1.   编程:计算班级学生平均成绩和不及格人数。

//这三个函数之间的运行先后顺序是怎么样的?没有main函数一下子不会看代码了。//我的问题是dc.LineTo(108+(5*i),250-LineHight[i]*5+99);//以及BYTEa=*(char*)(data+i);//BYTEb=*(char*)(data+(++i));//floatc=(float)a+(float)(b%10)/10;//str.Format(“%2.1f”,c);//将c格式化//if(str.GetLength()5)str=”0″+str;//str=str.Right(5);//从数组中提取5个字符//m_ReceiveData+=str;//将刚采集的数加到编辑框中//LineHight[121]=a;//这两个算法看不懂。。。希望大家能帮我讲解一下。

#include <stdio.h>

int main(int argc, constchar * argv[])

{

    int stu[10]={99,98,55,96,95,94,93,92,91,90};

    int sum=0;

    int count=0;

    float avr=0;

    for (int i=0; i<10; i++) {

        sum+=stu[i];

        if (60>stu[i]) {

            count++;

        }

    }

    avr = (float)sum / 10;

    printf(“学生平均成绩是:%f,不及格人数是:%d”,avr,count);

    return0;

}

2.   编程,用条件表达式实现三个整数从大到小排序。

#include <stdio.h>

int main(int argc, constchar * argv[])

{

 

    int a=10,b=20,c=30;

    int max,mid,min;

    max=a>b?(a>c?a:c):(b>c?b:c);

    mid=a>b?(a<c?a:c>b?c:b):(b<c?b:c);

    min=a<b?(a<c?a:c):(b<c?b:c);

    printf(“max=%d,mid=%d,min=%d”,max,mid,min);

    return0;

}

 

3.   请说明三种循环语句的异同点。

     三种循环分别是while;do while 和 for

     相同点都是实现了一段逻辑循环操作,都具有以下三条内容:

     (1)循环体的设计

     (2)循环条件的设计

     (3)循环入口的初始化工作

     不同点:while是先进行判断,然后执行循环体;do
while是先进行循环体然后再进行判断;for也是先进行判断然后进入循环体,结束后,进行++操作

     for循环一般用在循环次数固定的情况下

 

4.   请举例说明 break、continue 语句的区别。

      break//终止当前循环       contine//跳过此次循环

     #include <stdio.h>

int main(int argc, constchar * argv[])

{

 

    for (int i=0; i<4; i++) {

        for (int j=0; j<4; j++) {

            if (i==1) {

                continue;

            }

            if (j==2) {

                break;

            }

            printf(“%d   %dn”,i,j);

        }

    }

    return0;

}

结果:

0   0

0   1

2   0

2   1

3   0

3   1

5.   用三种循环语句编写程序实现:计算 100 以内的整数之和 。

     

for循环:

#include <stdio.h>

int main(int argc, constchar * argv[])

{

 

    int sum=0;

    for (int i=0; i<=100; i++) {

        sum+=i;

    }

    printf(“100以内的整数的和:%d”,sum);

    return0;

}

while循环:

#include <stdio.h>

int main(int argc, constchar * argv[])

{

 

    int sum=0;

    int i=0;

    while (i<=100) {

        sum+=i;

        i++;

    }

    printf(“100以内的整数的和:%d”,sum);

    return0;

}

do while循环:

#include <stdio.h>

int main(int argc, constchar * argv[])

{

 

    int sum=0;

    int i=0;

    do {

        sum+=i;

        i++;

    }while (i<=100);

    printf(“100以内的整数的和:%d”,sum);

    return0;

}

一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10分)

提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n
与“零值”比较的 if 语句为:

    if ( n == 0 )

    if ( n != 0 )

以此类推。

 

请写出 BOOL  flag 与“零值”比较的 if 语句:

 if(FALSE == flag)[错误]

 

 if(flag)或者if(!flag)

请写出 float  x 与“零值”比较的 if 语句:

 

 const double EPSILON = 1.00e-07;

 

if (x<abs(EPSILON))

{

 

}

 

请写出 char  *p 与“零值”比较的 if 语句:

 

 if(NULL == p)或者if(NULL != p)

 

二、以下为Windows NT下的32位C++程序,请计算sizeof的值(10分)

 

       char  str[] = “Hello” ;

       char   *p = str ;

int     n = 10;

请计算

sizeof (str ) = 5[错]     6[对]          char str[8] = “Hello”  
sizeof(str) =8

        

sizeof ( p ) =  8    

         

sizeof ( n ) = 4

void Func ( char str[100])

{

请计算

 sizeof( str ) = 8  //相当于指针

}

 

void *p = malloc( 100 );

请计算

sizeof ( p ) =8  

 

 

三、简答题(25分)

 

1、头文件中的 ifndef/define/endif 干什么用?

 

 防止引用该头文件的时候重复定义

 

2、#include  <filename.h>   和  #include  “filename.h”
有什么区别?

 

 第一种是指从系统文件中去找filename.h文件;第二种是从当前文件中去找filename.h的文件

 

3、const 有什么用途?(请至少说明两种)

 1.const修饰常量,该变量不可修改,例如const double PI=3.14

 

 2.常指针,const放在不同的地方有不同的效果,例如:

const int *p 和 int const *p
效果是一样的,指针所指向的内容是不可以变的,指针指向可以变

const int *p 和 int const *p指针指向不可变,但指针指向的内容可以变

int const * const p  指针指向和内容都不可以变

 

4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?

 

 首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。

被extern “C”修饰的变量和函数是按照C语言方式编译和连接的

 

 

5、请简述以下两个for循环的优缺点

 

// 第一个

for (i=0; i<N; i++)

{

if (condition)

    DoSomething();

else

    DoOtherthing();

}

// 第二个

if (condition)

{

for (i=0; i<N; i++)

    DoSomething();

}

else

{

    for (i=0; i<N; i++)

    DoOtherthing();

}

优点:

 如果N比较小,第一种方法代码量少

 

缺点:

 

 耗时间

 

优点:

发表评论

电子邮件地址不会被公开。 必填项已用*标注