Как читать в полиномах и хранить их в массиве с проверкой ошибок в C? - PullRequest
0 голосов
/ 16 февраля 2019

Функция считывает коэффициенты для полинома из стандартного ввода и сохраняет их в заданном массиве.Параметр вместимости сообщает функции, сколько места имеет массив coeff [] для коэффициентов.Функция пытается прочитать все возможные коэффициенты, пока не достигнет конца файла, и возвращает количество коэффициентов, которые она фактически читает.Если входной полином неверен (например, слишком много коэффициентов или если входное значение не анализируется как число с плавающей запятой), эта функция выведет «Недопустимый полином» и выйдет из программы со статусом 101.

Входной файл выглядит следующим образом:

0,0 6,0

25,00 -47,50 25,17 -5,00 0,33

Первые два числа - это диапазон графика и вторая строкапредставляет коэффициенты многочлена.

Это код, который у меня есть до сих пор:

/**
 */

// Include our own header first
#include "poly.h"

// Then, anything else we need in the implementation file.
#include <stdlib.h>
#include <stdio.h>

/** Exit status if the input polynomail is bad. */
#define INVALID_POLYNOMAIL_STATUS 101

int readPoly( int capacity, double coeff[] )
{
   double variable = 0.0;

   int ch;

   int count = 0;
  while ( ( ch = getchar() ) != EOF ) {

    for(int i = 0; i < capacity; i++) {


         if(scanf("%lf", &variable) != 1) {

            fprintf(stderr, "Invalid input");
            exit(101);
         }

          else {

                  coeff[i] = variable;

                  count++;
               } 
    }
 }
 return count;
}

1 Ответ

0 голосов
/ 16 февраля 2019

getchar может прочитать начало значения, это не так

Простой способ - остановить любую ошибку (EOF или неверное значение):

int readPoly( int capacity, double coeff[] )
{
   int i;

   for(i = 0; i < capacity; i++) {
      if (scanf("%lf", &coeff[i]) != 1)
        break;
   }

   return i;
}

Другой способ - обойти вручную пробелы, чтобы можно было указать на ошибку:

int readPoly( int capacity, double coeff[] )
{
   int i;

   for (i = 0; i < capacity; i++) {
      for (;;) {
        int c;

        if ((c = getchar()) == EOF)
          return i;
        if (!isspace(c)) {
          ungetc(c, stdin);
          break;
      }
      if (scanf("%lf", &coeff[i]) != 1) {
        fprintf(stderr, "Invalid input");
        exit(101);
      }
   }

   return i;
}

Примечание count является избыточным с i достаточно i , и вы также можете напрямую scanf в массив

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...