返回列表 发帖

【教学视频】《C语言也能干大事》第六节:二进制及位运算

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

在线观看视频(非清晰在线版):


清晰版下载地址:
如鹏下载站1:点击下载
如鹏电骡(verycd)下载站:http://www.verycd.com/topics/2800166/


高清版:
不提供下载

板书:
1、对diamondboy作业的点评。思路非常好,而且使用了表驱动算法。
2、位运算的基础:
| :或。1|0=1;1|1=1;0|0=0;
&:与。1&0=0;0&0=0;1&1=1;
^:非。^1=0,^0=1;
3、位运算例子:

101


110 |

====

1 1 1


001
101|
===

1 0 1


4、

101


110 &

====

1 0 0


1100

1000 &
====
1 0
00


0100
1000&
====

0
0
0 0


要判断一个数的二进制的第n位是否为1的方法就是:把一个n位为1,其他位为零的数与待判断的书进行与运算,只要结果不为0,就说明n为为1,否则为0.让其他为为0就是利用与运算的特性来屏蔽其他位的干扰,0最具侵略性(与运算);n为为1则是为了验证那一位是否真的为1.
1000=8
因此判断是否存在D盘这道题的位运算的解法。
参考答案:

DWORD ds = GetLogicalDrives();


//8
1000

if(ds&8)


