面向对象程序设计寒假作业1(编程题)

这个作业属于哪个课程 2020面向对象程序设计张栋班
这个作业要求在哪里 面向对象程序设计寒假作业1
这个作业的目标 按照要求完成简单文言文编程的相关功能
其他参考文献

ps:因为能力有限加上本人有点懒,所以该程序仅支持数据范围在0~99内的处理和很差的错误提示以及代码不够简练,如有大佬发现我的代码有不足之处,请指正,希望日后能改进程序。

1、思考题目所需要的功能

  • (1)数字转换成为汉字需要考虑以下特殊情况:
    • 0~9的数字
    • 10~19的数字
    • 整十的数字
      在这里我设置了一个字符数组记录0~10的数字
    char hz[11][10]={"零","一","二","三","四","五","六","七","八","九","十"};

    然后分情况处理对应的特殊情况
    然后我写了一个函数来完成:

    if(num>=10)
    {
      if(num%10==0)
      {
          if(num==10)
          {
              printf("%s\n",hz[10]);
          }
          else
          {
          printf("%s%s\n",hz[num/10],hz[10]);
          }
      }
      else
      {
          if(num<20)
          {
              printf("%s%s\n",hz[10],hz[num%10]);
          }
          else
          {
              printf("%s%s%s\n",hz[num/10],hz[10],hz[num%10]);
          }
      }
    }
    else
    {
      printf("%s\n",hz[num]);
    }
  • (2)汉字转换为数字:
    这里我了解到gbk编码一个汉字为两个字节,于是我想到用strlen函数先量取字符串长度,因为范围在0~99,因此可以得出字符串长度仅可为2、4、6;
    • 当长度为6时,提取字符串头两个和最后两个位,利用循环在hz数组中对比相应的汉字数字
    • 当长度为4和2时,仅需提取头两位进行循环对比
      函数代码如下:
    int hz_to_num(char* str)
    {
      char a[10],b[10];
      int len,i,j;
      len=strlen(str);
      if(len==4)
      {
          a[0]=str[0];
          a[1]=str[1];
          b[0]=str[2];
          b[1]=str[3];
          if(strcmp(b,hz[10])==0)
          {
              for(i=0;i<11;i++)
              {
                  if(strcmp(a,hz[i])==0)
                  {
                      return i*10;
                  }
              }
          }
          else
          {
              for(i=0;i<10;i++)
              {
                  if(strcmp(b,hz[i])==0)
                  {
                      return i+10;
                  }
              }
          }
      }
      else if(len==6)
      {
          a[0]=str[0];
          a[1]=str[1];
          b[0]=str[4];
          b[1]=str[5];
          b[2]=0;//这里十分不解,自己也是试了几遍才试出来,需要加上一个'\0',感觉是内存分配出了问题,但是不知道为什么
          for(i=0;i<10;i++)
          {
              if(strcmp(a,hz[i])==0)
              {
                  for(j=0;j<11;j++)
                  {
                      if(strcmp(b,hz[j])==0)
                      {
                          return i*10+j;
                      }
                  }
              }
          }
      }
      else if(len==2)
      {
          a[0]=str[0];
          a[1]=str[1];
          for(i=0;i<11;i++)
          {
              if(strcmp(a,hz[i])==0)
              {
                  return i;
              }
          }
      }
    }
  • (3)计算功能
    这里引入关键字字符数组:
char keywords[5][20]={"整数","等于","增加","减少","看看"};

该功能需要结合前两个函数进行计算代码如下:

int calculate(int num,char* command,char* number)
{
    int n;
    if(strcmp(command,keywords[2])==0)
    {
        n=hz_to_num(number);
        //printf("%d\n",n);
        num+=n; 
        return num;
    }
    else if(strcmp(command,keywords[3])==0)
    {
        n=hz_to_num(number);
        num-=n;
        return num;
    }
}

2、直接给出代码

#include<stdio.h>
#include<string.h>
int hz_to_num(char* str); 
char hz[11][10]={"零","一","二","三","四","五","六","七","八","九","十"};
char keywords[5][20]={"整数","等于","增加","减少","看看"};
int calculate(int num,char* command,char* number)
{
    int n;
    if(strcmp(command,keywords[2])==0)
    {
        n=hz_to_num(number); 
        num+=n;
        return num;
    }
    else if(strcmp(command,keywords[3])==0)
    {
        n=hz_to_num(number);
        num-=n;
        return num;
    }
}
int hz_to_num(char* str)
{
    char a[10],b[10];
    int len,i,j;
    len=strlen(str);
    if(len==4)
    {
        a[0]=str[0];
        a[1]=str[1];
        b[0]=str[2];
        b[1]=str[3];
        if(strcmp(b,hz[10])==0)
        {
            for(i=0;i<11;i++)
            {
                if(strcmp(a,hz[i])==0)
                {
                    return i*10;
                }
            }
        }
        else
        {
            for(i=0;i<10;i++)
            {
                if(strcmp(b,hz[i])==0)
                {
                    return i+10;
                }
            }
        }
    }
    else if(len==6)
    {
        a[0]=str[0];
        a[1]=str[1];
        b[0]=str[4];
        b[1]=str[5];
        b[2]=0;
        for(i=0;i<10;i++)
        {
            if(strcmp(a,hz[i])==0)
            {
                for(j=0;j<11;j++)
                {
                    if(strcmp(b,hz[j])==0)
                    {
                        return i*10+j;
                    }
                }
            }
        }
    }
    else if(len==2)
    {
        a[0]=str[0];
        a[1]=str[1];
        for(i=0;i<11;i++)
        {
            if(strcmp(a,hz[i])==0)
            {
                return i;
            }
        }
    }
}
int num_to_hz(int num)
{
    if(num>=10)
    {
        if(num%10==0)
        {
            if(num==10)
            {
                printf("%s\n",hz[10]);
            }
            else
            {
                printf("%s%s\n",hz[num/10],hz[10]);
            }
        }
        else
        {
            if(num<20)
            {
                printf("%s%s\n",hz[10],hz[num%10]);
            }
            else
            {
                printf("%s%s%s\n",hz[num/10],hz[10],hz[num%10]);
            }
        }
    }
    else
    {
        printf("%s\n",hz[num]);
    }
}
int main()
{
    char name[20],command[100][20];
    int i=0,target;
    scanf("%s",command[i++]);
    if(strcmp(command[i-1],keywords[0])==0)
    {
        scanf("%s",name);
        scanf("%s",command[i++]);
        if(strcmp(command[i-1],keywords[1])==0)
        {
            scanf("%s",command[i++]);
            target=hz_to_num(command[i-1]); 
        }
        else
        {
            printf("输入错误!\n"); 
            return 0; 
        }       
    }
    else
    {
        printf("错误,请先定义变量!\n");
    }
    while(1)
    {
        scanf("%s",command[i++]);
        if(strcmp(command[i-1],keywords[4])==0)
        {
            scanf("%s",command[i++]);
            if(strcmp(command[i-1],name)==0)
            {
                num_to_hz(target);
                return 0;
            }
            else
            {
                printf("输入名称错误!\n"); 
            }
        }
        else if(strcmp(command[i-1],name)==0)
        {
            scanf("%s",command[i++]);
            scanf("%s",command[i++]);
            target=calculate(target,command[i-2],command[i-1]);
        }
        else
        {
            printf("输入名称错误!\n");
        }
    }   
}

 

3、下面是我的几个测试样例




猜你喜欢

转载自www.cnblogs.com/JoshuaYu/p/12232979.html