C++语言编写一个大概300~600行的程序解决一个实际问题。(必须使用类)

RT。... RT。 展开
 我来答
帐号已注销
2015-12-23 · TA获得超过738个赞
知道小有建树答主
回答量:160
采纳率:0%
帮助的人:161万
展开全部

从今天凌晨3点多,一直写代码写到现在,除了吃饭没休息过。希望这个程序对你有所帮助。如果有任何疑惑的地方,可以继续提问、交流。附件里有源代码文件。

代码已经超过600行,这里只有部分代码,因为已经超过字数限制。其余代码可在源文件里查看。


#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
#define Mc_MaxByte_MenuItem       61  //菜单项字符串长度最多61字节
#define Mc_MaxBufferSize          17  //缓存最大字节数。因为该程序只支持输入小于等于2字节的整型,而2字节整型的二进制位数有16位,所以需要17个字节保存二进制字符串,最后一个为结束符。
#define Mc_Back                  (-1) //返回上一级菜单
#define Mc_Exit                  (-2) //退出程序
#define Mc_Error                 (-3) //输入错误
#define Mc_Binary                 0   //二进制
#define Mc_Octonary               1   //八进制
#define Mc_Decimalism             2   //十进制
#define Mc_Hexadecimal            3   //十六进制
class Calculator //计算器类
{
 protected:
  char         chr1Buffer[Mc_MaxBufferSize]; //用于接收用户输入的数学算数运算式,如:“23+6*5-400/20=”
  bool         Chr1SameAsInt(char* chrPt,int number); //判断2个整数是否相等。前一个是用字符串表示的整数,后一个就是int型的整数。
  int          Chr1ToInt(const char* chrPt); //将用字符串表示的整数转换为int型整数
  int          Menu(char* chrPtMenuTitle,char chr2MenuItem[][Mc_MaxByte_MenuItem], int intItemCount,bool bCreateBackItem); //显示一个菜单。最后一个参数表示:是否创建“返回”选项
  void         ClearScreen();            //清屏
  void         ShowInf(const char* chrInf);    //显示一条信息
  void         NextLine(int count);      //换行
  int          NumberFormTransitionUI(char* title); //“整数的进制转换”功能界面
  void         InputToBuffer(const char* title);
  const char*  GetBuffer();
  void         (Calculator::*funPt)(const char* chrSource,char* chrResult); //函数指针
  int          NumberFormTransition(int source,int target); //进制转换函数。source源数据进制形式,target目标进制形式
  void         BinaryToOctonary(const char* chrPtBinary,char* chrPtOctonaryResult); //二进制转八进制。得出的结果将用字符串表示,且用chrPtOctonaryResult接收转换后的结果
  void         BinaryToDecimalism(const char* chrPtBinary,char* chrPtDecimalismResult); //二进制转十进制
  void         BinaryToHexadecimal(const char* chrPtBinary,char* chrPtHexadecimalResult); //二进制转十六进制
  void         OctonaryToDecimalism(const char* chrPtOctonary,char* chrPtDecimalismResult); //八进制转十进制
  void         OctonaryToBinary(const char* chrPtOctonary,char* chrPtBinaryResult); //八进制转二进制
  void         OctonaryToHexadecimal(const char* chrPtOctonary,char* chrPtHexadecimalResult); //八进制转十六进制
  void         DecimalismToBinary(const char* chrPtDecimalism,char* chrPtBinaryResult); //十进制转二进制
  void         DecimalismToOctonary(const char* chrPtDecimalism,char* chrPtOctonaryResult); //十进制转八进制
  void         DecimalismToHexadecimal(const char* chrPtDecimalism,char* chrPtHexadecimalResult); //十进制转十六进制
  void         HexadecimalToDecimalism(const char* chrPtHexadecimal,char* chrPtDecimalismResult); //十六进制转十进制
  void         HexadecimalToOctonary(const char* chrPtHexadecimal,char* chrPtOctonaryResult); //十六进制转八进制
  void         HexadecimalToBinary(const char* chrPtHexadecimal,char* chrPtBinaryResult); //十六进制转二进制
 public:
  int          UI();                   //计算器界面
};
int Calculator::UI()
{
  int code = !Mc_Exit, CodeTmp = 1;
  char chr2Menu[][Mc_MaxByte_MenuItem] = { "数的进制转换" };
  while (code != Mc_Exit)
  {
    code = Menu("计算器", chr2Menu, 1, false);
    switch (code)
    {
      case 1:
           ClearScreen();
           CodeTmp = NumberFormTransitionUI(chr2Menu[0]);
      break;
      case Mc_Error:
       ShowInf("\n  < 输入错误!请重新输入。 >\n  < 按任意键继续...... >");
       getch();
       ClearScreen();
    }
    if (CodeTmp == Mc_Exit)
      code = Mc_Exit;
  }
  return code;
}
bool Calculator::Chr1SameAsInt(char* chrPt,int number)
{
  int len = strlen(chrPt) - 1;
  while(number && len >= 0)
  {
    if (chrPt[len] - 48 != number % 10)
      break;
    len --, number /= 10;
  }
  if (len < 0 && !number)
    return true;
  return false;
}
int Calculator::Chr1ToInt(const char* chrPt)
{
  int len = strlen(chrPt), num = 0, i;
  for (i = 0; len > 0; len --, i ++) //将用字符串表示的数字转换成int整数
    num += (chrPt[i] - 48) * (int)pow(10, len - 1);
  return num;
}
int Calculator::Menu(char* chrPtMenuTitle,char chr2MenuItem[][Mc_MaxByte_MenuItem],int intItemCount,bool bCreateBackItem)
{
  int index, choice = 0, len, i;
  cout<<"<-------------- "<<chrPtMenuTitle<<" -------------->"<<endl<<endl;
  for (index = 1; index <= intItemCount; index ++)
    cout<<"  "<<index<<"."<<chr2MenuItem[index - 1]<<endl;
  if (bCreateBackItem)
    cout<<"  "<<index ++<<"."<<"返回"<<endl;
  cout<<"  "<<index<<"."<<"退出"<<endl;
  InputToBuffer("请输入相应选项的序号:");
  if (bCreateBackItem)
  {
    if (Chr1SameAsInt(chr1Buffer, index - 1))
      return Mc_Back;    //用户选择了返回选项
  }
  if (Chr1SameAsInt(chr1Buffer, index))
    return Mc_Exit;    //用户选择了退出选项
  len = strlen(chr1Buffer);
  for (i = 0; len > 0; len --, i ++) //将用字符串表示的数字转换成int整数
    choice += (chr1Buffer[i] - 48) * (int)pow(10, len - 1);
  if (choice < 1 || choice > index)
    return Mc_Error;
  return choice;
}
void Calculator::ClearScreen()
{
  system("cls");
}
void Calculator::ShowInf(const char* chrInf)
{
  cout<<chrInf;
}
void Calculator::NextLine(int count)
{
  while (count-- > 0)
  {
    cout<<'\n';
  }
}
void Calculator::InputToBuffer(const char* title)
{
  cout<<title;
  cin>>chr1Buffer;
}
const char* Calculator::GetBuffer()
{
  return chr1Buffer;
}
void Calculator::BinaryToOctonary(const char* chrPtBinary,char* chrPtOctonaryResult)
{
  int index, x, numTmp = 0;
  bool  bBreak;
  const char* chrPt;
  char chr1Tmp[6]; //十进制65535等于八进制177777,这个最大值八进制数有6位数,所以至少需要6个字节。这个临时数组所保存的字符串不需要结束符。
  chrPt = chrPtBinary + strlen(chrPtBinary) - 1; //让chrPt指向最后一个字符
  index = 0, bBreak = false;
  while (bBreak == false)
  {
    for (x = 0, numTmp = 0; x < 3; x ++, chrPt --)
    { // 01011011 -->每3位二进制数对应一个八进制数。从最低位,右边开始:011=3,011=3,01=1。则该二进制数的八进制形式为133(最后结果需要反序)
      if (chrPt > chrPtBinary)
        numTmp += (*chrPt - 48) * (int)pow(2, x);
      else
      {
        numTmp += (*chrPt - 48) * (int)pow(2, x);
        bBreak = true;
        break;
      }
    }
    chr1Tmp[index ++] = numTmp + 48;
  }
  if (index > 1)
  {
    for (-- index; index > 0; index --)
      if (chr1Tmp[index] != '0')
        break;
  }
  else
  {
    chr1Tmp[0] = '0';
    index = 0;
  }
  for (; index >= 0; chrPtOctonaryResult ++, index --)
    *chrPtOctonaryResult = chr1Tmp[index];
  *chrPtOctonaryResult = '\0'; //给返回参数加上结束符
}

