作者归档:horsley

我的c++程序设计作业-atm

程序说明:

本作业atm部分我用了大概两天时间来完成。
    一开始的工作是尝试着在原框架代码上加注释,以此来了解老师给出的基本思路。
同时着手对框架中不符合c++标准的,没有能很好地利用c++的特性的地方进行修改
本项目使用面向对象的编程方法,抽象出atm类和account账户类,做到基本实现作业要求

亮点之处:
1.充分利用c++的string类代替c语言风格的字符数组,简化了许多操作
2.统一管理用户界面,实现表现逻辑与业务逻辑的分离和代码重用
3.结合控制台清屏、延时、密码星号回显输入等技术,优化用户界面
4.使用简单文本文件作为本地持久化存储解决方案
5.规范的编码,包括变量和方法命名、注释等
6.全局的调试信息输出开关,方便测试程序

exe目录内含文件分别为打开/关闭全局调试信息输出开关、调试/发布方式编译得出的文件
目录中的另外三个文本文件为运行时需要用到的数据文件
本项目编译环境为win7 + c-free 5

下面贴出代码,乃抛砖引玉之意,希望各位大大不吝赐教,欢迎大家讨论交流,切勿照抄作业!

main.cpp – 主程序

#include"function.h"

/******************************************************************************
*	题目1.(100分)
*	用面向对象方法实现ATM的模拟,实现储存,取款,查账,转账,修改密码等一系列功能。
*	(1)用类实现ATM的主要功能
*	(2)提示用户执行操作,内置用户资料,输入操作动作和信息。
*	(3)程序可执行对不同用户的储存,取款,查账,转账,修改密码等一系列动作。
******************************************************************************/



int main()
{
	ATM atmServer;
	atmServer.start(); 
	return 0;
}


account.cpp – 账户类

#include"function.h"

/******************************************************************************
* 
*	文件:		account.cpp 
* 
*	=========================================================================== 
*	
*	内容:		账户类的实现 
*	
*	接口函数:	account::account(string num,string pwd,float money)
*				account::getPassword()
*				account::toFile(string filename)
*				account::fromFile(string filename)
*				account::minusMoney(float money)
*				account::addMoney(float money)
*				account::queryMoney()
*				account::changePassword(string newPassword)
*				account::getCardNum()
* 
*	用途:		实现账户类底层数据操作接口 
*
*	注释:		本层未作一般条件限制,上层应予以实现 
*	
******************************************************************************/


/******************************************************************************
* 
*	方法:	account::account(string num,string pwd,float money)
*
*	功能:	账户类构造函数,同时初始化类成员变量 
* 
*	注释:	本层不做检测直接覆盖类成员变量里面的数据 
*	
******************************************************************************/ 
account::account (string num, string pwd, float money)
{
   m_cardNum	= num;
   m_password	= pwd;
   m_money 		= money;
}

/******************************************************************************
* 
*	方法:	account::getPassword()
*
*	功能:	查询返回账户的密码 
* 
*	注释:	底层实现故未作任何条件限制,交给上层来实现
*	
******************************************************************************/
string account::getPassword ()
{
	return m_password;
}

/******************************************************************************
* 
*	方法:	account::toFile(string filename)
*
*	功能:	将一个账户类的数据写入到指定的文件中 
* 
*	注释:	请确保对应文件及目录具有写入权限,否则程序cerr输出后将退出 
*	
******************************************************************************/
void account::toFile (string filename)
{
	ofstream out((char *)filename.c_str());
	if(!out)
	{
		cerr << "打开输出文件错误!" << endl;
		system("pause");
		exit(1);
	}
	out << m_cardNum << endl << m_password << endl << m_money << endl;
	out.close();
	
}

/******************************************************************************
* 
*	方法:	account::fromFile(string filename)
*
*	功能:	从指定的文件中将一个账户类的数据读入,覆盖原有所有数据 
* 
*	注释:	请确保对应文件及目录具有读取权限,否则程序cerr输出后将退出
*			本层不做检测直接覆盖类成员变量里面的数据,小心使用
*			可以先使用isAccountFileExist(string cardNum)方法检测账户是否存在 
*	
******************************************************************************/
void account::fromFile (string filename)
{
	ifstream in((char *)filename.c_str());
	if(!in)
	{
		cerr << "打开输入文件错误!" << endl;
		system("pause");
		exit(1);
	}
	in >> m_cardNum >> m_password >> m_money;
	in.close();	
	
}

/******************************************************************************
* 
*	方法:	account::minusMoney(float money)
*
*	功能:	在当前帐户类中扣除指定金额的钱 
* 
*	注释:	本方法内有余额不足检测,余额不足返回假,否则返回真 
*			上层也应使用queryMoney()方法进行检查 
*	
******************************************************************************/
bool account::minusMoney (float money)
{
	if (money > m_money) //余额不足以扣钱 
	{
		return false;
	}
	m_money -= money;
	return true;
}

/******************************************************************************
* 
*	方法:	account::addMoney(float money)
*
*	功能:	在当前帐户类中增加指定金额的钱 
* 
*	注释:	底层实现故未作任何条件限制,交给上层来实现 
*	
******************************************************************************/
void account::addMoney (float money)
{
	m_money += money; 
}

/******************************************************************************
* 
*	方法:	account::queryMoney()
*
*	功能:	返回在当前帐户中的余额 
* 
*	注释:	底层实现故未作任何条件限制,交给上层来实现 
*	
******************************************************************************/
float account::queryMoney ()
{
	return m_money;
}

