给函数传递实参(一)

案一:
按值传递机制
int incr10(int num);
int _tmain(int argc, _TCHAR* argv[])
{
int num(3);
cout<<endl
<<“incr10(num) = “<< incr10(num) <<endl
<<“num = “<< num << endl;

system("pause");
return 0;

}

int incr10(int num)
{
num += 10;
return num;
}
结果:
incr10(num) = 13
num = 3
说明:
输出证明,原来的num值没有改变。作为实参传递给函数incr10()的是num的副本,
加法运算也发生在num的副本上面,在最终退出函数时抛弃运算结果。
显然,按值传递机制高度保护了调用函数提供的实参。

案二:
给函数传递指针实参
int incr10(int num);
int _tmain(int argc, _TCHAR
argv[])
{
int num(3);
int *pnum(&num);

int result = incr10(pnum);

cout<<endl
    <<"incr10(pnum) = "<< result<<endl
    <<"num = "<< num << endl;
system("pause");
return 0;

}

int incr10(int* num)
{
*num += 10;
return *num;
}

练习1:计算质数

方法一:

#include “stdafx.h”
#include
#include
#include <stdlib.h>
//#include “StaticTest.h”
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
const int MAX(100);//定义希望该程序产生的质数数量
long primes[MAX] = {2,3,5};
long trial(5);
int count(3);
bool found(false);
do
{
trial += 2;
found = false;

    for(int i = 0; i< count; i++)
    {
        found = (trial %*(primes + i)) == 0;//将被检查的数除以小于或等于其平方根的质数
        if(found)
            break;
    }
    if(!found)
        *(primes + count++) = trial;
}while(count < MAX);

for(int i = 0; i<MAX; i++)
{
    if(i % 5 == 0)
        cout<<endl;
        cout<<setw(10)<<*(primes + i);
}
cout <<endl;


system("pause");
return 0;

}

方法二:使用动态数组

#include “stdafx.h”
#include
#include
#include <stdlib.h>
//#include “StaticTest.h”
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
long * pprime(nullptr);
long trial(5);
int count(3);
int found(0);
int max(0);

cout<<endl
    <<"Enter the number of primes you would like(at least 4):";
cin>>max;

if(max < 4)
    max = 4;

pprime = new long[max];
*pprime = 2;
*(pprime + 1) = 3;
*(pprime + 2) = 5;

do
{
    trial += 2;
    found = 0;
    for(int i = 0;i < count; i++)
    {
        found = (trial % *(pprime + i)) == 0;
        if(found)
            break;
    }

    if(found == 0)
        *(pprime + count++) = trial;
}while(count < max);

for(int i = 0; i < max; i++)
{
    if(i % 5 == 0)
        cout<<endl;
    cout<<setw(10)<< *(pprime + i);
}

delete [] pprime;
pprime = nullptr;
cout <<endl;
system("pause");
return 0;

}

世界很大,我想去看看!

