Чтение фракций в C

Как читать часть в 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, "/"); } } 

Это использует sscanf для получения чисел, вы можете использовать scanf напрямую, конечно:

 #include  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; } 

Держите указатель на голову строки.

Затем просмотрите использование strchr() чтобы получить второй указатель, указывающий на символ / .

Вы можете:

  1. Прочитайте символы с разыменованного первого указателя до тех пор, пока ваш первый указатель не будет равен второму указателю. Храните эти символы в char [] или char * – это ваш числитель как строка C.
  2. Читайте от следующего символа после того, куда указывает второй указатель, вплоть до нулевого терминатора /0 в конце строки. Храните эти символы во втором char [] или char * – это ваш знаменатель как строка C.

Используйте atoi() чтобы преобразовать обе строки C в целые числа.

Если strchr() возвращает NULL, вы можете сделать проверку ошибок очень легко, потому что в строке ввода не было / .

Хорошо. У меня по-другому. Используйте strtol который вернет вам указатель на ‘/’, к которому вы добавите 1, и вызовите strtol снова для второй половины.

Это в два раза меньше, чем первый ответ, наполовину как нерешительный, как второй. 🙂

 #include  #include  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 означает, чтобы разделить число с плавающей запятой на два целых числа.

Если, с другой стороны, у вас будет много фракций для работы, вы можете захотеть создать структуру для их хранения ( объект , если хотите).

 struct frac { long num; long den; }; struct frac f = { 12, 7 }; printf("%ld/%ld\n", f.num, f.den); 

вы можете сделать это так же ……

  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); 
 #include  typedef struct { int num, denom; }fraction; int main() { fraction fract = {1,2}; printf("fraction: %i/%i", fract.num, fract.denom); return 0; } 

Вот что я обычно делаю.

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

Даже если пользователь не вводит значение переменной b, значение уже инициализируется в 1.0f, поэтому оно может все равно вычислить его значение.

Это проверено на Ubuntu с GCC.