Ошибка в C++ , связанная с типом данных

#include <iostream>

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

void main()

{

    float d, b, z;
    setlocale(0, "Russian");
    printf("\nВведите два катета");
    scanf_s("%f %f", d, b);
    z = sqrt(d*d + b*b);
    printf("Площадь равна=");
    printf(0, 5 * d*b);
    printf("Периметр равен=");
    printf(d + b + z);
}

Visual Studio выдает ошибку:

Ошибка  C2664   "int printf(const char *const ,...)": невозможно преобразовать аргумент 1 из "float" в "const char *const " ConsoleApplication22    c:\users\79582\source\repos\consoleapplication22\consoleapplication22\consoleapplication22.cpp  20  

Ответы (2 шт):

Автор решения: olkhovich
#include <iostream>
int main() {
    double d, b, z, S, P;
    setlocale(0, "Russian");
    std::cout << "Введите катет: ";
    std::cin >> d;
    std::cout << "Введите второй катет: ";
    std::cin >> b;
    z = sqrt(d * d + b * b);
    S = 0.5 * d * b;
    P = d + b + z;
    std::cout << "Площадь равна: " << S << std::endl;
    std::cout << "Периметр равен: " << P << std::endl;
    return 0;
}
→ Ссылка
Автор решения: wololo

Начнём с заголовочных файлов. Вместо стандартных заголовочных файлов вида <name.h> лучше использовать заголовочные файлы вида <cname>, т.к. первые признаны устаревшими и могут быть удалены в будущих версиях стандарта языка C++. Итак, нам понадобятся:

<cstdio> для std::printf и std::scanf
<clocale> для std::setlocale и макроса LC_ALL
<cmath> для std::sqrt

Функция main должна возвращать значение типа int. Может ли она возвращать значение какого-нибудь другого типа или нет определяется реализацией, поэтому объявим main так:

int main()

Первым аргументом в функцию std::setlocale лучше передать один из специально предназначенных для этого макросов. Например, LC_ALL. Учтите, что одно и тоже целочисленное значение в разных компиляторах может соответствовать разным макросам. Например, в gcc 0 соответствует макросу LC_CTYPE, в то время как в vc++ 0 соответствует макросу LC_ALL.

В C++ в отличие от языка C функция scanf_s не обязана быть объявлена в каком-либо заголовочном файле, поэтому лучше воспользоваться функцией std::scanf. Спецификатор %f говорит, что в scanf необходимо передать указатель на float:

std::scanf("%f %f", &d, &b);

Первым аргументом в функцию std::printf необходимо передать указатель на начальный символ нуль-терминированной строки, задающей что собственно необходимо отобразить и как интерпретировать последующие аргументы. Чтобы вывести значение типа float можно воспользоваться спецификатором преобразования %f:

std::printf("Площадь равна = %f", 0.5 * d * b);

Обратите внимание, что разделитель целой и дробной частей в литерале с плавающей точкой — это точка (.). Итоговый код выглядит примерно так:

#include <cstdio>
#include <clocale>
#include <cmath>

int main()
{
    float d, b, z;
    
    std::setlocale(LC_ALL, "Russian");
    std::printf("Введите два катета: ");
    std::scanf("%f %f", &d, &b);
    z = std::sqrt(d*d + b*b);
    std::printf("Площадь равна = %f\n", 0.5 * d * b);
    std::printf("Периметр равен = %f\n", d + b + z);
    
    return 0;
}
→ Ссылка