/******************************************************************************
* 
*	方法:	account::changePassword(string newPassword)
*
*	功能:	修改当前帐户的密码
* 
*	注释:	本层不做检测直接覆盖类成员变量里面的数据
*			未作任何条件限制,上层应予以实现 
*	
******************************************************************************/
void account::changePassword (string newPassword)
{
	m_password = newPassword;
}

 /******************************************************************************
* 
*	方法:	account::getCardNum()
*
*	功能:	返回在当前帐户的账号 
* 
*	注释:	保存文件、转账自身是检测用 
*	
******************************************************************************/
string account::getCardNum()
{
	return m_cardNum;
}

ATM.cpp – atm机类

#include "function.h"


/******************************************************************************
* 
*	文件:		ATM.cpp 
* 
*	=========================================================================== 
*	
*	内容:		ATM机类的实现 
*	
*	接口函数:	ATM::start()
*				ATM::checkPassword()
*				ATM::functionShow() 
*				ATM::lockAccount()	
*				ATM::loadAccount()			
*				ATM::welcome()		
*				ATM::depositMoney()
*				ATM::withdrawMoney()
*				ATM::changePassword()
*				ATM::transferMoney()
*				ATM::getCardBack()
* 
*	用途:		实现ATM机上层用户操作接口 
*
*	注释:		本层未作一般条件限制,上层应予以实现 
*	
******************************************************************************/


/******************************************************************************
* 
*	方法:	ATM::start() 
*
*	功能:	模拟atm开机,引导初始化工作 
* 
*	注释:	对外的接口
*	
******************************************************************************/
void ATM::start()
{
	stopFlag = false;
	while (!stopFlag)	welcome(); 
}
/******************************************************************************
* 
*	方法:	ATM::welcome() 
*
*	功能:	模拟atm机初始化显示欢迎界面给用户 
* 
*	注释:	本方法将清屏后输出欢迎界面,然后调用load()方法 
*	
******************************************************************************/
void ATM::welcome()
{
	printMsg(101); //欢迎界面 
	
	loadAccount(); 
}

/******************************************************************************
* 
*	方法:	ATM::loadAccount() 
*
*	功能:	模拟插卡和验证密码过程,最终读入对应账户的文件 
* 
*	注释:	对应账户的文件应该要存在 
*	
******************************************************************************/
void ATM::loadAccount()
{
	string cardNum,password;
	if (g_debug)	printMsg(201); //调试账号提示 
	
	
	//账号验证 
	do
	{
		printMsg(102); //输入账号提示
		cin >> cardNum;
		if (account::isAccountFileExist(cardNum)) break; //输入正确跳出循环 
		printMsg(301);	//账号错误提示
		
	} while (true);
	
	//账号读入 
	account tmpAccount;
	int		errPassTimes = 0; 
	tmpAccount.fromFile(cardNum + ".txt");
	
	//密码验证 检验来源为文件中存储的密码数据,不能使用checkPassword() 
	do
	{
		if (g_debug)	printMsg(202, tmpAccount.getPassword()); 	//调试密码提示
		printMsg(103);												//输入密码提示 
		password = ATM::inputPassword();
		if (password == tmpAccount.getPassword()) break;			//输入正确跳出循环 
		printMsg(302);												//密码错误提示	
		errPassTimes++;
		if (errPassTimes >= 3)
		{
			lockAccount();
			return;
		}
	} while (true);
	
	curAccount = tmpAccount; 
	functionShow();
}/*	load() - 结束	*/

/******************************************************************************
* 
*	方法:	ATM::checkPassword(string pwd) 
*
*	功能:	检验给出的密码是否与atm内部当前账户密码一致 
* 
*	注释:	注意此处检验来源为atm对象中存储当前帐户的密码数据
*	
******************************************************************************/
bool ATM::checkPassword(string pwd)
{
	if(pwd	==	curAccount.getPassword())
		return true;
	else 
		return false;
}

/******************************************************************************
* 
*	方法:	ATM::lockAccount() 
*
*	功能:	模拟atm输错密码次数过多后吞卡 
* 
*	注释:	吞卡后return一直到顶层start()里面重复welcome()的过程 
*	
******************************************************************************/
void ATM::lockAccount()
{
	printMsg(303); 
}

/******************************************************************************
* 
*	方法:	ATM::functionShow() 
*
*	功能:	模拟atm验证密码成功后显示功能菜单并分流处理用户选择 
* 
*	注释:	分流出去处理具体过程,本方法作为一个总路由 
*	
******************************************************************************/
void ATM::functionShow()
{
   do
   {
   		printMsg(101);						//顶部 
   		if (g_debug)	printMsg(204, ""); 	//退卡提示
					
   		printMsg(104);						//功能菜单 
   		int n;
     	cin>>n;
     	
   		while(n<1||n>6)
	 	{
  			printMsg(304);					//操作编号有误 
      		cin>>n;
   		}
   		
    	switch(n)
		{
      		case 1:		//执行存款功能
      					depositMoney(); 
      					break;
      		case 2:   	//执行取款功能
 						withdrawMoney();
	 					break;
      		case 3:   	//执行查询余额功能 
	 					queryMoney();
	 					break;
      		case 4:   	//执行转账功能 
      					transferMoney();
					  	break;
      		case 5:		//修改密码 
   						if(!changePassword()) return; //验证密码失败一直退回到顶层重新welcome()
					   	break;
			case 6:		//退卡
						getCardBack();
						return;   //一直退回到顶层重新welcome() 
						break;
		}
   } while (true);
}

