Язык C (c++)

Интересные алгоритмы, олимпиадные задачи, эффектные и эффективные решения. freepascal, delphi, c, c++, c#, java, javascript, perl, ruby, python, php, bash, wsh и т.д. Компиляторы, интерпретаторы, линкеры, отладчики, системы контроля версий и многое другое.

Модератор: xdsl

Язык C (c++)

Сообщение Vladislav_133 11 фев 2009, 22:00

Волею судеб веду сейчас спецкурс у пятого курса учителей. Оказывается, многие из них очень интересуются программированием (хотя, так и должно быть). Спецкурс посвящен С. Мне показалось, что было-бы интересно пообсуждать этот язык. Ведь это ж, в конце концов, классика.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Язык C (c++)

Сообщение blacksmith 11 фев 2009, 22:30

Vladislav_133 писал(а):Волею судеб веду сейчас спецкурс у пятого курса учителей. Оказывается, многие из них очень интересуются программированием (хотя, так и должно быть). Спецкурс посвящен С. Мне показалось, что было-бы интересно пообсуждать этот язык. Ведь это ж, в конце концов, классика.

<offtop>Хотите научить их простреливать себе ногу? )</offtop>
blacksmith
 

Re: Язык C (c++)

Сообщение Vladislav_133 11 фев 2009, 22:42

Это в смысле мучиться? Дак нет, они (т.е. интересующаяся часть) занимаются с удовольствием.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Язык C (c++)

Сообщение blacksmith 11 фев 2009, 23:31

Vladislav_133 писал(а):Это в смысле мучиться? Дак нет, они (т.е. интересующаяся часть) занимаются с удовольствием.

Хе-хе, это я вспомнил старую шутку про сравнение языков программирования. :)
задача: прострелить себе ногу

C: Вы простреливаете себе ногу.

C++: Вы случайно создаете дюжину экземпляров объекта «вы» и всем им простреливаете ногу. Срочная медицинская помощь оказывается невозможной, так как вы не можете разобраться, где настоящие объекты, а где – те, которые только указывают на них и говорят: «А вот – я!».

Фортран: Итерактивно вы простреливаете каждый палец ноги, а когда пальцы заканчиваются, загружаете следующую ногу и продолжаете. Когда пули заканчиваются, вы все равно продолжаете попытки прострелить себе ноги, потому что не имеете возможности обработать такую особую ситуацию.

Паскаль: Транслятор не позволит вам прострелить себе ногу.

Форт: Hога простреливать себе вы.

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

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

Модула-2: После того, как вы понимаете, что фактически ничего не можете сделать на этом языке, вы простреливаете себе голову.
blacksmith
 

Re: Язык C (c++)

Сообщение Vladislav_133 11 фев 2009, 23:47

Остроумно, особенно насчет фортрана и C++.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Язык C (c++)

Сообщение blacksmith 12 фев 2009, 00:24

Ada: После тщательного описания пакета «нога», вы пытаетесь одновременно зарядить пистолет, нажать курок, завопить и выстрелить себе в ногу. В ходе попыток обнаруживается, однако, что вас постигла неудача, так как ваша нога оказалась неверного типа.

Кобол: Hаводите ПИСТОЛЕТ COLT 45 на HОГА.СТОПА, Затем помещаете РУКА.КИСТЬ.ПАЛЕЦ на ПИСТОЛЕТ.КРЮЧОК и HАЖИМАЕТЕ. Затем возвращаете ПИСТОЛЕТ в КОБУРА. ПРОВЕРЬТЕ, нуждаются ли шнурки в повторном связывании.

LISP: Вы простреливаете себе отросток, который держит пистолет, с помощью которого вы простреливаете себе отросток, который держит пистолет, с помощью которого вы простреливаете себе отросток, который держит пистолет, с помощью которого вы простреливаете себе отросток, который держит пистолет, с помощью которого вы простреливаете себе отросток, который...

Бейсик: Вы простреливаете себе ногу из водяного пистолета. В расширенных реализациях языка продолжайте, пока вся нижняя часть тела не промокнет.

Visual Basic: Hа самом деле вы будете только выглядеть, как будто ваша нога прострелена. Однако в процессе реализации вы получите столько удовольствия, что подобные мелочи вас не озаботят.

Hyper Talk: Поместите первую пулю пистолета в ступню левой ноги вас. Сообщите результат.

Motif: Вы затрачиваете несколько дней на построение UIL – описания вашей ноги, пули, ее траектории и замысловатой резьбы по слоновой кости на рукоятке пистолета. Когда вы наконец-то управились и готовы нажать на курок, пистолет закупоривается.

