返回列表 发帖

【教学视频】《C语言也能干大事》第五节:Windows编程原理及自己动手写计算器

《C语言也能干大事》已经录制第二版,不推荐初学者学习这里的旧版,因此请到下面的地址( http://www.rupeng.com/forum/forum-52-1.html )学习第二版。





如鹏电骡(verycd)下载站:http://www.verycd.com/topics/2800166/

板书:
1、在编写控制台程序的时候一切流程都是有先后关系、并行的,而且所有函数都是由我们来调用的,比如下面的实例性代码:
printf("确定请输入y,取消输入n");
char c = getchar();
if(c=='y')
{

///

}
else if(c=='n')
{

///

}

我们可以用getchar来等待用户输入一个值。但是到了Windows编程中就不一样了,同一时刻用户即可能点击【OK】按钮,又可能点击【Cancel】按钮,又可能在文本框中输入几个字,还可能在窗口上双击几下,这样就无法同时等待用户的这些动作。为了解决这个问题,Windows引入了消息机制(也可以叫做回调机制或者事件机制)。在程序启动的时候把函数func1要响应【OK】按钮1的点击动作、函数func2要响应【Cancel】按钮的点击动作、函数func3要响应窗口的双击动作等等这些信息告诉Windows,然后当用户执行相应操作的时候Windows就会来主动调用你注册的函数,主动通知你。不再是程序调用操作系统的函数,而是操作系统反过来调用你的函数。Don't call me ,I'll call you!(也被人称为“好莱坞法则”)。
2、关于上面的这个问题要慢慢来理解,下面就来通过第一个例子来初步理解这个Don't call me ,I'll call you!
创建一个对话框程序,然后来分析代码。看Main_OnCommand方法,初探windows的消息机制。
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{

switch(id)


{


case IDC_OK:


MessageBox(hwnd,"You click OK!","Test003",MB_OK);


EndDialog(hwnd, id);


break;


case IDC_CANCEL:


MessageBox(hwnd,"You click Cancel!","Test003",MB_OK);


EndDialog(hwnd, id);


break;


default:break;


}

}
按钮被按下的时候Main_OnCommand方法被调用,hwnd是对话框句柄(什么是句柄后面讲,通俗的说就是通过它能够操纵对话框),id是控件的id,后两个参数暂时不关心。
Main_OnCommand方法中根据id,也就是被点击按钮的名字来决定不同的动作,EndDialog用来关闭对话框。
3、定制自己的对话框,向世界问好
首先打开资源编辑器并且打开对话框IDD_MAIN,然后删除对话框上的两个按钮和标签,同时删除main.cpp中的两个Case语句变成:
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{

switch(id)


{


default:break;


}

}
然后重新添加一个自己的按钮,在属性中修改Name属性为IDC_BTNHELLO
控件名字的潜规则:所有控件的Name都以“IDC_”开头,然后后边跟着控件类型的简称(按钮简称BTN、文本框简称EDT等等),最后才是控件的真正的名字。修改按钮的Caption属性(也就是按钮上显示的文字)为“问好”。

在代码中怎么得到IDC_BTNHELLO呢?刚才被删掉的IDC_OK是什么东东呢?回忆配置ResEd的时候配置的“名称输出格式”和“默认输出文件名”以及“保存时自动输出”。每次保存对话框的时候ResEd都会帮我们把控件的名字输出到rsrc.inc文件中,打开工程文件夹下的rsrc.inc,内容如下:
#define IDC_BTNHELLO
1001


Dialog编辑器会自动递增id的取值。然后生成rsrc.inc,其实就是h头文件,取这些定义的时候要先include这个inc文件。可以看到rsrc.inc文件中就是这些控件名字的定义,使用的时候只要include这些文件就可以。“rsrc.inc”和头文件一样。因此首先在main.cpp中添加“#include "rsrc.inc"

编辑Main_OnCommand方法:
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{

switch(id)


{



case IDC_BTNHELLO:



MessageBox(NULL,TEXT("
世界你好"),TEXT("问好"),MB_OK);


break;


default:break;


}

}

运行程序,点击“问好”按钮,咱们第一个响应按钮动作的程序就做好了。
4、自己动手写计算器1.0
1)、得到控件中用户输入的文本
GetDlgItemText(hwnd,IDC_EDTNAME,str,sizeof(str));
第一个参数是对话框的句柄;第二参数就是控件的idname);第三个参数就是字符串数组的指针;
疑问:为什么不能像MessageBox一样把字符串做为返回值返回呢???
这就涉及到C语言中函数返回指针的问题了
int i=20;
char cStr[3];
itoa(i,cStr,10);

char* f1()
{

return "adsfadsfasd";

}

在函数内部返回函数内构建的指针有可能出现数据混乱.
f1函数在执行的时候,这段内存是被占用的,一旦函数返回,那么内存就标记为可以被其他人、函数占用。
如果你把这段内存中的指针返回了,那么一旦其他地方用了这段内存,那么你引用的就是错误的数据了。
GetWindowTextGetDlgItemText的时候为什么要传数组名呢?复习:数组名就是指针,函数只有得到指针,才能直接操作数组中的数据。
2c语言中字符串连接:strcat(name,"你好");
但是在编写windows程序的时候最好使用lstrcat代替strcat
lstrcat(name,"你好");
同样代替的有:strlenlstrlenstrcmplstrcmp
3)向用户问好


