Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2010, 09:16   #11
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну и где файл?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.12.2010, 10:09   #12
rubakKa
Пользователь
 
Регистрация: 30.11.2010
Сообщений: 29
По умолчанию

Код:
#include <stdio.h>
main(){
FILE *in,*out;
in=fopen("input.txt","r");
out=fopen("output.txt","w");
 
float s;
int n,min;
char x[50];
char y[50];
fscanf(in,"%d",&n);
for(int i=0;i<n;i++)
{
fscanf(in,"%d",&x[i]);
fscanf(in,"%d",&y[i]);
}
x[n]=x[0];
y[n]=y[0];
 
min=y[0];
for(int i=1;i<n;i++)
if(min>y[i])min=y[i];
 
for(int i=0;i<n+1;i++)
y[i]=y[i]-min;
 
s=0;
for(int i=0;i<n;i++){
s=s+((y[i+1]+y[i])*(x[i+1]-x[i])/2);
}
if(s<0)
s=-s;
fprintf(out,"%1.1f",s);
fclose(in);
fclose(out);
}
Отредактировал.. Почти все нормально: заместо 3.5 3.0.. Где я напутал?

Последний раз редактировалось rubakKa; 15.12.2010 в 10:18.
rubakKa вне форума Ответить с цитированием
Старый 15.12.2010, 10:49   #13
V0id
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 30
По умолчанию

ИМХО, должно быть как-то так...
Код:
#include <stdio.h>
#include <math.h>

float round(float x)
{
	float n;
	float fract = modf(x*10, &n);
	if (fract >= 0.5)
		n += 1;
	return n / 10;
}

int main()
{
	int n;
	float s, min, x[500], y[500];

	FILE *in,*out;
	in=fopen("input.txt","rt");
	out=fopen("output.txt","wt");

	if (in && out)
	{
		fscanf(in,"%d",&n);
		for(int i=0;i<n;i++)
			fscanf(in,"%f %f",&x[i], &y[i]);
		x[n]=x[0];
		y[n]=y[0];
		min=y[0];
		for(int i=1;i<n;i++)
			if(min>y[i]) 
				min=y[i];
		for(int i=0;i<n+1;i++)
			y[i]=y[i]-min;
		s=0.0;
		for(int i=0;i<n;i++)
			s=s+((y[i+1]+y[i])*(x[i+1]-x[i])/2);
		s = fabs(s);
		fprintf(out,"%.1f",round(s));
	}
	else
		printf("Can't open files!");

	fclose(in);
	fclose(out);
	return 0;
}
Но в условии задачи написано, что вершин может быть до 50000 штук, а массивы создаются лишь на 500 элементов. Исправляйте.

Но тестировалось лишь для одного простейшего случая, так что насчет работоспособности не уверен.

Последний раз редактировалось V0id; 15.12.2010 в 11:24. Причина: Update №9935...
V0id вне форума Ответить с цитированием
Старый 15.12.2010, 10:59   #14
rubakKa
Пользователь
 
Регистрация: 30.11.2010
Сообщений: 29
По умолчанию

Цитата:
Сообщение от V0id Посмотреть сообщение
ИМХО, должно быть как-то так...
cannot convert `float*' to `double*' for argument `2' to `double modf(double, double*)'

Какую функцию выполняет код:
Код:
float round(float x)
{
	float n;
	float fract = modf(x*10, &n);
	if (fract >= 0.5)
		n += 1;
	return n / 10;
}

Последний раз редактировалось rubakKa; 15.12.2010 в 11:01.
rubakKa вне форума Ответить с цитированием
Старый 15.12.2010, 11:04   #15
V0id
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 30
По умолчанию

Цитата:
Сообщение от rubakKa Посмотреть сообщение
cannot convert `float*' to `double*' for argument `2' to `double modf(double, double*)'

Какую функцию выполняет код:
Код:
float round(float x)
{
	float n;
	float fract = modf(x*10, &n);
	if (fract >= 0.5)
		n += 1;
	return n / 10;
}
Округление до десятых.
V0id вне форума Ответить с цитированием
Старый 15.12.2010, 11:10   #16
rubakKa
Пользователь
 
Регистрация: 30.11.2010
Сообщений: 29
По умолчанию

Координаты записываются в целом виде.. Тогда массивы не float, а long. А зачем тут округление?
Можно просто
Код:
fprintf(out,"%1.1f",s);
rubakKa вне форума Ответить с цитированием
Старый 15.12.2010, 11:22   #17
V0id
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 30
По умолчанию