APL: Вы простреливаете себе ногу, затем тратите весь день на то, чтобы представить себе, как это сделать с меньшим количеством символов.

Снобол: Если вам удастся, прострелите себе левую ногу. Если не удастся, то прострелите себе правую ногу.

Unix:
% ls
Foot.c foot.h foot.o toe.c toe.o
% rm * .o
rm: .o no such file or directory
% ls
%

Параллельный Euclid: Вы простреливаете себе чью-то чужую ногу.

Язык управления заданиями IBM/370: Вы посылаете свою ногу в управляющую информационную систему с приложением документа на 400 страниц, точно описывающего, как именно вы хотите быть простреленным. Через три года ваша нога возвращается с глубоким ожогом.

Paradox: Не только вы можете прострелить себе ногу, но и ваши пользователи.

Access: Вы пытаетесь прицелиться в вашу ногу, но в результате простреливаете все Борландовские дистрибутивные дискеты.

Revelation: Вы уверены, что сможете прострелить себе ногу, как только разберетесь, для чего служат эти маленькие хорошенькие пульки.
blacksmith
 

Re: Язык C (c++)

Сообщение blacksmith 12 фев 2009, 00:29

Java: После импорта java.awt.right.foot.* и java.awt.gun.right.hand.*, записи классов и методов, необходимых для этих классов, вы забываете, что вы, чёрт возьми, делаете.

Javascript: ВЫ усовершенствовали здравый, богатый пользовательский опыт для того, чтобы выстрелить себе в ногу. Потом вы понимаете, что в вашем пистолете отключены пули.

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

PHP: Вы стреляете себе в ногу из пистолета, сделанного из частей 500 других пистолетов.

ASP.NET: У Вас есть выбор: прострелить себе ногу быстро, но входное отверстие будет унылым, или вы проковыряете отверстие в ноге дулом пистолета, и входное отверстие будет оригинальным.

Perl: Вы стреляете себе в ногу и никто не может понять, как вы сделали это. Через шесть месяцев не можете и вы.

CSS: Вы стреляете с одной руки в правую ногу, потом меняете руку, чтобы выстрелить в другую ногу и обнаруживаете, что пистолет превратился в банан.

Питон: Вы пытаетесь выстрелить себе в ногу, но то и делаете, что попадаете промеж пальцев.

BrainFuck: Вы палите наугад из безумной смеси пистолета и экскаватора, урановыми медведями. В конце концов вам удается попасть в изогнутую по синусоиде "ногу."

VHDL: Вы аккуратно описываете компоненты "нога", "рука", "пистолет" и "пуля". Любовно их отлаживаете и моделируете по отдельности. После синтеза всей системы обнаруживается, что нога и пистолет активируются на чётных тактах сигнала синхронизации, а рука и пуля на нечётных.
blacksmith
 

Re: Язык C (c++)

Сообщение xdsl 12 фев 2009, 10:27

А первоисточник?
xdsl
 
Сообщения: 1236
Зарегистрирован: 09 дек 2008, 05:16
Откуда: ВЦ ШГПИ
Полное имя: Слинкин Д.А.

Re: Язык C (c++)

Сообщение blacksmith 12 фев 2009, 16:46

Нету первоисточника. За давностью лет потерялся.
Едиственное, что точно известно, так это то, что текст произошел от одной цитаты... ;) http://www.quotes.net/quote/9012
blacksmith
 

Re: Язык C (c++)

Сообщение Vladislav_133 22 май 2009, 10:54

