学生党的一个课程设计,希望可以对有些人有些帮助,第一次发,不好的话请多多原谅
c++:
一.题目要求:
设计一个可视化的计算器,可以执行+,-,*,/,.,%,()等操作。要求使用API来编写程序。(我的计算器输入的时候是以#号开始)。
二.需求分析:
1.问题描述:
①——用api来编写一个可视化的计算器程序,首先我们要用界面来实现它,所以我们要设计一个计算器的可执行的界面,我使用了2个界面(具体请见第四条的测试),第一个是菜单界面,这个界面是可有可无的,我使用它是为了给用户一个选择,从file退出或从start开始进入,这个不是很重要;第二个界面是计算器的执行界面,这是本次实践的主要目的,我们需要在dialog中添加一个输入与输出列表框,许多button(数字的,运算符的,clear,cancel等),首先在纸上画出理想图,列出个数;因此我们要设计好界面,要注意界面之间,button之间的关系。
②——其次我们需要考虑的是之前的c++计算器代码与api界面代码之间的融合,这是没有做过的,要想好它们之间的关系,比如点击什么按钮的时候执行什么操作,会出来啥界面,啥提示,都要在程序中注意;还要把整个程序做成多文件的形式,不能都弄在一起,要便于编译与改错。
三.详细设计(由于c++计算器运算部分不是本次实践的主要目的,在此主要讨论界面实现部分的详细设计):
1.resource.h头文件(只是一部分,重复部分省略):
//{
{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 Resource.rc使用
//
#define IDR_MYMENU 101 //菜单的定义
#define IDD_START 102 //START的定义
#define IDC_BUTTON1 1000 //BUTTON1的定义
#define IDC_BUTTON2 1001 //BUTTON2的定义
#define IDC_BUTTON3 1002 //BUTTON3的定义
#define IDC_BUTTON4 1003 //BUTTON4的定义
#define IDC_BUTTON5 1004 //BUTTON5的定义
#define IDC_LIST1 1018 //列表框的定义
#define ID_FILE_EXIT 40001 //File中Exit的编译
#define ID_START_START 40002 //Start中Start中Start的定义
// Next default values for newobjects
// 以下是生成资源文件时自生成的,都是一些定义
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 103
#define _APS_NEXT_COMMAND_VALUE 40003
#define _APS_NEXT_CONTROL_VALUE 1021
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
2.Resource.rc头文件(部分重要):
IDR_MYMENU MENU //定义标识符MENU
BEGIN
POPUP "&File" //点File
BEGIN
MENUITEM "E&xit", ID_FILE_EXIT //点Exit
END
POPUP "&START" //点START
BEGIN
MENUITEM"&START...", ID_START_START //点START中的START
END
END
// Dialog
//
IDD_START DIALOGEX 0, 0, 339, 182//IDD_START为资源的标识.DIALOG是资源的类型
//以STYLE开头然后在后面跟上用来创建此对话框的窗口风格
STYLE DS_SETFONT | DS_MODALFRAME |WS_POPUP | WS_CAPTION | WS_SYSMENU
//dialog的名字
CAPTION "My Calculator"
//创建此对话框的字体的大小和名字
FONT 8, "MS Sans Serif", 0,0, 0x1
BEGIN
//代表cancel按钮(定义,位置,大小)
PUSHBUTTON "Cancel",IDCANCEL,261,135,63,28
//代表BUTTON0-9按钮(定义,位置,大小)
PUSHBUTTON "1",IDC_BUTTON1,7,47,50,39
PUSHBUTTON "2",IDC_BUTTON2,7,84,50,39
PUSHBUTTON "3",IDC_BUTTON3,7,122,50,43
PUSHBUTTON "4",IDC_BUTTON4,57,48,50,37
PUSHBUTTON "5",IDC_BUTTON5,57,86,50,36
PUSHBUTTON "6",IDC_BUTTON6,58,123,50,42
PUSHBUTTON "7",IDC_BUTTON7,108,49,50,35
PUSHBUTTON "8",IDC_BUTTON8,108,85,50,37
PUSHBUTTON "9",IDC_BUTTON9,108,124,50,41
PUSHBUTTON "0",IDC_BUTTON10,159,49,50,35
//代表操作符按钮(定义,位置,大小)
PUSHBUTTON ".",IDC_BUTTON11,159,86,50,38
PUSHBUTTON "=",IDC_BUTTON12,159,124,50,41
PUSHBUTTON "+",IDC_BUTTON13,210,49,50,30
PUSHBUTTON "-",IDC_BUTTON14,210,79,50,28
PUSHBUTTON "*",IDC_BUTTON15,210,108,50,26
PUSHBUTTON "/",IDC_BUTTON16,209,135,50,29
PUSHBUTTON "(",IDC_BUTTON17,260,50,32,28
PUSHBUTTON ")",IDC_BUTTON18,293,51,32,27
PUSHBUTTON "%",IDC_BUTTON19,261,80,63,28
//列表框
LISTBOX IDC_LIST1,8,0,316,49,LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL| WS_TABSTOP
//代表Clear按钮(定义,位置,大小)
PUSHBUTTON "Clear",IDC_BUTTON20,262,108,62,27
END
// DESIGNINFO
//dialog的风格
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_ABOUT, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 332
TOPMARGIN, 7
BOTTOMMARGIN, 175
END
END
#endif // APSTUDIO_INVOKED
3.Win.cpp文件:
#include <windows.h>
#include "resource.h" //包含资源文件
char buf1[20]; //类外定义
//将double转换成string
string DoubleToString(double d){
stringstr;
stringstreamss;
ss<< d;
ss>> str;
returnstr;
}
char buf[100]; //类外定义
int i = 1; //类外定义
核心部分为(dialog的实现):
BOOL CALLBACK AboutDlgProc(HWND hwnd,UINT Message, WPARAM wParam, LPARAM lParam)
{
buf[0]='#'; //以#开始
switch(Message) //接收消息
{
caseWM_INITDIALOG:
return TRUE;
caseWM_COMMAND:
switch (LOWORD(wParam))
{
//当点击BUTTON1(1)的时候:
case IDC_BUTTON1:{
//清空,相当于刷新输出到界面
SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);
buf[i]= '1';
buf[++i]= '\0';
//显示
SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf); }
break;
......
//当点击BUTTON12(=)时,要执行c++计算器的计算工作,在背后执行,不再界面显示
case IDC_BUTTON12:{
SendDlgItemMessage(hwnd,IDC_LIST1, LB_RESETCONTENT, 0, 0);
buf[i]= '=';
buf[++i]= '\0';
SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)buf);
CalculatorCalcul; //定义类对象
Calcul.Cal(buf); //使用类函数成员
stringstr1 = DoubleToString(Calcul.a);
//将string转换成char类型的数组(buf1[]用于输出)
for(inti=0;i<str1.size();i++){
buf1[i]=str1[i];
}
SendDlgItemMessage(hwnd,IDC_LIST1, LB_ADDSTRING, 0