Решите его математически сначала, затем переведите в код. Помните, что самая короткая строка между точкой и краем круга также пройдет через свой центр (как указано @litb).
Одной из наиболее важных особенностей C является его переносимость. На x86 у вас есть практически все языки программирования, но на некоторых других архитектурах C часто является единственным выбором в дополнение к сборке. Другое значение переносимости, как кто-то заметил, состоит в том, что большинство других языков программирования имеют привязки C. Когда у вас есть библиотека C, вы можете относительно легко получить API Perl или Python со скоростью, сравнимой с собственной библиотекой C. Кроме того, компиляторы C обычно намного более надежны, чем компиляторы C ++, и более развиты. Кто-то сказал мне, что это одна из многих причин, почему ядро Linux написано на C.
Распределенные системы контроля версий (DVCSes), например Git .
Приложение, над которым я работаю (блок, который управляет системами IP-камер), началось на C, потому что мы изначально разрабатывали его для очень маленькой встроенной системы, а C ++ не работал в Среда uclibc.
Со временем мы перешли на Regulac libc, но ядро приложения осталось на C. Есть некоторые части, в которых мы выиграем от объектно-ориентированного дизайна и исключений, но я думаю, что язык по-прежнему хорошо работает для нас.
Встроенные устройства, торговые алгоритмы, алгоритмы обработки звука, драйверы, ядро Linux и т. Д.
В моей текущей роли мы обычно пишем код C только при изменении устаревших систем ( VxWorks ядра) или иногда для простых инструментов или программ.
C также безумно портативный; (почти) каждая ОС и ядро имеют компилятор C, поэтому для приложений, требующих такой поддержки, C является одним из лучших доступных вариантов.
C ++ считается в целом лучше C, хотя я понимаю, что при строгом соблюдении условий, компиляторы C предпочтительнее - условия, такие как драйверы низкого уровня, небольшие встроенные системы и т. д.
И называйте меня старомодным, но я думаю, что C - лучший язык для обучения начинающих программистов - PHP, C ++, Java ... все они похожи на C по синтаксису - я начал изучать C 10 лет назад и теперь чувствую себя уверенно, что могу взяться за любой язык программирования. А потом там '
Пока было получено много хороших ответов. Другая причина заключается в том, что это наименее общий знаменатель - многие языки высокого уровня имеют среду выполнения, реализованную на C, и поддерживают написание расширений на C. Таким образом, если вы пишете библиотеку на C, она может быть доступна на самых разных языках. . Это не тот случай, если вы используете, скажем, Java или Python для реализации своей библиотеки. Инструментарий GTK + GUI и связанные библиотеки написаны на C именно с этой целью.
В наши дни я в основном занимаюсь Linux, и удивительное количество кода Linux написано на C, а не на C ++ или чем-то еще.
Есть очень веские причины, по которым ядро Linux, и в этом отношении другие ядра, такие как Darwin, различные дистрибутивы BSD и т. д., написаны на C. Вот некоторые из них:
C часто называют «переносимым языком ассемблера». Довольно легко мысленно «скомпилировать» простые операторы C для целевого процессора и представить, что произойдет, в терминах инструкций, регистров и так далее. И вы действительно хотите иметь возможность делать это при работе с ядром ОС.
Есть много библиотечных процедур, которые вы просто не можете использовать в ядре, например, malloc () или printf (), потому что они небезопасно в этом контексте. Вместо этого вы должны использовать специальные эквиваленты ядра. Проблема с C ++ заключается в том, что многие вещи, которые люди считают фундаментальными функциями языка, такими как оператор new, iostreams или автоматическое построение объекта в стеке, небезопасны в ядре в их конфигурациях по умолчанию. Возможно, вы сможете взломать что-нибудь, что будет работать, но гораздо проще придерживаться известного рабочего решения, которое заключается в использовании C.
Кодовая база уже написана на C, и это было бы огромным задание по преобразованию его в C ++.
Для данной архитектуры ЦП код, сгенерированный из C, довольно стандартизирован. Не так с C ++, особенно для таких вещей, как шаблоны и встроенные функции. Машинный язык C ++ довольно непредсказуем, и некоторые компиляторы C ++ создают действительно раздутый код. Это не то, что вам нужно от ядра, код которого должен быть предсказуемым, быстрым, и как можно меньше.
Многие другие функции "пользовательского пространства" в Linux также написаны на C. Некоторые из компонентов, над которыми я работаю, включают X Windows, GLib / GObject, GDK / GTK, Cairo, Pango и Clutter. Все это можно было бы написать или переписать на C ++, но, похоже, в мире Linux предпочтение отдается C.
Все, что связано с аппаратным обеспечением - в первую очередь драйверы устройств и встроенные системы. Вещи, где уровень абстракции C полезен для обеспечения некоторой переносимости, но что-то еще может помешать.
Причины, по которым можно увидеть написанный новый код C, включают:
Настоящий код приложения общего назначения (особенно там, где есть человек в цикле) ... не так много.
Я использую C для несистемного программирования. Моя работа связана с биоинформатикой . Причина, по которой я использую C, заключается в том, что существует множество очень хороших библиотек C, а подпрограммы очень загружают процессор.
C также легко связывается с другими языками. Таким образом, вы можете создать библиотеку на C и заставить ее работать с C ++, Python, Java, .NET, Ruby, PHP и т. Д. Это не так просто в обратном направлении.
Я знаю, что низкоуровневые драйверы обычно пишутся на C из-за простых предварительных и пост-условий для любой данной инструкции. У меня есть друг, который пишет низкоуровневые драйверы устройств для компании, занимающейся флэш-памятью, и весь код, который он пишет, написан на C.
C / C ++ также используется для повышения скорости, поэтому такие вещи, как видеоигры, по-прежнему пишутся на C / C ++. Торговые приложения в реальном времени, вероятно, также написаны на C.
Одна тема, о которой еще не упоминалось, - это скорость. Хотя многие компиляторы языков более высокого уровня хорошо справляются с этой задачей, если у вас есть приложение, которое должно работать очень быстро, или небольшой внутренний цикл кода, который вызывается много раз в среде, критичной к производительности, хорошо написанный код C часто может выполняют работу лучше, чем большинство других вариантов, за исключением машинного кода.
Когда я читал первое, было не сразу очевидно, что SomeProperty было логическим свойством, и что Bar () не возвращал логическое значение, пока вы не прочитаете часть else оператора.
Лично я считаю, что этот подход должен быть наилучшей практикой: Каждая строка кода должна быть настолько интерпретируемой, насколько это возможно, со ссылкой на как можно меньшее количество другого кода .
Поскольку первый оператор требует от меня ссылки на часть else в операторе, чтобы интерполировать, что и SomeProperty, и Bar () являются логическими по своей природе, я бы использовал вторую.
Во втором случае в одной строке кода сразу же очевидны все следующие факты:
Большинство встроенных систем, приложения HPC (здесь также много Fortran ), операционные системы, множество приложений Unix ( Apache и Sendmail )
Компиляторы / интерпретаторы для большинства других языков также могут содержать C в разной степени!
Как кто-то заметил, C используется там, где вы программируете близко к оборудованию. Это одна из основных причин, по которой C используется во многих приложениях робототехники. Существует множество кросс-компиляторов, которые позволяют кодировать на C, а затем переносить код на микропроцессор, микроконтроллер , встроенное устройство и даже процессоры DSP . Существуют даже специальные языки, основанные на C, например nesC , которые используются специально для программирования беспроводных датчиков малого радиуса действия.
Даже для тяжелой промышленной робототехники вы обнаружите, что программирование контроллеров низкого уровня выполняется на C и затем инженеры поместили графический интерфейс Java или C #, который взаимодействует с обширными библиотеками C.
Развитие языка, чтобы не писать на C.
Python - http://svn.python.org/view/python/trunk/Parser/
PHP - http://svn.php.net/viewvc/php/php-src/trunk/main/