Exemplo n.º 1
0
void operator_fraction() {
    fraction result;
    char in[USHRT_MAX];
    double numerator;
    double denominator;
    printf("Entre com o 1º numerador: ");
    scanf("%s", in);
    printf("\n");
    numerator = atof(in);
    while (1) {
        printf("Entre com o 1º denominador: ");
        scanf("%s", in);
        printf("\n");
        denominator = atof(in);
        if (denominator == 0)
            printf("Denominador inválido!\n\n");
        else
            break;
    }
    result = fraction_constructor(numerator, denominator);
    int keep_going = 1;
    while (keep_going) {
        switch (menu_fraction()) {
            case 1:
                // Add
                printf("Entre com o próximo numerador: ");
                scanf("%s", in);
                printf("\n");
                numerator = atof(in);
                while (1) {
                    printf("Entre com o próximo denominador: ");
                    scanf("%s", in);
                    printf("\n");
                    denominator = atof(in);
                    if (denominator == 0)
                        printf("Denominador inválido!\n\n");
                    else
                        break;
                }
                fraction_add(&result, fraction_constructor(numerator, denominator));
                break;
            case 2:
                // Subtract
                printf("Entre com o próximo numerador: ");
                scanf("%s", in);
                printf("\n");
                numerator = atof(in);
                while (1) {
                    printf("Entre com o próximo denominador: ");
                    scanf("%s", in);
                    printf("\n");
                    denominator = atof(in);
                    if (denominator == 0)
                        printf("Denominador inválido!\n\n");
                    else
                        break;
                }
                fraction_subtract(&result, fraction_constructor(numerator, denominator));
                break;
            case 3:
                // Multiply
                printf("Entre com o próximo numerador: ");
                scanf("%s", in);
                printf("\n");
                numerator = atof(in);
                while (1) {
                    printf("Entre com o próximo denominador: ");
                    scanf("%s", in);
                    printf("\n");
                    denominator = atof(in);
                    if (denominator == 0)
                        printf("Denominador inválido!\n\n");
                    else
                        break;
                }
                fraction_multiply(&result, fraction_constructor(numerator, denominator));
                break;
            case 4:
                // Power
                while (1) {
                    printf("Entre com o próximo valor: ");
                    scanf("%s", in);
                    printf("\n");
                    fraction original = result;
                    fraction_power(&result, atof(in));
                    if (isnan(result.numerator) || isnan(result.denominator)) {
                        result = original;
                        printf("Valor inválido!\n\n");
                    } else
                        break;
                }
                break;
            case 5:
                // Divide
                while (1) {
                    printf("Entre com o próximo numerador: ");
                    scanf("%s", in);
                    printf("\n");
                    numerator = atof(in);
                    if (numerator == 0)
                        printf("Numerador inválido!\n\n");
                    else
                        break;
                }
                while (1) {
                    printf("Entre com o próximo denominador: ");
                    scanf("%s", in);
                    printf("\n");
                    denominator = atof(in);
                    if (denominator == 0)
                        printf("Denominador inválido!\n\n");
                    else
                        break;
                }
                fraction_divide(&result, fraction_constructor(numerator, denominator));
                break;
            default:
                keep_going = 0;
                break;
        }
        char *string = fraction_string(result);
        printf("Resultado: %s\n\n", string);
        free(string);
    }
}
Exemplo n.º 2
0
fraction_t *fraction_subtract(const fraction_t *x, const fraction_t *y) {
    fraction_t *minus_y = fraction_negate(y);
    fraction_t *result = fraction_add(x, minus_y);
    fraction_free(minus_y);
    return result;
}
Exemplo n.º 3
0
int
iec61883_cip_fill_header(raw1394handle_t handle, struct iec61883_cip *ptz,
		struct iec61883_packet *packet)
{
  struct iec61883_fraction next;
  int nevents, nevents_dbc, syt_index, syt;

  fraction_add(&next, &ptz->ready_samples, &ptz->samples_per_cycle);
  if (ptz->mode == IEC61883_MODE_BLOCKING_EMPTY ||
      ptz->mode == IEC61883_MODE_BLOCKING_NODATA) {
    if (fraction_floor(&next) >= ptz->syt_interval)
      nevents = ptz->syt_interval;
    else
      nevents = 0;
  }
  else
    nevents = fraction_floor(&next);

  if (ptz->mode == IEC61883_MODE_BLOCKING_NODATA) {
    /* The DBC is incremented even with NO_DATA packets. */
    nevents_dbc = ptz->syt_interval;
  }
  else {
    nevents_dbc = nevents;
  }

  /* Now that we know how many events to put in the packet, update the
   * fraction ready_samples. */
  fraction_sub_int(&ptz->ready_samples, &next, nevents);

  /* Calculate synchronization timestamp (syt). First we
   * determine syt_index, that is, the index in the packet of
   * the sample for which the timestamp is valid. */
  syt_index = (ptz->syt_interval - ptz->dbc) & (ptz->syt_interval - 1);
  if (syt_index < nevents) {
    syt = ((ptz->cycle_count << 12) | fraction_floor(&ptz->cycle_offset)) & 0xffff;
    fraction_add(&ptz->cycle_offset, &ptz->cycle_offset,
		 &ptz->ticks_per_syt_offset);

    /* The cycle_count field is a 13 bits value that goes from 0 to 7999.
     * The cycle_offset field is a 12 bits value that goes from 0 to 3071. */
    ptz->cycle_count += ptz->cycle_offset.integer / 3072;
    ptz->cycle_count %= 8000;
    ptz->cycle_offset.integer %= 3072;
  }
  else
    syt = 0xffff;

  packet->eoh0 = 0;

  /* Our node ID can change after a bus reset, so it is best to fetch
   * our node ID for each packet. */
  packet->sid = raw1394_get_local_id( handle ) & 0x3f;

  packet->dbs = ptz->dbs;
  packet->fn = 0;
  packet->qpc = 0;
  packet->sph = 0;
  packet->reserved = 0;
  packet->dbc = ptz->dbc;
  packet->eoh1 = 2;
  packet->fmt = ptz->format;

  if ( nevents == 0 && ptz->mode == IEC61883_MODE_BLOCKING_NODATA ) {
    /* FDF code for packets containing dummy data. */
    packet->fdf = IEC61883_FDF_NODATA;
  }
  else {
    /* FDF code for non-blocking mode and for blocking mode with empty packets. */
    packet->fdf = ptz->fdf;
  }
  
  packet->syt = htons(syt);

  ptz->dbc += nevents_dbc;

  return nevents;
}