Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Изучаем программирование – советы

2544  1 2 3 все
AlexNek патриот04.05.15 21:12
AlexNek
NEW 04.05.15 21:12 
Предлагаю записывать сюда Ваши рекомендации.
А пока что то типа введения, как оно видится лично мне.
#1 
AlexNek патриот04.05.15 21:13
AlexNek
NEW 04.05.15 21:13 
в ответ AlexNek 04.05.15 21:12, Последний раз изменено 07.05.15 18:47 (AlexNek)
Под программированием подразумевают процесс создания программ и не обязательно только для компьютера. Но нас будут интересовать именно компьютерные программы, где мы будем говорить компьютеру что ему делать. Есть еще и другие способы решения задач но мы не будем отвлекаться на них.
Однако , что бы кому то говорить, что ему делать нужно вначале самому знать, как решить поставленную задачу. В простых случаях решение можно найти самому, в сложных, лучше поискать решения данной задачи и выбрать наиболее подходящее. Нам требуется найти и описать определенный порядок инструкций, определяющий действия исполнителя для достижения нужного нам результата. Желательно его достичь за минимальное количество шагов. Данный порядок действий называют алгоритмом. Для решения одной и той же задачи в каждой конкретной ситуации может быть свой алгоритм. Например, алгоритм приготовления чая может быть следующим:
1. Взять чашку.
2. Положить в чашку требуемое количество сахара
3. Положить в чашку пакетик с чаем.
4. Начать подогрев воды.
5. Ждать пока вода закипит.
6. Залить кипяток в чашку.
7. «Смешать» компоненты.
Казалось бы все понятно, но тем не менее для каждого пункта наберется еще море вопросов. Например для пункта 1. Где лежат чашки? Какого размера чашка нам нужна? Если чашка грязная то где ее помыть? Для пункта 4. Где взять воду? В чем ее подогревать? Сколько нужно воды? Как ее подогреть быстрее всего? Вам нужно будет найти ответы на все вопросы для каждой конкретной ситуации. И фактически для каждого пункта можно написать свой, более подробный алгоритм. При этом, достаточно простая задача для человека превращается в относительно сложный алгоритм для «робота». Однако, как можно заметить, нам требуется произвести определенные действия, в определённой последовательности над определенными предметами. Иногда просто сменив последовательность действий мы можем сделать наш алгоритм более эффективным. Например, начать пункт 4 перед пунктом 1.
Довольно часто, при изучении программирования, этап составления алгоритма считается не важным и проскакивается по верхам. А ведь еще не начав собственно программировать, мы уже столкнулись с проблемами и научились их решать. По крайней мере, надеюсь стало понятно, что решение любой сложной задачи можно разбить на последовательность решений более простых задач, а те в свою очередь разбить на решения еще более простых задач и так до тех пор пока уже не будет иметь смысла дробить задачи на более мелкие. Ведь проще сконцентрироваться на анализе и решении более простой задачи чем сложной. И совсем не беда, если еще неизвестно как решить ту или иную задачу. В конце концов решение найдется. Также не обязательно непременно идти от сложного к простому, рекомендаций на эту тему достаточно много, выбирайте путь который больше всего подходит для конкретной задачи и нравится вам.
Ну ладно алгоритм мы написали, а что дальше? А дальше нужно просто перевести этот алгоритм на язык понятный нашему «роботу». Однако нынешним роботам требуются достаточно примитивные команды, типа поднять манипулятор 1 на 30 см вверх, переместить манипулятор 1 на 20 см влево, закрыть зажим на манипуляторе 1. Перевести наш алгоритм на данный язык будет весьма непросто. Так что желательно либо научить робота исполнять команды более высокого уровня, либо написать программу на каком-то промежуточном языке, который можно было автоматически преобразовать на язык понятный нашему роботу. В большинстве случае выбирают использование некоего промежуточного языка, который будет понятен людям и который можно перевести на язык понятный машине. Язык должен иметь возможность описания данных и описания действий.
Данные могут быть атомарными или неделимыми на более мелкие части (целое число, буква) и составными состоящими из нескольких атомарных данных. Составные данные могут быть в свою очередь фиксированного размера (когда количество данных известно до выполнения программы) и переменного размера, а также они могут состоять как из данных одного типа (только целые числа), так и из комбинации различных типов данных (в том числе и составных).
Весьма желательно иметь представление о том как представлены в вашей машине различные типы данных и какие ограничения они имеют. Например, в тип Byte можно записать числа от 0 до 255. (Интересно, появился ли вопрос почему?)
В некоторых языках используются специальные объекты которые объединяют не только данные но и операции над этими данными. Например в объект «динамический массив» можно добавить данные, удалить данные, найти что то конкретное, отсортировать данные и т.п. Стоит отметить, что конкретный язык только определяет, как описывать объекты, реализации стандартных объектов идут как дополнительные модули.
Действия также можно разбить на основные типы:
- выполнение. Выполнить операцию без каких-либо условий.
- ветвление / развилка. Если некоторое условие на момент выполнения действия правильно (вода нагрелась до 100 С) то выполнить действие1 иначе действие2.
- цикл. Повторяем действие пока выполняется некоторое условие.
- выбор. Выбираем для исполнения некоторое действие согласно текущему состоянию.
Вообще то для построения программы достаточно и первых трех типов действий, но для удобства, каждый язык программирования предоставляет дополнительные типы действий. Часто действия могут объединятся в блоки, которые считаются как бы одним простым действием. Также в многих языках имеются целых три типа различных циклов: для определенного количества раз, с проверкой условия до начала цикла, с проверкой условия после окончания цикла.
Как можно было заметить мы еще ни разу не использовали конкретный язык программирования и совсем неспроста, ведь язык программирования это всего лишь инструмент для постройки программы. Ведь не будете же вы строить дом начав с подробного изучения топора и пилы.
Однако без инструментов и навыков работы с ними также ничего хорошего не получится, даже имея в наличии подробный алгоритм. И остается извечный вопрос с какого языка начать? Увы, но однозначного ответа нет, слишком много определяет конкретная ситуация. Хотя во многих случаях я бы порекомендовал начать с Паскаля. Язык был специально разработан для учебных целей и кроме интернета ничего не понадобится. (1,2,3 – онлайн компиляторы, 4 описание стандартного паскаля на английском, описание расширенной версии паскаля на русском)
1. http://pascalabc.net/WDE/
2. https://ideone.com/
3. http://www.tutorialspoint.com/compile_pascal_online.php
4. http://www.tutorialspoint.com/pascal/index.htm
5. http://pascalabc.net/downloads/pabcnethelp/PABC_Help_Web.html
Часто еще рекомендуют С или С++, как одни из часто используемых. «Опасность» эти языков заключается в том, что они имеют несколько больше возможностей, в которых можно достаточно легко запутаться поначалу. Хотя если Вы можете уже без проблем записать алгоритм программы на своем родном языке, перевести этот алгоритм на конкретный язык программирования не составит большого труда.
Для примера сделаем простейшую программу сложения чисел и проверки результата
Псевдокод:
Ввести число А
Ввести число Б
Записать сумму А+Б в С
Если С больше 10 То вывести текст «Результат >10»
Текст программы:
Program SumSample;
var
a:integer;
b:integer;
c:integer;
begin
Write('Input integer A:');
Readln(a);
Write('Input integer B:');
Readln(b);
c := a + b;
Writeln('Result A+B=',c);
if(c > 10) then begin
Writeln('Result >10');
end;
end.

