Этот код не работает так, как должен, сразу после ввода формы он не выполняет остальные

Я пытался запрограммировать инструмент, где я получаю данные от пользователя, если это круг, квадрат или прямоугольник, и, соответственно, он будет принимать входные данные измерений и распечатывать площадь для них. Но это не работает, пожалуйста, помогите мне, в чем проблема с моим кодом и как я могу заставить его работать?

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

float square(float side);
float circle(float rad);
float rect(float a,float b);

int main(){

    char lol;
    
    printf("press s for square\n c for circle\n r for rectagle\n");
    scanf("%c ", &lol);

    if (lol == 's')
    {
        int t;
        printf("enter side measurement");
        scanf("%d", &t);
        printf("the area is %f", square(t));

        
    }
    if (lol == 'c');
    {
        int r;
        printf("enter radius of circle");
        scanf("%d", &r);
        printf("the area is %f", circle(r));


    }
    if (lol == 'r')
    {
        int m,n;
        printf("enter 2 sides ");
        scanf("%d %d", &m,&n);
        printf("the area is %f", rect(m,n));
    }

    return 0;
}

float square(float side){
    return side*side;
}

float circle(float rad){
    return 3.14* rad*rad;
}

float rect(float a,float b){
    return a*b;
}

Скриншот исполнения

Добро пожаловать в StackOverflow. Пожалуйста, предоставьте более подробное описание проблемы: что вы ожидали и что вместо этого произошло? Это облегчает людям помощь.

PhilMasteG 27.11.2022 14:12

Пожалуйста, также сделайте более информативный заголовок, который действительно описывает вашу проблему.

user438383 27.11.2022 14:14

Кроме того, расскажите нам, что вы обнаружили при использовании отладчика.

Raymond Chen 27.11.2022 14:16

Просто поставьте `\n` в конце каждого printf

Özgür Murat Sağdıçoğlu 27.11.2022 14:16

Основной тип с плавающей запятой в C — это double, а не float. float — это тип с ограниченной точностью и диапазоном, который в основном подходит для экономии места в больших массивах данных.

Kaz 27.11.2022 14:17
scanf("%c ", &lol); Уберите пробел после %c.
etsuhisa 27.11.2022 14:20

Не используйте scanf для интерактивного ввода. scanf предназначен для чтения форматированных данных. Чтобы сделать это наполовину надежно, вы должны проверить возвращаемое значение и закодировать некоторую обработку ошибок.

Kaz 27.11.2022 14:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
7
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы хотите удалить пробную версию ' ' в первом scanf() и удалить ; после оператора if.

Если main() стоит последним, вы часто можете обойтись без указания прототипов для таких небольших программ, как эта. Добавлена ​​проверка ошибок scanf(). Предпочитайте if-else-if, когда условия взаимоисключающие, или, как здесь, оператор switch, чтобы вам не нужно было повторять lol == . Немного подправил подсказки (двоеточия, новые строки) и отсортировал как меню, так и соответствующую реализацию. Это упрощает конечным пользователям и упрощает навигацию для всех, кто работает над кодом. math.h определил константу M_PI, если установлено __USE_XOPEN. Лучше использовать константу, чем жестко кодировать значение 3,14 в circle().

#define __USE_XOPEN
#include <math.h>
#include <stdio.h>

float circle(float rad) {
    return M_PI * rad * rad;
}

float rect(float a, float b) {
    return a * b;
}

float square(float side) {
    return side * side;
}

int main(void) {
    printf("press:\n"
           " c for circle\n"
           " r for rectangle\n"
           " s for square\n"
    );
    char lol;
    if (scanf("%c", &lol) != 1) {
        printf("scanf failed\n");
        return 1;
    }
    switch(lol) {
        case 'c': {
            printf("enter radius of circle: ");
            int r;
            if (scanf("%d", &r) != 1) {
                printf("scanf failed\n");
                return 1;
            }
            printf("the area is %f\n", circle(r));
            break;
        }
        case 'r': {
            printf("enter 2 sides: ");
            int m, n;
            if (scanf("%d %d", &m,&n) != 2) {
                printf("scanf failed\n");
                return 1;
            }
            printf("the area is %f\n", rect(m,n));
            break;
        }
        case 's': {
            printf("enter side measurement: ");
            int t;
            if (scanf("%d", &t) != 1) {
                printf("scanf failed\n");
                return 1;
            }
            printf("the area is %f\n", square(t));
            break;
        }
        default:
            printf("invalid selection %c\n", lol);
    }
}

Другие вопросы по теме