Как отобразить общую сумму и расчеты с входа в C - PullRequest
0 голосов
/ 08 мая 2019

Я делаю оценку и должен написать короткую программу на C для ввода вершин и размера стороны для отображения периметра и площади многоугольника. Когда программа завершается, я должен отобразить:

  • а. общее количество выполненных расчетов
  • б. сумма всех вершин
  • с. сумма всех сторон размеров
  • д. сумма всех периметров
  • е. квадратный корень произведения всех областей

Как это делается в C? Спасибо

Я попытался сохранить их в массиве, а затем отобразить их

#include <stdio.h>
#include <stdlib.h>

int main() {
    float PI = 3.1415;
    char choice;
    float area, parameter;
    int radius, side, length, width;

    do {
        printf("Please enter a shape(C:Circle, S:Square, R:Rectangle, Q:Quiit> ");
        scanf("%s", &choice);

        switch (choice) {
          case 'C':
            printf("Enter a radius of the circle: ");
            scanf("%d", &radius);
            area = (2 * radius) * PI;
            parameter = 2 * PI * radius;
            printf("The area of the circle is %.02f and parameter is %.02f",
                   area, parameter);
            break;

          case 'S':
            printf("Enter the side of the square: ");
            scanf("%d", &side);
            area = side * side;
            parameter = 4 * side;
            printf("The area of the circle is %.02f and parameter is %.02f",
                   area, parameter);
            break;

          case 'R':
            printf("Enter the width of the rectangle: ");
            scanf("%d", &width);
            printf("Enter the length of the rectangle: ");
            scanf("%d", &length);
            area = length * width;
            parameter = (2 * length) + (2 * width);
            printf("The area of the circle is %.02f and parameter is %.02f",
                   area, parameter);
            break;

          case 'Q':
            printf ("Thank and bye");
            break;

          default:
            printf ("Invalid input");
        }
        return 0;
    } while (choice != 'Q');
}

Я ожидаю, что это делается через массив, но я не уверен, как работают массивы.

1 Ответ

2 голосов
/ 08 мая 2019

Первые замечания по текущему коду

Наличие

 char choice;
 ...
 scanf ("%s", &choice);

вы пишете хотя бы один символ из выбора для установки нулевого символа, поведение не определено

Вы хотите ввести символ сделать

scanf (" %c", &choice);

пробел перед %s, позволяющий обойти разделители (перевод строки / пробел)

Зачем return 0;, если вы хотите зацикливаться на 'Q'? Убери это.

Добавьте новую строку в конце всех отпечатков, чтобы получить результат, чтобы отделить его от вопроса после (или, конечно, заменить «Пожалуйста, введите форму ...» на «\ nПожалуйста, введите форму ...», чтобы не иметь это на той же строке предыдущего оттиска)

Я рекомендую вам проверить, что что-то действительное входит через scanf , иначе вы не можете знать, например, было ли введено целое число для scanf("%d", &radius);, поэтому проверка scanf возвращает 1

Я ожидаю, что это делается через массив, но я не уверен, как работают массивы.

Вам не нужны массивы (ы), для 'a' 'b' 'c' и 'd' суммы могут обновляться каждый раз, для 'e' обновляйте продукт каждый раз, а затем в конце выполните квадрат

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

  • вы используете массивы статического размера, и в этом случае вы должны ограничить количество входов, чтобы не выходить из него
  • вы используете динамический массив, используя malloc затем realloc для увеличения их размера

затем в конце ('Q') вы вычисляете необходимое значение из содержимого массивов


Например, управление 'a' и 'e' двумя способами в зависимости от идентификатора препроцессора ARRAYS:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#ifdef ARRAYS
typedef struct Vector {
  float * values;
  size_t nValues;
} Vector;

// initialize the array, must be called because to add values
void init(Vector * v)
{
  v->values = malloc(0);
  v->nValues = 0;
}

// a a new value into the vector
void add(Vector * v, float f)
{
  v->values = realloc(v->values, (++v->nValues) * sizeof(float));
  v->values[v->nValues - 1] = f;
}

// print the content of the array
void pr(Vector * v, const char * what)
{
  printf("there are %d %s :", v->nValues, what);
  for (size_t i = 0; i != v->nValues; ++i)
    printf(" %.02f", v->values[i]);
  putchar('\n');
}
#endif

