Плохо ли смотреть готовый код задач по СИ, чтобы понять как это работает?
Плохо ли смотреть чужой рабочий код (с похожей задаче) для понимания что и как реализовано, если самому вывести решение может занять чуть ли не несколько недель, хотя задачка с виду простая? Как это может повлиять на мое обучение? Может лучше долго но самому?
Учу язык СИ по видео-урокам CS50 и на канале GenaANTG, плюс различная литература (Язык программирования C» автора Брайан Керниган, Деннис Ритчи), но мне кажется что для обучения данная книга не очень подходит, больше как инструкция и справочник. Также лекции CS50, плюс естественно GOOGLE.
Вот мне попалась задача из курса CS50
"Наша программка будет рисовать полупирамиду, подобную той, что вы видите, но прямо в консоли, без графики: каждый из блоков будет состоять из значка хэша (#). Даже если вы еще не сообразили, как это сделать, поверьте: это просто. Чтобы сделать задачу более интересной, добавим в неё возможность задавать высоту полупирамидки с помощью неотрицательного целого числа от 0 до 23. Высота пирамидки на картинке считается в самом высоком месте, то есть равна 8. Если пользователь неправильно вводит число, нужно попросить его сделать это ещё раз. Затем сгенерировать с помощью printf пирамидку.
Позаботьтесь о том, чтобы выровнять нижний левый угол вашей полупирамиды по левому краю окна терминала, как в примере ниже. Подчеркнутый текст — это то, что пользователь вводит самостоятельно.
username:~/workspace/pset1 $ ./mario
height: 8
##
###
####
#####
######
#######
########
#########
Обратите внимание, что два крайних правых столбца имеют одинаковую высоту. Генерировать трубы, облака и самого Марио пока не стоит=). По крайней мере для этого задания.
Если пользователь ввел неправильные данные (ввел не число, или число, которое меньше единицы или больше, чем 23), программа должна снова попросить его ввести данные, как в примере внизу, где подчеркнутый текст — то, что вводил пользователь с клавиатуры.
Для считывания введенной строки используйте GetInt. Она может помочь проверить неправильный ввод, но не для всех случаев. "
Я на данный момент мало понимаю как это реализовать, но понимаю что копипастить хэши в printf не лучшая идея и однозначно все реализуется циклами и какими-либо формулами, здесь начинаю понимать, что возможно я чуть больше шарил в математике, я бы быстрее просчитал как это сделать.
"Плохо ли смотреть чужой рабочий код (с похожей задаче)"
Плохо ли писать книги, если до этого никогда ничего не читал?
Плохо ли снимать фильмы, если до этого никогда фильмы не смотрел?
Плохо ли готовить, если до этого ел только сырое?
Чужой опыт - это то, что дало человечеству цивилизацию.
Saboteur: как это кто? Кто был первым - яйцо или курица? Если кто-то опирался на чей-то опыт, то кто-то другой этот опыт "создал" первым? Эйнштейн свою т .относительности (тут он первый ), Попов радио в России и тд. Это они и есть первые в своих областях и направлениях деятельности. Но не всем это дано. Не всем же быть Поповыми и Эйнштейнами...вот я о чем. Те они создали первыми то, что ДО них не создавали и в ЭТОМ не опирались ни на чей опыт, а создали свой, уникальный.
Александр: Эйнштейн знал много других физических и математических теорий. Всё, что он сделал - придумал идею, что пространство и время связаны в одно пространство-время, кривизна которого зависит от массы-энергии, и описал это математически. Математика здесь - инструмент реализации идеи. Си и чужие проекты - инструмент в реализации какой-то другой идеи. Нет никаких "пионеров". Чтобы что-то создать, нужно знать матчасть и уж точно уметь пользоваться инструментами твоего ремесла.
Александр: Ничего подобного. Работы Эйнштейна базируются на работах тысяч математиков и физиков до него. Даже его теория относительности разрабатывалась им не в одиночку.
Попов изобрел радио не сразу после дубины, а после тысяч лет изобретений, каждое из которых было продолжением чего-то более простого.
То, что кто-то первым написал буквами, еще не значит что он его в одиночку изобрел. Во всем опыт миллионов предков.
Saboteur: Вы знаете, эта "база" о которой вы говорите, есть и сейчас, да вот открытия только делают единицы...да, база есть, и некий предыдущий опыт накопленный есть, но прорыв вперед, открытия делают единицы. Именно они создают то, что в философии называют переходом количества в качество. Количество (чужой опыт) был несомненно, но вот качественный переход совершить под силу удалось только им. И их имена становятся известны всему миру. Надеюсь, Вы же не думаете, что между вами и Перельманом (к примеру) нет разницы? (ничего личного - это к примеру). Так что, в итоге, давайте не путать Бабеля с Бебелем (если Вы в курсе, о чем я.., хотя киевляне точно должны Бабеля знать) ;-)
Арсений Ефремов: извините, но вот Вы не возьмете и не придумаете ВДРУГ нечто подобное Эйнштейну, верно же? Хотя владеете базой и уверен, высшее образование у вас есть...Вас кто знает? Ближайшее окружение и все, а Эйнштейна весь мир. Так что давайте не будем заноситься. :-) Вы вот, уверен, владеете инструментом (языком С), но ведь вы не Керниган, и не Ритчи и не Линус Торвальдс, верно? :) Давайте быть скромнее. В СССР была замечательная серия ЖЗЛ - почитайте ее, там много интересного о таких людях написано. Очень познавательно.
Александр: Между мной и Перельманом нет разницы.
Между мной и Эйнштейном нет разницы. Между вами и мной нет разницы. Билл Гейтс от нас недалеко ушел.
Всемирная известность и прорыв вперед - вещи вообще не связанные. Можно попасть в удачное время в удачное место. Про гандам-стайл знает больше людей, чем про Коперника.
Человек в принципе не способен придумать ничего нового - так устроен мозг, что он может только основываться на том, что получает изовне и какой опыт у него был до этого, обобщая и перерабатывая уже известный опыт.
Единственное, что человек, как биологический вид, научился общаться на языке высокого уровня, который позволяет оперировать различными уровнями абстракции, таким образом он может проецировать уже имеющийся опыт на казалось бы несовместимые вещи.
Нечто подобное Эйнштейну, сперва придумывало множество физиков и философов (в те времена философия была близка к математике и физике, уже затем выделилась в отдельное направление). Просто публикация книг в те времена была затруднительна, поэтому до нас дошли лишь отдельные имена тех, кто уже смог пробиться в публицисты. Тот же Галлилео, Планк, Максвелл.
Вообще почитайте например https://ru.wikipedia.org/wiki/%D0%98%D1%81%D1%82%D...
Например, я могу назвать себя первым в некоторых вещах, например в рамках страны. Но буду ли я выдающимся? Нет. Просто обычный человек, который когда-то потратил время на определенные вещи.
Saboteur: все, что я хотел сказать, я уже сказал. Если между вами и теми, кого вы перечислили нет разницы, то мне нечего больше сказать. Единственно добавлю только, что когда вы и правда сделаете что-то великое по настоящему кроме демагогии и о вас узнает весь мир, мы сможем вернуться к этому вопросу снова. А пока я вижу только раздутое самомнение(спрятанное за словами - "я такой как и вы...") и навеянное современным временем "я не хуже и даже лучше всех остальных! Я самый, самый самый....". Только вот "я" без подтверждения делом - просто последняя буква алфавита. А ваших дел до сих пор никто не знает(кроме вашего ближайшего окружения). Может потом когда-нибудь...
PS Мировая общественность от науки нобелевские премии тоже не всем подряд раздают. Или они тоже ошибаются в частности на ваш счет? Надо бы и вам ее срочно выдать, раз вы не хуже Перельмана и тем паче Эйнштейна )))
Александр: Простите, много ли вы знаете всемирно известных нобелевских лауреатов? Подозреваю, что вы наизусть не сможете перечислить даже тех, кто получил нобелевку в прошлом году.
Вы категорически не понимаете о чем я говорю. Я говорю не о достижениях конкретных личностей в социуме, а о принципах работы мозга. В этом плане гениальный ученый, который всю жизнь исследовал математику, не будет слишком отличаться от человека, который всю жизнь выращивал пчел.
Кроме того, есть множество людей, которые сделали великие вещи, их имена никто не помнит. Например, вы знаете, кто конкретно придумал Gif? Кто придумал первый панельный менеджер? Кто придумал XML? Кто придумал email? Кто придумал первую систему контроля версий? Кто придумал регулярные выражения? Кто придумал крестовую отвертку? Кто придумал ЖК монитор? Кто открыл первую интернет-аптеку в стране? Кто придумал скейтбоард? Кто запустил первую MMORPG? Кто придумал шахматы?
И да, мои слова: "Но буду ли я выдающимся? Нет." и ваши "Я самый, самый самый.." слегка противоречат друг другу.
Но если вы очень хотите быть самым-самым - будьте им.
Не читайте чужой код, не читайте документацию, не слушайте советов - творите все самостоятельно.
Александр: нет, я не владею этими инструментами так, как Керниган, Ритчи и прочие. И не владею знаниями, какими владел Эйнштейн. И я уж точно не посвятил работе всю свою жизнь. Но я обладаю неплохой фантазией и абстрактным мышлением и могу себе представить тот уровень, где все их творения достигаются любым другим человеком. В этом нет ничего заносчивого, это просто реальность.
Алсо, почитал ваши остальные ответы. "Сначала добейся" - крайне плохой аргумент с точки зрения логики. Не обязательно читать ЖЗЛ, чтобы понимать что-то, но вот о логических ошибках знать точно стоило бы.
Арсений Ефремов: Это хоть признал, что не владеет и не такой же, как они )))
Фантазия у вас странная. Скорее фэнтези, в том то и дело, что не "Любым другим". Вы вот тоже "любой", но не можете сделать того же, поэтому вам и остается только маниловщина в удел (те пустые фантазии, если не знаете, кто такой Манилов). Тема закрыта, тк есть пословица - " не спорь с неумными людьми, а то окружающие не заметят между вами разницы". Всех благ вам, фантазер.
Александр: То есть те достижения, что я перечислил, которые были достигнуты не особо популярными людьми (не Эйнштейном и не и не Керниганом), вы за достижения не считаете вообще?
добавлю, что эти и другие задачи есть в учебнике Дейтела "Как программировать на С" на странице 179, правда НЕТ решения ))) Очень рекомендую эту книгу, сам ее читаю все время - просто нравится ))
Просто надо начинать думать "как программист". Математики тут нет и алгоритм простейший. Алгоритм понятен сразу, как только вы смотрите на рисунок:
для введенного числа 8
1.первая строка - рисуем 2 решетки
2.следующая строка рисуем решеток на 1 больше, чем на предыдущем шаге
3.8 строка - после рисования решеток заканчиваем цикл.
Решетки рисуются в цикле по одной. В конце каждой строки, после решеток, "дорисовываем" перевод строки.
Как реализовать можете подсмотреть на первый раз, но дальше пытайтесь делать самостоятельно. Если совсем уж затык, то же можно взглянуть бегло на решение, чтоб понять принцип. А потом постараться самому реализовать.
Нужно стараться делать задания самостоятельно - только то что осилил сам запомниться на долго.
Плохо ли смотреть чужой рабочий код (с похожей задаче) для понимания что и как реализовано, если самому вывести решение может занять чуть ли не несколько недель, хотя задачка с виду простая? Как это может повлиять на мое обучение? Может лучше долго но самому?
смотря чего добиться хотите.
если алгоритмистом хотите стать - то до велосипедов в реальных задачах опускаться не надо, но в учебе упражняться самому побольше.
только вот алгоритмистом быть необязательно.
я ненавижу сложные алгоритмы, математику, очень недолюбливаю читать книжки. многие за это считают меня дебилом.
но там где мне платят деньги, я называюсь совсем другими словами: очень хорошим реверс-инженером, ремонтником и человеком, способным написать бота для любого сайта, разобраться с любой либой безо всякой документации, нагуглить исходник, имеющийся в одном экземпляре на весь гугл и мн. др.