如果有一天有幸我也能站在讲台上给那些中学的小孩们聊一聊:

    特比喜欢和年轻人一起聊梦想,理想,未来。因为在我们的心里还对一切充满着无限期待,激情。
    小时候的我们很单纯,每当有大人你问我们将来要干什么,我们会毫不犹豫的说,当老师,当科学家。。。
    我记得小学的我跟家人说,我将来要当一名教师,因为江泽民也是老师教出来的,老师多伟大。
    现在想想当时那股神气劲儿,就在心里偷偷地笑。
    随着我们一天天长大,路越走越宽,十字路口也想越来越多,梦想越来越现实化,
    更有些人为了生活会把自己的梦想深深的埋在内心最深处,有时候翻出来会是一种痛,
    也许这种痛只有长大了才会体会吧。希望现在的你们长大了不要去体会这种感觉。
    有时候计划不如变化大,我们也不知道将来的自己会走向何方。
    就像初中的不会想到今天的自己会在异国他乡,初中的自己每天都在学习,
    觉得世界就是我待的小城,就是学校,就是我眼前的一切。不会考虑国外什么样,
    因为我的爸妈没有那么多money供我去国外。我的生活圈就是学校,家。
    我的身边就是家人,朋友,老师,同学。。。感觉自己很有存在感。
    渐渐长大了,才明白,我就是大千世界里微乎其微的小小一颗。
    我还有好多好多东西要学习,我还有好多好多风景要看。
    原来还有那么蓝的天空,那么清澈的海水,那么碧绿的山,那么清新的空气,
    看后让人想哭的感觉,原来登上3700多米的山顶,可以看到那么广阔的世界。
    每次感受飞机冲上云霄的那一刻又是那么的让我兴奋。
    上大学时我第一次见到大海,人家说大海会有让人心胸开阔的感觉,
    可惜我当时没有那种感觉,唯一的感觉就是: 啊,大海啊,全是水。
    但是6年后等我坐上游艇,体验伊豆风情时,行驶在那么清澈透心蓝的海水上,
    周围全是山,那一刻我好兴奋。感觉自己激动的快要哭了,真的好美,
    大自然是如此的神奇。
     说的再多没有亲身体会也是感受不到的。当然你们也不必想的那么遥远,
     你们要做的就是把把握现在。现在就是为将来打地基,
     不要像我一样当初没有好好学习英语,现在用到了,每天工作之余还要累死累活的去补习语言,
     将来这些都会影响到你的薪水,你能交流的很好,薪水自然会高一些,
     如果你是老板肯定也会雇佣一个汉语好的老外吧。所以一开始越牢固,
     将来你猜能站得更高看的更远。你们现在好好努力了,才会上好的高中考上好的大学,
     去好的城市,如果能在那个城市工作就更好了,因为你大学期间在这里认识了很多老师朋友,
     这就是你农村迈上城市的第一步。求学期间交到的朋友可能会伴随你的一生,
     进入社会就很难交到朋友了。
     所以只有走到大城市,考上好大学,你才会认识更多优秀的人才,
     只有和优秀的人在一起自己也会越来越优秀。近朱者赤近墨者黑。
     环境一定会影响一个人的成长。
     有人会说有些人没上大学也成功了啊,可是亲爱的小朋友们,
     我们出生在平凡的不能再平凡的家庭中,没有实力,没有背景,我们只能靠自己。
     你没上大学也可以,你得付出多少努力才能遇到一个教会你经商的人。
     你靠什么才能进入那些公司的大门。没有人生来就会经商,这些都是要靠后天的学习。
     没有从事过某一方面的工作,怎么才能做到见多识广,眼界开阔。当你做一个领导时,
     怎么才能以不变应万变。
     所以不管你上不上大学,你都得努力,都要在社会上不断取经。
     古人云,读万卷书不如行万里路,行万里路不如阅人无数。
     很多人的成长是步入社会之后,成长和年龄不成正比,这要看阅历,成长更来源于生活。
     所以我们不要做温室里的花朵,好好利用你们的寒暑假,体验体验生活,
     多出去走走看看外面的大山大水大世界,有诗还有远方。。。
     外面的世界很精彩外面的世界也很无奈,对于年少的我们只管精彩不管无奈。
     趁着年轻多走走,在旅途中才会遇到未知的自己。才会发现自己的梦想在何方。
     总而言之,活在当下,每个阶段有每个阶段的精彩,做好自己该做的事情。
     18岁之前没办法决定自己的人生,那就多读书,书中自有黄金屋,书中自有颜如玉。
     多行路,只为遇到未知的自己。
     18岁之后自己掌舵,追求自己想要追求的,过自己想要过的生活,成为自己想要成为的人。
     世界很大,我想去看看!

C++学习笔记(二)2017/2/23

1,cout<<“count1 = “<<::count1;
这个语句使用作用域解析运算符(::)清楚地向编译器表明,想引用的是全局变量count1,而不是局部变量count2.

2,枚举
//声明了一个枚举类型Weekdays和变量today,
enum Weekdays
{
Mon = ‘,’,
Tues =4,
Wed,
Thurs,
Fri,
Sat,
Sun
}today;//该变量today是Weekdays的一个实例。

        int _tmain(int argc, _TCHAR* argv[])
  {
        Weekdays e_day = Mon;//把枚举常量赋值给变量
        today = Sat;                    //把枚举常量赋值给变量
        cout<<"e_day = "<<e_day<<endl;
        cout<<"today = "<<today<<endl;
        system("pause");
        return 0;
  }

<img src="http://cuicaiwei.com/wp-content/uploads/2017/02/3.png" alt="3" width="426" height="165" class="alignnone size-full wp-image-145" />

说明:
枚举定义的符号常量按顺序赋值,默认从0开始。
把特殊符号赋值给枚举器,会输出这些符号的十进制数。
如果没有显示指定的值,按照从最后一个指定的值开始递增1的方式给每个枚举器赋值。

3,枚举器名称默认导出到封闭的范围内,所以在引用它们时,不需要限定名称。但会导致一个问题。
4
两组枚举器名称都可以在封闭范围内使用,即在main()的代码体中使用,但不能枚举重定义。

