Ошибка в 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 шт):
#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;
}
Начнём с заголовочных файлов. Вместо стандартных заголовочных файлов вида <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;
}