int main ()
{
  float PI = 3.1415;
  char choice;
  float area, parameter;
  int radius, side, length, width;
#ifdef ARRAYS
  Vector calculations, areas;

  init(&calculations);
  init(&areas);
#else
  int calcNumber = 0;
  float prodAreas = 1;
#endif

  do {
    printf("Please enter a shape(C:Circle, S:Square, R:Rectangle, Q:Quit> ");
    scanf (" %c", &choice);

    switch (choice) {
    case 'C':
      printf ("Enter a radius of the circle: ");
      if (scanf ("%d", &radius) != 1) {
        puts("invalid value");
        return -1;
      }
      area = (2 * radius) * PI;
      parameter = 2 * PI * radius;
      printf ("The area of the circle is %.02f and parameter is %.02f\n",
              area, parameter);
#ifdef ARRAYS
      add(&calculations, area);
      add(&areas, area);
      add(&calculations, parameter);
#else
      calcNumber += 2;
      prodAreas *= area;
#endif
      break;

    case 'S':
      printf ("Enter the side of the square: ");
      if (scanf ("%d", &side) != 1) {
        puts("invalid value");
        return -1;
      }
      area = side * side;
      parameter = 4 * side;
      printf ("The area of the circle is %.02f and parameter is %.02f\n",
              area, parameter);
#ifdef ARRAYS
      add(&calculations, area);
      add(&areas, area);
      add(&calculations, parameter);
#else
      calcNumber += 2;
      prodAreas *= area;
#endif
      break;

    case 'R':
      printf ("Enter the width of the rectangle: ");
     if ( scanf ("%d", &width) != 1) {
        puts("invalid value");
        return -1;
      }
      printf ("Enter the length of the rectangle: ");
      if (scanf ("%d", &length) != 1) {
        puts("invalid value");
        return -1;
      }
      area = length * width;
      parameter = (2 * length) + (2 * width);
      printf ("The area of the circle is %.02f and parameter is %.02f\n",
              area, parameter);
#ifdef ARRAYS
      add(&calculations, area);
      add(&areas, area);
      add(&calculations, parameter);
#else
      calcNumber += 2;
      prodAreas *= area;
#endif
      break;

    case 'Q':
      puts ("Thank and bye");
      break;

    default:
      puts ("Invalid input");
    }
  } while (choice != 'Q');

#ifdef ARRAYS
  pr(&calculations, "calculations");

  pr(&areas, "areas");

  float e = 1;

  for (size_t i = 0; i != areas.nValues; ++i)
    e *= areas.values[i];
  printf("square root of the product of all areas : %.02f\n", sqrt(e));
#else
  printf("there are %d calculations\n", calcNumber);
  printf("square root of the product of all areas : %.02f\n", sqrt(prodAreas));
#endif

  return 0;
}

Компиляция и выполнение с использованием массивов:

pi@raspberrypi:/tmp $ gcc -DARRAYS -pedantic -Wall  -Wextra c.c -lm
pi@raspberrypi:/tmp $ ./a.out
Please enter a shape(C:Circle, S:Square, R:Rectangle, Q:Quit> C
Enter a radius of the circle: 1
The area of the circle is 6.28 and parameter is 6.28
Please enter a shape(C:Circle, S:Square, R:Rectangle, Q:Quit> S
Enter the side of the square: 1
The area of the circle is 1.00 and parameter is 4.00
Please enter a shape(C:Circle, S:Square, R:Rectangle, Q:Quit> Q
Thank and bye
there are 4 calculations : 6.28 6.28 1.00 4.00
there are 2 areas : 6.28 1.00
square root of the product of all areas : 2.51
pi@raspberrypi:/tmp $ 

Компиляция и выполнение без массивов:

pi@raspberrypi:/tmp $ gcc -pedantic -Wall  -Wextra c.c -lm
pi@raspberrypi:/tmp $ ./a.out
Please enter a shape(C:Circle, S:Square, R:Rectangle, Q:Quit> C
Enter a radius of the circle: 1
The area of the circle is 6.28 and parameter is 6.28
Please enter a shape(C:Circle, S:Square, R:Rectangle, Q:Quit> S
Enter the side of the square: 1
The area of the circle is 1.00 and parameter is 4.00
Please enter a shape(C:Circle, S:Square, R:Rectangle, Q:Quit> Q
Thank and bye
there are 4 calculations
square root of the product of all areas : 2.51

Я позволю тебе делать для 'b', c 'и' d '

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