4,类型安全的枚举
为了避免以上错误,Visual C++实现了一种新的枚举。
在enum的后面使用class 关键字。就可以定义新的枚举。
** 注意:在VS2010中编辑会有错,在VS2015中可以正常使用。**
enum class Weekdays
{
Mon = ‘,’,
Tues = 4,
Wed,
Thurs,
Fri,
Sat,
Sun
}today;
enum class Weekdays1
{
Mon1 = ‘,’,
Tues ,
Wed1,
Thurs1,
Fri1,
Sat1,
Sun1
};

  int main()
  {
        Weekdays e_day = Weekdays::Mon;
        today = Weekdays::Sat;
        Weekdays1 e_day1 = Weekdays1::Tues;

        cout << "e_day = " << static_cast<int>(e_day) << endl;
        cout << "today = " << static_cast<int>(today) << endl;
        cout << "e_day1 = " << static_cast<int>(e_day1) << endl;
        system("pause");
        return 0;
  }

C++学习笔记 (一)2017/2/23

1,IDE :Integrated Development environment 开发集成环境

2,MFC:Microsoft Foundation Classes

3,桌面应用程序可以面向Windows7,Windows8或者Windows Vista。Windows8应用程序只能在Windows8上执行,且必须在Windows8上安装Visual Studio2012,才能开发它们。Windows8应用程序通过Windows运行库WinRT与操作系统通信。
1

4,GUI:Graphical User Interface 图形用户界面

5,过程化程序的输入是由程序代码控制的,而且只能发生在程序允许它发生的时候,因此,Windows程序主要是由响应事件的代码段组成的,而事件是由用户动作或者Windows本身引起的。
2

6,作为IDE组成部分提供的Visual C++的基本部件有编辑器,编译器,连接器和库。

7,Solution Explorer窗格 :Ctrl+Alt+L

8,Class View窗格 : Ctrl+Shift+C

9,预处理器指令是由编译器的预处理阶段执行的命令,这个阶段在代码被编译成目标代码之前执行,在编译源代码之前,预处理器指令通常以某种方式作用于它们。预处理器指令都以#字符开头。

10,1.125E2,其中小数部分与E(代表指数)后面指定的10的幂相乘。

11,typedef关键字能够为现有的类型定义自己的类型名称,例:
typedef long int BigOnes;
BigOnes mynum = 0L; //long int mynum = 0L;

12,引用#include 可以使用操作符setw(n),它输出的值在n个空格字段中遵循右对齐。如:
int num1 = 1234,num2 = 5678;
cout<<setw(6)<<num1<<setw(6)<<num2<<endl;

            左对齐:cout<<setiosflags(ios::left);

13, const变量类型定义程序中使用的常量:
const double roolWidth = 21.1;

14,显式类型转换:int value1 = static_cast(value2);
老式的类型强制转换;int value1 = (int)(value2);

15,类型输出:
cout<<“The type of xy is “<<typeid(xy).name()<<endl;

Static变量,普通变量

全局变量前加上static就构成了静态变量。全局变量本身就是静态存储方式,静态全局变量也是静态存储方式。两者在存储方式上并无不同。两者的区别在于普通全局变量的作用域是整个源程序。当源程序是由多个源文件组成时,普通全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其他文件中不能使用它。

参考资料:
http://blog.csdn.net/gjw198276/article/details/2010150

http://blog.csdn.net/w825828482/article/details/20526145

《愿风载尘》

最近在读小四的书《愿风载尘》。其实他已经出名很久很久了,原谅我是个不爱读书的孩子,但最近的我想要改变自己,培养自己去体验读书的乐趣。在自己每天都坚持的情况下发现书真的可以充实一个人。
虽然我不知道这本书最终想要表达什么,但是阅读的时候就好似在和他对话,听着他讲述他的故事,跟着他的情绪波动。有些事情只有经历过才会达到共鸣。每天在拥挤的电车里读着他的故事,好似我的眼前只有他,柔柔弱弱的外表下有一颗强大的心。听他聊父亲聊学生时代,更喜欢听他聊梦想。羡慕他身边有一群为了同一个目标而努力的朋友。听着他说一群朋友聚会唱歌,有的唱着唱着就哭了,最害怕提及“梦想”“坚持”。。。
听完别人的故事不禁要反省自己。我也和他们一样正值青春,我也有大把的梦想。可是毕业后感觉时间好似换了高级交通工具一般总是那么飞快的驶过,让我害怕抓不住。一转眼,年龄就大了好几岁,一直以为自己还很小,可是看到公司有了新的面孔,有了稚嫩的笑容时,我发现时光已经带走了几年前的我。
我是一个普通的不能再普通的小草根。比上不足比下有余,看到有些朋友过的安逸快乐时,我并没有羡慕,我知道每个人有每个人的想法,每个人都有自己的路要走,自己就是那么不容易满足。我也想有一天晚上站在30多层的公寓里俯瞰整座城,喜欢那片繁华,喜欢那闪烁的霓虹灯。

