0

今夜の真夜中に予定されているプログラムを書いていますが、完全に立ち往生しています。このプログラムは C で書かれており、ユーザーからの入力を SOS の形式で受け取ります。ここで、S = 文字列、O = 演算子 (IE '+'、'-'、'*'、'/') です。この本の入力と出力の例は次のとおりです。

入力> abc+aab

出力: abc + aab => bce

そして、それは文字通り、変数ではありません。同様に、a + a must = 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);
  }
}
4

3 に答える 3

3

これは宿題なので、インストラクターが眉をひそめると思われる大量のコードを提供するのではなく、これを解決する方法に焦点を当てましょう。

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")
}

最後に、各関数を記述します。もちろん、途中で障害に遭遇した場合は、必ず戻って具体的な質問をしてください。

于 2012-09-21T16:56:12.437 に答える
0

あなたの例に基づくと、「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」、「ab」、「a / b」など、アルファベットを超えた結果について何かする必要があります。
于 2012-09-21T17:38:47.363 に答える
0

回答例から、それが 1 の表現になると仮定するとa、他のすべての値の表現値を見つけて、そこから の値表現を差し引くことができます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) 最初の文字の 10 進値を取得する

3) 2 番目の文字の 10 進値を取得します

a4) 文字(97) と 2 番目の文字 + 1の差を見つけます<-aが 1 の表現であると仮定します

5) 差を s1 char に追加し、10 進数表現を文字に変換します。

例 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

于 2012-09-21T18:56:21.927 に答える