2

分数を C に読み込んで計算するにはどうすればよいですか? (分数にはスラッシュ記号が含まれます) たとえば、ユーザーは 3/12 と入力します。(文字列) プログラムは gcd を見つけ、簡約分数を計算し、1/4 を計算します。

私の当初の計画は、strtok() 関数を使用して分子と分母を単独で取得することでしたが、分子と分母を別々の変数に格納するという問題に遭遇しました。これは有効な方法ですか?もしそうなら、文字列をトークン化した後、分子と分母を2つの別々の変数にどのように格納しますか?

void blah(void) {
  char str[30];
  scanf("%s",&str);
  char * pch;
  pch = strtok (str,"/");
  int i;
  while (pch != NULL)
  {
    i = atoi(pch);
    printf("\n%d", i);
    pch = strtok (NULL, "/");
  }
}
4

6 に答える 6

1

文字列の先頭へのポインタを保持します。

次に、を使用strchr()して、文字を指す2番目のポインターを取得することを検討し/ます。

その後、次のことができます。

  1. 逆参照された最初のポインターから、最初のポインターが2番目のポインターと等しくなるまで文字を読み取ります。char []それらの文字をまたはに格納しchar *ます—これはC文字列としての分子です。
  2. 2番目のポインタが指す場所の後の次の文字から/0、文字列の最後にあるヌル文字まで読み取ります。それらの文字を1秒以内に格納するchar []char *—それがC文字列としての分母です。

atoi()両方のC文字列を整数に変換するために使用します。

NULLを返す場合、入力文字列に何も含まれてstrchr()いないため、エラーチェックを非常に簡単に実行できます。/

于 2013-03-11T06:16:41.773 に答える
1

大丈夫。私は別の方法を持っています。which を使用strtolすると、1 を追加した '/' へのポインターが返され、strtol後半で再度呼び出されます。

これは、最初の回答の 2 倍、2 番目の回答の半分ほど手間がかかります。:)

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

int main(){
    char *f = " 12/7 ";
    char *s;
    long n,d;
    n = strtol(f, &s, 10);
    d = strtol(s+1, NULL, 10);
    printf(" %ld/%ld \n", n, d);
    return 0;
}

残りの質問に答えるには、分数になる場合は間違いなく2つの変数が必要です。浮動小数点を内部で使用でき、分数がユーザー入力の優れた機能である場合は、先に進んでそれらを分割し、数値を 1 つの変数に格納できます。

double v;
v = (double)n / d;

to へのキャストdoubleは、2 つの整数に対して浮動小数点除算を強制するためにあります。

一方、処理する分数が多い場合は、分数を保持するための構造体を作成することをお勧めします (必要に応じてobject )。

struct frac {
    long num;
    long den;
};
struct frac f = { 12, 7 };
printf("%ld/%ld\n", f.num, f.den);
于 2013-03-11T06:27:10.683 に答える
1

これは sscanf を使用して数値を取得します。もちろん直接 scanf を使用することもできます:

#include <stdio.h>
int main() {
  const char *s = " 13/6  \n";
  int a,b;
  sscanf(s, "%d/%d", &a, &b);
  printf("%d frac %d\n", a, b);
  return 0;
}
于 2013-03-11T06:12:47.867 に答える
0

この方法でもできます......

  char str[30];
  scanf("%s",str);
  char c[30];
  int i, num, denom;

  i = 0;
  while (*(str+i) != '/')
  {
      memcpy((c+i), (str+i), 1);
      i++;
  }
  *(c+i) = 0;
  i++;
  num = atoi(c);
  strcpy(c, (str+i));
  denom = atoi(c);
  printf("%d\n", num);
  printf("%d\n", denom);
于 2013-03-11T06:30:01.440 に答える
0
#include <stdio.h>

typedef struct
{
int num, denom;
}fraction;

int main()
{
fraction fract = {1,2};

printf("fraction: %i/%i", fract.num, fract.denom);
return 0;
}
于 2014-03-18T00:48:42.430 に答える