Цитата:
А зачем тут округление?
Цитирую задание: "Его следует округлить до ближайшего числа с одной цифрой после запятой."
Цитата:
Сообщение от rubakKa Посмотреть сообщение
Координаты записываются в целом виде.. Тогда массивы не float, а long.
Конечно, но тогда, действительно, зачем тут округление?

Цитата:
Можно просто
Код:
fprintf(out,"%1.1f",s);
Это не округление.
V0id вне форума Ответить с цитированием
Старый 15.12.2010, 11:25   #18
rubakKa
Пользователь
 
Регистрация: 30.11.2010
Сообщений: 29
По умолчанию

Код:
#include <stdio.h>
main(){
FILE *in,*out;
in=fopen("input.txt","r");
out=fopen("output.txt","w");
 
float s;
int n,min;
long x[50000];
long y[50000];
fscanf(in,"%d",&n);
for(int i=0;i<n;i++)
{
fscanf(in,"%d",&x[i]);
fscanf(in,"%d",&y[i]);
}
x[n]=x[0];
y[n]=y[0];
 
min=y[0];
for(int i=1;i<n;i++)
if(min>y[i])min=y[i];
 
for(int i=0;i<n+1;i++)
y[i]=y[i]-min;
s=0.0;
for(int i=0;i<n;i++){
s=s+(((float)y[i+1]+(float)y[i])*((float)x[i+1]-(float)x[i])/2);
}
if(s<0)
s=-s;
fprintf(out,"%1.1f",s);
fclose(in);
fclose(out);
}
Вот теперь работает!!!
Спасибо V0id и Гром
rubakKa вне форума Ответить с цитированием
Старый 15.12.2010, 11:34   #19
rubakKa
Пользователь
 
Регистрация: 30.11.2010
Сообщений: 29
По умолчанию

Задача из той же басни:


Группа экспертов обнаружила на территории нежилого массива множество опасных участков, соприкосновение с которыми небезопасно для жизни человека.
В целях безопасности требуется создать защитный периметр в форме выпуклого многоугольника, который бы смог обезопасить проникновение человека в эту зону.
По заданным координатам опасных участков требуется вычислить минимально возможную площадь опасной зоны, которая попадет в защитный периметр.

Входные данные
В первой строке входного файла INPUT.TXT записано натуральное число N – количество опасных участков. В каждой из N последующих строк находятся два числа Xi и Yi – координаты участков, размерами которых можно пренебречь. При этом участки могут повторяться.
Все числа целые, не превосходящие 1000 по абсолютной величине.
Выходные данные
В выходной файл OUTPUT.TXT необходимо вывести одно число – площадь опасной зоны, округленной до целого значения.
rubakKa вне форума Ответить с цитированием
Старый 15.12.2010, 22:05   #20
Lyubitel'
Новичок
Джуниор
 
Регистрация: 15.12.2010
Сообщений: 1
По умолчанию

Привет всем!
Мне досталась очень хорошая работа, но не могу разобраться в одном куске кода. Помогите, прошу, объясните как именно рассчитывается координаты нормали в if.

Vertex bufNorm;
for (i=0; i<kol_t/2; i++)
{
GetNormal(t[i], bufNorm); // я полагаю, считается при каждой i-ой итерации - нормаль
t[i].N.Set(bufNorm.x, bufNorm.y, bufNorm.z, 1); //могу предположить, что устанавливается нормаль для i-го треугольника

if(t[i].N.x*InsPoint1.x + t[i].N.y*InsPoint1.y + t[i].N.z*InsPoint1.z + (-t[i].N.x*t[i].A.x - t[i].N.y*t[i].A.y - t[i].N.z*t[i].A.z) > 0)
t[i].N.Set(-t[i].N.x, -t[i].N.y, -t[i].N.z, 1);
} //здесь не могу ничего разобрать

InsPoint1.Set(b[n+2].x, b[n+2].y, b[n+2].z, 1);//для основания конуса (это комментарий уже существовал в программе)
Triangle *t;
Vertex N; //думаю, что координаты текущей нормали, но могу ошибаться
Lyubitel' вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Геометрия в Си rik_nel Общие вопросы C/C++ 5 14.12.2010 13:43
Вычислительная практика (транскрипция) smart70 Паскаль, Turbo Pascal, PascalABC.NET 6 03.08.2010 13:21
Вычислительная геометрия на С Soull Помощь студентам 7 18.05.2010 12:54
Си геометрия Денни Помощь студентам 11 05.03.2010 09:41
Вычислительная эквивалентность исполнителей Анатолий 111 Помощь студентам 0 25.12.2009 00:38