ibash.org.ru - Новый цитатник Рунета

Форум: Научить программировать 1 2 3 4 > [RSS]

Форум: Вход Регистрация Участники Поиск RSS

NoName_NoFame
06.12.2009 - 02:12

Дано:
Быдлокодер (ваш покорный слуга), коему не в лом тратить своё драгоценное время на всякие глупости
Девушка (мозг, вроде бы на месте. По крайней мере дискретку ту же понимать понимает)
Энное количество времени
Компилятор
Надо:
Получить девушку, которая в состоянии написать простенькую 300-500строчную программу на С++ (конвертор чисел из одной позиционной системы счисления в другую, с периодами и защитой от дурака, например) и получить от этого моральное удовлетворение.

Хочется услышать ваши идеи и комментарии по поводу вопроса.

#101
#101 - 07.12.2009 - 22:48

>все пишут на C++
Насколько я знаю, C++ в наши дни активно используется разве что в геймдеве из-за того, что там особо критично быстродействие. А сам язык (имхо) довольно противный, с большим количеством тонкостей и подводных камней. При программировании нужно не сражаться с языком, а решать конкректную задачу наиболее оптимальным путём. И знать нужно не один, а несколько языков, желательно хотя бы по одному для каждой основной парадигмы (процедурная, ООП, ФП). И уж точно нельзя цепляться за одну парадигму (например, за ООП) - золотого молотка не существует. (Кстати, про ООП - C++ НЕ поддерживает ООП в строгом смысле этого понятия).

По сабжу: План обучения программированию мне видится примерно следующим:
1) Основы: процедурное программирование - алгоритмы, структуры данных, процедуры/функции. Особое внимание на то, чтобы не лепить весь код в одну функцию (как это делают многие новиички), а грамотно разбивать на подзадачи. Потом это станет привычкой, а это ОЧЕНЬ плохая привычка. Язык желательно со статической типизацией. (Динамическая типизация поначалу может развращать). Можно начать с C (без плюсов), но тогда сразу придётся рассказывать про указатели и прочее низкоуровневое представление вещей, или, что ещё хуже, объяснять на уровне "магических конструкций" (для ввода числа пиши scanf("%d", &varName), а что такое &varName узнаешь как-нибудь потом), что ещё хуже. Как вариант - начать с паскаля, а потом перейти к C. (Вообще, C желательно изучить, так как несколько полезных языков на нём основаны).
2) Вот теперь можно вынести мозг всяким матаном в виде ФП. Из языков могу порекомендовать Scheme или Erlang. У обоих языков довольно простой синтаксис (учится за день), что позволяет быстро перейти к осознанию самой концепции.
3) ООП. Только не C++, а что-нибудь более Ъ. Ruby хорош. Также хорош Objective-C. Smalltalk - Ъ и вообще родоначальник ООП, но реально используется реже, однако тоже хороший вариант.
4) Теперь, когда база усвоена, можно изучать практически любой язык - на основе предыдущих вариантов остаётся разобраться только с основными идиомами, а остальное уже изучено.

Примерное время обучения (из расчёта по одному занятию на каждый день):
1) 2-3 недели (1-2 недели на основы и изучение языка, 1 неделя - на оттачивание навыков).
2) 1-2 недели (1 неделя - на вкуривание концепции, 1 неделя - на оттачивание навыков)
3) 1-2 недели (1 неделя - на вкуривание концепции, 1 неделя - ...ну ты понял)

NoName_NoFame
#102 - 08.12.2009 - 09:29

#101
>>1) Основы: процедурное программирование - алгоритмы, структуры данных, процедуры/функции.
В таком порядке? 0_о
>>сразу придётся рассказывать про указатели
Рассказал уже. В принципе она в состоянии понять такое. По крайней мере нечто вроде
void swap (int* a, int* b)
{
int c=*a;
*a=*b;
*b=c;
}
написать может. Теперь осталось разобраться с окончательным пониманием массивов и тех же циклов (объяснял их через инварианты, теперь частично жалею... Но ничего более разумного я придумать не могу по этому поводу), и можно переходить к мучению девушки алгоритмами.
>> Можно начать с C (без плюсов),
А почему без плюсов?
>> Особое внимание на то, чтобы не лепить весь код в одну функцию (как это делают многие новиички), а грамотно разбивать на подзадачи
Вот этим надо заняться, да. Без моего тыка сверху код на функции не делит...

unikoid
#103 - 08.12.2009 - 09:40

