第一次个人编程作业

这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系)
这个作业要求在哪里 第一次个人编程作业
这个作业的目标 实现汉字编程
作业正文 第一次个人编程作业
其他参考文献 本次作业查询的资料

编程过程

  • 代码行数:162
  • 需求分析时间:1h
  • 编码时间:3h

要求

  • 编写一个程序,制作一个简易的中文语言编译器,即使用中文语法进行编程,输入为逐行输入,每行为一个语句,一个语句代变一个操作

存在的问题

  • 没有考虑负数的情况
  • 代码不够精细,很多重复代码
  • 在尝试书写十以上代码时,未考虑到一个汉字是占用2byte(已解决)
  • 在编写的时候,对于输入文字的循环存在问题,知识的遗忘,忘记了scanf()!=EOF的用法(通过查阅资料解决)

思路

  • 编程语言:C
  • 在判断要执行的功能时,找到需要完成功能的特点
  • 范例一,"看看"是其输入的特点,所以在if语句判断时可以判断字符数组的内容与"看看"是否相匹配,若匹配在执行所需的功能
  • 范例二,"如果"是其输入的特点,所以在if语句判断时可以判断字符数组的内容与"如果"是否相匹配,若匹配则执行所需的功能
  • 去除引号应考虑汉字占用的空间大小,一个汉字2byte
  • 求大于十小于九十九的数字时,找到特点拆分输入的字符数组,再进行操作

代码