Давайте разбирайтесь, а я пока пошел готовить кофе.
Успехов!

#2 
Kras2012 посетитель05.05.15 18:06
NEW 05.05.15 18:06 
в ответ AlexNek 04.05.15 21:13, Последний раз изменено 05.05.15 18:10 (Kras2012)
Алексей, проблема приготовления чая алгоритмически не разрешима
Насчет Паскаля ни в коем случае,
надо начинать с функциональных языков типа LISP или OCaml.
Они лучше всего дисциплинируют мЫшление и учат мыслить структурированно.
С приветом, Шишкин
#3 
Simple Nothing is f*cked05.05.15 18:49
Simple
05.05.15 18:49 
в ответ Kras2012 05.05.15 18:06
(Common) Lisp - мультипарадигменный язык ;)
#4 
Kras2012 посетитель05.05.15 19:00
NEW 05.05.15 19:00 
в ответ Simple 05.05.15 18:49
Хорошо, заменим LISP на Haskell,
но суть та же самая: язык на основе
Lambda Calculus и по возможности
без side effect' ов.
#5 
Simple Nothing is f*cked05.05.15 19:05
Simple
NEW 05.05.15 19:05 
в ответ Kras2012 05.05.15 19:00
Слишком круто для новичка. Лучше Scheme и SICP ;)
#6 
AlexNek патриот05.05.15 20:39
AlexNek
NEW 05.05.15 20:39 
в ответ Kras2012 05.05.15 18:06, Последний раз изменено 06.05.15 16:19 (AlexNek)
В ответ на:
Алексей, проблема приготовления чая алгоритмически не разрешима

