2

如何将分数读入 C 中以进行数学运算?(分数将包含斜线符号)例如,用户将输入 3/12。(a string) 程序会找到 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

这里使用 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 回答
1

保留一个指向字符串头部的指针。

然后研究使用strchr()来获取指向该/字符的第二个指针。

然后您可以:

  1. 从取消引用的第一个指针中读取字符,直到您的第一个指针等于第二个指针。将这些字符存储到一个char []char *中——这是你的分子作为一个 C 字符串。
  2. 从第二个指针指向的位置之后的下一个字符开始读取,直到/0字符串末尾的 nul 终止符。在一秒钟内存储这些字符,char []或者char *- 这是你的分母作为 C 字符串。

用于atoi()将两个 C 字符串转换为整数。

如果strchr()返回 NULL,那么您可以很容易地进行错误检查,因为/输入字符串中没有。

于 2013-03-11T06:16:41.773 回答
1

好吧。我有一个不同的方法。使用strtolwhich 将为您返回一个指向您添加 1 并strtol在下半场再次调用的“/”的指针。

这是第一个答案的两倍,是第二个答案的一半。:)

#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 个变量。如果您可以在内部使用浮点并且分数只是用户输入的一个很好的功能,那么您可以继续将它们除以并将数字存储在一个变量中。

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

强制转换double为对两个整数进行浮点除法。

另一方面,如果您要处理很多分数,您可能需要创建一个结构来保存它们(如果您愿意,可以使用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 回答
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 回答
0

这是我通常做的。

int main()
{
double a,b=1.0f,s;
scanf("%lf/%lf",a,b);
s=a/b;
printf("%lf",s);
}

即使用户没有输入变量 b 的值,该值也已经初始化为 1.0f,因此无论如何它都可以计算它的值。

这是在带有 GCC 的 Ubuntu 上尝试的。

于 2017-04-20T15:09:54.587 回答