Почему функция "scanf" не работает в си?
/*Программа требует от пользователя ввод данных, но эти данные не воспринимаются scanf, выставляются либо минимальные значения, либо нули, уже кучу форумов перерыл в поисках ответа, но так и не нашел его, что делать? */
// Геометрическая лаба.cpp: определяет точку входа для консольного приложения. //
#include "stdafx.h"
#include"math.h"
#include"stdio.h"
#include"Windows.h"
#include"stdlib.h"
#include"cstdlib"
#include"conio.h"
#pragma warning (disable : 4996)
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
float xa, ya, xb, yb, xc, yc, xd, yd, S, AB, BC, CD, DA, AC, BD;
printf("Введите координаты точек вашей фигуры(по часовой стрелке(A, B, C, D): ");
scanf("%f, %f, %f, %f, %f, %f, %f, %f ", &xa, &ya, &xb, &yb, &xc, &yc, &xd, &yd);
printf("%f, %f, %f, %f, %f, %f, %f, %f ", &xa, &ya, &xb, &yb, &xc, &yc, &xd, &yd);
AB = sqrt(pow((xb - xa), 2) + pow((yb - ya), 2));
BC = sqrt(pow((xc - xb), 2) + pow((yc - yb), 2));
CD = sqrt(pow((xd - xc), 2) + pow((yd - yc), 2));
DA = sqrt(pow((xa - xd), 2) + pow((ya - yd), 2));
AC = sqrt(pow((xc - xa), 2) + pow((yc - ya), 2));
BD = sqrt(pow((xd - xb), 2) + pow((yd - yb), 2));
if (DA + AB > BD && BC + CD > BD && AB == BC == CD == DA)
{
S = 1 / 2 * (AC + CD);
printf("Площадб ромба S=, %d ", &S);
}
else
{
printf("Это не ромб, введите координаты заново\n");
system("pause");
return 0;
}
}
//(вот сама программа)
Ответы (2 шт):
Оператор & перед именем переменной возвращает адрес в памяти, где хранится эта переменная. Функции scanf и другим подобным функциям нужен именно адрес переменной в памяти, поскольку им нужно записывать значение в эту переменную. Единственный способ изменять переменную внутри функции так, чтобы эти изменения были видны снаружи функции - передача в функцию указателя (как это делается в scanf) или ссылки на переменную. Функциям вывода, таким как printf, не нужно изменять переменную внутри функции. Поэтому они работают с передачей переменной по значению. Оператор взятия адреса (&) перед аргументами printf не нужен. Если вы всё-таки используете оператор & перед аргументами printf, то Вы увидите на экране адреса (номера ячеек памяти), где лежат значения, а не сами значения.
Что касается scanf_s и других подобных функций. Они делают то же самое, что и обычный scanf. Разница только в том, что они требуют указывать размер буфера, что позволяет предотвращать запись данных в память за границей массива.
Что касается вычислений - не возьмусь проверять геометрические формулы. Выведите результат правильно (без &). Если он по-прежнему будет неверным, советую просто выводить результаты каждого шага вычислений и сверять с вычисленными вручную данными. Так Вы легко найдёте ошибку.
И расставьте скобки в условии if. Если Вам почему-то не хочется этого делать, почитайте по приоритет операторов и проверьте Ваше условие. Возможно, выражение в условии вычисляется совсем не так, как Вы ожидали.
Так, проблема решилась, во- первых ошибка была в scanf( после %f запятые не нужны), во вторых if надо было переделать вот так if ((DA + AB > BD) && (BC + CD > BD) && (AB == BC) && (BC == CD) && (CD == DA) && (DA == AB)), в третьих амперсанд перед S не нужен, он лишний, спасибо за помощь вам всем))))
, кстати, чуть не забыл S = (1. / 2.) * (AC * BD); формулу площади лучше писать вот так.