TCHAR name[256];



GetDlgItemText(hwnd,IDC_EDTNAME,name,sizeof(name)/sizeof(TCHAR));



lstrcat(name,"
你好");


MessageBox(NULL,name,TEXT("
问好"),MB_OK);
4
C语言里边字符串转换为数字:atoiascii to int
5

编写windows程序的时候最好用TCHAR来代替char,可以避免中文的问题


case IDC_BTNHELLO:



TCHAR name[256];



GetDlgItemText(hwnd,IDC_EDTNAME,name,sizeof(name)/sizeof(TCHAR));



int i = atoi(name);



int j=i*2;



TCHAR result[256];



itoa(j,result,10);






MessageBox(NULL,result,TEXT("
问好"),MB_OK);
6GetSet:配对的,设置对话框的值用SetDlgItemText
代码:


case IDC_BTNADD:



//
取第一个文本框的字符串,然后得到整数表示

//
取第二个文本框的字符串,然后得到整数表示

//
计算两个整数的和

//
把和重新转换成字符串,然后Messagebox出来。

TCHAR cNumber1[256];


GetDlgItemText(hwnd,IDC_EDTNUM1,cNumber1,sizeof(cNumber1)/sizeof(TCHAR));


int n1 = atoi(cNumber1);


TCHAR cNumber2[256];


GetDlgItemText(hwnd,IDC_EDTNUM2,cNumber2,sizeof(cNumber2)/sizeof(TCHAR));


int n2 = atoi(cNumber2);


int n3 = n1+n2;


TCHAR cResult[256];


itoa(n3,cResult,10);


SetDlgItemText(hwnd,IDC_EDTRESULT, cResult);



break;

7代码中有UINTTCHARLRESULTHWND之类的新的数据类型,其实它们只是一些类型的别名而已,可以通过宏定义看出来。但是考虑到可移植性,尽量不要使用它们的真实类型
8)思考:这个计算两个数的和程序有什么缺陷?没有阻止用户输入非数字
9)作业:做一个面积计算器,用户输入半径,在另外一个文本框中显示面积。
5、得到系统中有哪些逻辑驱动器
DWORD GetLogicalDrives(VOID);
返回值的二进制位标志着存在哪些驱动器。其中,位0设为1表示驱动器A存在于系统中;位1设为1表示存在B驱动器;以次类推。
比如:
00001100:有C盘,D
000011100cde
1101A(软驱)、CD
1)写程序中的错误排除
"dwDrives"was not declared in the scope
declare:声明;scope:范围
"dwDrives"没有被声明在这个范围内。
2)以二进制显示GetLogicalDrives的返回值:

stdlib.h



DWORD ds = GetLogicalDrives();


char str[33];


itoa(ds,str,2);


MessageBox(NULL,str,"",MB_OK);


DWORD
是什么类型?在DWORD上点击右键,选择“转到DWORD的定义”,其实DWORD是“unsigned long”。因此str定义成33位(还有最后一位的“\0”)。
3)课后习题:判断是否存在D盘。
4)课后习题:依次显示系统中所有的盘符。比如显示出“CDEF”。
5)课后习题:显示系统中有多少个逻辑驱动器。
这三道课后作业都是在锻炼位运算。一定要重视,不要一位没啥意思,很多公司的笔试面试都会考查这一点,这也是继续深入研究C和其他语言的基础。




