C语言也能干大事编程项目开发计算器编程.docx
《C语言也能干大事编程项目开发计算器编程.docx》由会员分享,可在线阅读,更多相关《C语言也能干大事编程项目开发计算器编程.docx(50页珍藏版)》请在冰豆网上搜索。
![C语言也能干大事编程项目开发计算器编程.docx](https://file1.bdocx.com/fileroot1/2023-2/4/b08d8773-03d9-45e0-b404-07a720cf85e1/b08d8773-03d9-45e0-b404-07a720cf85e11.gif)
C语言也能干大事编程项目开发计算器编程
C语言也能干大事
附注:
本文档里的代码都是本人学习编程之后自己所写,请不要随便的改写或删除,如在学习过程中有什么不懂的地方,可以提出来共同探讨学习!
第一部分
C语言也能干大事
第一节:
题目:
自己动手写恶搞坑爹程序
要求:
运行以后弹出询问对话框(有【是】、【否】两个按钮以及问号图标)“你是好人吗?
”,如果点击【是】,则弹出对话框(只有一个【确定】按钮以及一个警告图标)“一看你就不像好人,点击【确定】开始格式化C盘!
”;如果点击【否】,则弹出对话框(有【重试】、【取消】两个按钮)“尝试把你变成好人失败,是否重试?
”。
代码:
(部分重要程序)
#include"stdafx.h"
intAPIENTRYWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPSTRlpCmdLine,
intnCmdShow)
{
intret1=MessageBox(NULL,TEXT("你是好人吗?
"),TEXT("人品鉴定系统"),MB_YESNO|MB_ICONASTERISK);
/*“MB”是“MessageBox”的简写,MB_YESNO是可在窗口中显示的按钮,像这样的按钮还有:
#defineMB_OK(确定)0x00000000L
#defineMB_OKCANCEL(确定和取消)0x00000001L
#defineMB_ABORTRETRYIGNORE(终止、重试和忽略)0x00000002L
#defineMB_YESNOCANCEL(是、否和取消)0x00000003L
#defineMB_YESNO(是和否)0x00000004L
#defineMB_RETRYCANCEL(重试和取消)0x00000005L
定义了一个int型变量,说明“MB_YESNO|MB_ICONASTERISK”运算(是或运算)之后的结果是一个整型数据。
“MessageBox()”括号里面有四个参数,第一个参数:
hWnd:
标识将被创建的消息框的拥有窗口。
如果此参数为NULL,则消息框没有拥有窗口;第二个参数:
用“TEXT”包起来的字符串,表示框内的内容。
第三个参数:
用“TEXT”包起来的字符串,表示框的标题;第四个参数:
设置希望在对话框中显示的按钮或图标,“MB_ICONASTERISK”就是表示“警告”的图标,像这样的图标的还有:
#defineMB_ICONHAND(错误“X”状图标)0x00000010L
#defineMB_ICONQUESTION(问号图标)0x00000020L
#defineMB_ICONEXCLAMATION(感叹号警告图标)0x00000030L
#defineMB_ICONASTERISK(感叹号图标)0x00000040L
*/
if(IDYES==ret1)
{
MessageBox(NULL,TEXT("哼哼,一看就知道你不是好人"),TEXT("鉴定结果"),MB_OK|MB_ICONASTERISK);
}
elseif(IDNO==ret1)
{
intret2=MessageBox(NULL,TEXT("哈哈,算你有自知之明。
你想变成一个好人吗?
"),TEXT("鉴定结果"),MB_OK);
if(IDOK==ret2)
{
MessageBox(NULL,TEXT("sorry!
尝试把你变成好人失败..."),TEXT("无力回天"),MB_OK|MB_ICONEXCLAMATION);
MessageBox(NULL,TEXT("由于你的人品问题,现在开始格式化C盘..."),TEXT("处理办法"),MB_OK);
}
}
return0;
}
/*if语句里面的IDYES是返回值,返回值为用户点击的按钮:
(注意:
以后我们在判断条件时,把变量写在等号的右边,这样做的目的就是能够在把等号“==”写成赋值号“=”情况下不能通过编译,快速发现错误。
如果把变量写在等号的左边,就变成赋值表达式了,赋值表达式如果是真,就通过了编译,导致不知道错误在哪儿。
)像这样的返回值还有:
#defineIDOK1
#defineIDCANCEL2
#defineIDABORT3
#defineIDRETRY4
#defineIDIGNORE5
#defineIDYES6
#defineIDNO7
*/
第二节:
题目:
开发一个注册界面
本节没有代码,讲一下一些控件的使用:
第三节:
题目:
制作一个能计算加减乘除的计算器(V1.0版)和一个十进制转二进制的小工具。
要求:
当用户输入非数字或给除数输入0时,要给出错误提示信息。
代码:
(部分重要程序)
#include"stdafx.h"
#include
#include
#include"resource.h"
#include"MainDlg.h"
BOOLWINAPIMain_Proc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam)
{
switch(uMsg)
{
HANDLE_MSG(hWnd,WM_INITDIALOG,Main_OnInitDialog);
HANDLE_MSG(hWnd,WM_COMMAND,Main_OnCommand);
HANDLE_MSG(hWnd,WM_CLOSE,Main_OnClose);
}
returnFALSE;
}
BOOLMain_OnInitDialog(HWNDhwnd,HWNDhwndFocus,LPARAMlParam)
{
returnTRUE;
}
BOOLIsInt(TCHAR*str)
{
inti=atoi(str);
TCHARstemp[256];
wsprintf(stemp,"%i",i);
if(strcmp(str,stemp)!
=0)
{
returnFALSE;
}
else
{
returnTRUE;
}
}
/*在这儿定义了一个类型为BOLL的被掉函数IsInt(),返回值是BOOL型,bool为布尔型,只有一个字节,取值false和true,是0和1的区别。
函数的参数是一个字符型指针,接受实参传过来的地址(这里是字符型数组的首地址)。
函数atoi()的功能是将字符串转化为整型数。
函数说明:
参数字符串,如果第一个非空格字符不存在或者不是数字也不是正负号则返回零,否则开始做类型转换,之后检测到非数字(包括结束符\0)字符时停止转换,返回整型数。
要有头文件:
#include。
函数wsprintf()的作用:
将一系列的字符和数值输入到缓冲区;输出缓冲区里的的值取决于格式说明符(即"%");如果写入的是文字,此函数给写入的文字的末尾追加一个'\0';函数的返回值是写入的长度,但不包括最后的'\0'。
wsprintf()包含在头文件windows.h中。
我们可以这样来理解:
wsprintf(缓冲区,格式,要格式化的值);
第一个参数是字符缓冲区,后面是格式字符串,wsprintf不是将格式化结果写到标准输出,而是将其写入缓冲区中,该函数返回该字符串的长度。
Strcmp()函数:
原型:
externintstrcmp(char*s1,char*s2);
用法:
#include
功能:
比较字符串s1和s2。
说明:
当s1当s1=s2时,返回值=0
当s1>s2时,返回值>0
*/
voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify)
{
/*按钮被按下的时候Main_OnCommand方法被调用,hwnd是对话框句柄(什么是句柄后面讲,通俗的说就是通过它能够操纵对话框),id是控件的id,后两个参数暂时不关心。
Main_OnCommand方法中根据id,也就是被点击按钮的名字来决定不同的动作,从而和匹配case匹配。
Hwnd是当前窗口的句柄,句柄就是把柄!
操作一个东西,要先抓住他的把柄!
通过句柄就可以操作这个对象。
*/
switch(id)
{
caseIDC_OK:
{
MessageBox(hwnd,TEXT("嘿嘿...同志,你走错门了!
"),TEXT("嘿嘿"),MB_OK|MB_ICONASTERISK);
}
break;
caseIDC_BUTTON1:
//如果按下该按钮执行
{
TCHARstr1[256],str2[256];
GetDlgItemText(hwnd,IDC_EDIT1,str1,sizeof(str1));
/*GetDlgItemText就是“得到对话框项目文本”的意思(暂时可以这样理解)
Hwnd就是控件的句柄,IDC_EDIT1就是编辑框1,
参数说明:
调用这个函数以获得与对话框中的控件相关的标题或文本。
GetDlgItemText成员函数将文本拷贝到str1指向的位置并返回拷贝的字节的数目。
*/
GetDlgItemText(hwnd,IDC_EDIT2,str2,sizeof(str2));
if(FALSE==IsInt(str1))
{
MessageBox(hwnd,TEXT("sorry,你的第一个数输入有误!
"),TEXT("错误!
"),MB_OK|MB_ICONHAND);
return;//注意:
不要掉了,不然会在错误的情况下得到结果
}
if(FALSE==IsInt(str2))
{
MessageBox(hwnd,TEXT("sorry,你的第二个数输入有误!
"),TEXT("错误!
"),MB_OK|MB_ICONHAND);
return;
}
inti1=atoi(str1);inti2=atoi(str2);
inti3=i1+i2;
TCHARstr3[256];
wsprintf(str3,"%i",i3);
SetDlgItemText(hwnd,IDC_EDIT3,str3);
//可以理解为:
把str3指定的内容拷贝到得到句柄的编辑框内
}
break;
caseIDC_BUTTON2:
{
TCHARstr1[256],str2[256];
GetDlgItemText(hwnd,IDC_EDIT4,str1,sizeof(str1));
GetDlgItemText(hwnd,IDC_EDIT5,str2,sizeof(str2));
if(FALSE==IsInt(str1))
{
MessageBox(hwnd,TEXT("sorry,你的第一个数输入有误!
"),TEXT("错误!
"),MB_OK|MB_ICONHAND);
return;
}
if(FALSE==IsInt(str2))
{
MessageBox(hwnd,TEXT("sorry,你的第二个数输入有误!
"),TEXT("错误!
"),MB_OK|MB_ICONHAND);
return;
}
inti1=atoi(str1);inti2=atoi(str2);
inti3=i1-i2;
TCHARstr3[256];
wsprintf(str3,"%i",i3);
SetDlgItemText(hwnd,IDC_EDIT6,str3);
}
break;
caseIDC_BUTTON3:
{
TCHARstr1[256],str2[256];
GetDlgItemText(hwnd,IDC_EDIT7,str1,sizeof(str1));
GetDlgItemText(hwnd,IDC_EDIT8,str2,sizeof(str2));
if(FALSE==IsInt(str1))
{
MessageBox(hwnd,TEXT("sorry,你的第一个数输入有误!
"),TEXT("错误!
"),MB_OK|MB_ICONHAND);
return;
}
if(FALSE==IsInt(str2))
{
MessageBox(hwnd,TEXT("sorry,你的第二个数输入有误!
"),TEXT("错误!
"),MB_OK|MB_ICONHAND);
return;
}
inti1=atoi(str1);inti2=atoi(str2);
inti3=i1*i2;
TCHARstr3[256];
wsprintf(str3,"%i",i3);
SetDlgItemText(hwnd,IDC_EDIT9,str3);
}
break;
caseIDC_BUTTON4:
{
TCHARstr1[256],str2[256];
GetDlgItemText(hwnd,IDC_EDIT10,str1,sizeof(str1));
GetDlgItemText(hwnd,IDC_EDIT11,str2,sizeof(str2));
if(FALSE==IsInt(str1))
{
MessageBox(hwnd,TEXT("sorry,你的第一个数输入有误!
"),TEXT("错误!
"),MB_OK|MB_ICONHAND);
return;
}
if(FALSE==IsInt(str2))
{
MessageBox(hwnd,TEXT("sorry,你的第二个数输入有误!
"),TEXT("错误!
"),MB_OK|MB_ICONHAND);
return;
}
inti1=atoi(str1);inti2=atoi(str2);
if(i2==0)
{
MessageBox(hwnd,TEXT("笨蛋!
除数不能为零!
"),TEXT("错误!
"),MB_OK|MB_ICONHAND);
return;
}
inti3=i1/i2;
TCHARstr3[256];
wsprintf(str3,"%i",i3);
SetDlgItemText(hwnd,IDC_EDIT12,str3);
}
break;
caseIDC_BUTTON5:
{
TCHARstr1[256];
GetDlgItemText(hwnd,IDC_EDIT13,str1,sizeof(str1));
if(FALSE==IsInt(str1))
{
MessageBox(hwnd,TEXT("sorry,你的输入有误!
"),TEXT("错误!
"),MB_OK|MB_ICONHAND);
return;
}
inti1=atoi(str1);
TCHARstr2[256];
itoa(i1,str2,2);
/*函数itoa(参数1,参数2,参数3);
功能:
把一整数转换为字符串
用法:
itoa(i,num,10);
i----需要转换成字符串的数字
num----转换后保存字符串的变量
10----转换数字的基数(即进制)。
10就是说按10进制转换数字。
还可以是2,8,16等等你喜欢的进制类型
返回值:
指向num这个字符串的指针
*/
SetDlgItemText(hwnd,IDC_EDIT14,str2);
}
break;
}
}
voidMain_OnClose(HWNDhwnd)
{
EndDialog(hwnd,0);
}
第四节:
题目:
开发一个计算器(V2.0版)和一个小工具(功能:
用户任意输入年月日后显示这一年是平年还是闰年,并且告诉用户这一天是星期几)。
要求:
1.上述两个工具在一个界面上实现。
2.如果用户输入的年月日不符合实际(比如:
在平年的2月输入29日...)、除数为零等都要报错。
代码:
(部分重要程序)
#include"stdafx.h"
#include
#include
#include"resource.h"
#include"MainDlg.h"
BOOLWINAPIMain_Proc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam)
{
switch(uMsg)
{
HANDLE_MSG(hWnd,WM_INITDIALOG,Main_OnInitDialog);
HANDLE_MSG(hWnd,WM_COMMAND,Main_OnCommand);
HANDLE_MSG(hWnd,WM_CLOSE,Main_OnClose);
}
returnFALSE;
}
BOOLMain_OnInitDialog(HWNDhwnd,HWNDhwndFocus,LPARAMlParam)
{
HWNDhwndcombo1=GetDlgItem(hwnd,IDC_COMBO1);
ComboBox_InsertString(hwndcombo1,-1,TEXT("加"));
ComboBox_InsertString(hwndcombo1,-1,TEXT("减"));
ComboBox_InsertString(hwndcombo1,-1,TEXT("乘"));
ComboBox_InsertString(hwndcombo1,-1,TEXT("除以"));
returnTRUE;
}
/*当对话框接收到WM_INITDIALOG消息时,就会执行函数BOOLMain_OnInitDialog(HWNDhwnd,HWNDhwndFocus,LPARAMlParam),一般一些初始化的变量之类的都写这个函数内进行初始化。
HWNDhwndcombo1=GetDlgItem(hwnd,IDC_COMBO1);是定义一个HWND类型的量,通过函数GetDlgItem()来获取控件“IDC_COMBO1"的句柄,并赋值给hwndcombo1.而ComboBox_InsertString(hwndcombo1,-1,TEXT("加"));是将得到的控件内加入内容,其中参数:
hwndcombo1是得到的控件的句柄,关于参数-1的说明请看“Thezero-basedindexatwhichtoinsertthestring,or–1toaddittotheendofthelist.”我的翻译——“从0开始以什么样的指标插入字符串,或1到把它添加到列表的末尾”,呵呵,还差强人意吧,用这个“函数”为了使添加内容的顺序按照自己意图实现,如果用“函数”(因为不是真正的函数,其实是宏)ComboBox_AddString()进行添加内容会出现乱序的现象,就不会是“加减乘除”的顺序了*/
intIsInt(TCHAR*str)
{
inti=atoi(str);
TCHARstr1[256];
itoa(i,str1,10);
if(strcmp(str,str1)!
=0)
{
returnFALSE;
}
else
{
returnTRUE;
}
}
intfun(inta,intb,intc)
{
intp,q,p1=28,p2=29;
if(a%400==0||a%4==0&&a%100!
=0)
{
p=p2;
}
elseif(a%4!
=0)
{
p=p1;
}
switch(b)
{
case1:
q=c;break;
case2:
q=31+c;break;
case3:
q=31+p+c;break;
case4:
q=31+p+31+c;break;
case5:
q=31+p+31+30+c;break;
case6:
q=31+p+31+30+31+c;break;
case7:
q=31+p+31+30+31+30+c;break;
case8:
q=31+p+31+30+31+30+31+c;break;
case9:
q=31+p+31+30+31+30+31+31+c;break;
case10:
q=31+p+31+30+31+30+31+31+30+c;break;
case11:
q=31+p+31+30+31+30+31+31+30+31+c;break;
case12:
q=31+p+31+30+31+30+31+31+30+31+30+c;break;
}
returnq;
}
voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify)
{
switch(id)
{
caseIDC_OK:
{
MessageBox(hwnd,TEXT("Sorry!
由于你的人品出现了问题,系统不允许你退出...嘿嘿^-^"),TEXT("嘿嘿^-^"),MB_OK|MB_ICONHAND);
}
break;
caseIDC_BUTTON1:
{
TCHARstr1[256],str2[256];
GetDlgItemText(hwnd,IDC_EDIT1,str1,sizeof(str1));
GetDlgItemText(hwnd,IDC_EDIT2,str2,sizeof(str2));
inti1=atoi(str1);inti2=atoi(str2);inti3=0;
HWNDhwndcombo1=GetDlgItem(hwnd,IDC_COMBO1);
intcurIndex=ComboBox_GetCurSel(hwndcombo1);
/*定义了一个整型变量来表示添加内容的