Как сделать это задание на C? Часть 2

Далее предлагается ввести радиус и высоту и использовать эти значения для расчета объема цилиндра. Как я могу написать эту программу, чтобы она не завершалась, когда пользователь вводит отрицательное значение для любого радиуса высоты? Диапазон должен быть от 1 до 10 включительно, другие подсказки не допускаются. Цикл должен быть завершен только тогда, когда вводится что-то нечисловое.

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


float areaCirc(float r){
return (M_PI*r*r);
}

float volCyl(float r, float h){
return (areaCirc(r)*h);
}


int main(void) {
float r, h;
int k = 0;
float volume;
float avgh = 0;
float toth = 0;

do{
    float exit = scanf("%f%f", &r, &h);
    if (exit == 0) 
    {break;}
    if(r<=0 || r>10){
        printf("Invalid radius: %.2f\n",r);
    }
    if(h<=0 || h>10){
        printf("Invalid height: %.2f\n",h);
    }
    if(r>=0 && r<=10 && h>=0 && h <= 10){
    volume = volCyl(r,h);
    k = k++;
    printf(" Cylinder %d radius %.2f height %.2f volume %.2f\n",k,r,h,volume);
    toth = toth + h;
} }while(r>0 && h>0);
    avgh = toth/k;
    printf("Total Height: %.2f\n",toth);
    printf("Average Height: %.2f\n",avgh);

return EXIT_SUCCESS;
}

person user2805620    schedule 13.10.2013    source источник


Ответы (3)


Мой указанный диапазон должен быть от 1 до 10 включительно, без отрицательных значений, завершающих программу, и никакие другие подсказки не допускаются.

Измените свою основную функцию

do{
    int ex = scanf("%f%f", &r, &h); //scanf returns int

   if (ex == 0)
    {break;}
    if(r<=0 || r>10){
        printf("Invalid radius: %.2f\n",r);
       continue;
    }
    if(h<=0 || h>10){
        printf("Invalid height: %.2f\n",h);
       continue;
    }
   // hence above conditions failed means you have given desired input
   // need not to check any conditions 
    volume = volCyl(r,h);
    k = k++;
    printf(" Cylinder %d radius %.2f height %.2f volume %.2f\n",k,r,h,volume);
    toth = toth + h;
   }while(r>0 && h>0);

  if(k>0) // check this other wise divide by zero will occur
    {
    avgh = toth/k;
    printf("Total Height: %.2f\n",toth);
    printf("Average Height: %.2f\n",avgh);
    }
person Gangadhar    schedule 13.10.2013
comment
Мой указанный диапазон должен быть от 1 до 10 включительно, без отрицательных значений, завершающих программу, и никакие другие подсказки не допускаются. - person user2805620; 13.10.2013
comment
вы хотите напечатать ошибку, когда пользователь вводит 11 или -1 в качестве входных данных. я имею в виду диапазон от 1 до 10 - person Gangadhar; 13.10.2013
comment
Я хочу напечатать недопустимый радиус или недопустимую высоту, если они выходят за пределы допустимого диапазона, и продолжать запрашивать ввод без направляющего их текста, и цикл завершается только тогда, когда вводится что-то нечисловое. - person user2805620; 13.10.2013
comment
@ user2805620 соответственно изменил ответ. - person Gangadhar; 13.10.2013
comment
программа по-прежнему завершается после ввода отрицательных значений. Это условия во время выполнения, которые я не знаю, как изменить - person user2805620; 13.10.2013
comment
Это приводит к тому, что программа не завершается, когда вводится что-то нечисловое, и переходит в бесконечный вывод. Не следует ли изменить условия части while? - person user2805620; 13.10.2013
comment
изменить состояние внутри, пока while(r>0 && h>0); ==> while(1); - person Gangadhar; 13.10.2013

Посмотрите на оператор внутри вашего while(). Обратите внимание, что это будет продолжать зацикливаться тогда и только тогда, когда эти условия приводят к истине.

person It'sPete    schedule 13.10.2013
comment
Я знаю это, но я не знаю, как включить в него все значения, находящиеся в пределах диапазона, которые являются отрицательными значениями и включают ноль. - person user2805620; 13.10.2013

do {
    printf("Enter radius: ")
    scanf("%d", &r);
    printf("Enter height: ")
    scanf("%d", &h);
} while(r<=0 || h<=0);

Вы можете использовать цикл do-while, который будет предлагать пользователю повторно ввести радиус и высоту, если значение меньше или равно 0.

Надеюсь это поможет :)

person user2828487    schedule 13.10.2013