我做出的计算器,什么都没有输入,直接点击“=”于按钮,为什么结果会出来0呢?

            因为: int n1 = atoi(NUM1);
                       int n2 = atoi(NUM2);
             n1,n2的结果都为0啊,你调试一下就明白了
1

评分人数

TOP

我的计算器程序

calc02.rar (8.02 KB) void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
        case IDC_BTNADD:
        TCHAR cNumber1[256];
        GetDlgItemText(hwnd,IDC_EDTNUM1,cNumber1,sizeof(cNumber1)/sizeof(TCHAR));
        double fNumber1=atof(cNumber1);
         TCHAR cNumber2[256];
        GetDlgItemText(hwnd,IDC_EDTNUM2,cNumber2,sizeof(cNumber2)/sizeof(TCHAR));
        double fNumber2=atof(cNumber2);
        double fNumber3=fNumber1+fNumber2;
        TCHAR cResult[256];
        gcvt(fNumber3,10,cResult);
        SetDlgItemText(hwnd,IDC_EDTRESULT,cResult);
        break;
        case IDC_BTNSUBTRACT:
        TCHAR sNumber1[256];
        GetDlgItemText(hwnd,IDC_EDTNUM1,sNumber1,sizeof(sNumber1)/sizeof(TCHAR));
        double sNum1=atof(sNumber1);
         TCHAR sNumber2[256];
        GetDlgItemText(hwnd,IDC_EDTNUM2,sNumber2,sizeof(sNumber2)/sizeof(TCHAR));
        double sNum2=atof(sNumber2);
        double sNum3=sNum1-sNum2;
        TCHAR sResult[256];
        gcvt(sNum3,10,sResult);
        SetDlgItemText(hwnd,IDC_EDTRESULT,sResult);
        break;
        case IDC_BTNMULTIPLICATION:
        TCHAR tNumber1[256];
        GetDlgItemText(hwnd,IDC_EDTNUM1,tNumber1,sizeof(tNumber1)/sizeof(TCHAR));
        double tNum1=atof(tNumber1);
         TCHAR tNumber2[256];
        GetDlgItemText(hwnd,IDC_EDTNUM2,tNumber2,sizeof(tNumber2)/sizeof(TCHAR));
        double tNum2=atof(tNumber2);
        double tNum3=tNum1*tNum2;
        TCHAR tResult[256];
        gcvt(tNum3,10,tResult);
        SetDlgItemText(hwnd,IDC_EDTRESULT,tResult);
        break;
        case IDC_BTNDIVISION:
        TCHAR lNumber1[256];
        GetDlgItemText(hwnd,IDC_EDTNUM1,lNumber1,sizeof(lNumber1)/sizeof(TCHAR));
        double lNum1=atof(lNumber1);
         TCHAR lNumber2[256];
        GetDlgItemText(hwnd,IDC_EDTNUM2,lNumber2,sizeof(lNumber2)/sizeof(TCHAR));
        double lNum2=atof(lNumber2);
        double lNum3=lNum1/lNum2;
        TCHAR lResult[256];
        gcvt(lNum3,10,lResult);
        SetDlgItemText(hwnd,IDC_EDTRESULT,lResult);
        break;
        
        
        default:break;
    }

}
1

评分人数

TOP