深入浅出MFC-笔记

WinSDK

Win32程序开发流程
windows程序分为【程序代码】和【UI(User Interface)资源】两大部分,两部分最后以RC编辑器整合为一个完整的EXE文件。所谓UI资源是指功能菜单,对话框外貌,程序图标,光标形状等等东西。这些UI资源的实际内容(二进制代码)系借助各种工具产生,并以各种扩展名存在,如.ico, .bmp, .cur等等。程序员必须在一个所谓的资源描述档(.rc)中描述它们。RC编辑器(RC.EXE)读取RC档的描述后将所有UI资源档集中制作出一个.RES档,再与程序代码结合在一起,这才是一个完整的Windows可执行档。

C++操作注册表

//*****************************************************************************
// 関数名 :GetUseNetwork()
// 概略 :前回変更したネットワークアダプタ情報の取得
//*****************************************************************************
int IPMessage::GetUseNetwork(TCHAR szUseNetwork[256])
{
//初期化
long lRet = 0;
HKEY hKey; // レジストリキーオープン用キー・ハンドル
TCHAR szKeyName[256]; // レジストリパス

//レジストリ「SOFTWARE\\×××\\OPOSPLUS\\Administrator\\」で取得します。
lstrcpy(szKeyName, PROFILE_KEY4);
lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_ALL_ACCESS, &hKey);

if(lRet == ERROR_SUCCESS)
{
    //変数
    UINT    cchValue = 256;
    long    lDataLen = cchValue * sizeof(TCHAR);
    UINT    cbData(lDataLen);
    DWORD   cb(cbData);
    TCHAR   szVer[256];
    LPBYTE  pbData = (LPBYTE)szVer;
    DWORD   dwType(REG_SZ);
    CString strNetworkname ;
    lRet = ::RegQueryValueExA(hKey, "UseNetworkCard", NULL, &dwType, pbData, &cb);
    if(lRet ==ERROR_SUCCESS)
    {
        strNetworkname = pbData;
        //前回変更したアダプタ名を保存します。
        lstrcpy(szUseNetwork, strNetworkname);
    }
    else
    {
        return 1;
    }
}
else
{
    return 1;
}   
return 0;

}

//*****************************************************************************
// 関数名 :SetUseNetwork()
// 概略 :変更したネットワークアダプタ情報の設定
//*****************************************************************************
int IPMessage::SetUseNetwork(CString strAdapterName)
{
HKEY hKey; // レジストリキーオープン用キー・ハンドル
TCHAR szKeyName[256]; // レジストリパス
long lRet = 0;

//レジストリ「SOFTWARE\\×××\\OPOSPLUS\\Administrator\\」で取得します。
lstrcpy(szKeyName, PROFILE_KEY4);
lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_ALL_ACCESS, &hKey);

if (lRet == ERROR_SUCCESS)
{
    UINT cbData   = (lstrlen(strAdapterName) + 2) * sizeof(TCHAR); 
    LPBYTE pbData = (LPBYTE)_alloca(cbData);
    memset(pbData, NULL, cbData);
    lstrcpy((LPTSTR)pbData, strAdapterName);

    lRet = RegSetValueEx(hKey, _T("UseNetworkCard"), 0, REG_SZ, pbData , cbData);
    if (lRet != ERROR_SUCCESS)
    {
        return 1;
    }
}
return 0;

}

获取使用网卡