/******************************************************************************
* 
*	方法:	ATM::depositMoney() 
*
*	功能:	模拟atm存钱 
* 
*	注释:	存钱 - 显示余额 - 返回菜单 
*	
******************************************************************************/
void ATM::depositMoney()
{
	printMsg(101);							//显示顶部 
	if (g_debug)	printMsg(203); 			//调试存款提示
	printMsg(106);							//提示存款
	float tmp;
	cin >> tmp;
	
	curAccount.addMoney(tmp); 
	
	printMsg(107, tmp);						//显示实际存入金额
	printMsg(108, curAccount.queryMoney());	//显示余额 
}

/******************************************************************************
* 
*	方法:	ATM::withdrawMoney() 
*
*	功能:	模拟atm取钱 
* 
*	注释:	取钱 - 显示余额 - 返回菜单 
*	
******************************************************************************/
void ATM::withdrawMoney()
{
	printMsg(101);							//显示顶部 
	if (g_debug)	printMsg(205); 			//调试取款提示
	
	float tmp;
	
	do
	{
		printMsg(109);						//提示取款 
		cin >> tmp;
		if (tmp <= curAccount.queryMoney()) break;
		printMsg(305);
	} while (true); 
	 
	curAccount.minusMoney(tmp);
	printMsg(110, tmp);						//显示实际存入金额
	printMsg(108, curAccount.queryMoney());	//显示余额 
}

/******************************************************************************
* 
*	方法:	ATM::queryMoney() 
*
*	功能:	模拟atm查询余额 
* 
*	注释:	显示余额 - 返回菜单 
*	
******************************************************************************/
void ATM::queryMoney()
{
	printMsg(101);							//显示顶部
	printMsg(108, curAccount.queryMoney());	//显示余额	
}

/******************************************************************************
* 
*	方法:	ATM::changePassword() 
*
*	功能:	模拟atm改密码 
* 
*	注释:	验证原有密码 - 设置新密码 - 确认新密码 - 返回菜单
*			验证原有密码失败则返回假一直退到顶层重新welcome过程 
*	
******************************************************************************/
bool ATM::changePassword()
{
	int 	errPassTimes = 0;
	string	password, vPassword;
	printMsg(101);													//显示顶部
	
	//验证原密码 
	if (g_debug)	printMsg(202, curAccount.getPassword()); 		//调试密码提示
	do
	{		
		printMsg(103);												//输入密码提示 
		password = ATM::inputPassword();
		if (password == curAccount.getPassword()) break; 			//输入正确跳出循环 
		printMsg(302);												//密码错误提示
		errPassTimes++;
		if (errPassTimes >= 3)
		{
			lockAccount();
			return false;
		}
	} while (true);
	
	//设置新密码 
	do
	{
		printMsg(111);		//新密码输入提示
		password = ATM::inputPassword();
		printMsg(112);		//新密码再次输入提示
		vPassword = ATM::inputPassword();
		if (password == vPassword) break;
		printMsg(306);
	} while (true);
	
	//写入数据
	curAccount.changePassword(password);
	printMsg(113); 
 
}

/******************************************************************************
* 
*	方法:	ATM::transferMoney() 
*
*	功能:	模拟atm转账 
* 
*	注释:	当前帐户减钱 - 目标账户加钱 - 返回菜单
*	
******************************************************************************/
void ATM::transferMoney()
{
	printMsg(101);												//显示顶部
	//账号验证 
	string cardNum;
	if (g_debug)	printMsg(201); 								//调试账号提示 
	do
	{
		printMsg(114); 											//输入账号提示
		cin >> cardNum;
		if (account::isAccountFileExist(cardNum) &&				//账户存在 
			cardNum != curAccount.getCardNum()					//不是给自己转 
		) break; 		//输入正确跳出循环 
		printMsg(301);											//账号错误提示
		
	} while (true);
	
	//账号读入 
	account tmpAccount; 
	tmpAccount.fromFile(cardNum + ".txt");
	
	//余额验证
	float tmp; 
	do
	{
		printMsg(115);											//提示转账 
		cin >> tmp;
		if (tmp <= curAccount.queryMoney()) break;
		printMsg(305);
	} while (true);
	
	//加减钱过程
	curAccount.minusMoney(tmp);
	tmpAccount.addMoney(tmp);
	//临时账户的保存
	tmpAccount.toFile(cardNum + ".txt");
	
 	printMsg(116);							//转账成功 
	printMsg(108, curAccount.queryMoney());	//显示余额
}

/******************************************************************************
* 
*	方法:	ATM::getCardBack()
*
*	功能:	模拟atm退卡 
* 
*	注释:	保存文件 - 返回welcome
*	
******************************************************************************/
void ATM::getCardBack()
{
	//保存过程
	curAccount.toFile(curAccount.getCardNum() + ".txt");
	printMsg(101);		//显示顶部
	printMsg(117);		//退卡提示 
}

printMsg.cpp - 用户界面打印的集中实现

#include  
#include  
#include 		//cout格式输出
#include  		//延时函数 sleep
#include 		//类型转换用到 
 
using namespace std;

/******************************************************************************
* 
*	文件:		printMsg.cpp 
* 
*	=========================================================================== 
*	
*	内容:		实现一个向控制台输出信息的封装函数 
*	
*	用途:		统一管理用户界面所有可重用的输出 
*
*	注释:		分离用户界面层表现逻辑和程序业务逻辑,实现输出信息统一管理  
*	
******************************************************************************/