交作业了 【好开心】


  1. void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
  2. {
  3.        #define M 300
  4.        #define PI 3.1415926
  5.        int count=0,t=0;//初始化
  6.        TCHAR STR[20]="无";

  7.        DWORD dw=GetLogicalDrives();
  8.     switch(id)
  9.     {
  10.         case IDC_BTNPI://圆面积计算
  11.                TCHAR sa[M];
  12.                lstrcpy(sa,"0");//初始化
  13.                GetDlgItemText(hwnd,IDC_EDTA,sa,sizeof(sa)/sizeof(TCHAR));
  14.                double r=atof(sa);
  15.                double square=r*r*PI;
  16.                TCHAR sb[M];
  17.                gcvt(square,10,sb);
  18.                SetDlgItemText(hwnd,IDC_EDTB,sb);
  19.        break;
  20.               case IDC_BTNPD://D盘是否存在
  21.                      
  22.                      
  23.                      if((dw&8)>0)
  24.                      {
  25.                             SetDlgItemText(hwnd,IDC_EDTDISKD,TEXT("存在"));
  26.                      }
  27.                      else
  28.                      {
  29.                            
  30.                             SetDlgItemText(hwnd,IDC_EDTDISKD,TEXT("不存在"));
  31.                      }
  32.             
  33.         break;
  34.         case IDC_BTNALL://计算盘数与列出存在的所有盘符
  35.                
  36.                TCHAR Ccount[20];
  37.                
  38.                while(dw>0)
  39.                {
  40.                             if((dw&1)==1)
  41.                             {
  42.                                    STR[count]='A'+t;
  43.                                    count++;
  44.                                    
  45.                             }
  46.                             dw=dw>>1;
  47.                             t++;
  48.                      }
  49.                      STR[count]='\0';
  50.                      itoa(count,Ccount,10);
  51.                      SetDlgItemText(hwnd,IDC_EDTALL,Ccount);
  52.                      SetDlgItemText(hwnd,IDC_EDTALL2,STR);
  53.                      count=t=0;lstrcpy(STR,"无");
  54.         break;
  55.         
  56.         default:break;
  57.     }

  58. }
复制代码


11.JPG
2009-7-19 15:56

作业程序.rar (8.21 KB)

1

评分人数

坚持就是胜利~~~~~

TOP

原帖由 Me烏托邦ing 于 2009-8-24 21:47 发表
case IDC_BTNAREAS:
          TCHAR cRadius[256];
          GetDlgItemText(hwnd,IDC_EDTRADIUS,cRadius,sizeof(cRadius)/sizeof(TCHAR));
          double R=atof(cRadius);
          //double S=PI*R*R;
...

我试过你的代码没有错,你看看你的PI宏定义是不是 #define Pi 3.1415926(没有“=”哦)
1

评分人数

TOP

交作业: 圆面积计算、获得本地磁盘信息等

