Первые замечания по текущему коду
Наличие
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 '