>Теперь осталось разобраться с окончательным пониманием массивов и тех же циклов (объяснял их через инварианты, теперь частично жалею... Но ничего более разумного я придумать не могу по этому поводу), и можно переходить к мучению девушки алгоритмами.
Так это ж все в школе объясняют. Как жеж она егэ сдавала?! Да, алгоритмами, имхо, нужно мучать по ходу обучения конструкциями, это лучше дает понять, как устроена и для чего нужна та или иная конструкция.

>void swap (int* a, int* b)
{
int c=*a;
*a=*b;
*b=c;
}

А почему не ссылками?
void swap(int &x, int&y)
{
int c = y;
y = x;
x = c;
return;
//Правда, это, ЕМНИП, только для С++ работает, но не для чистого С.
}
>А почему без плюсов?
Потому что для начала нужно как следует разобраться с процедурным программированием, а потом уж вникать в ООП, ФП, шаблоны и т. д. Ну и плюс недостатки С++, кои тут в принципе уже обсудили.

X-Ray
#104 - 08.12.2009 - 15:06

LISP рулит ( Не путать с "Lot of Idiotic and Stupid Parentheses")!

#105
#105 - 08.12.2009 - 15:50

>В таком порядке? 0_о
Порядок тут может быть любой, лишь бы понятно было.

>Рассказал уже. В принципе она в состоянии понять такое.
Вот и прекрасно. Значит, можно начинать сразу с C
ещё и время обучения
>А почему без плюсов?
При изучении первого языка для каждой парадигмы учатся две вещи: сам язык и, собственно, парадигма. Вдвойне сложно при изучении, вообще, самого первого языка. Поэтому, имхо, не стоит создавать лишние сложности при обучении и сосредоточиться не на языке, а на понимании парадигмы и умении её применить. Не должно быть проблем: "Моя программа не компилиться". Должны быть проблемы: "Моя программа не работает". А C++ - язык довольно тяжёлый, как я уже говорил. Однако, после того, как основная концепция будет вкурена, C++ будет изучить намного легче, так что в итоге можно ещё и сэкономить на времени обучения.

naryl
#106 - 08.12.2009 - 16:33

#104 +1 ;)

NoName_NoFame, про плюсы можешь вообще забыть. В качестве первого языка выбираешь C, по причинам, упомянутым #105. В качестве следующего - Scheme по SICP. По C она начинает понимать основы и структурную парадигму. По Scheme - остальные. Потому что Scheme не просто позволяет их использовать, он позволяет их реализовать на себе.

#107
#107 - 08.12.2009 - 17:15

>В качестве следующего - Scheme по SICP. По C она начинает понимать основы и структурную парадигму. По Scheme - остальные. Потому что Scheme не просто позволяет их использовать, он позволяет их реализовать на себе.
+1

VovanZ
#108 - 08.12.2009 - 17:24

Я знаю только Pascal, и пишу на Delphi и Lazarus Free Pascal.... Скажите у меня есть какой-нибудь шанс стать человеком? Доктор, я буду жить?!

naryl
#109 - 08.12.2009 - 17:30

Да. Срочно приступай к плану #101, пока C++ с PHP не выучил :)
Потом учи и пиши на чём хочешь.

VovanZ
#110 - 08.12.2009 - 17:34

#109 - спасибо, доктор, вы дали мне надежду!

X-Ray
#111 - 08.12.2009 - 18:10

#108 +1 :)

NoName_NoFame
#112 - 08.12.2009 - 22:06

#103
1. Не ссылками т.к. пока требую указателями.
2. Кто мешает писать на плюсах без ООП? А cout удобнее printf в некотором смысле...
#104
В любом случае - лабы требуются на плюсах :(
#105
За чистый С злобный препод бьёт страшной железной линейкой :( Но да, идея вообще понятна.
#106-107
Оки, понятно, спасибо за поддержку и дельные идеи *ушел читать SICP*

#113
#113 - 08.12.2009 - 22:18

>А cout удобнее printf в некотором смысле...
Не думаю. Придётся объяснять про то, что такое <<. Есть два пути: 1) Сказать, что это "магия" (я уже высказывал своё отношение к такому подходу: магии быть не должно. Должна быть система знаний.) и 2) рассказать про перегрузку операторов, что опять же означает введение ненужных сущностей в самом начале обучения.