#include
#include
int trans(char str[])
{
    if(strcmp("零",str)==0)return 0;
    if(strcmp("一",str)==0)return 1;
    if(strcmp("二",str)==0)return 2;
    if(strcmp("三",str)==0)return 3;
    if(strcmp("四",str)==0)return 4;
    if(strcmp("五",str)==0)return 5;
    if(strcmp("六",str)==0)return 6;
    if(strcmp("七",str)==0)return 7;
    if(strcmp("八",str)==0)return 8;
    if(strcmp("九",str)==0)return 9;
    if(strcmp("十",str)==0)return 10;
}
int main(){
    char *chinese[11]={"零","一","二","三","四","五","六","七","八","九","十"};
    char name[200],verb[200],numb[200],oper[200],name1[200],toint[200],name3[200],more[10],less[10];
    char a[20],b[20],numb2[20],d[20],word[100],e[20],f[20],cold[100],name2[100];
    char age[200],money[200];
    int sum,sum2,sum3;//sum表示第二题年龄,sum2表示零花钱
    scanf("%s",toint);
    scanf("%s %s %s",name,verb,numb);
    if(strlen(numb)==2){
        sum=trans(numb); //零到十的数字
    }
    else if(strlen(numb)==4){
        more[0]=numb[2];
        more[1]=numb[3];
        more[2]='\0';      
        if(sum!=10) {sum=trans(more)+10;}//十开头的数字
            else{
                more[0]=numb[0];
                more[1]=numb[1];
                more[2]='\0';
                sum=10*trans(more);//整十数字
            }
    }
    else if(strlen(numb)==6){
        more[0]=numb[4];
        more[1]=numb[5];
        more[2]='\0';
        less[0]=numb[0];
        less[1]=numb[1];
        less[2]='\0';
        sum=trans(more)+trans(less)*10;//二十以上,九十九以下的数字
    }
    while(scanf("%s",name1)!=EOF)
    {   
        if(strcmp(name1,toint)==0)//判断是否是第二题
        {
            scanf("%s %s %s",name3,verb,numb);
            sum2=trans(numb);
        }
        if(strcmp(name1,name)==0){//加减法运算+-+-+-+-+-+-+-+-+-+-+-++-+-+-
            scanf("%s",oper);
            if(strcmp(oper,"增加")==0){scanf("%s",numb);
            if(strlen(numb)==2){
        sum3=trans(numb); //零到十的数字
        }
        else if(strlen(numb)==4){
            more[0]=numb[2];
            more[1]=numb[3];
            more[2]='\0';      
        if(sum!=10) {sum3=trans(more)+10;}//十开头的数字
            else{
                more[0]=numb[0];
                more[1]=numb[1];
                more[2]='\0';
                sum3=10*trans(more);//整十数字
            }
        }
        else if(strlen(numb)==6){
            more[0]=numb[4];
            more[1]=numb[5];
            more[2]='\0';
            less[0]=numb[0];
            less[1]=numb[1];
            less[2]='\0';
            sum3=trans(more)+trans(less)*10;//二十以上,九十九以下的数字
            }
            sum+=sum3;}
        if(strcmp(oper,"减少")==0){scanf("%s",numb);  if(strlen(numb)==2){
        sum3=trans(numb); //零到十的数字
        }
        else if(strlen(numb)==4){
            more[0]=numb[2];
            more[1]=numb[3];
            more[2]='\0';      
        if(sum!=10) {sum3=trans(more)+10;}//十开头的数字
            else{
                more[0]=numb[0];
                more[1]=numb[1];
                more[2]='\0';
                sum3=10*trans(more);//整十数字
            }
        }
        else if(strlen(numb)==6){
            more[0]=numb[4];
            more[1]=numb[5];
            more[2]='\0';
            less[0]=numb[0];
            less[1]=numb[1];
            less[2]='\0';
            sum3=trans(more)+trans(less)*10;//二十以上,九十九以下的数字
            }
            sum-=sum3;}
            //printf("%s",chinese[sum]);
        }
        else if(strcmp(name1,"看看")==0)
        {
            int lasttmp;
            scanf("%s",name);
            scanf("%s %s %s %s %s %s %s %s %s %s",a,name,b,numb2,d,name2,word,e,f,cold);
            lasttmp=trans(numb2);
            int len=strlen(word);
            int len1=strlen(cold);
            //if(lasttmp<=10)
            {
                if(sum>=lasttmp)
                {
                    if(sum>=0&&sum<=10){
                    printf("%s\n",chinese[sum]);for (int i=1;i8)//第二题sum表示年龄,sum2零花钱
                {
                    int x=sum2+1;
                    printf("%s",chinese[x]);
                }
            }
        }
    }
    return 0;
}

测试样例

  • 输入样例1
整数 气温 等于 十
气温 减少 三
气温 增加 二
看看 气温
如果 气温 大于 八 则 看看 “你好,世界” 否则 看看 “冻死我了”
  • 输出:
    第一次个人编程作业_第1张图片
  • 测试样例(大于十小于九十九的数字):
整数 小区楼层高度 等于 五十六
小区楼层高度 减少 二十六
小区楼层高度 增加 三十
看看 小区楼层高度
如果 小区楼层高度 大于 二十 则 看看 “好高啊” 否则 看看 “够住就行了”
  • 输出:
    第一次个人编程作业_第2张图片
  • 输入样例2
整数 小杨年龄 等于 八
整数 小杨零花钱 等于 二
小杨年龄 增加 一
如果 小杨年龄 大于 八 则 小杨零花钱 增加 一 否则 无
看看 小杨零花钱
  • 输出
    第一次个人编程作业_第3张图片

源代码1:github

改进

  • 实现负数的判定
  • 简化了代码,减少代码重复带来的资源浪费,用外接函数的形式实现

修改后的代码

#include
#include
#include
int trans(char str[])
{
    if(strcmp("零",str)==0)return 0;
    if(strcmp("一",str)==0)return 1;
    if(strcmp("二",str)==0)return 2;
    if(strcmp("三",str)==0)return 3;
    if(strcmp("四",str)==0)return 4;
    if(strcmp("五",str)==0)return 5;
    if(strcmp("六",str)==0)return 6;
    if(strcmp("七",str)==0)return 7;
    if(strcmp("八",str)==0)return 8;
    if(strcmp("九",str)==0)return 9;
    if(strcmp("十",str)==0)return 10;
}
int jud(char str[]){
    char more[10],less[10];
    if(strlen(str)==2){return trans(str); //对应零一二等单个汉字表达的数字
    }
    else if(strlen(str)==4){
        more[0]=str[2];
        more[1]=str[3];
        more[2]='\0';      
            if(trans(more)!=10) return 10+trans(more);//对应十一、十二等以十开头的两个汉字表达的数字
            else{
                more[0]=str[0];
                more[1]=str[1];
                more[2]='\0';
                return 10*trans(more);//对应二十、三十等以十结尾的数字
            }
    
    }
    else if(strlen(str)==6){
        more[0]=str[4];
        more[1]=str[5];
        more[2]='\0';
        less[0]=str[0];
        less[1]=str[1];
        less[2]='\0';
        return trans(more)+trans(less)*10;//对应“几十几”类型的数字
    }
}
int main(){
    char *chinese[11]={"零","一","二","三","四","五","六","七","八","九","十"};
    char name[200],verb[200],numb[200],oper[200],name1[200],toint[200],name3[200];
    char a[20],b[20],numb2[20],d[20],word[100],e[20],f[20],cold[100],name2[100];
    char age[200],money[200];
    int sum,sum2,sum3;//sum表示第二题年龄,sum2表示零花钱
    scanf("%s",toint);
    scanf("%s %s %s",name,verb,numb);
    sum=jud(numb);
    while(scanf("%s",name1)!=EOF)
    {   
        if(strcmp(name1,toint)==0)//判断是否是第二题
        {
            scanf("%s %s %s",name3,verb,numb);
            sum2=trans(numb);
        }
        if(strcmp(name1,name)==0){//加减法运算+-+-+-+-+-+-+-+-+-+-+-++-+-+-
            scanf("%s",oper);
            if(strcmp(oper,"增加")==0){
                scanf("%s",numb);
                sum3=jud(numb);
                sum+=sum3;}
            if(strcmp(oper,"减少")==0){
                scanf("%s",numb);   
                if(strlen(numb)==2)
                {
                    sum3=jud(numb);
                    sum-=sum3;
                }//printf("%s",chinese[sum]);
            }
        }
        else if(strcmp(name1,"看看")==0)
        {
            int lasttmp;
            scanf("%s",name);
            scanf("%s %s %s %s %s %s %s %s %s %s",a,name,b,numb2,d,name2,word,e,f,cold);
            lasttmp=trans(numb2);
            int len=strlen(word);
            int len1=strlen(cold);
            {
                if(sum>=lasttmp)
                {   if(sum>=0&&sum<=10){
                    printf("%s\n",chinese[sum]);for (int i=1;i8)//第二题sum表示年龄,sum2零花钱
                {
                    int x=sum2+1;
                    printf("%s",chinese[x]);
                }
            }
        }
    }
    return 0;
}

测试样例

整数 气温 等于 八
气温 减少 九
看看 气温
如果 气温 大于 八 则 看看 “你好,世界” 否则 看看 “冻死我了”

第一次个人编程作业_第4张图片

源代码2:github

你可能感兴趣的:(第一次个人编程作业)