{


MessageBox(NULL,"
存在D","",MB_OK);

}


else


{


MessageBox(NULL,"
不存在D","",MB_OK);

}

5、显示系统中有多少个逻辑驱动器。
分析规律:
1100。数有多少个1就可以了。
右移一位:
110

再右移一位:11
再右移一位:1
再右移一位:0

1110。数有多少个1就可以了。
右移一位:
111

再右移一位:11
再右移一位:1
再右移一位:0

不断的右移,只要某一位为1,那么早晚会移到末尾一位,只要在末尾等着他就可以了。不断右移位,然后判断最后一位是否是1,如果是的话就计数器加1,知道移位变成0为止。

//得到数字n的二进制中1的个数
//写一个单独的函数,这样就达到了抽象的目的,不要把所有代码挤在一个函数中
int Get1Count(DWORD n)
{

int counter=0;


while(n>0)


{


//
判断末位是否是1

if(n&1)


{


counter++;


}


//
向右移位,直至为0

n=n>>1;


}


return counter;

}

依次显示系统中所有的盘符。”这道题请大家课后继续思考。光看没用,要是看一看就管用的话去看看NBA比赛我就能成为灌篮高手,要是看一看就管用的话去看看菲尔普斯游泳我就能成水中飞鱼,要经常练、实际的把代码自己写出来。





  1. #include <stdio.h>
  2. #include <windows.h>

  3. int main (void)
  4. {
  5. int count=0;
  6. DWORD dwDrives;
  7. dwDrives = GetLogicalDrives();
  8. if(dwDrives&4)
  9. {
  10. printf("yes\n");
  11. }
  12. else
  13. {
  14. printf("no\n");
  15. }
  16. while(dwDrives!=0)
  17. {
  18. if(dwDrives&1)
  19. {
  20. count++;
  21. }
  22. dwDrives>>=1;
  23. }
  24. printf("%d",count);
  25. return 0;
  26. }
复制代码


自己看了老大的思路写的,可能有点像照抄~~~

不过还是遇到了一个问题,就是本来要判断D盘,我想试试判断A,B盘然后把if(dwDrives&8)改成了if(dwDrives&1),编译,运行,哈不错,显示NO,没有 恩 本来我也没有软盘嘛, 接着又改了一下if(dwDrives&10),编译——>运行,??奇怪了,运行结果是YES,不对啊我没有B盘啊,怎么会这样,自己又用人脑算了一遍:(我有CDEFG五个盘)
1111100
          10 &
=========
0000000
结果是0啊,应该显示NO的啊,又拿CALC算了一次,还是0,我晕了,问题出在哪啊,调试了一下也没整出来,仔细想了想,最后终于想通了,那个10是十进制的啊,可不是二进制的,真正二进制的10所对应的十进制是2啊
应该写成if(dwDrives&2) ,再编译——>运行,呵 成功 显示出NO 恩
这个以后要注意了!
1

评分人数

    • 杨中科: 分享学习、分享快乐鹏币 + 2

TOP

老大,板书貌似有地方错了~~

“^”是按位抑或,是双目运算符,“~”才是取反运算符
1

评分人数

TOP

作业

作业是在这里发吗~~
变量在最前定义了~~
           int i,j=0,k=1;
         _TCHAR cp[52];
点击“显示盘符”按钮调用以下函数:

void cpjs(HWND hwnd)
{
    if(k)          //多次点击无效,与倒数第四行“k=0”连用
    {
    DWORD dw = GetLogicalDrives();
            for(i=1;dw;i++)
            {
                if(dw&1)
                {
                    cp[j]=64+i;   
                    j+=1;
                    cp[j]=32;     //加个空格 嗨嗨~~
                    j+=1;
                }
                dw = dw>>1;
            }
            k=0;        
            SetDlgItemText(hwnd,IDC_EDTXX,cp);   //输出
    }
}

TOP

to a335031:
你的代码很好。需要注意的地方就是不要用cp、k这种无意义的变量名,而且32、64这样的“魔术数”也要避免。

TOP

英语不好,真不知道起什么名字好~~

TOP

TCHAR *zimu="ABCDEFGHIJKLM";
        int Math=0;
       TCHAR ShowDrives[256];
        DWORD Temp1=GetLogicalDrives();
while(Temp1>0)
        {
if(Temp1&1>0)
         {
          ShowDrives[Math]=*(zimu);
          Math++;
         }
if(Temp1|0)//写成Temp&1==0为什么不行?知道的说下。
        {
            zimu=zimu+1;
        }
Temp1=Temp1>>1;
        }
ShowDrives[Math]='\0';
SetDlgItemText(hwnd,IDC_EDTSHOWDRIVES,ShowDrives);
}

TOP

原来在这里交作业啊!

卡在显示盘符卡了2天,想破脑袋都想不出来怎么实现,自己的思路根本没法用代码完成,最后不得已借用了别人的代码完成了。

除了这个以外,其它的都是我自己想出来的!

思路:
1、获取磁盘信息
2、找出为1的位置
3、用ABCDE将它们输出

运行截图

未命名.JPG

CalcV1.rar (13.14 KB)

程序源码

TOP

交作业

计算磁盘数量做错了,现改正如下:

  1. case IDC_BTNDISKQTY://计算磁盘数量并显示
  2.     int c1;
  3.     c1=0;
  4.     for(temp=0;dwDrivers;temp++)
  5.     {
  6.       if(dwDrivers&1==1)
  7.       {
  8.         c1++;
  9.       }
  10.       dwDrivers=dwDrivers>>1;
  11.     }
  12.     itoa(c1,cResultINFO,10);
  13.       SetDlgItemText(hwnd,IDC_EDTINFO,cResultINFO);
  14.      break;
复制代码

TOP

这一节的内容比较简单,以前学过,位运算还是很重要的!

TOP

如果判断D盘 带判断的数与上2^n    n为3则是 判断D盘    就是2^n  n为0 就是第一位为1   n为1 这第二位为1
也就是
2^0=0000000000000001
2^1=0000000000000010
2^2=0000000000000100
……

老师 是这样吧  
给大家分享下。
可能大家都知道吧  我再这写下 呵呵  以后忘记了可以回来复习......
坚持就是胜利~~~~~

TOP

恩  9楼的对的  杨老师 上面板书 还没修改
坚持就是胜利~~~~~

TOP

不知是什么原因,我下的C-FREE总是无法在我的电脑上正常运行(同一个地方下载的程序在同学的电脑上却是正常的)。
郁闷。。。所以我只好用VS08(发现如鹏之前装的)来做。

逻辑驱动器的算法参考了DiamondBoy的交表算法。另外,VS08里默认用的都是宽字符,所以在求圆面积的那段使用了
MutiyByteToWideChar 这个函数。

  1. //摘录:
  2. //.....
  3. static LPCWSTR lpDrives = TEXT("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
  4. static short nDrives[27];
  5. WCHAR wcDriveList[26];
  6. switch(idCtrl)
  7. {
  8. case IDC_BTNCOUNT:   //简单计算器
  9.   TCHAR num1[256], num2[256];
  10.   int n1, n2, n3;
  11.   GetDlgItemText(hWndDlg, IDC_EDTNUM1, num1, 256);
  12.   GetDlgItemText(hWndDlg, IDC_EDTNUM2, num2, 256);
  13.   n1 = _wtoi(num1);
  14.   n2 = _wtoi(num2);
  15.   n3 = n1 + n2;
  16.   _itow(n3, num2, 10);
  17.   SetDlgItemText(hWndDlg, IDC_EDTNUM3, num2);
  18.   return TRUE;
  19.   break;
  20. case IDC_BTNCOUNT2:  //计算圆面积
  21.   char tn[256];
  22.   memset(tn, 0, 256);
  23.   TCHAR num3[256];
  24.   double radius, result;
  25.   GetDlgItemText(hWndDlg, IDC_EDTNUM4, num3, 256);
  26.   radius = _wtof(num3);
  27.   result = 3.1415926 * radius * radius;
  28.   _gcvt(result, 10, tn);
  29.   MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, tn, -1, num3, 256);
  30.   SetDlgItemText(hWndDlg, IDC_EDTNUM5, num3);
  31.   return TRUE;
  32. case IDC_BTNALLDISK:  //获取逻辑驱动器
  33.   DWORD dwDrives;  
  34.   dwDrives = GetLogicalDrives();
  35.   nDrives[26] = 0;
  36.   short temp;
  37.   temp = 0;
  38.   do
  39.   {   
  40.    if(dwDrives & 1)
  41.    {
  42.     nDrives[26] += 1;
  43.     nDrives[temp] = 1;
  44.    }
  45.    temp++;
  46.    dwDrives = dwDrives >> 1;
  47.   }while(dwDrives != 0);   
  48.   temp = 0;
  49.   for(short i = 0; i < 26; i++)
  50.   {
  51.    if(nDrives[i])
  52.    {
  53.     wcDriveList[temp] = lpDrives[i];
  54.     temp++;
  55.    }
  56.   }
  57.   wcDriveList[nDrives[26]] = L'\0';
  58.   SetDlgItemText(hWndDlg, IDC_EDTDISK, wcDriveList);
  59.   return TRUE;
  60. //.....
复制代码

t1.JPG
2009-8-11 13:20

5~6节作业.rar (69.32 KB)

TOP

我也试着写一下:
char allDisk[50];//机器上的所有盘
         int i;
         int temp;
         int count;//有多少盘
         char ch[10];
         //得到所有盘
         DWORD ds=GetLogicalDrives();
         //判断是否有D盘
         DWORD isD=ds & 1000;
         if(isD){
    MessageBox(NULL,"有D盘","",MB_OK);
         }
         else
         {
          MessageBox(NULL,"没有D盘","",MB_OK);
         }
         
         //for(i=0;i<50;i++)allDisk='\0';
         
         //获取所有盘符
         i=0;
         count=0;
   while(ds>0)
   {
    if(ds&1){
     temp=65+i;
     allDisk[count]=temp;
     count++;
    }
    i++;
    //向右移位,直到为0
    ds=ds>>1;
   }
   itoa(count,ch,10);//count转换成字符串
   //输出结果:
         MessageBox(NULL,ch,"磁盘个数:",MB_OK);
   MessageBox(NULL,allDisk,"所有磁盘为:",MB_OK);

TOP

杨老师,貌似^不是单目运算符吧,~(取反)才是单目运算符吧!
          不知道这个在下节课是否有解释.....................

TOP

位运算很重要啊!

TOP

原帖由 yingthesky 于 2009-4-6 03:01 发表
TCHAR *zimu="ABCDEFGHIJKLM";
        int Math=0;
       TCHAR ShowDrives[256];
        DWORD Temp1=GetLogicalDrives();
while(Temp1>0)
        {
if(Temp1&1>0)
         {
          ShowDrives[Ma ...

是优先级原因。&低于==,更正为(Temp&1)==0就可以了。
貌似这句if(Temp1&1>0)也有同样的问题,但是为什么没出现问题呢?原因是你的代码冗余了,虽然先计算了1>0,这个表达式恒为1,在计算Temp1&1,关键就出在这,恰巧Temp1&1的值正好和(Temp1&1)>0的表达式的值是一样的,正好是歪打正着了,呵呵。所以你可以直接写Temp1&1就行了。

TOP

看完视频,我也写了个。程序加上MAIN函数。多多指教!


下面是MAIN.CPP:


#include <windows.h>
#include <windowsx.h>
#include "main.h"
#include "dialogs.h"
#include "resource.h"
#include "rsrc.inc"
static TCHAR DISKMY[256]; //通过静态变量来实现。
//递归定义一个以2为底数的n次方。即是求2的n次方值。
int powerMy(int a,int n){
if(n==0){
  return 1;
}else{
  return 2*powerMy(a,n-1);
}
}


void checkDisc(DWORD num){
int all;
int i;
int j;

for(i=0;;i++){
  all = powerMy(2,i);
  if(all>num){
   break;
  }
}
int disc[i+1];
disc[0] = 0;


for(j=1;j<=i;j++){
  disc[j] = powerMy(2,j-1);  
}
j = j-1;

TCHAR discin[256];

int k;
for(k=1;k<=26;k++){
  discin[k]= (TCHAR)((int)('A')+k-1);  
}
discin[k] = '\0';
discin[0]=' ';
for(i=1;i<=j;i++){
  if(num&disc){
   DISKMY= discin;
  }else{
   DISKMY= ' ';
  }
}
DISKMY='\0';
DISKMY[0]=' ';

}


//通过函数检验有没有A,B,C,……等。
void checkDisc1(DWORD num){
int all;
int i;
int j;

for(i=0;;i++){
  all = powerMy(2,i);
  if(all>num){
   break;
  }
}
int disc[i+1];
disc[0] = 0;


for(j=1;j<=i;j++){
  disc[j] = powerMy(2,j-1);  
}
j = j-1;

TCHAR discName[256];
TCHAR discin[256];

int k;
for(k=1;k<=26;k++){
  discin[k]= (TCHAR)((int)('A')+k-1);  
}
discin[k] = '\0';
discin[0]=' ';
for(i=1;i<=j;i++){
  if(num&disc){
   discName= discin;
  }else{
   discName= ' ';
  }
}
discName='\0';
discName[0]=' ';
MessageBox(NULL,discName,TEXT("系统中的逻辑磁盘"),MB_OKCANCEL);

    // SetDlgItemText(hwnd,IDC_EDTDISC,discName);//此函数仍旧存在缺陷 不能用此定义。
}

BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        //BEGIN MESSAGE CRACK
        HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
        HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
        HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
        //END MESSAGE CRACK
    }
    return FALSE;
}
////////////////////////////////////////////////////////////////////////////////
//  Main_OnInitDialog
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
    // Set app icons
    HICON hIcon = LoadIcon((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE) ,MAKEINTRESOURCE(IDI_ICONAPP));
    SendMessage(hwnd, WM_SETICON, TRUE,  (LPARAM)hIcon);
    SendMessage(hwnd, WM_SETICON, FALSE, (LPARAM)hIcon);
   
    //
    // Add initializing code here
    //
   
    return TRUE;
}
////////////////////////////////////////////////////////////////////////////////
//  Main_OnCommand
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
        case IDC_BTNSHOWVALUE:
         DWORD dwDrives = GetLogicalDrives();
         TCHAR cResult[256];
         itoa(dwDrives,cResult,2);
         SetDlgItemText(hwnd,IDC_EDTVALUE,cResult);        
        break;
        case IDC_BTNSHOWDISC:
         DWORD dwNum = GetLogicalDrives();
   checkDisc(dwNum);
   SetDlgItemText(hwnd,IDC_EDTDISC,DISKMY);        
        break;
        default:break;
    }
}
////////////////////////////////////////////////////////////////////////////////
//  Main_OnClose
void Main_OnClose(HWND hwnd)
{
    EndDialog(hwnd, 0);
}