>За чистый С злобный препод бьёт страшной железной линейкой :( Но да, идея вообще понятна.
Ух. Не повезло с преподом :( (Вообще, преподавание программирования у нас в большинстве ВУЗов совершенно странное.)

NoName_NoFame
#114 - 08.12.2009 - 22:39

#113
1. А вопросов особо нет... Хотя да, признаю свою неправоту.
2. Угу. Ну, он вроде бы только начинает. Может со временем станет чем-нибудь не таким уж и плохим...

злобный препод
#115 - 09.12.2009 - 07:19

#113

есть такое противное понятие как "рабочая программа" и за отклонение от оной декан "бьёт страшной железной линейкой (с)"

unikoid
#116 - 09.12.2009 - 11:50

>2. Кто мешает писать на плюсах без ООП? А cout удобнее printf в некотором смысле...
Так это (за незначительными исключениями) и есть чистый С. А использование cout/cin и прочего - это уже ООП. И это надо либо объяснять целиком или ссылаться на магию.

unikoid
#117 - 09.12.2009 - 11:52

№115, а в "рабочей программе" прям написано, какие операторы и функции использовать, да?
//Нас пока учат С, ссылаясь на С++ в тех моментах, где проявляются различия (те же ссылки, как пример).

naryl
#118 - 09.12.2009 - 13:19

> Так это (за незначительными исключениями) и есть чистый С.

Уже давным-давно нет. Даже C99 содержит фичи, отсутствующие во всех стандартах C++.

xserg
#119 - 09.12.2009 - 13:30

davelos videt' lntel fortran compiler dlya m$ studio.
skazhite plz, pochemu tam takoy idiotskij sintaksis? ili eto v fortrane vsegda tak i bylo?

unikoid
#120 - 09.12.2009 - 13:48

#118, спасибо, значит те книжки, по которым я учился и наши преподы слегка отстали от жизни. То-то я с ходу и примера не вспомнил, чтоб различия были, даже в ссылках неуверен был.

unikoid
#121 - 09.12.2009 - 13:51

#119, открыл учебник по математике за 1981 год, посмотрел примеры программ. С ходу ничего особо страшного не увидел, только что все в верхнем регистре написано.

naryl
#122 - 09.12.2009 - 14:32

unikoid, я ни C ни C++ много не пишу в последнее время, но уверен, что variable-length arrays и structs в C++ нет.

struct myStruct {
int self_length;
char msg[];
};

myStruct окажется переменной длинны, а msg - не указателем на массив, а самим массивом, т.е. данными, но его длинна может быть разная для разных деклараций экземпляров myStruct.

unikoid
#123 - 09.12.2009 - 15:19

Да, это так. Вот, соответственно и разница. В книжке то я об этом читал, а вот на лекциях ни слова про это не сказали, видимо обучают по С89.

Кто-то
#124 - 09.12.2009 - 16:14

xserg, фиксированный формат фортрана, конечно, полная лажа, а вот свободным (есть начиная с Fortran 90) вполне юзабелен.

злобный препод
#125 - 09.12.2009 - 18:26

#117
unikoid, там написано на основе какого языка вести обучение, и хорошо если там написано Си а не Паскаль

smb.
#126 - 09.12.2009 - 19:11

>и хорошо если там написано Си а не Паскаль
А чем плох Паскаль?

злобный препод
#127 - 09.12.2009 - 20:35

А с паскаля потом на другие языки никто переходить не хочет, с паскаля переходят на дельфи и на этом процесс развития заканчивается.

unikoid
#128 - 09.12.2009 - 20:43

Но посмотрев на паскаль после С не хочется переходить на паскаль. Хотя для обучения процедурному программированию и алгоритмизации в чистом виде паскаль, имхо, хорош. Для этого он, собсно, и предназначался.

naryl
#129 - 09.12.2009 - 21:37

Паскаль - замечательный пример простого, стройного, но бесполезного языка. Как и большинство творений проф. Никлауса Вирта.

#130
#130 - 10.12.2009 - 00:16

Для разнообразия напишу по теме...
может кто-нибудь порекомендовать книгу, если таковая вообще была написана, доходчиво описывающую программирование, начиная с уровня"написать хеллоуворлд в дэлфи" и заканчивая пониманием положений всех основных парадигм программирования, и разницей между ними, ну, и необходимые навыки чтобы это понимание как-то использовать в своих корыстных целях :) Акцентирую внимание, что хотелось бы именно понять, грубо говоря, КУДА копать а не КАК копать... иными словами, не вызубрить синтаксис к\л языка или набора языков, а получить навыки, необходимые для того, чтобы впоследствии, потратив неделю\другую на изучение синтаксиса языка была возможность с максимальной эффективностью использовать... также, язнаю что такое гугиль и википедия, но читая то что там написано, я ощущаю что я по уровню умственного развития нахожусь где-то между дубовым поленом и табуреткой, и, кроме того, разрозненную инфу труднее усвоить,по крайней мере, для меня, потому и прошу дать информацию об одной книге, где всё это было бы систематизировано и выстроено в порядке, в котором это можно усвоить... может хоть это мне поможет =_=

#131
#131 - 10.12.2009 - 00:18

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

VMChaZ
#132 - 10.12.2009 - 00:21

Пост выше - замечательный пример поста без аргументации. Жаль,здесь нет лички - я бы попросил перечислить недостатки такого Паскаля, в который он развился сейчас (синтаксис последних версий FPC и Delphi 7) (Не в этой теме - потому, что не хочу уводить тему в холивар).

VMChaZ
#133 - 10.12.2009 - 00:22

Прошу прощения, указатель "пост выше" является ссылкой на пост 129

ilik
#134 - 10.12.2009 - 03:18

#130 Кормен, Кнут, Ахо, Вирт, Седжвик. Это по алгоритмам книжки. Читай - интересно и полезно.

аноним
#135 - 10.12.2009 - 07:55

тут лежат http://e-maxx.ru/bookz/

аноним
#136 - 10.12.2009 - 07:56

кстати перцы с этого сайта упорно всё пишут на c++ и java
к чему бы это?

unikoid
#137 - 10.12.2009 - 16:21

#129, Если мне не изменяет память, паскаль задумывался как учебный язык. Со данной задачей он справляется на отлично, имхо. Ибо позволяет писать строго процедурные программы, понимая алгоритмы и не заморачиваясь на особенностях реализации, вроде того же ручного управления памятью, указателей, форматов ввода-вывода и т. д.

3213
#138 - 10.12.2009 - 17:43

#135
Есть подобный архив в fb2?

John Fremlin
#139 - 10.12.2009 - 18:51

Паскаль, С, Ruby, etc не нужны! На них хороший блог не сделаешь! Учите лисп!

Кто-то
#140 - 10.12.2009 - 22:12

Ты же имел в виду самозаполняющийся блог? Ну тогда конечно

3113
#141 - 10.12.2009 - 22:46

#139
/me представил блог на паскале
гыгы

White5178
#142 - 12.12.2009 - 12:33

>>А с паскаля потом на другие языки никто переходить не хочет, с паскаля переходят на дельфи и на этом процесс развития заканчивается.
не правда, сам начинал с паскаля/делфи, ща изучаю с++, java, php....
размышляю над асемблером, но послений - туговат

аноним
#143 - 12.12.2009 - 18:52

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

naryl
#144 - 12.12.2009 - 19:06

White5178, асм намного проще и логичнее, чем C++. Возможно проблема в том, что вы забыли познакомиться с архитектурой ПК.

unikoid
#145 - 12.12.2009 - 19:13

naryl, да, он проще и логичнее, но писать на нем большие программы - весьма неудобно. Да и смысла особого нет, имхо, лучше комбинировать код на С/другом языке с ассемблерными вставками.

naryl
#146 - 12.12.2009 - 19:17

White5178 утверждает, что у него проблемы с "размышлением" над ассемблером, а не написанием больших программ. ;)

аноним
#147 - 12.12.2009 - 20:16

unikoid, а часто ли ассемблерные вставки получаются лучше чем у компилятора? и большой ли они дают выигрыш?

#148
#148 - 12.12.2009 - 21:30

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

naryl
#149 - 12.12.2009 - 21:40

т.е. в тех случаях, когда причиной их использования стал недостаточно умный компилятор ;)

аноним
#150 - 12.12.2009 - 22:03

говорят у интела хороший компилятор сишный, который странным образом очень хорошо знает архитектуру процессора
и который сводит на нет все потуги по изготовлению высокоуровневых потоков, т.к. умеет сам делать низкоуровневые при наличии директивы специальной в коде
К списку вопросовСтраницы: 1 2 3 4 >

Быстрый ответ
Имя:      Пароль:    
Текст сообщения:

«ibash.org.ru — Новый цитатник Рунета» Почта вебмастера: imail@ibash.org.ru