void Calculator::DecimalismToBinary(const char* chrPtDecimalism,char* chrPtBinaryResult) //十进制转二进制
{
   int num = Chr1ToInt(chrPtDecimalism), index = 0;
   char chr1Tmp[16];
   while (num)
   {
     chr1Tmp[index ++] = num % 2 + 48;
     num /= 2;
   }
  if (!index)
  {
    chr1Tmp[0] = '0';
    index = 1;
  }
   for(-- index; index >= 0; chrPtBinaryResult ++, index --)
     *chrPtBinaryResult = chr1Tmp[index];
   *chrPtBinaryResult = '\0';
}
void Calculator::DecimalismToHexadecimal(const char* chrPtDecimalism,char* chrPtHexadecimalResult) //十进制转十六进制
{
   int num = Chr1ToInt(chrPtDecimalism), index = 0, tmp;
   char chr1Tmp[16];
   while (num)
   {
     tmp = num % 16;
     num /= 16;
     switch (tmp)
     {
       case 10:
            chr1Tmp[index ++] = 'A';
       break;
       case 11:
            chr1Tmp[index ++] = 'B';
       break;
       case 12:
            chr1Tmp[index ++] = 'C';
       break;
       case 13:
            chr1Tmp[index ++] = 'D';
       break;
       case 14:
            chr1Tmp[index ++] = 'E';
       break;
       case 15:
            chr1Tmp[index ++] = 'F';
       break;
       default:
         chr1Tmp[index ++] = tmp + 48;
     }
   }
  if (!index)
  {
    chr1Tmp[0] = '0';
    index = 1;
  }
   for(-- index; index >= 0; chrPtHexadecimalResult ++, index --)
     *chrPtHexadecimalResult = chr1Tmp[index];
   *chrPtHexadecimalResult = '\0';
}
void Calculator::HexadecimalToDecimalism(const char* chrPtHexadecimal,char* chrPtDecimalismResult) //十六进制转十进制
{
  int x, index, NumTmp = 0;
  const char* chrPt = chrPtHexadecimal + strlen(chrPtHexadecimal) - 1;
  char chr1Tmp[4];
  for ( x = 0; chrPt > chrPtHexadecimal; chrPt --)
  {
    switch (*chrPt)
    {
      case 'a':
      case 'A':
          NumTmp += 10 * (int)pow(16, x ++);
      break;
      case 'b':
      case 'B':
          NumTmp += 11 * (int)pow(16, x ++);
      break;
      case 'c':
      case 'C':
          NumTmp += 12 * (int)pow(16, x ++);
      break;
      case 'd':
      case 'D':
          NumTmp += 13 * (int)pow(16, x ++);
      break;
      case 'e':
      case 'E':
          NumTmp += 14 * (int)pow(16, x ++);
      break;
      case 'f':
      case 'F':
          NumTmp += 15 * (int)pow(16, x ++);
      break;
      default:
        NumTmp += (*chrPt - 48) * (int)pow(16, x ++);
    }
  }
  switch (*chrPt)
  {
    case 'a':
    case 'A':
        NumTmp += 10 * (int)pow(16, x);
    break;
    case 'b':
    case 'B':
        NumTmp += 11 * (int)pow(16, x);
    break;
    case 'c':
    case 'C':
        NumTmp += 12 * (int)pow(16, x);
    break;
    case 'd':
    case 'D':
        NumTmp += 13 * (int)pow(16, x);
    break;
    case 'e':
    case 'E':
        NumTmp += 14 * (int)pow(16, x);
    break;
    case 'f':
    case 'F':
        NumTmp += 15 * (int)pow(16, x);
    break;
    default:
      NumTmp += (*chrPt - 48) * (int)pow(16, x ++);
  }
  for (index = 0; NumTmp; index ++)
  {
    chr1Tmp[index] = NumTmp % 10 + 48;
    NumTmp /= 10;
  }
  if (!index)
  {
    chr1Tmp[0] = '0';
    index = 1;
  }
  for (-- index; index >= 0; chrPtDecimalismResult ++, index --)
    *chrPtDecimalismResult = chr1Tmp[index];
  *chrPtDecimalismResult = '\0';
}
void Calculator::HexadecimalToOctonary(const char* chrPtHexadecimal,char* chrPtOctonaryResult) //十六进制转八进制
{
  char chr1Tmp[6];
  HexadecimalToDecimalism(chrPtHexadecimal, chr1Tmp);  //先将十六进制转化为十进制
  DecimalismToOctonary(chr1Tmp, chrPtOctonaryResult);  //再将十进制转化为八进制
}
void Calculator::HexadecimalToBinary(const char* chrPtHexadecimal,char* chrPtBinaryResult) //十六进制转二进制
{
  char chr1Tmp[6];
  HexadecimalToDecimalism(chrPtHexadecimal, chr1Tmp);  //先将十六进制转化为十进制
  DecimalismToBinary(chr1Tmp, chrPtBinaryResult);      //再将十进制转化为二进制
}
int main()
{
  Calculator cal;
  cal.UI();
  return 0;
}


追问
好的,谢谢你了,赶紧休息去吧!
李小期的店铺
2015-12-23 · TA获得超过350个赞
知道小有建树答主
回答量:1627
采纳率:0%
帮助的人:232万
展开全部
代做,有意私信
追问
代做还需要收费是吗
追答
是啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sunnyMiracle14
2015-12-23 · TA获得超过198个赞
知道小有建树答主
回答量:824
采纳率:0%
帮助的人:456万
展开全部
代做,有意私信
追问
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式