2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Правильно ли такое решение? Олимпиадная задача
Сообщение15.08.2012, 21:08 
Аватара пользователя
Вот задача:
Изображение

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

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

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <stdio.h>
#include <iostream.h>
#include <math.h>

float Rpryam (float a, float b); // Функция считает радиус описанной около прямоугольника окружности
float Rtreug (float a, float b, float c); // Функция считает радиус описанной около треугольника окружности
float a,b,c,R,d;
int N,n;

int main()
{freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%ld%ld", N, n);

for (int i=0; n>i; i++) // Счетчик считает переход по строчкам
{ scanf("%ld", a);// а - первый элемент строки

  if (a==1)
     {scanf("%ld%ld%ld", a, b, c);
     if ((N/2)>Rtreug(a, b, c)) // N/2 -радиус коробки. Сравниваем радиус коробки и радиус описанной около пряника окружности
     printf("%ld","Y");  
     
     else printf("%ld","N");}

  if (a==2)
     {scanf("%ld%ld", a, b);
      if ((N/2)>Rpryam(a, b))// N/2 -радиус коробки. Сравниваем радиус коробки и радиус описанной около пряника окружности
      printf("%ld","Y");
     
      else printf("%ld", "N");} }
     
      return 0;}


float Rpryam (float, float)
{R=(sqrt(a*a+b*b))/2;
 return R;}
 
 float Rtreug (float, float, float)
 {R=(a*b*c)/(4*(sqrt(((a+b+c)/2)*(((a+b+c)/2)-a)*(((a+b+c)/2)-b)*(((a+b+c)/2)-c))));// R находим по формуле с помощью формулы Герона. a*b*b/4*S
return R;}
 

 
 
 
 Re: Правильно ли такое решение? Олимпиадная задача
Сообщение16.08.2012, 13:04 
Ошибки — не страшно, учитесь пользоваться отладчиком.
Разберитесь наконец с консольным вводом/выводом, проблемы с этим. Точнее, с бездумным использованием функции scanf(). Прототип этой функции выглядит примерно так (см. stdio.h):
Используется синтаксис C
int scanf(const char *format, ...);
Необходимо понимать, что компилятор при компиляции имеет возможность проверить тип только первого параметра, а за многоточием здесь скрывается последовательность параметров-указателей на переменные, где будут сохранены результаты разбора ввода согласно форматной строке. Постоянные ошибки начинающих: scan("%ld%ld", N, n) (правильно scan("%ld%ld", &N, &n)) — введённое целое значение сохраняется по адресу, который суть значение переменной N, в данном случае 0; неправильная спецификация формата — переменная декларирована как float, но при вызове scanf используется "%ld" (см. переменные a, b, c).
Также обратите внимание на вызовы функции printf("%ld", "N") (ах, это сладкое слово — copy-paste), для вывода строк используется спецификатор формата "%s".

А ещё лучше сразу пользоваться потоками ввода/вывода, и голова не болит от спецификаций формата:
Используется синтаксис C++
int N, n;
cin >> N >> n;
float a, b, c;
cin >> a >> b >> c;
cout << 'Y' << endl;

В этом случае для работы с файлами используйте перенаправление ввода/вывода:
Код:
МояПрограмма < input.txt > output.txt

 
 
 
 Re: Правильно ли такое решение? Олимпиадная задача
Сообщение16.08.2012, 13:37 
Аватара пользователя
Спасибо, lim0n. Подправил все, что смог понять из Вашего ответа. Теперь ошибки типа память не может быть типа written уже не появляется, все работает без сбоев, только в файл ничего не записывается.

Вот что исправил. Исправил только ошибки в scanf и printf.
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <stdio.h>
#include <iostream.h>
#include <math.h>

float Rpryam (float a, float b); // Функция считает радиус описанной около прямоугольника окружности
float Rtreug (float a, float b, float c); // Функция считает радиус описанной около треугольника окружности
float a,b,c,R,d;
int N,n;