/******************************************************************************
* 
*	函数:	printMsg(int index)
*
*	功能:	打印指定的信息到控制台 
* 
*	注释:	index索引值用于指定要打印的信息,定义如下
*				普通信息: 1xx 
*				101:显示欢迎界面 
*				102:输入账号提示 
*				103:输入密码提示 
*				104:atm功能菜单
*				105:输入操作编号提示 
*				106:存款提示 
*				107:存款成功提示 
*				108:余额提示
*				109:取款提示
*				110:取款成功提示 
*				111:输入新密码提示
*				112:再次输入新密码提示
*				113:密码修改成功提示
*				114:转账输入账号提示 
*				116:转账成功 
*				117:退卡提示 
*
*				调试提示信息: 2xx 
*				201:显示可用的内置调试账户号码
*				202:显示可用的内置调试账户密码 
*				203:显示存款提示 
*				204:退卡提示
*				205:调试取款提示 
*
*				错误提示信息: 3xx 
*				301:账号不存在
*				302:显示密码错误
*				303:吞卡
*				304:功能菜单输入编号错  
*				305:余额不足
*				306:两次密码不一致 
*				307:自己转账给自己 
*	
******************************************************************************/
void printMsg(int index, string extraInfo)
{
	switch(index)
	{
		case 101:		//显示欢迎界面 
					system("cls"); 
					cout << endl << "  " << setfill('$') << setw(60) << "" << endl;
					cout << setfill(' ') << "  " << "$" << setw(59) << "$" << endl;
					cout << setfill(' ') << "  " << "$" << setw(20)<< "";
					cout << "欢迎使用暨大银行ATM" << setw(20)<< "$" << endl;
					cout << setfill(' ') << "  " << "$" << setw(59) << "$" << endl;
					cout << setfill('$') << "  " << setw(60) << "" << endl << endl;
					break;
		case 102:		//输入账号提示 
					cout << "    请输入您的账号:";
					break; 
		case 103:		//输入密码提示
					cout << "    请输入您当前帐户的密码:";
					break; 
		case 104:		//atm功能菜单
					cout << "    尊敬的客户您好,本机提供以下功能: " << endl << endl;
     				cout << "      (1) 存款     " << endl
  	 					 << "      (2) 取款     " << endl
         				 << "      (3) 查询余额 " << endl
         				 << "      (4) 转账     " << endl
         			 	 << "      (5) 修改密码 " << endl
         				 << "      (6) 退卡     " << endl << endl;
					printMsg(105, "");	
					break; 
		case 105:		//操作输入提示 
					cout << "    请输入操作数字编号:";
					break;
		case 106:		//存款提示
					cout << "    请输入要存入的金额:";
					break; 
		case 107:		//存款成功提示
					cout << "    已成功存入:" << extraInfo << endl;
					break; 	
		case 108:		//余额提示
					cout << "    当前帐户的余额为:" << extraInfo << endl;
					Sleep(3000);	//延时3秒,返回功能界面
					break;
		case 109:		//取款提示
					cout << "    请输入要取出的金额:";
					break;
		case 110:		//取款成功提示
					cout << "    已成功取出:" << extraInfo << endl;
					break;
		case 111:		//输入密码提示
					cout << "    请输入您的新密码:";
					break;
		case 112:		//输入密码提示
					cout << "    请再次输入您的新密码:";
					break; 
		case 113:		//改密码成功提示
					cout << "    密码修改成功,请记住您的新密码。" << endl;
					Sleep(3000);	//延时3秒,返回功能界面
					break;
		case 114:		//转账输入账号提示 
					cout << "    请输入目标账号:";
					break;
		case 115:		//转账金额输入提示
					cout << "    请输入要转账的金额:";
					break;
		case 116:		//转账输入账号提示 
					cout << "    转账成功!"<> ret;
	return ret;
}

void printMsg(int index, float extraInfo)
{
	printMsg(index, floatToString(extraInfo));
}

全部代码文件、工程文件、exe文件、说明文档打包下载点击这里ATM

程序员人生之路

自从坚定地选择了这一个学科,选择了这一个职业,选择了这一条路之后,我一直在收集他的信息,像这篇文章,换着说法的看过不少了,还是值得收藏。对比着分析自我判定了一下,发现我比较符合深钻技术的出路一,但是我个人又强烈意识到这样不好,想转入相对轻松的管理层面,像路三。对未来还是很迷茫,但是我有有意识的去锻炼自己在对应范畴的能力,例如沟通能力,能不能既成为一个技术宅,同时又是一个懂心理懂管理口齿伶俐善于沟通的人呢,我有点贪心?

=========================阿黎的分割线============================

相对同时刚出校门同学从事其它行业而言优厚的薪水,以及不断学习更新的专业知识不仅仅让你感到生活的充实,更满足了你那不让外人知的虚荣心。在刚出校门的几年中,你经常回头看看被你落在后面的同学们,在内心怜悯他们的同时,你也会对自已天天加班的努力工作感到心里平衡:“有付出才会有回报”这句话在那几年中你说的最多,不管是对自已的朋友们还是自已的爱人。第二句最常说的话是对公司的领导:“不行我就走人!”,实际上你也真的走过几回。对了,在这几年中,因为你的经济条件不错,你开始买房、开始谈恋爱、结婚、开始有了自已的小孩。有时候你会对自已说再过两年就去买车。当然其中可能有许多大件是需要分期付款的,但你对前途充满了信心,你确信认为这种日子会永远的持续下去,即使不是变得更好的话。
日子总是在这种平淡中一天天的过去,就在那么不经意间,你突然发现自已已经快30岁了,或者已经30了,莫名的,你心里会漫延着一种说不清楚的不安情绪,你好像觉得前途并非像前几年那样变得越来越好,你也忽然发现你以前所瞧不起的同学里好像已经有不少开着车的了,也有几个人住着比你还大的房子,好像房款还是一次付清的,你突然明白你现在的生活比起你的同学来最多是中游偏上了。工作中最让你感到心里不舒服的是,你越来越不敢对你的领导说不了,即使比你来的晚的同事升职或提薪,你也只是在私下与朋友们一起喝酒时才敢发发牢骚,在头的面前你的声间越来越小、笑脸是越来越温柔。
你终于开始迷茫“再过几年我会是在干什么呢?”,这句话常常出现在你的心里。
计算机开发工作,是一种以年轻为资本的工作,说句通俗点的话是“吃青春饭的”,嗯,这句话好像在一种特别的行业也听到过。

其标志就是一:工作的时间性非常强,一个开发项目被定的时限通常是很紧张的,更有甚者,有些号称开发管理的书里面还非常卑鄙的号召将一个项目切成多个小片,每个小片都定一个叫“里程碑”的东东来严格跟踪开发进度,加班加点在其它行业是需要加班工资的,而在开发行业,加班工资好像还没见到几个公司发过,是啊,反正有时间限制着,你干不完我再找你算账.所以开发工作通常有着其它工作所没有的精神上的压力。

一旦一个人步入而立之年,因为家庭和孩子的负担,加上精力上面的衰退,加班工作时间变得越来越少,这点让很多老板们感到:这些人已经老了,不好用了。指示人事部门:“以后招开发人员限制在30岁以下!”,相对而言硬件开发会年龄方面限制会稍好一点点,但也是五十步笑百步。还有一个很重要的一点就是:计算机这个烂东东实在是进步的太快了,前两年买的顶级配置电脑,现在怎么看怎么像废品,这还是小事,更可气的是好像每天都需要学习新的知识,刚毕业时只会书本上的PASCAL,学会了用腐蚀的办法来做电路板,一上班就开始学习TURBOC和TANGER2.0,刚刚学会,还没来得及高兴,马上开始学Borland C++和Protel3.0,好不容易学会了,却发现需要学习VC和Protel98了。单片机也是啊:Z80的指令背的很熟,工作中没来得及用就要学8031,好好学吧,本来想着这辈子就吃它了,又发现又出来什么PIC、DSP、CPLD、FPGA、ARM等等….这还不包括中间要学一大堆74系列、4000系列、XX系列…IC卡居然里面还有CPU卡..如果学习的知识里每个字都能变成一分钱,我想所有的开发工程师都是腰缠万贯的富翁。
一眼看去,这种日子好像见不到头,年轻时乐此不彼,但现在你一定对自已能坚持到什么时候感到怀疑了。我们都玩过像仙剑奇侠传这样的RPG游戏,刚开始时你只是一个一名不文的少年,随着你去打怪物、捡宝贝、学秘芨,最后终于有一天你会变成一个大英雄!那么你在实际生活中过得比那些小侠们还辛苦,为什么成不了一个生活中的大侠呢?呵呵,原因在这里:因为开发工作是邪门功夫,它虽然可以让你速成的变成小资,但它最大的特点是经验不积累!日新月异的知识更新,让你总是感到自已在退步,你就像在RPG中的主人公,开始时就给了你一把好剑和好盔甲,而且让你的级别很高,但让你的经验不累积,虽然刚开始打小怪物时你觉得自已很爽,但越到后来,你会发现你会死的很惨!比较一下你与其它非开发行业的同学你就可以知道了,例如和你学医的同学比起来。套用岳不群他老人家说华山剑宗和气宗的区别那段话:前十年你比你那些学医的同学收入和地位要好的多,但十年以后你和他基本上各方面都会持平,而二十年以后你的各方面远远不能与你学医的同学相提并论!嗯,你已经开始不笑辟邪剑法了吧。
“敢问路在何方?路在脚下…”,不过猴兄和八戒兄这么认为是可以的,你呢?
总结了许多开发朋友在30岁以后的生活之路,让我们一起看看开发人员“路在何方?”那么开发人员在30岁以后都干些什么呢?
其路一:继续做你这个很有“前途”的职业吧!
偶掰着脚指头仔细数了数,发现还真的有很多朋友在30岁以后还在从事开发工作,我这里说的从事,是指你还需要天天在电脑边上编程序和画电路板,与你手下是否有几个小兵无关,也与你是否头上顶着什么项目经理、主任工程师的帽子无关,只要你还需要亲自开发,你就属于这一类。其中有个年龄最大的朋友是63年的,从事医疗仪器的开发工作,35岁左右还在从事软硬件开发工作的仍有一大堆,分析这些仍然从事开发的朋友,基本上都有以下特点:
1 痴迷工作或者痴迷电脑,晚上八点到十二点的这段时间,基本上是在电脑桌或工作台前渡过的。
2 不喜欢与人交住,朋友很少,常联系的人不超过五个。
3 与朋友交往时谈工作多,但一般不主动谈钱。
4 体型偏胖或偏廋,不在正常区间。
5 无未来计划,对五年后自已生活怎么样、从事什么工作说不清楚。
6 俭省,从不乱花钱。
即使你是还不到30岁的开发人员,你也可以看看自己对以上几条是否符合,是否会在30岁后还从事开发职业,四条疑似,五条以上基本确诊你也是这类型的人。
这些朋友们通常报着过一天是一天的态度生活,到了这个年龄,也不敢再轻易的换工作了,年轻时的锐气慢慢的也消退了。唯一不变的希望是有一天从天上掉下来一大堆钱把自己砸伤。说实在话因为他们的性格所限,基本上可以确定他们以后不可能在职场上获得更好的发展,当个小头头,带几个人开发已经是他们发展的顶点。至于以后的人生之路,不仅他们自己迷茫,可能上帝也正在头痛。
不过像这类朋友,偶很奇怪的发现:他们的小孩都是儿子!不知是偶然还是有什么其它说法。
简单建议:要改变命运,先改变性格:坚持半年晚上不从事工作、游戏及电视,用此时间与人交往,你的人生会有改变。

其路二:转行从事技术支持、行政或生产等工作还有一些朋友,从事了几年的开发工作,因为自已并非特别的爱好,或者领导上面的强制工作安排,他们转到了技术支持、服务或行政等工作,至少当时从表面上看起来,他们的薪水较开发要少一些,但真正的统计这些人,发现他们之中有半数的人获得了更好的发展,升职为服务部经理或行政经理等职,最历害的一个朋友已升职为总经理助理,进入高层。
这类朋友当时转行通常并非自已志愿,属被逼无奈或者其它原因,但显然,拥有专业知识技术的他们显然在非技术部门中鹤立鸡群,遇到什么事情他们均可从专业的角度提出建言,久而久之,他们获得更多的升职和加薪机会也就不足为奇。
因为不从事开发,所以经验开始积累,这类的职业通常会给你一个很安定的感觉,你到30多岁后会发现这类职业反而比开发工作更容易获得新的工作机会。

简单建议:你如果确定在开发部无法获得很好的发展机会,不妨转到其它几个部门试试,换个活法,钱少点就少点吧,机会多。
其路三:开发管理
如果你现在已经是总工或开发部经理,或者你眼看就有机会被提升为这类职务,那么恭喜你,你走的是从“弼马温”到“斗战胜佛”这条金光大路,你不仅拥有很高的专业技能,而且很显然,你也有着很强的人际交往能力,你这类人根本不需要对未来有着任何的担心,你在即使一无所有的时候也很容易白手起家。
你这种人算是练辟邪剑法练成了仙,嗯,我无话可说。
你是不是这类人也很容易区别,就像围棋二十岁不称国手终身无望一样,你应该在工作三、四年以后,也就是说二十七岁左右就会发现自已工作中指手划脚的时间比亲自开发的时间要多了,而且大多数这类人在这个年龄手下应该有“兵”了,相反的,如果你快30岁了还天天埋头于电脑前编程序和画板子,或者30多岁了你还没升到部门经理(虽然你总是觉得自已很有希望),基本上可以确定你不是这类人。好了,如果你确定你是这类人,那么你唯一的想法就是尽快爬上中层和高层,因为有时候人生偶然性太大,不占住坑的萝卜很有可能被人拔出来!

简单建议:天天去你的老板家里面拖地和擦桌子!

其路四:出国或考研
有两个搞开发后出国的朋友,其中一个甚至打工打到了一个小公司总工的位置,数据库和软件方面水平巨牛,但仍感觉心里不踏实,于是将自己工作多年的钱忍痛掏出来,出国费加上机票大概将自已辛苦所攒的银子花完,然后又借了一些钱,在02年身上揣着一万美元跑去了加拿大,在加拿大不停的重复找工作,换工作,然后再找工作的循环,找的工作基本上与计算机无关,不过工资总是在1500加元左右,呵呵,折成人民币与他在国内打工拿的基本上差不多,不过租个地下室就花了300加元,然后吃吃喝喝,再买个电脑上上网这类的,基本每月平均还要倒贴一点。前段时间给我的邮件里说,现在身上花的差不多只有5、6000美元了,准备开个小公司,看看能不能往国内倒腾点东东,做最后一搏。另外一个朋友去澳州,时间稍早一些,先是大概摘了一年多的葡萄,后来总算找了个技术工作,每天的工作是画机械图纸,收入还算不错

将近3000澳元,买了个旧车,也算是过上了资本主义生活。不过前年回来一趟,唯一的感叹就是:在国外拿2000美元的生活,绝对不如在国内拿5000人民币的生活舒服。
也有两个考研的朋友,不过其中一个严格的说不是做开发的出身,偏重于市场方面的工作性质,不过我的朋友里面考研的不多,只好凑两个人说说,一个考研后在北京找了个工作,每个月5、6000元钱,但还是做开发,生活仍然与没考研之前没有任何的改变,前途仍然没见到什么大亮的光,还是搞不清楚以后再干些什么,标准的过一天算一天了。另外一个考研后在大学里面找了个工作,工资虽然比他原来打工少了不少,但毕竟终身有靠,稳定了下来,也算修成了正果,这位哥们心情一放松下来,也开始有时间琢磨着业余时间自已做点什么,好像现在慢慢的也开始有了点眉目。
简单建议:这两条路,对开发人员来说都不算是很好,出国十年前是好事,现在难说,考研能成功转行的概率恐怕也不是很大,多半仍然去搞开发,只不过研究生可以多干几年罢了。

其路五:转行到市场
绞尽脑汁的想想,我所知道的人之中只有两个开发人员去了市场,这两个人都不能说是朋友,认识而已。他们都是主动要求去了市场,结果是这两个人均在市场都是干到一年左右,然后都自已开公司了。呵呵,很奇怪,极高的转行成功率!不过仔细想想,我对这两个人的思路佩服的五体投地。能下决心仍掉每月5、6000元的开发职位,从事一个自已并不熟悉的岗位,每月拿个2000多元+提成,但提成那是说不清楚的事情,这个决定,只能让人感觉到他们对自已前途清晰的把握和老谋深算的心机。而且他们不去服务不去生产,挖空心思说服领导去市场(市场部门与开发部门通常是一个公司的核心部门,进入其实并不容易),可以说是有着长远的考虑的。有技术了,再与客户交成朋友,马上就会产生很大的机遇应该是正常的事情。
有实力,有心机,也有着很强的决心力,这种人恐怕早在大学毕业时或更早的时候就已经决定了自已的人生之路,他们的每一步路在若干年前早就计划周全,现在看起来:学会技术->进入市场->寻找商机->开公司,一条多么清楚的人生之路。但就像我们上小学中学时,所有人都知道上大学是我们最清楚的人生路一样,最后只有少数人才能真正达到目标(当然,现在扩招的历害是另外一回事,我是说我们那个时候,也就是:“很久很久以前,当我像你那么大的时候”)。

简单建议:你若是这类人,我的建议是:…嗯?….那个你.你,你别走啊,我还有个事想请你赞助一下啊…..

其路六:开公司自已干

呵呵,看到这一条,发现你的眼睛已经圆了,你肯定千百次的想过这个事情吧,咳咳,其实我从事开发的时候也是天天梦想着这种事情。总想着过两年找个机会就自已干,这个梦想一年又一年的折磨着你也给着你希望。看看吧,开发后来开公司的还真的不少,里面有成功的也有很多失败的,通常开公司都是几个人合伙开始的,有做技术的,有做市场的,几个人一拍即合、狼狈为奸,共同策划了这一个大活动。一般说来能让这几个人下决心走出这一步,产品肯定是先进的,甚至是国内独一无二的,市场也是很大的,负责市场的那个哥们通常会拍着胸保证可以卖出去,并悄悄地告诉你他在某主管领导是他小舅子的同学的二叔,肯定没问题。于是你们几个人找地点、注册执照、买了几个破桌子,再攒了两台电脑,每个人又凑了几万银子,公司开张了!
产品很快出来了,市场的哥们也不负重望,有几个客户表示要试用了,一切看起来都是如此的正常,“…….你坐在老板桌前,不停的有人来汇报工作或者找你签字…人进人出中…你又想起公司再穷也不能只有一把椅子的故事…..”你在梦中笑出声来。
是如此的顺利,你们很快就有单子了,很快的单子让你们凑的那点钱不够了,你们很高兴的每个人又增加了投入,拿出钱时你眼泪汪汪的数着钱说:“这就是我那生蛋的母鸡啊”。你们的产品确实不错,市场也经营的很好,客户慢慢的多了起来,单子来的时候一笔接着一笔,你每天都处于兴奋之中,唯一美中不足的是好像客户回款总是会拖一些日子,不过客户给你保证说:过几天,过几天就付给你们,因为回款总是在计划外,所以你们为了资金的流畅运行又凑了一些钱,这个时候你有一些心事了,因为你的存款折上面的数字已经快趋向于零了。“没事,过两个月等回款了一切都OK了,谁干事业不吃点苦呢?”你这么安慰着自已又投入到工作中去,资金总是在回款和生产经营费用之间走着一个窄窄的小木桥,你的账上总是没有太多的钱,扩大了的公司规模和许多意外情况,使你又一次、二次、三次的与合作者们再次投入了自已的资金,当然,后来的钱你可能已经是借的了…..
终于有一天,你的会计再一次告诉你,老板啊,账上又没现金了,吃过多次苦头的你终于下决心开始重视资金的运行了,你裁掉了一些不必要的人手,减少了开发的投入,要求市场人员签单的时候必须予付XX%的款,回扣也必须等收过款后再付,同时也开始对产品的生产成本开始进行控制。
时间一天一天的过去,因为竟争对手的产品也对你的产品进行了仿造,你的产品慢慢变得不再先进,市场人员开始埋怨公司的合同资金方面规定太严格,不好签单,生产成本的下降通常也导至产品毛病的增多,客户也开始埋怨你的服务人员不能及时进行服务。
终于有一天,你重新走进了人才交流中心,以前你是来招人的,现在你拿着自已的简历开始寻找一个工作
……
公司的成功与否,与产品有关,与市场有关,但更重要的是与资金有关,产品与市场都可以通过资金来弥补,而却没有任何东西可以代替

资金,凡是倒下的公司,99%与资金链的断裂有关。在你决定要开公司以前,先估计一下你公司支持一年所需要的资金数额,包括人工费,生产,场地,广告宣传、市场费用、甚至电、水费等等等等,把你所想到的一切加在一起,得出的值就是..慢..如果你没有实际的开过公司的经验,你需要将此数字乘3,然后就是你开公司一年最少需要的费用,呵呵,公司的实际运营所需要的钱是你想像的3倍以上,你要是不信我也没办法。

简单建议:开公司前最重要的是先确立你后续的资金来源!也就是说钱不够了怎么办?---因为你投入的钱肯定会不够的。

其路七:第二职业
这类的朋友有不少,他们没有脱离开发工作,但是在业余时间又不停的接项目或者在卖产品,在单位里面他们显得并不出众,比起其它人来说他们属于最不愿意加班的一类.为此他们白天通常工作很勤奋.这类人也许不一定可以挣很多钱,但平均下来他们一年之中通常都可以比同事们多挣个几万元.有时候比上班拿得还多.但令人疑惑的是,这类人在生活中更加注重稳定,基本上没见到他们跳过蹧,即使私下里面已经开了个小公司,他们通常也不会辞职.
你的旁边有没有这类人呢?分辨他们很容易:
–电话很多,而且更愿意来电话时离开办公室找个没人的旮旯通话.神秘兮兮给人一种”这家伙是不是有二奶啊?”的感觉的人,通常是这类人。这类人是女性最佳的选择对象:很顾家,不象那些富人容易花心,而比起一般人来说,他们收入相对要高得多。但总结了一下几位这类的开发朋友:也得出了一个令人沮丧的结论:这种人通常个子不高,体形类似桶状…..

简单建议:这好像是开发人员最佳的出路了,但比较丰厚的收入通常让这类人不愿意去冒风险….到现在为止我所认识的这类人还没有一个真正算是成功的。
好了,虽然偶的经历远远说不上丰富,也没有什么成功之处可以自满的,但或许因为比其它朋友痴长了几岁,见过的人可能会稍多一些,所

以斗胆写出了以上的一些文字,让您掉牙了。
下面是偶走过开发这条路上总结出来的一点心得,你可以不看,但看了就千万别把嘴咧的太大:
一、不管是给别人打工还是自已干,都要全心全意的工作,因为你所做的任何一点工作都会让自已的人生多一点筹码,这一点最最重要!这样的例子我至少可以举出两起,优秀的开发人员被其它新公司挖走,并给一定的股份,成为新公司的股东的例子。当时与这样的开发人员一个部门同时工作或更早工作的有许多人,他们平时经常偷点懒,能少干点工作就少干点,有时候还笑话那个平时努力工作的人傻,几年过去了,究竟谁比谁傻?
二、多与市场人员交朋友,你接触他们时可能总会觉得他们知识比你少,甚至素质比你低,可能比你还有点黄。但实际上他们比你更懂这个社会!参加到他们这个圈子中去,和他们一起赌赌钱、一起聊聊天、一起洗洗桑拿、一起…..你会通过他们接触到另外一个世界。
三、机会远比钱重要,挣不挣钱在年轻时并不是特别重要!不论是在实际生活中还是在网上或其它地方,如果有机会参与到除本职工作外的一些项目或产品的开发中(包括你的朋友拉你去做点小生意之类的非开发性质的工作),那怕是帮忙的性质,也要积极介入,至少你会交到很多的朋友,这样你的人生会多出很多的机会。

转载自:http://smartsoft.5d6d.com/thread-6860-1-1.html

利用win7自带虚拟无线网卡端口共享网络

首先,本文讨论的是基于Windows 7系统自带的功能,Vista和XP里面没有的,这个是Windows 7才加入的特性。

第一部分、配置虚拟无线网卡

第一步,以管理员权限打开命令行提示符,按下快捷键win(alt旁边的windows徽标键)+r,你也可以在开始菜单找到“运行”,打开运行对话框,输入cmd后确定运行。

第二步,输入下面的语句,配置你的无线路由

netsh wlan set hostednetwork mode=allow ssid=”Hosley ‘s private AP” key=88888888
这里解释一下,ssid=你的无线网络名字;key=无线网络的密码,貌似要8 位以上;上面的例子我这个命令就创建了一个名字为Hosley ‘s private AP,密码8个8的虚拟无线路由。这时候你可以在系统控制面板 – 网络连接里面看到一个新的无线网络连接生成了,例如我的是下图,名字可能不一样,但是你看到这个链接的网卡是Microsoft Virtual WiFi Miniport…。证明它是使用的虚拟的无线网卡。

第二部分、虚拟无线路由地开启与关闭

同样在命令行控制台下操作,开启这个承载网络的命令是

netsh wlan start hostednetwork

如果你要关闭,可以输入下面的命令

netsh wlan stop hostednetwork

当你开启之后这个承载网络之后,别人在附近搜索wifi就可以搜索到你之前创建的热点,例如我这一个Hosley ‘s private AP

同时你在网络连接那里看到原来未连接的那一个虚拟路由,现在已经连接上

先别着急连上这个热点,现在连上还不能实现共享网络,且看下一部分

第三部分、共享网络

打开控制面板 – 网络和共享中心 – 更改适配器设置,在这里面你需要找到你有联网的那个连接,不管是无线连接还是有线连接,右键点击选择菜单最后一项“属性”,在弹出的对话框中选择“共享”选项卡,选中第一项“允许其他网络用户通过此计算机的 Internet 连接来连接”,然后按下确定关闭对话框即可

什么?弹出来错误对话框?像下面这样?

这是因为你关闭了windows自带的防火墙服务,win + r 运行,输入services.msc打开“服务”配置窗口,在列表中找到Windows Firewall服务,右键点击启动即可,如果你已经禁用了这个服务,你还需要先右键属性将其启动类型选择为自动或者手动,然后再启用。

当成功开启共享之后,你会发现你原来联网的连接的信息上面多了一个已共享的字样,这就成功了。现在你用手机或者别的电脑都可以通过你这个电脑的虚拟的路由器上网了。