int IPMessage::GetNetcardStatus(TCHAR szAdapterName[6][256],long* plCount,int nStatus[6])
{

//変数初期化
long lRet     = 0; 
long lCardNum = 0;
int  nCount  = 0;

//変数:レジストリでネットワークアダプタを取得する関連
HKEY    hKey;           // レジストリキーオープン用キー・ハンドル
TCHAR   szKeyName[256]; // レジストリパス
TCHAR   szServiceName[6][256];
CString strServiceName;

//変数:ネットワークアダプタ接続状態を取得する関連
CString                  strGuidId           = NULL;
INetConnectionManager    *pManager           = NULL;
IEnumNetConnection       *pEnum              = NULL;
NETCON_PROPERTIES        *Nproperties        = NULL;
INetConnection           *pConnection        = NULL;
ULONG                    celt                = 0;
INetSharingManager       *pNetSharingManager = NULL;
INetSharingConfiguration *pConfiguration     = NULL;

/////////////////////////////////////////////////////////////////////////////////////////////////////////
//1,该步获取的是本机曾经使用过的所有网卡,不管现在是否物理连接
////////////////////////////////////////////////////////////////////////////////////////////////////////
for (long lCardNo = 1; lCardNo <= NETWORKCARD_MAX_NUMBER; lCardNo++)
{
//レジストリ「SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\」で
//全部なネットワークアダプタを取得します。
wsprintf(szKeyName, _T(“%s%d”), PROFILE_KEY3, lCardNo);

    lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_ALL_ACCESS, &hKey);
    if ( lRet == ERROR_SUCCESS)
    {
        //変数
        UINT    cchValue = 256;
        long    lDataLen = cchValue * sizeof(TCHAR);
        UINT    cbData(lDataLen);
        DWORD   cb(cbData);
        TCHAR   szVer[256];
        LPBYTE  pbData = (LPBYTE)szVer;
        DWORD   dwType(REG_SZ);

        lRet = ::RegQueryValueExA(hKey, "ServiceName", NULL, &dwType, pbData, &cb);
        if ( lRet == ERROR_SUCCESS)
        {
            strServiceName = pbData;
            lstrcpy(szServiceName[lCardNum], strServiceName);
            lCardNum = lCardNum + 1;
        }
        else
        {
            return 1;
        }
    }
    else
    {
        continue;
    }
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////
//2,该步获取的是本机正物理连接的所有网卡,包括在本地连接中显示的蓝牙也会被检索出来
////////////////////////////////////////////////////////////////////////////////////////////////////////
//可用なネットワークアダプタの接続状態を取得します。
CoInitialize(NULL);
CoCreateInstance(CLSID_ConnectionManager, NULL, CLSCTX_SERVER, IID_INetConnectionManager, (void**)&pManager);
if(pManager == NULL)
{
printf(“異常、失敗,Error:%d\n”,GetLastError());
return 1;
}

pManager->EnumConnections(NCME_DEFAULT, &pEnum);
while(pEnum->Next(1, &pConnection, &celt) == S_OK )
{
    pConnection->GetProperties(&Nproperties);
    strGuidId.Format(_T("{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}" )
                    ,Nproperties->guidId.Data1 
                    ,Nproperties->guidId.Data2 
                    ,Nproperties->guidId.Data3 
                    ,Nproperties->guidId.Data4[0]
                    ,Nproperties->guidId.Data4[1] 
                    ,Nproperties->guidId.Data4[2]
                    ,Nproperties->guidId.Data4[3]
                    ,Nproperties->guidId.Data4[4]
                    ,Nproperties->guidId.Data4[5] 
                    ,Nproperties->guidId.Data4[6]
                    ,Nproperties->guidId.Data4[7]
                    ); 

    for(int i = 0; i < lCardNum; i++)
    {
    ///////////////////////////////////////////////////////////////////////////
    //将第2步得到的网卡在第一步得到网卡信息中查找,如果找到就是本次需要的网卡
    //////////////////////////////////////////////////////////////////////////
        strServiceName = szServiceName[i] ;
        if( strServiceName == strGuidId)
        {
            lstrcpy(szAdapterName[nCount], strGuidId);
            lstrcpy(m_szAdapterName[nCount], strGuidId);

///////////////////////////////////////////////////////////////////////////////////////
//该处的连接状态有很多种,我只是选择了几个自己需要的状态
///////////////////////////////////////////////////////////////////////////////////////
//ネットワークアダプタの接続状態を取得します。
if(Nproperties->Status == NCS_CONNECTED)//
{
nStatus[nCount] = 1;
}
else if(Nproperties->Status == NCS_MEDIA_DISCONNECTED)
{
nStatus[nCount] = 1;
}
if(Nproperties->Status == NCS_DISCONNECTING)
{
nStatus[nCount] = 0;
}
nCount = nCount + 1;
}
}
}
if(pManager) pManager->Release();
if(pConnection) pConnection->Release();
if(pEnum) pEnum->Release();
if(pNetSharingManager) pNetSharingManager->Release();
if(pConfiguration) pConfiguration->Release();
CoUninitialize();

*plCount = nCount;
return 0;

}