骨头君! 2022-05-17 02:11 采纳率: 100%
浏览 198
已结题

初学者不太看得懂程序

 用英文单词模拟数学计算

读入两个小于100的正整数A和B,计算A+B。需要注意的是:A和B的每一位数字由对应的英文单词给出。
具体的输入输出格式规定如下:
输入格式:测试输入包含若干测试用例,每个测试用例占一行,格式为“A+B=",相邻两字符串有一个空格间隔。当A和B同时为zero时输入结束,相应的结果不要输出。
输出格式:对每个测试用例输出1行,即A+B的值。
输入样例:
one+ two =
three four +five six=
zero seven +eight nine =
zero + zero =
输出样例:
three
nine zero
nine six


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXSIZE (200)

char *array[] = {"zero", "one", "two", "three", "four", "five",
"six", "seven", "eight", "nine"};

void procstr(char *string, int *left, int *right)
{
char words[50][MAXSIZE];
char c;
int i, num = 0, word = 0, j;

/*
 *这部分的功能就是将字符串分解
 * 输入为 one + two =       
 * 分解为:        
 * words[0] = "one"
 * words[1] = "+"
 * words[2] = "two"
 * words[3] = "="
 */
for(i = 0; (c = string[i]) != '\0'; i++) {
    if (c == ' ') {
        if (word) {
            strncpy(words[num-1], &string[i-word], word);
            words[num-1][word] = '\0';
        }
        word = 0;
    } else if (word == 0) {
        word++;
        num++;
    } else {
        word++;
    }
}    

if (word) {
    strncpy(words[num-1], &string[i-word], word);
    words[num-1][word] = '\0';
}
/*****************************************/    

/*
 * 这里的功能就是把
 * + 左边的转换为整数放入 left 里面
 * + 右边的转换为整数放入 right 里面
 */

*left = 0 , *right = 0;
int leftok = 0;
for(i = 0; i<num - 1; i++) {
            if (strcmp(words[i], "+") == 0) {
        leftok = 1;
    } else {
        for (j = 0; j < 10; j++) {
            if (strcmp(words[i], array[j]) == 0) {
                if (leftok == 1) {
                    *right = (*right) * 10 + j;
                } else {
                    *left = (*left) * 10 + j;
                }
            }
        }
    }
}

}

/* 显示结果 */
void showRes(int res)
{
int stack[20], top = -1;

do {
    stack[++top] = res % 10;
    res /= 10;
} while (res != 0);

for (int i = top; i>=0; i--) {
    if (i != 0) {
        printf("%s ", array[stack[i]]);
    } else {
        printf("%s\n", array[stack[i]]);
    }
}

}

int main()
{
char str[MAXSIZE] = {'\0'};
int left = 0, right = 0;int sum;
while(1) {
fgets(str, MAXSIZE - 1, stdin);
procstr(str, &left, &right);

    if (left == 0 && right == 0) {
        break;
    } else {
    
        showRes(left + right);
    } 
}
system("pause");
return 0;

}

  • 写回答

4条回答 默认 最新

  • Faith_xzc 大数据领域优质创作者 2022-05-17 07:36
    关注
    
    #include <stdio.h>
    #include <string.h>
    char chNumber[10][10] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
    int fnStrToNum(char chNum[])
    {
    int i = 0;
    for (i=0; i<10; i++)
    {
    if (0 == strcmp(chNum, chNumber[i]))
    {
    return i;
    }
    }
    return 0;
    }
    int fnStrToInt(char chNum[][10], int n)
    {
    int i = 0;
    int c = 0;
    while (n--)
    {
    c *= 10;
    c += fnStrToNum(chNum[i++]);
    }
    return c;
    }
    int fnIntToStr(char chNum[][10], int nNum)
    {
    int r = 0;
    char chT[10];
    if (nNum<10)
    {
    strcpy(chNum[0], chNumber[nNum]);
    }
    else
    {
    r = fnIntToStr(&chT, nNum/10);
    strcpy(chNum[r], chT);
    }
    return r+1;
    }
    int main()
    {
    int i = 0;
    int j = 0;
    int k = 0;
    char chA[2][10] = {0}, chB[2][10] = {0};
    int iCount = 0; 
    int iOut[1000]; 
    while (1)
    {
    scanf("%s%s", chA[0], chA[1]);
    if (chA[1][0] == '+')
    {
    scanf("%s%s", chB[0], chB[1]);
    if (chB[1][0] == '=')
    {
    iOut[iCount] = fnStrToNum(chA[0]) + fnStrToNum(chB[0]);
    }
    else
    {
    iOut[iCount] = fnStrToNum(chA[0]) + fnStrToInt(chB, 2);
    }
    }
    else
    {
    scanf("%s%s", chB[0], chB[1]);
    if (chB[1][0] == '=')
    {
    iOut[iCount] = fnStrToInt(chA, 2) + fnStrToNum(chB[0]);
    }
    else
    {
    iOut[iCount] = fnStrToInt(chA, 2) + fnStrToInt(chB, 2);
    }
    }
    if (!iOut[iCount])
    {
    break;
    }
    iCount++;
    }
    char chC[3][10];
    for (i=0; i<iCount; i++)
    {
    k = fnIntToStr(chC, iOut[i]);
    for (j=0; j<k; j++)
    {
    printf("%s ", chC[j]);
    }
    printf("\n");
    }
    return 0;
    }
    

    经过测试,感谢采纳!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 6月1日
  • 已采纳回答 5月24日
  • 创建了问题 5月17日

悬赏问题

  • ¥20 关于#目标检测#的问题:(qq收集表到时间才能填写,填写的份数有上限)
  • ¥50 ZYNQ7020双核FLAHS烧写的问题
  • ¥20 ue 5 中想要实现第一人称人物左右行走摆动的效果,摄像头只向右摆动一次(关键词-结点)
  • ¥15 钢岔管添加弹性约束模拟围岩作用
  • ¥15 AD9164瞬时带宽1.8G,怎么计算出来?
  • ¥15 鼠标右键,撤销删除 复制 移动,要怎样删除
  • ¥15 使用MATLAB进行余弦相似度计算加速
  • ¥15 服务器安装php5.6版本
  • ¥15 我想用51单片机和数码管做一个从0开始的计数表 我写了一串代码 但是放到单片机里面数码管只闪烁一下然后熄灭
  • ¥20 系统工程中,状态空间模型中状态方程的应用。请猛男来完整讲一下下面所有问题