显示系统逻辑磁盘.rar (8.54 KB)

程序

TOP

main.cpp代码:
#include <windows.h>
#include <stdlib.h>
#include <windowsx.h>
#include "main.h"
#include "dialogs.h"
#include "resource.h"
#include "rsrc.inc"
#define p 3.1416
#define AREA(x) x*x*p
#define MASK 1
BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        //BEGIN MESSAGE CRACK
        HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
        HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
        HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
        //END MESSAGE CRACK
    }

    return FALSE;
}

////////////////////////////////////////////////////////////////////////////////
//  Main_OnInitDialog
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
    // Set app icons
    HICON hIcon = LoadIcon((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE) ,MAKEINTRESOURCE(IDI_ICONAPP));
    SendMessage(hwnd, WM_SETICON, TRUE,  (LPARAM)hIcon);
    SendMessage(hwnd, WM_SETICON, FALSE, (LPARAM)hIcon);
   
    //
    // Add initializing code here
    //
   
    return TRUE;
}

////////////////////////////////////////////////////////////////////////////////
//  Main_OnCommand
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
        case IDC_BTNEQUAL:
          TCHAR cNO1[256];
          GetDlgItemText(hwnd,IDC_EDTNO1,cNO1,sizeof(cNO1)/sizeof(TCHAR));
       //ware can not input char
          int i;
          for(i=0;i<lstrlen(cNO1)&&cNO1>='0'&&cNO1<='9';++i);
          if(i<lstrlen(cNO1))
          {
                  MessageBox(NULL,TEXT(strcat(cNO1,"中不能含有字符")),TEXT("警告!"),MB_OKCANCEL);
                  break;
          }
          int intNO1=atoi(cNO1);
         
          TCHAR cNO2[256];
          GetDlgItemText(hwnd,IDC_EDTNO2,cNO2,sizeof(cNO2)/sizeof(TCHAR));
          //ware can not input char
          int j;
          for(j=0;j<lstrlen(cNO2)&& cNO2[j]>='0' && cNO2[j]<='9';++j);
          if(j<lstrlen(cNO2))
          {
                  MessageBox(NULL,TEXT(strcat(cNO2,"中不能含有字符")),TEXT("警告!"),MB_OKCANCEL);
                  break;
          }
          int intNO2=atoi(cNO2);
          TCHAR cRESULT[256];
          itoa(intNO1+intNO2,cRESULT,10);
          SetDlgItemText(hwnd,IDC_EDTRESUL,cRESULT);
        break;
        
        case IDC_AREA:
           TCHAR cRadii[256];
           GetDlgItemText(hwnd,IDC_RADIIVALUE,cRadii,sizeof(cRadii)/sizeof(TCHAR));
           
           int k; //simple variable to check out char exist in 'cAREA'
           for(k=0;k<lstrlen(cRadii)&&cRadii[k]>='0'&&cRadii[k]<='9' ||cRadii[k]=='.';++k);
           if(k<lstrlen(cRadii))
           {
                  MessageBox(NULL,TEXT(strcat(cRadii,"中不能含有字符")),TEXT("警告!"),MB_OKCANCEL);
                  break;
           }
           
           double dRADII=atof(cRadii),dRESULE;
           TCHAR cAREA[256];
           gcvt(AREA(dRADII),10,cAREA); //double value convert to char *
           SetDlgItemText(hwnd,IDC_AREAVALUE,cAREA);
        break;
        
        case IDC_DISKLIST:
           DWORD ds=GetLogicalDrives();
           TCHAR cDS[sizeof(DWORD)+1];
                   TCHAR cFLAG;
           int m,sum;
           for(m=0,sum=0,cFLAG='A';ds;++cFLAG,ds>>=1)
           {
                   if(ds & MASK)
                   {
                           cDS[m]=cFLAG;
                           ++sum;
                           ++m;
                   }
           }
           cDS[m]='\0';
           TCHAR DRINSUM[2];
           itoa(sum,DRINSUM,10);
           SetDlgItemText(hwnd,IDC_EDTSUM,DRINSUM);
           SetDlgItemText(hwnd,IDC_EDTLIST,cDS);
        break;
        
        case IDC_BTND:
           DWORD DS2=GetLogicalDrives();
           if(DS2 & 8)
           {
                    SetDlgItemText(hwnd,IDC_EDTD,"EXIST!");
           }
           else
           {
                  SetDlgItemText(hwnd,IDC_EDTD,"not EXIST!");
           }
        break;
        
        case IDC_BTNEXIT:
          exit(0);
        break;
        default:break;
    }

}