Зато хорошо решается практически и всем известна
В ответ на:
надо начинать с функциональных языков типа LISP

Предлагаю тем кому он неизвестен расказать, что делает эта строка
(if (< n 3)1(+ (fi (- n 1)) (fi (- n 2))) )
Я так понимаю вы любите пошутить?
#7 
Kras2012 посетитель06.05.15 03:15
NEW 06.05.15 03:15 
в ответ AlexNek 05.05.15 20:39
In Antwort auf:
что делает эта строка
(if (< n 3)1(+ (fi (- n 1)) (fi (- n 2))) ))

Она растляет умы малолетних, внушая им, что рекурсия по своей СУТИ
безумно неэффективна. Рекурсии лучше всего учить на примере
бинарного поиска. А числа Фибоначи можно (и должно!) программировать
с помощью tail-рекурсии.
#8 
Bigfoot коренной житель06.05.15 09:04
Bigfoot
NEW 06.05.15 09:04 
в ответ Kras2012 06.05.15 03:15
В ответ на:
А числа Фибоначи можно (и должно!) программировать с помощью tail-рекурсии.

Числа Фибоначчи можно (и должно!) программировать вообще без рекурсии.
Oh gravity, thou art a heartless bitch! (c) Dr.Cooper
#9 
AlexNek патриот06.05.15 14:15
AlexNek
NEW 06.05.15 14:15 
в ответ Kras2012 06.05.15 03:15
В ответ на:
внушая им, что рекурсия

выводу сделаны явно не из анализа написанной строки, а токмо с целью защитить любимое детище видимо.
Хотя уж только начало говорит о том, что данный язык не только к обучению нельзя подпускать, но и желательно выслать куда нибудь подальше
"if (< n 3)"
Из декларативного программирования только Лого можно частично использовать для обучения, остальное для фанатов.
А о рекурсии и указателях в начале обучения вообще лучше не упоминать.
#10 
MrSanders старожил06.05.15 15:53
NEW 06.05.15 15:53 
в ответ AlexNek 05.05.15 20:39
В ответ на:
(if (< n 3)1(+ (fi (- n 1)) (fi (- n 2))) ))