int main()
{freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%ld%ld", &N, &n);

for (int i=0; n>i; i++) // Счетчик считает переход по строчкам
{ scanf("%ld", &a);// а - первый элемент строки

  if (a==1)
     {scanf("%g%g%g", &a, &b, &c);
     if ((N/2)>Rtreug(a, b, c)) // N/2 -радиус коробки. Сравниваем радиус коробки и радиус описанной около пряника окружности
     printf("%s","Y");  
     
     else printf("%s","N");}

  if (a==2)
     {scanf("%g%g", &a, &b);
      if ((N/2)>Rpryam(a, b))// N/2 -радиус коробки. Сравниваем радиус коробки и радиус описанной около пряника окружности
      printf("%s","Y");
     
      else printf("%s", "N");} }
     
      return 0;}


float Rpryam (float, float)
{R=(sqrt(a*a+b*b))/2;
 return R;}
 
 float Rtreug (float, float, float)
 {R=(a*b*c)/(4*(sqrt(((a+b+c)/2)*(((a+b+c)/2)-a)*(((a+b+c)/2)-b)*(((a+b+c)/2)-c))));// R находим по формуле с помощью формулы Герона. a*b*b/4*S
return R;}

 
 
 
 Re: Правильно ли такое решение? Олимпиадная задача
Сообщение16.08.2012, 21:20 
Ubermensch в сообщении #606649 писал(а):
Вот что исправил. Исправил только ошибки в scanf и printf.

Вы пропустили
Код:
scanf("%ld", &a);// а - первый элемент строки

Все же, надо воспользоваться советом
lim0n в сообщении #606641 писал(а):
Ошибки — не страшно, учитесь пользоваться отладчиком.

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

 
 
 
 Re: Правильно ли такое решение? Олимпиадная задача
Сообщение16.08.2012, 22:00 
Аватара пользователя
Цитата:
Вы пропустили
Код:
scanf("%ld", &a);// а - первый элемент строки

Так в этом случае число 100% будет без плавающей точки. То бишь удовлетворяет %ld. Или нужно, чтобы везде было одинаково - если %g, то везде %g.

Все, готово.

 
 
 
 Re: Правильно ли такое решение? Олимпиадная задача
Сообщение17.08.2012, 00:28 
Аватара пользователя
Ubermensch в сообщении #606811 писал(а):
Так в этом случае число 100% будет без плавающей точки. То бишь удовлетворяет %ld. Или нужно, чтобы везде было одинаково - если %g, то везде %g.

Спецификация формата определяет не только то, какие символы scanf будет читать во входном файле, но и какую переменную он ожидает, чтобы записать в неё в память получившееся значение. a у вас переменная типа float, а этот тип хранится в памяти иначе, чем int. scanf, доверяя вам, ошибочно считает, что там переменная типа int, записывает значение в формате int, и потом оказывается, что это содержимое памяти не годится как значение типа float. Иногда при таких ошибках можно нарваться и на то, что запись в одну переменную будет повреждать другие, соседние, и даже техническую информацию для вызова-возврата из функций, то есть приводить к вылетанию всей программы (в былые времена - и к вылетанию системы).

 
 
 
 Re: Правильно ли такое решение? Олимпиадная задача
Сообщение17.08.2012, 11:46 
Аватара пользователя
Munin в сообщении #606846 писал(а):
Ubermensch в сообщении #606811 писал(а):
Так в этом случае число 100% будет без плавающей точки. То бишь удовлетворяет %ld. Или нужно, чтобы везде было одинаково - если %g, то везде %g.

Спецификация формата определяет не только то, какие символы scanf будет читать во входном файле, но и какую переменную он ожидает, чтобы записать в неё в память получившееся значение. a у вас переменная типа float, а этот тип хранится в памяти иначе, чем int. scanf, доверяя вам, ошибочно считает, что там переменная типа int, записывает значение в формате int, и потом оказывается, что это содержимое памяти не годится как значение типа float. Иногда при таких ошибках можно нарваться и на то, что запись в одну переменную будет повреждать другие, соседние, и даже техническую информацию для вызова-возврата из функций, то есть приводить к вылетанию всей программы (в былые времена - и к вылетанию системы).

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

 
 
 
 Re: Правильно ли такое решение? Олимпиадная задача
Сообщение17.08.2012, 15:00 
Аватара пользователя
Ubermensch в сообщении #606958 писал(а):
У меня иногда бывает, что при компиляции компьютер перезагружается.

Это к вашим ошибкам не относится.

 
 
 [ Сообщений: 8 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group