////////////////////////////////////////////////////////////////////////////////
//  Main_OnClose
void Main_OnClose(HWND hwnd)
{
    EndDialog(hwnd, 0);
}


dialogs.dlg代码:
#define IDD_MAIN 100
#define IDC_EDTNO1 1003
#define IDC_EDTNO2 1002
#define IDC_BTNEQUAL 1004
#define IDC_EDTRESUL 1005
#define IDC_EDTADD 1001
#define IDC_STC1 1006
#define IDC_RADIIVALUE 1008
#define IDC_AREA 1009
#define IDC_AREAVALUE 1010
#define IDC_RADII 1007
#define IDC_STC2 1011
#define IDC_STC3 1012
#define IDC_STC4 1013
#define IDC_DISKLIST 1014
#define IDC_EDTLIST 1015
#define IDC_BTND 1016
#define IDC_EDTD 1017
#define IDC_EDTSUM 1018
#define IDC_BTNEXIT 1019
#define IDC_IMG1 1020
#define IDC_STC5 1021
#define IDC_STC6 1022

#include "dialogs.h"
#include <windows.h>

IDD_MAIN DIALOGEX 122,75,300,194
LANGUAGE 4,2
CAPTION "计算器(V1.0)"
FONT 8,"Tahoma",0,0,0
STYLE WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MAXIMIZEBOX|0xC0000000
BEGIN
  CONTROL "",IDC_EDTNO1,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP,7,12,36,11,WS_EX_CLIENTEDGE
  CONTROL "",IDC_EDTNO2,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP,62,12,38,11,WS_EX_CLIENTEDGE
  CONTROL "=",IDC_BTNEQUAL,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,110,14,21,9
  CONTROL "",IDC_EDTRESUL,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_READONLY,143,12,42,11,WS_EX_CLIENTEDGE
  CONTROL "+",IDC_EDTADD,"Static",WS_CHILD|WS_VISIBLE,51,14,6,9
  CONTROL "计算圆的面积:",IDC_STC1,"Static",WS_CHILD|WS_VISIBLE,0,31,124,9
  CONTROL "",IDC_RADIIVALUE,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP,32,44,34,11,WS_EX_CLIENTEDGE
  CONTROL "求出面积→",IDC_AREA,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,74,44,48,13
  CONTROL "",IDC_AREAVALUE,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_READONLY,127,44,59,13,WS_EX_CLIENTEDGE
  CONTROL "半径:",IDC_RADII,"Static",WS_CHILD|WS_VISIBLE,1,46,25,11
  CONTROL "―――――――――――――――――――――――――――――――",IDC_STC2,"Static",WS_CHILD|WS_VISIBLE,-1,66,195,8
  CONTROL "加法运算:",IDC_STC3,"Static",WS_CHILD|WS_VISIBLE,1,1,67,9
  CONTROL "磁盘信息检测:",IDC_STC4,"Static",WS_CHILD|WS_VISIBLE,1,86,168,11
  CONTROL "所有磁盘信息:",IDC_DISKLIST,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,3,107,71,28
  CONTROL "",IDC_EDTLIST,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_READONLY,122,101,59,17,WS_EX_CLIENTEDGE
  CONTROL "是否存在D盘:",IDC_BTND,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,3,147,71,17
  CONTROL "",IDC_EDTD,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_READONLY,78,147,101,17,WS_EX_CLIENTEDGE
  CONTROL "",IDC_EDTSUM,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_READONLY,122,123,57,17,WS_EX_CLIENTEDGE
  CONTROL "退出系统",IDC_BTNEXIT,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,7,173,40,17
  CONTROL "IDB_IMG1",IDC_IMG1,"Static",WS_CHILD|WS_VISIBLE|SS_CENTERIMAGE|SS_BITMAP,190,-3,111,319
  CONTROL "所有盘符:",IDC_STC5,"Static",WS_CHILD|WS_VISIBLE,80,105,42,13
  CONTROL "驱动总数:",IDC_STC6,"Static",WS_CHILD|WS_VISIBLE,80,127,36,11
