2014 dxdy logo

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

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




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


21/06/12
184
Вот задача:
Изображение

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

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

код: [ скачать ] [ спрятать ]
Используется синтаксис 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 


16/06/10
199
Ошибки — не страшно, учитесь пользоваться отладчиком.
Разберитесь наконец с консольным вводом/выводом, проблемы с этим. Точнее, с бездумным использованием функции 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 
Аватара пользователя


21/06/12
184
Спасибо, 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 


01/07/08
836
Киев
Ubermensch в сообщении #606649 писал(а):
Вот что исправил. Исправил только ошибки в scanf и printf.

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

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

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

 Профиль  
                  
 
 Re: Правильно ли такое решение? Олимпиадная задача
Сообщение16.08.2012, 22:00 
Аватара пользователя


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

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

Все, готово.

 Профиль  
                  
 
 Re: Правильно ли такое решение? Олимпиадная задача
Сообщение17.08.2012, 00:28 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Ubermensch в сообщении #606811 писал(а):
Так в этом случае число 100% будет без плавающей точки. То бишь удовлетворяет %ld. Или нужно, чтобы везде было одинаково - если %g, то везде %g.

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

 Профиль  
                  
 
 Re: Правильно ли такое решение? Олимпиадная задача
Сообщение17.08.2012, 11:46 
Аватара пользователя


21/06/12
184
Munin в сообщении #606846 писал(а):
Ubermensch в сообщении #606811 писал(а):
Так в этом случае число 100% будет без плавающей точки. То бишь удовлетворяет %ld. Или нужно, чтобы везде было одинаково - если %g, то везде %g.

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

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

 Профиль  
                  
 
 Re: Правильно ли такое решение? Олимпиадная задача
Сообщение17.08.2012, 15:00 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Ubermensch в сообщении #606958 писал(а):
У меня иногда бывает, что при компиляции компьютер перезагружается.

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group