Main_OnCommand 函数的响应按钮段:
  1. void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
  2. {
  3. TCHAR cDriveExists[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  4. int nLen=0;
  5. switch(id)
  6. {
  7. case IDC_BTNRESULT: //响应计算圆面积按钮
  8. TCHAR cBanjing[256];
  9. GetDlgItemText(hwnd,IDC_EDTRADIUS,cBanjing,sizeof(cBanjing)/sizeof(TCHAR));
  10. double fBanjing,fZhouchang;
  11. fBanjing = atof(cBanjing);
  12. fZhouchang = 3.1415926*(fBanjing*fBanjing);
  13. TCHAR cZhouchang[256];
  14. gcvt(fZhouchang,10,cZhouchang);
  15. //SetDlgItemText(hwnd,IDC_EDTZHOUCHANG,cZhouchang);
  16. SetDlgItemText(hwnd,IDC_STC,cZhouchang);
  17. break;
  18. case IDC_BTNCALCHELP: //响应圆面积帮助按钮
  19. MessageBox(hwnd,TEXT("\n圆形面积计算公式:\n\n圆面积(s)=圆周率π(3.14)*半径(r)的平方。\t"),TEXT("计算公式"),MB_OK|MB_ICONASTERISK);
  20. break;
  21. case IDC_BTNGETDRIVERS: //获取用户磁盘信息按钮
  22. DWORD dwMydrivers;
  23. dwMydrivers = GetLogicalDrives();
  24. TCHAR cDrivers[256];
  25. itoa(dwMydrivers,cDrivers,2); //转换为字符串
  26. strrev(cDrivers); //反转字符串
  27. TCHAR cDriverscn[256];
  28. //MessageBox(hwnd,cDrivers,TEXT("调试"),MB_OK);

  29. //列出所有存在盘符
  30. int i;
  31. for(i=0;i<strlen(cDrivers);i++)
  32. {
  33. if(cDrivers[i]=='1')
  34. {
  35. cDriverscn[nLen] = cDriveExists[i];
  36. nLen++;
  37. }
  38. }
  39. cDriverscn[nLen]='\0';
  40. SetDlgItemText(hwnd,IDC_EDTMYDRIVERS,cDriverscn);

  41. //判断是否存在D盘
  42. if(cDrivers[4]='1')
  43. {
  44. SetDlgItemText(hwnd,IDC_EDTYESNOD,TEXT("有"));
  45. }
  46. else
  47. {
  48. SetDlgItemText(hwnd,IDC_EDTYESNOD,TEXT("无"));
  49. }

  50. //计算存在磁盘总数
  51. TCHAR cSUM[256];
  52. itoa(nLen,cSUM,10);
  53. SetDlgItemText(hwnd,IDC_EDTDRIVERSNUM,cSUM);
  54. break;

  55. default:break;
  56. }
  57. }
复制代码


#include "rsrc.inc"     rsrc.inc文件里面的内容

  1. #define IDC_GRPCALC             1001
  2. #define IDC_GRP1                1014
  3. #define IDC_EDTRADIUS           1002
  4. #define IDC_BTNRESULT           1003
  5. #define IDC_BTNCALCHELP         1006
  6. #define IDC_BTNGETDRIVERS       1008
  7. #define IDC_STC1                1005
  8. #define IDC_EDTMYDRIVERS        1007
  9. #define IDC_EDTYESNOD           1009
  10. #define IDC_EDTDRIVERSNUM       1010
  11. #define IDC_STC2                1011
  12. #define IDC_STC3                1012
  13. #define IDC_STC4                1013
  14. #define IDC_STC                 1015
复制代码


dialogs.dlg  文件的内容

  1. #define IDC_GRPCALC 1001
  2. #define IDC_GRP1 1014
  3. #define IDC_EDTRADIUS 1002
  4. #define IDC_BTNRESULT 1003
  5. #define IDC_BTNCALCHELP 1006
  6. #define IDC_BTNGETDRIVERS 1008
  7. #define IDC_STC1 1005
  8. #define IDC_EDTMYDRIVERS 1007
  9. #define IDC_EDTYESNOD 1009
  10. #define IDC_EDTDRIVERSNUM 1010
  11. #define IDC_STC2 1011
  12. #define IDC_STC3 1012
  13. #define IDC_STC4 1013
  14. #define IDC_STC 1015
  15. #include "dialogs.h"
  16. #include <windows.h>
  17. IDD_MAIN DIALOGEX 122,75,245,193
  18. LANGUAGE 4,2
  19. CAPTION "calc"
  20. FONT 8,"Tahoma",0,0,0
  21. STYLE WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MAXIMIZEBOX
  22. BEGIN
  23.   CONTROL "",IDC_EDTRADIUS,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP,102,29,54,13,WS_EX_CLIENTEDGE
  24.   CONTROL "计  算",IDC_BTNRESULT,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,162,29,42,13
  25.   CONTROL "帮  助",IDC_BTNCALCHELP,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,162,46,42,13
  26.   CONTROL "获取磁盘信息",IDC_BTNGETDRIVERS,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,90,158,66,13
  27.   CONTROL "计算结果:",IDC_STC1,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,60,48,40,9
  28.   CONTROL "",IDC_EDTMYDRIVERS,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_READONLY,126,118,86,13,WS_EX_CLIENTEDGE
  29.   CONTROL "",IDC_EDTYESNOD,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_READONLY,126,99,86,13,WS_EX_CLIENTEDGE
  30.   CONTROL "",IDC_EDTDRIVERSNUM,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_READONLY,126,136,86,13,WS_EX_CLIENTEDGE
  31.   CONTROL "系统中是否存在有 D 盘:",IDC_STC2,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,30,101,90,9
  32.   CONTROL "系统中存在的所有磁盘:",IDC_STC3,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,30,120,88,9
  33.   CONTROL "系统中逻辑驱动器个数:",IDC_STC4,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,30,138,88,9
  34.   CONTROL "请输入圆的半径 r=",IDC_TEXT,"Static",WS_CHILD|WS_VISIBLE|WS_GROUP,34,31,68,9
  35.   CONTROL "计算圆面积",IDC_GRPCALC,"Button",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,22,14,202,59
  36.   CONTROL "本地磁盘信息",IDC_GRP1,"Button",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,22,84,202,94
  37.   CONTROL "请输入半径",IDC_STC,"Static",WS_CHILD|WS_VISIBLE,104,48,54,9
  38. END
复制代码

TOP

diamondboy的答案非常好,值得鼓励!!!
你想一下GetLogicalDriver相关的那几道作业题有没有更高效的解法呢?提示一下使用位运算。你可以参考咱们以前的C#的课的内容:
http://www.rupeng.com/forum/viewthread.php?tid=63&extra=page%3D1
位运算是语言无关的,而且C#的位运算和C一模一样,完全可以参考。还是那句话“一通百通”。
咱们的论坛已经可以上传附件了,可以把你的作业上传上来。
再次为diamondboy喝彩。

TOP

晕了呢,我就搞不懂所谓的位运算是怎么回事呢,二进制的东东看了就懵了。。  现在就去看老大给的视频去。。。

calc.rar (19.89 KB)

作业文件

TOP

老杨辛苦,呵呵

TOP

由itoa是英文integer to array得atoi是英文 array to integer
百度得到的
貌似不是 C语言里边字符串转换为数字:atoiascii to int
哈哈
鸡蛋里面挑骨头

TOP

void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
  int i=0;
  DWORD x,t=1;
  char sz[26],p='A';
  if(id==IDC_BTNGET)
    {
         x=GetLogicalDrives();
         while(x>0)
                         {
                                     if((t&x)==1)  { sz=p;++i; }
                                     x>>=1;++p;
                               }
             SetDlgItemText(hwnd,IDC_EDTOUT,sz);
     }
               
}


