【问题标题】:I need to add string characters in C. A + B must = C. Literally我需要在 C 中添加字符串字符。A + B 必须 = C。字面意思
【发布时间】:2012-09-21 16:50:31
【问题描述】:

我正在编写一个今晚午夜到期的程序,但我完全被卡住了。该程序是用 C 编写的,并以 SOS 的形式从用户那里获取输入,其中 S = 字符串,O = 运算符(即“+”、“-”、“*”、“/”)。书中输入输出示例如下:

输入>abc+aab

输出:abc + aab => bce

这是字面上的,而不是可变的。比如,a + a 必须 = b。

执行此操作的代码是什么?我将发布到目前为止的代码,但它所做的只是获取输入并将其划分为每个部分。

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

int main() {
  system("clear");
  char in[20], s1[10], s2[10], o[2], ans[15];

  while(1) {
    printf("\nInput> ");
    scanf("%s", in);
    if (in[0] == 'q' && in[1] == 'u' && in[2] == 'i' && in[3] == 't') {
      system("clear");
      return 0;
    }
    int i, hold, breakNum;
    for (i = 0; i < 20; i++) {
      if (in[i] == '+' || in[i] == '-' || in[i] == '/' || in[i] == '*') {
        hold = i;
      }
      if (in[i] == '\0') {
        breakNum = i;
      }
    }
    int j;
    for (j = 0; j < hold; j++) {
      s1[j] = in[j];
    }
    s1[hold] = '\0';
    o[0] = in[hold];
    o[1] = '\0';
    int k;
    int l = 0;
    for (k = (hold + 1); k < breakNum; k++) {
      s2[l] = in[k];
      l++;
    }
    s2[breakNum] = '\0';
    printf("%s %s %s =>\n", s1, o, s2);
  }
}

【问题讨论】:

  • y+y 在您的问题中的值是多少?
  • 所以你问如何确定答案,但你真的没有提供规则。从您的示例中,您似乎可以将每个字符的值设置为 character - 'a' 以转换为数字,执行您的操作,然后再转换回来(通过添加“a”),但这只是推测 - 因为你没有' t 提供了规则。
  • @Tyler - 通常最好先编写 Pseduo 代码,然后才能在疯狂恐慌中敲出一些代码。这样你就可以只考虑算法,而不会因为编程语言的细微差别和弱点而混淆你的头脑。 (也许不要把事情留到最后一分钟是个好主意:-
  • 如果我理解这个问题:z+z=z; z+y=y; y+y=x; y+a=z; y+b=a; y+c=b; z+a=a;所以它就像一个圆,如果我们到达 z 所以下一个元素将是 a

标签: c computer-science


【解决方案1】:

因为这是家庭作业,所以让我们专注于如何解决这个问题,而不是提供一堆我怀疑你的老师会皱眉头的代码。

首先,不要在main() 函数中执行所有操作。将其分解为更小的函数,每个函数都完成部分任务。

其次,将任务分解成组件并写出伪代码:

while ( 1 )
{
    // read input "abc + def"
    // convert input into tokens "abc", "+", "def"
    // evaluate tokens 1 and 3 as operands ("abc" -> 123, "def" -> 456)
    // perform the operation indicated by token 2
    // format the result as a series of characters (579 -> "egi")
}

最后,编写每个函数。当然,如果您在途中遇到障碍,请务必回来询问您的具体问题。

【讨论】:

  • 该问题专门询问如何执行(组合字符的)操作。他们已经有了读取和解析输入的代码,并且没有在这方面寻求帮助。
【解决方案2】:

根据您的示例,“a”的行为类似于 1,“b”的行为类似于 2,依此类推。鉴于此,您可以像这样对单个字符执行算术:

// Map character from first string to an integer.
int c1 = s1[j] - 'a' + 1;

// Map character from second string to an integer.
int c2 = s2[j] - 'a' + 1;

// Perform operation.
int result = c1 + c2;

// Map result to a character.
char c = result - 1 + 'a';

您必须添加一些内容:

  • 您必须将它放在一个循环中,以便为字符串中的每个字符执行此操作。
  • 您必须根据输入中指定的运算符来改变操作。
  • 您必须对每个结果进行处理,可能会打印出来。
  • 您必须对超出字母表的结果进行处理,例如“y+y”、“a-b”或“a/b”。

【讨论】:

    【解决方案3】:

    如果我们从您的示例答案中假设 a 将是 1 的表示,那么您可以找到所有其他值的表示值并从中减去 a 的值表示。

     for (i = 0; i < str_len; i++) {
          int s1Int = (int)s1[i];
          int s2Int = (int)s1[i];
          int addAmount = 1 + abs((int)'a' - s2Int);
          output[i] = (char)(s1Int + addAmount)
     }
    

    步骤

    1) 对于s1或s2的长度

    2) 获取第一个字符的十进制值

    3) 检索第二个字符的十进制值

    4) 求字母a (97) 和第二个char + 1的区别a是1的表示

    5) 将差异添加到 s1 char 并将十进制表示转换回字符。

    示例 1:

    如果S1 char 是a,S2 char 是b

    s1Int = 97

    s2Int = 98

    addAmount = abs((int)'a' - s2Int)) = 1 + abs(97 - 98) = 2

    output = s1Int + addAmount = 97 + 2 = 99 = c

    示例 2:

    如果 S1 char 是 c,S2 char 是 a

    s1Int = 99

    s2Int = 97

    addAmount = abs((int)'a' - s2Int)) = 1 + abs(97 - 97) = 1

    output = s1Int + addAmount = 99 + 1 = 100 = d

    【讨论】:

      猜你喜欢
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 2011-09-17
      相关资源
      最近更新 更多