(Статья взята с одного из лучших программистких сайтов http://www.rsdn.ru)

С++ulture

Такой вещи, как идеальный текст, не существует. Как не существует идеального отчаяния.
Харуки Мураками, «Слушай песню ветра».

Что такое хороший язык программирования и каким он должен быть? Всякое люди говорят – тут тебе и дуракоустойчивость (прошу прощение, «защита от новичка»), и Тьюринг-полнота, и формализуемость, и еще 1024 критерия. Ерунда. Все нижеследующее просьба рассматривать как эссе в вольном стиле, а не научную статью.

Бывают языки красивые, бывают строгие, бывают такие, которым легко обучиться, бывают такие, на которых легко писать. Их не используют.
Бывают такие, в которых черт ногу сломит – и на них пишет полмира(сноска: Программистского мира, естественно, раз уж мы о языках программирования.), но никто не любит.
Бывают языки сложные и неочевидные: чтобы писать на них хорошие программы, нужно учиться несколько лет и прочесть кучу книг. В них влюбляются, им посвящают стихи, о них спорят до хрипоты, визга и метания в собеседника банановой кожуры.

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

***
Один мой коллега (и все профессора в моем институте) верят, что главное – это научиться программированию. Мол, человек, умеющий программировать вообще, за пару недель освоит новый язык и будет писать на нем великолепные программы. Поэтому в университетских курсах огромное количество сухой(сноска: Ну, черт с ней, полусухой.) теории, а языки преподаются на уровне пресловутого «Хелло Ворлд». Но это все равно, что научить стихосложению вообще – а потом студент за пару недель осваивает финский или хинди и выдает первоклассные стихи, входит в историю поэзии и энциклопедический словарь. Вроде абсурд получился.
Каждый язык программирования – из тех, в которые влюбляются – порождает свою культуру. Совершенно так же, как человеческий язык. У него есть свой букварь(сноска: Кафедра Программного обеспечения, курс «Язык С++», 48 часов. (с) расписание 2-го курса.). Но это – только самое-самое начало. Есть лексика – и даже нецензурная(сноска: Скажите любому опытному С++-программисту магическое слово goto. Только с безопасного расстояния.) (как и в естественном языке, иногда она бывает к месту). Есть синтаксис. Это все вещи понятные, относительно легко изучаемые и относительно легко формализуемые. Именно поэтому можно автоматизировать проверку синтаксической и лексической правильности как программы, так и данной статьи.
Но и это все – лишь начало. Ни «Война и мир», ни «безбашенная» проза Харуки Мураками, ни «Linux» – не являются математически стройными системами. Их нельзя назвать написанными «правильно» или «неправильно». Более того, и то, и другое, и третье можно было написать несчетным(сноска: В математическом, а не поэтическом значении этого слова.) количеством различных способов – но написаны (и ценны) они именно такими.
Нельзя «научить» писать эпиграммы, сказки или статьи, которые нравятся редакторам «Компьютерры». Каждое такое произведение – это результат творческого переосмысления опыта предыдущих поколений + немножко вдохновения + владение языком + собственный стиль. Нельзя научить писать программы на C++ – это результат [см. выше].
***
У этого языка есть свои идиомы – краткие, но очень емкие конструкции. Есть традиции – и возможность плевать на них. Есть свобода выбора стиля. Есть возможность различными словами написать одну и ту же фразу. Есть классика – и есть классики: Бьярн Страуструп, Джефф Элджер, Герб Саттер, Николай Джосаттис. На этом языке можно сказать двусмысленность – и не получить линейкой по рукам от компилятора(сноска: …а трое суток искать, почему программа вылетает, когда i=17.). Здесь есть место творчеству – здесь есть место спорам – здесь есть место 48-часовым марафонам по отладке программ. Есть тонкости, доступные только снобам. Здесь нет только одного – места, где можно было бы остановиться и сказать: все, ничего нового для меня в этом мире не осталось.

***
Поймите меня правильно – пользователю, в общем-то, плевать, на каком языке написана программа и насколько освоился в этом языке ее автор. В отличие от написания текстов, в программировании конечный продукт очень слабо связан со стилем и культурой автора текста(сноска: Естественно, связан сильно, но совершенно неочевидно для конечного потребителя.). Тем не менее, программа, которой «еще жить и жить» от версии к версии, просто обязана быть красивой – а не то в следующей версии никто уже не поймет, куда там дописывать новый кусок и почему старый до сих пор работает и «черт побери, кто вообще это писал?!» Но я вам другое скажу – программа, написанная с любовью и вдохновением, все же немножко другая. Не такая, как вышедшая из-под клавиатуры человека, любимая фраза которого «Надо сидеть и педалить код».
***
Поймите меня правильно еще раз. С++, будучи изначально и по определению промышленным языком, является крайне неудачным выбором для промышленного производства. Там нужен язык другой – пригодный для производства штампованных программ штампованными программистами. Язык, который подразумевает только один вариант выражения мысли. Язык, на котором десять разных программистов по одному и тому же заданию напишут практически идентичный код(сноска: Кстати, это уже шаг в сторону автоматической генерации программ или «Цель деятельности всех программистов – чтобы их деятельность стала не нужна».). Язык, в котором шаг влево, а равно и шаг вправо просто нельзя выразить средствами языка.
Язык, который никто и никогда не будет любить.
***
Я – программист. Мой любимый язык – С++. Это отвратительный язык. Я могу сказать на нем любую глупость. Мне не помогут и двести книг. Девятый вариант строчки тоже не сработал. Я безнадежен.


Статья во многом созвучна моим представлениям о программировании. Я всегда считал, что программирование и писательство очень близкие виды деятельности.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Язык C (c++)

Сообщение xdsl 23 май 2009, 08:27

Очень похоже на: "Велик и могуч русский язык" (с) Л.Н.Толстой
xdsl
 
Сообщения: 1236
Зарегистрирован: 09 дек 2008, 05:16
Откуда: ВЦ ШГПИ
Полное имя: Слинкин Д.А.

Re: Язык C (c++)

Сообщение Vladislav_133 23 май 2009, 11:56

xdsl писал(а):Очень похоже на: "Велик и могуч русский язык" (с) Л.Н.Толстой


Вроде того.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Язык C (c++)

Сообщение Vladislav_133 17 окт 2012, 12:50

Начал вести записки по языку C/C++.

http://shgpi.edu.ru/pirogov/c++/

Заходите, делайте замечания, пожелания, особенно, если ошибку найдете.
Можно здесь, либо мне письмом (там указано, как).
Это не книга и не учебное пособие. Изложение не систематическое.
Но может быть со временем что-то получится интересное.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Язык C (c++)

Сообщение xdsl 23 окт 2012, 10:13

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

Вместо этого можно взять, например, классическую задачи нормализации координат прямоугольника. Суть: прямоугольник задается координатами двух противолежащих углов. Вариант по умолчанию: левый-верхний и правый-нижний, однако существуют и другие корректные варианты: левый-нижний - правый верхний, правый-нижний - левый-верхний, правый-верхний - левый-нижний. Задача заключается в приведении координат прямоугольника к варианту по умолчанию.
rect.png
rect.png (4.49 Кб) Просмотров: 8253

Вот что у меня получилось:
Вариант для C:
Подсветка синтаксиса: (norm.c) [ Загрузить ] [ Скрыть ]
Подсветка синтаксиса языка cpp
  1. #include <stdio.h>
  2.  
  3. int normalize(int *x1, int *y1, int *x2, int *y2)
  4. {
  5.  int tmp;
  6.  int result=0;
  7.  if (*x1>*x2) {tmp=*x1; *x1=*x2; *x2=tmp; result++;}
  8.  if (*y1>*y2) {tmp=*y1; *y1=*y2; *y2=tmp; result++;}
  9.  return result;
  10. }
  11.  
  12. int main()
  13. {
  14.  int x1=10,y1=10,x2=20,y2=20;
  15.  if (normalize(&x1,&y1,&x2,&y2)) puts("Нормализация проведена"); else puts("Нормализация не требуется");
  16.  printf("Результат: (%d,%d)-(%d,%d)\n",x1,y1,x2,y2);
  17.  return 0;
  18. }


Вариант для C++:
Подсветка синтаксиса: (norm.cpp) [ Загрузить ] [ Скрыть ]
Подсветка синтаксиса языка cpp
  1. #include <stdio.h>
  2.  
  3. int normalize(int &x1, int &y1, int &x2, int &y2)
  4. {
  5.  int tmp;
  6.  int result=0;
  7.  if (x1>x2) {tmp=x1; x1=x2; x2=tmp; result++;}
  8.  if (y1>y2) {tmp=y1; y1=y2; y2=tmp; result++;}
  9.  return result;
  10. }
  11.  
  12. int main()
  13. {
  14.  int x1=10,y1=10,x2=20,y2=20;
  15.  if (normalize(x1,y1,x2,y2)) puts("Нормализация проведена"); else puts("Нормализация не требуется");
  16.  printf("Результат: (%d,%d)-(%d,%d)\n",x1,y1,x2,y2);
  17.  return 0;
  18. }


Сишный вариант будет компилироваться как сишным компилятором, так и компилятором C++.

P.S.
Только вот C++, вобрав в себя возможности C, добавила, на мой взгляд, избыточную возможность передачу данных в функцию по ссылке.
Избыточно с точки зрения строгости и однозначности синтаксиса. Но с точки зрения упрощения кодирования - очень на мой взгляд полезная возможность. Паскалевская такая, теплая, домашняя ;)
xdsl
 
Сообщения: 1236
Зарегистрирован: 09 дек 2008, 05:16
Откуда: ВЦ ШГПИ
Полное имя: Слинкин Д.А.

Re: Язык C (c++)

Сообщение Vladislav_133 26 окт 2012, 11:57

Конечно, с точки зрения безопасности кодирования в C++ появились дополнительные возможности.
И передача параметров по ссылке - как раз один из примеров. Можно также добавлять модификатор const, чтобы
запретить изменять параметр в функции.

Тут дело вкуса. А мне больше нравится чистый C-синтаксис.

Программирование на C подобно быстрому танцу на полу, только что натёртом воском, среди людей с острыми бритвами в руках
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.


Вернуться в Алгоритмизация и программирование

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

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