Скобка лишняя. Lots of Irritating Single Parentheses начинает и выигрывает :)
#11 
AlexNek патриот06.05.15 16:22
AlexNek
NEW 06.05.15 16:22 
в ответ MrSanders 06.05.15 15:53
исправил, когда тыбрил на них не обращал внимания
#12 
AlexOtt местный житель07.05.15 13:34
AlexOtt
NEW 07.05.15 13:34 
в ответ Simple 05.05.15 19:05
Плюсую SICP, перевод на русский - есть в сети. Для разбирательства с SICP есть специальный модуль в http://racket-lang.org/.
#13 
AlexOtt местный житель07.05.15 13:45
AlexOtt
NEW 07.05.15 13:45 
в ответ AlexNek 04.05.15 21:13
Паскаль для обучения - это очень старый миф. Сейчас уж лучше взять питон или что-то подобное, поскольку все эти тонкости о типах и т.п. - только мешают в самом начале, когда человек должен научиться думать, а не бороться с деталями реализации. Недаром в уже существующих языках есть тенденция к автоматическому выводу типов и т.п.
P.S. пример программы, кстати, тут неправильный - в условии говорится про числа (любые), а не про целые числа, так что человек который введет 10.5 в качестве одного из чисел, будет долго разбираться с тем почему у него неправильный ответ. А также долго будет разбираться если попытается сложить числа типа 12345678901 + 234567890123, или посчитать факториал в лоб...
#14 
AlexNek патриот07.05.15 18:46
AlexNek
NEW 07.05.15 18:46 
в ответ AlexOtt 07.05.15 13:45
В ответ на:
Паскаль для обучения - это очень старый миф

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

Приведите правильный для учебных целей. И гляньте хотя бы в текст программы.
#15 
AlexOtt местный житель07.05.15 19:54
AlexOtt
NEW 07.05.15 19:54 
в ответ AlexNek 07.05.15 18:46
извените, но я сам преподавал и паскаль, и Ц, и фортран, так что знаю про сложности... Питон сейчас активно преподается во многих университетах. А так, я программирую на том, что лучше подходит для задачи - если мне надо построить регрессионную модель, я не буду брать C++, я возьму R, или что-то подобное. Также, я не буду брать Java для embedded платформы, а возьму Ц или специальный язык.
я конечно заглянул в программу - иначе бы не писал. я вижу там объявление a: integer - этого достаточно. При этом, объявление - в одном месте, использование в другом и т.п.
Вот питон (тоже не без изъянов в виде явных типов, но они хотя бы объявляются по месту):
a = float(input("Enter number A: "))
b = float(input("Enter number B: "))
c = a+b
print str(a) + " + " + str(b) + " = " + str(c)


Вот Clojure:

(let [_ (println "Enter A: ")
a (read)
_ (println "Enter B: ")
b (read)]
(println a "+" b "=" (+ a b)))


Enter A:
1
Enter B:
2
1 + 2 = 3
Enter A:
1.0
Enter B:
2.5
1.0 + 2.5 = 3.5


P.S. а на SICP все-таки посмотрите - он именно учебник программирования, а не учебник лиспа

#16 
Kras2012 посетитель07.05.15 20:56
NEW 07.05.15 20:56 
в ответ AlexOtt 07.05.15 13:45, Последний раз изменено 07.05.15 20:59 (Kras2012)
In Antwort auf:
Паскаль для обучения - это очень старый миф. Сейчас уж лучше взять питон или что-то подобное, поскольку все эти тонкости о типах и т.п. - только мешают в самом начале, когда человек должен научиться думать, а не бороться с деталями реализации.

Справедливо говоришь. Вот уж, действительно, "from your lips to God's ears".
#17 
Murr патриот08.05.15 10:37
Murr
NEW 08.05.15 10:37 
в ответ Kras2012 07.05.15 20:56
"from your lips to God's ears".
------
Еще бы физику вспомнить...
ну там что-то про скорость распространения звука в вакууме...

#18 
natuerlich blond старожил08.05.15 23:11
natuerlich blond
NEW 08.05.15 23:11 
в ответ AlexNek 07.05.15 18:46
В ответ на:
Но было бы интересно узнать что сейчас люди изучают в институтах. Видимо все перешли на лисп и питон.

Питон да, изучали. Правда как 3-й язык, но потом очень много на нем программировали. Кстати, присоединяюсь к предыдущему оратору: этот язык очень даже неплох для начинающих.
Я до сих пор его использую для быстрой реализации небольших по объему задач, например, парсить или быстро протестировать чего-нить.
#19 
schweps2 старожил16.05.15 19:48
schweps2
NEW 16.05.15 19:48 
в ответ AlexNek 04.05.15 21:12
Совет: Первое правило программиста - меньше программировать.
Google→копировать→вставить
Germany.ru Boot CD v1.0 поможет :)
#20 
1 2 3 все