END

IDB_IMG1 BITMAP DISCARDABLE "D:/My Documents/My Pictures/lk.bmp"
dock.jpg

TOP

扬老师:   我想问下..就是我用
         dwDrives=GetLogicalDrives();
             TCHAR clookup[33];
           itoa(dwDrives,clookup,2);





SetDlgItemText(hwnd,IDC_EDTDISK,clookup);
怎么显示的是"1000000000000011100"啊.. 我是在网吧里弄的.. 我做的作业老是出错.. 电脑上面只有3个盘.. 他却显示了4个盘..
没有

TOP

回复 6# yingthesky


    !=0 的 时候才加吧? 直接写if(temp&1)就可以了。你用的或运算貌似没有意义。
Now!Acting!

TOP

回复 17# fashiontange


    逻辑运算的优先级高于赋值运算吧?呵呵,请指教。
Now!Acting!

TOP

回复 22# jinfengmusic


    给你个表看看,呵呵
未命名.PNG

TOP

我也帖出第4道题
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
            case IDC_BTN1:
            int i,n;
            char *str=(char*)malloc(30),ch;
            DWORD x=GetLogicalDrives(),tmp;
            tmp=x;
            for(i=0,n=0,ch=65;tmp!=0;ch++,i++,tmp=tmp>>1)
            {
                    if((x&(int)powf(2,i))==(int)powf(2,i))
                    {
                            str[n]=ch;
                            n++;
                           
                    }
                   
            }
        SetDlgItemText(hwnd,IDC_EDT1,str);
        free(str);
        break;
        
      
    }

}

TOP

我也帖出第4道题
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
            case IDC_BTN1:
            int i,n;
            char *str=(char*)malloc(30),ch;
            DWORD x=GetLogicalDrives(),tmp;
            tmp=x;
            for(i=0,n=0,ch=65;tmp!=0;ch++,i++,tmp=tmp>>1)
            {
                    if((x&(int)powf(2,i))==(int)powf(2,i))
                    {
                            str[n]=ch;
                            n++;
                           
                    }
                   
            }
        SetDlgItemText(hwnd,IDC_EDT1,str);
        free(str);
        break;
        
      
    }

}

TOP

void DisplayDrivers(HWND hwnd)
{
        TCHAR LogicalDrivers[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        TCHAR Display[26];
        DWORD DriversNumber;
        DriversNumber = GetLogicalDrives();
        for(int i = 0,j = 0; DriversNumber > 0;i++ )
        {
                if((DriversNumber & 1) > 0)
                {
                        Display[j]=LogicalDrivers[i];
                        j++;
                }
                DriversNumber = DriversNumber >> 1;
        }
        SetDlgItemText(hwnd,IDC_EDT3,Display);
}
//这个是显示磁盘符的实现!

TOP

大家什么看法?我先支持

TOP

向楼主致敬

TOP

返回列表