获取本机磁盘列表。

TOP

更正下:在         SetDlgItemText(hwnd,IDC_EDTOUT,sz); 上还要加一句   sz='\0';

TOP

先做了计算器...

caclv1.rar (31.02 KB)

TOP

本人位运算显示磁盘信息的代码

void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
        case IDC_BTN1:
         DWORD d=GetLogicalDrives();
         if((d&8)>0)
          {
           TCHAR c[256];
           SetDlgItemText(hwnd,IDC_EDT1,TEXT("存在"));
          }
         else
         {
          SetDlgItemText(hwnd ,IDC_EDT1,TEXT("不存在"));
         }
        break;
        case IDC_BTN2:
   hanshu(hwnd);
        break;
        case IDC_BTN3:         
         hanshu1(hwnd);
   break;
         
        default:break;
    }
}
void hanshu(HWND hwnd)
{
   DWORD d1=GetLogicalDrives();
         int i=0;
         while (d1>0)
         {
          if((d1&1)>0)
          {
           i++;
          }
          d1=d1>>1;
        
         }
         TCHAR j[256];
         itoa(i,j,10);
         lstrcat(j,"个");
         SetDlgItemText(hwnd,IDC_EDT2,j);
}
void hanshu1(HWND hwnd)
{
         DWORD e=GetLogicalDrives();
         int k=0;
         int p=0;
         TCHAR b[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
         TCHAR f[256];
         while (e>0)
         {
          if((e&1)==1)
           {
            
            f[p]=b[k];
            f[++p]='\0';
            SetDlgItemText(hwnd,IDC_EDT3,f);
         
                        
           }
    e=e>>1;
    k++;
         }
         
}

磁盘.rar (21.48 KB)

TOP

我的作业终于交上来啦!不过只有计算园面积的一道题。

TOP

哈哈 代码越来复杂了啊

TOP

板书有误

^不是“非”

TOP

交作业

太难了,即使能用控制台写出来也不知道在这里怎么实现。

在VC里面写,可以把字符存入数组的,可这里怎么弄都不行。

一个头3个大!!!

运行截图

未命名.JPG

CalcV1.rar (13.14 KB)

程序源码

TOP

作业

未命名.jpg
2009-5-18 21:58


除法的浮点数还不会弄..显示的还是整数。还想改成点击按钮输入数字,好像有点困难,唉继续想..

TOP

呵呵,非常开心终于看完第五节并做了个计算器

本以为一天可以看2节,结果看到第五节就耗费了我2天时间,并且还有位运算的练习没有做。非常感谢杨老师送给我的一句话:只有蚂蚁啃骨头慢慢来。看来也是没有办法的事,这个东西急步得。重看C++/mfc再看c跳来跳去终于还是选择了C。我把作业补交下吧

功能:四则运算(整型,双精度型) 圆面积计算
BUG:0字符显示没有控制好,没有处理键盘输入。
源代码带有文字说明,呵呵~~代码没有整理不要扔砖。
counter2.0.rar (24.46 KB)

TOP

改好了

参考之前同学的代码修改了一下弄好了,用的与运算不知对不对..
明天听第六课了,希望暑假前能赶上进度..我要努力,在如鹏能学到东西我很喜欢这里

jisuanqiv1.rar (21.2 KB)

TOP

讲课有错误

用函数返回值来传递动态内存这种方法虽然好用,但是常常有人把return语句用错了。这里强调不要用return语句返回指向“栈内存”的指针,因为该内存在函数结束时自动消亡,见示例7-4-4。

  char *GetString(void)
  {
  
char p[] = "hello world";

  
return p;
//
编译器将提出警告
  }
  
  void Test4(void)
  {
  char *str = NULL;
  str = GetString();
// str
的内容是垃圾
  cout<< str <<  endl;
  }
  

示例7-4-4 return语句返回指向“栈内存”的指针


用调试器逐步跟踪Test4,发现执行str = GetString语句后str不再是NULL指针,但是str的内容不是“helloworld”而是垃圾。
(你上课讲的那个指针返回值问题)
引自--林锐《高质量c/c++编程指南》

TOP

这边要注意if((a&8)>0)     a&8要用括号括起来 我刚开始没注意这个问题 一直出错

TOP

我的作业也写好了 虽然有点晚 发出来大家指教指教 我的变量名起的有点乱 大家要谅解 因为我英文水平非常烂
  1. switch(id)
  2. {
  3. case IDC_BTN2: //计算器
  4. {
  5. TCHAR aname[256],bname[256],cname[256];
  6. double a_1,a_2,a_3;
  7. GetDlgItemText(hwnd,IDC_EDT1,aname,sizeof(aname)/sizeof(int));
  8. GetDlgItemText(hwnd,IDC_EDT2,bname,sizeof(bname)/sizeof(int));
  9. a_1=atof(aname);
  10. a_2=atof(bname);
  11. a_3=a_1+a_2;
  12. gcvt(a_3,10,cname);
  13. SetDlgItemText(hwnd,IDC_EDT3,cname);
  14. }
  15. break;

  16. case IDC_BTN6: //面积
  17. {
  18. TCHAR dname[256],ename[256],qname[256];
  19. double a_4,a_5,a_9;
  20. GetDlgItemText(hwnd,IDC_EDT4,dname,sizeof(dname)/sizeof(TCHAR));
  21. GetDlgItemText(hwnd,IDC_EDT5,qname,sizeof(qname)/sizeof(TCHAR));
  22. a_4=atoi(dname);
  23. a_9=atoi(qname);
  24. a_5=a_4*3.1415;
  25. gcvt(a_5,10,ename);
  26. SetDlgItemText(hwnd,IDC_EDT6,ename);
  27. }
  28. break;

  29. case IDC_BTN1:  //是否存在d盘
  30. {
  31. int a_6;
  32. char fname[256];
  33. a_6=GetLogicalDrives();
  34. itoa(a_6,fname,2) ;
  35. if((a_6&8)>0)
  36. {
  37. SetDlgItemText(hwnd,IDC_EDT7,TEXT("存在D盘"));
  38. }
  39. else
  40. {
  41. SetDlgItemText(hwnd,IDC_EDT7,TEXT("不存在D盘"));
  42. }
  43. }
  44. break;

  45. case IDC_BTN3:  //响应显示所有盘符
  46. {
  47. int a_7,a_8=0,a_9=0;
  48. char hname[256];
  49. a_7=GetLogicalDrives();
  50. while(a_7!=0)
  51. {
  52. if((a_7&1)==1)
  53. {
  54. hname[a_8]='A'+a_9;
  55. a_8++;
  56. }
  57. a_7=a_7>>1;
  58. a_9++;
  59. }
  60. hname[a_8]='\0';
  61. SetDlgItemText(hwnd,IDC_EDT7,hname);
  62. }
  63. break;

  64. case IDC_BTN4:  // 响应显示磁盘个数
  65. {
  66. int j=0;
  67. int i=GetLogicalDrives();
  68. while(i!=0)
  69. {
  70. if((i&1)==1)
  71. {
  72. j++;
  73. }
  74. i=i>>1;
  75. }
  76. TCHAR k[256];
  77. itoa(j,k,10);
  78. SetDlgItemText(hwnd,IDC_EDT7,k);
  79. }
  80. break;

  81. case IDM_A:  //退出
  82. {
  83. EndDialog(hwnd, 0);
  84. }
  85. break;

  86. case IDM_B:   //打开如鹏网站
  87. {
  88. ShellExecute(hwnd,TEXT("OPEN"),TEXT("www.rupeng.com"),NULL,NULL,SW_NORMAL);
  89. }
  90. break;
  91. default:break;
  92. }
复制代码

界面

1112.jpg

TOP

交作业了!

圆的面积计算与磁盘:

dlg.rar (18.73 KB)

TOP

计算圆的面积,先学多一点,等开学了再来深入研究,回去了没有电脑
只交面积计算器的作业

面积计算器.rar (7.76 KB)

TOP

来的比较晚 O(∩_∩)O~交个作业
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
int i=0,j=64;
TCHAR cResault[MAX]={'\0'};
    TCHAR cResault1[MAX]={'\0'};
    switch(id)
    {
        case IDC_BTNINF :
             DWORD wrDrivers=GetLogicalDrives();           
             //SetDlgItemText(hwnd,IDC_EDT_D_ISINF,cResault);      
    do
     {
      j++;
     if(wrDrivers&1)
     {
      
       cResault[i++]=j;
                }
     }while((wrDrivers=(wrDrivers>>1))>0);
     itoa(i,cResault1,10);
     SetDlgItemText(hwnd,IDC_EDTDIS_D_INF,cResault);
     SetDlgItemText(hwnd,IDC_EDTDIS_D_NUM,cResault1);   
        break;
      
        default:break;
    }
}

TOP

QQ截图未命名.jpg
2009-6-29 21:49

4.rar (245.25 KB)

TOP

搞了一个晚上终于做了像样的小程序,虽然有点迟........
恩,还是先把作业交了吧。

CompteFactory.rar (62.03 KB)

业精于勤,未雨绸缪。

TOP

位运算或一般用来合并2进制如:1111000|0000011—》1111011
与一般用来进行判断如:#define P 1        P&i(变量)—》判断i这个变量的最低位是否为1,而其他位的判断略过

TOP

返回列表