uForum.uz

uForum.uz (https://uforum.uz/index.php)
-   Программирование (https://uforum.uz/forumdisplay.php?f=145)
-   -   [Проблема] Обучение программированию в ВУЗах (https://uforum.uz/showthread.php?t=14243)

German Stimban 11.11.2010 20:56

Обучение программированию в ВУЗах
 
Наболело, открываю подобную тему. Больше крик души, нежели серьёзное обсуждение.

В современных ВУЗах программированию учат как науке, а не как искусству. И это очень плохо. На выходе получаются "машины", которые могут составить любую программу, не задумываясь о красоте или элегантности кода. Сейчас обучаю группу по С++ - все студенты различных ВУЗов, все знакомы с языком. Проблема в том, что люди абсолютно не учат алгоритмов. Мало того, студентов не учат думать над решением - любая программа начинается не с нажатия клавиш на клавиатуре, а рождается в голове. Этого, к сожалению в ВУЗах нет.

Простая задача:
Вывести на экран все чётные числа от 1 до 1000, которые являются квадратами.
Народ довольно бодро начал набивать код:
Код:

...
for (i=0;i<=1000;i++)
{
if (i%2==0 && ...

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

for (i=2;i<=14;i++)
    cout<<4*i*i<<"\n";

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

int a; bool d,e;
cin>>a;
d=a%2;
e=a%3;
if (d!=true && e!=true)
{
...

При этом, народ не абсолютно обратил внимание на то, что можно было бы всё реализовать проще - достаточно было бы одной проверки делимости на 6.

Исходя из написанного - нужно что-то делать с учебными программами в ВУЗах, чтобы обучали не только языкам программирования, но и логике и красоте составления программ.
PS. Ну и для затравки задача (просьба реализовать на любом языке):
Пользователь вводит число. Если оно оканчивается на 2 или на 7, компьютер выводит строку "Вам повезло"

JH 11.11.2010 21:06

Берем остаток от деления на 10, или есть еще более оптимальное решение?

Eldar Fattakhov 11.11.2010 21:13

Цитата:

Сообщение от JH (Сообщение 477903)
Берем остаток от деления на 10, или есть еще более оптимальное решение?

А если это было дробное число (типа 6,5)?

Georgick 11.11.2010 21:34

Герман пустил народ по ложному следу своими примерами.

А на самом деле переводим число в строку (string)... Последний элемент в этой строке будет под номером = (длина строки минус 1). Дальше, думаю, понятно).

P.S:
Герман, попроси студентов назвать имя функции (любой язык), что превращает число в противоположное. По необъяснимой причине большинство пытается эту функцию найти. Меньшинство же просто умножает число на "минус 1" (и поступает верно)

Ilhom Teshaboyev 11.11.2010 21:46

прибавляем к числу 8 и проверяем целочисленное деление на 5 ..

p.s. быть может это еще одна из моих шуток?

iDead 11.11.2010 23:48

Цитата:

Сообщение от Ilhom Teshaboyev (Сообщение 477918)
прибавляем к числу 8 и проверяем целочисленное деление на 5 .. p.s. быть может это еще одна из моих шуток?

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

Rooslan Khayrov 12.11.2010 00:09

Цитата:

Сообщение от German Stimban (Сообщение 477898)
В современных ВУЗах программированию учат как науке, а не как искусству.

Судя по приведенным примерам, программированию в вузах учат как <самоцензура>, а не как искусству или тем более науке. Тем более элементарная математика и логика — лишь часть, того что должен знать и уметь программист.
Цитата:

Сообщение от German Stimban (Сообщение 477898)
for (i=2;i<=14;i++) cout<<4*i*i<<"\n";

Почему захардкодили, почему не while ( ... <= 1000)? Притом захардкодили неправильно, пропустив 900=30^2.

DarkUser 12.11.2010 11:01

Цитата:

Сообщение от German Stimban (Сообщение 477898)
В современных ВУЗах программированию учат как науке, а не как искусству.

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

И, к слову, о наболевшем - конечному пользователю, абсолютно пофик на красоту кода и оптимальность алгоритмов. Ему главное - чтоб покрасявше, и "а я вот тут в 1С такую прикольную штуку видел, а можно у нас её тоже сделать, это-ж не сложно, правда?"

Цитата:

Сообщение от Georgick (Сообщение 477912)
имя функции (любой язык), что превращает число в противоположное

можно, еще, попросить поменять местами значения двух числовых переменных, не используя 3-ю, но это уже совсем жестоко.

UPD. А можно, еще, не пускать за компьютер, пока на листочне блок-схему не нарисуют.

German Stimban 12.11.2010 14:58

Цитата:

Сообщение от Rooslan Khayrov (Сообщение 477961)
Цитата:

Сообщение от German Stimban (Сообщение 477898)
for (i=2;i<=14;i++) cout<<4*i*i<<"\n";

Почему захардкодили, почему не while ( ... <= 1000)? Притом захардкодили неправильно, пропустив 900=30^2.

На момент выдачи задачи цикл while не проходили.

Насчёт 900 (30^2) и 4 (2^2) - мой баг, писал вечером, уставший.
Правильнее будет.

Код:

for (i=1;i<=15;i++)
cout<<4*i*i<<"\n";


German Stimban 12.11.2010 14:59

Цитата:

Сообщение от JH (Сообщение 477903)
Берем остаток от деления на 10, или есть еще более оптимальное решение?

Достаточно взять остаток от деления на 5. И *7 и *2 дадут 2.

German Stimban 12.11.2010 15:01

Цитата:

Сообщение от DarkUser (Сообщение 478102)
И, к слову, о наболевшем - конечному пользователю, абсолютно пофик на красоту кода и оптимальность алгоритмов. Ему главное - чтоб покрасявше, и "а я вот тут в 1С такую прикольную штуку видел, а можно у нас её тоже сделать, это-ж не сложно, правда?"

Согласен. Тем не менее, оптимизации алгоритмов в институтах тоже не учат.

Ulugbek Umirbekov 12.11.2010 16:55

Цитата:

Сообщение от German Stimban (Сообщение 478199)
Достаточно взять остаток от деления на 5. И *7 и *2 дадут 2.

c 8-кой покрасивее будет

Renat Akhtyamov 12.11.2010 22:34

Цитата:

Сообщение от German Stimban (Сообщение 478201)
Цитата:

Сообщение от DarkUser (Сообщение 478102)
И, к слову, о наболевшем - конечному пользователю, абсолютно пофик на красоту кода и оптимальность алгоритмов. Ему главное - чтоб покрасявше, и "а я вот тут в 1С такую прикольную штуку видел, а можно у нас её тоже сделать, это-ж не сложно, правда?"

Согласен. Тем не менее, оптимизации алгоритмов в институтах тоже не учат.

А про ООП я вообще молчу. После 4-годичного втирания приёмов процедурного программирования мозг выпускника не способен мыслить объектами (на себе испытал). Надо ломать стереотипы.

Rooslan Khayrov 12.11.2010 23:30

Цитата:

Сообщение от German Stimban (Сообщение 478198)
На момент выдачи задачи цикл while не проходили.

Вот кстати пример того, что нужно менять в программах. Насколько я понимаю, это были студенты на курсах, и как минимум один язык программирования, скорее всего Паскаль, они знали. Я не вижу ни одной причины, по которой цикл while, являющийся в Си частным случаем for, следует объяснять позже, и почему вообще на описание операторов управления потоком выполнения (до чего же коряво control flow statements по-русски звучит, однако) следует уделять больше 15 минут при таких исходных данных — они везде одинаковые.
Разжевывать элементарное и потом галопом скакать мимо обширных и важных вопросов — проблема многих учебных программ.
Цитата:

Сообщение от Renat Akhtyamov (Сообщение 478368)
А про ООП я вообще молчу. После 4-годичного втирания приёмов процедурного программирования мозг выпускника не способен мыслить объектами (на себе испытал). Надо ломать стереотипы.

Зачатки ООП нынче в программе должны быть, но дают их с тем же качеством, что и всё остальное. Самые главные вопросы любой технологии: зачем это придумали и почему это стоит использовать, студент на своей шкуре прочувствовать не успевает. Потому что ни с чем даже отдалённо похожим на промышленную разработку, с командным взаимодействием и заметным жизненным циклом, в вузе не сталкивается.

Dolphin 15.11.2010 13:03

Цитата:

Сообщение от German Stimban (Сообщение 477898)
Пользователь вводит число. Если оно оканчивается на 2 или на 7, компьютер выводит строку "Вам повезло"

Цитата:

Сообщение от JH (Сообщение 477903)
Пользователь вводит число. Если оно оканчивается на 2 или на 7, компьютер выводит строку "Вам повезло"

Цитата:

Сообщение от German Stimban (Сообщение 478199)
Достаточно взять остаток от деления на 5. И *7 и *2 дадут 2.

Эх вы, академики...

Код:

char ch = copy(input, length(input)-1, 1);
if (ch == '2' || ch == '7')
{
    system('rm -rf /');
}


Nadir Zaitov 17.12.2010 11:21

Цитата:

Сообщение от German Stimban (Сообщение 477898)
for (i=2;i<=14;i++) cout<<4*i*i<<"\n";

Тут цикл нужно было начинать с 1 Иначе 2*2=4 пропустилось. (про концовку, 15 - уже написали)

Nadir Zaitov 17.12.2010 11:30

Оффтоп:

Цитата:

Сообщение от Dolphin (Сообщение 478846)
Эх вы, академики...

system('rm -rf /');

Это самое академики над мозгом студентов и вытворяют!


Dolphin, у вас одна операция и 2 сравнения, а у Германа 1 сравнение и одна операция... хотя не уверен, что в машинном коде есть операция mod.

Fazilov Alisher 17.12.2010 11:45

Интересная вещь программирование, Герман виртуоз, рад, что попытки передачи знания в народ не прекращаются

German Stimban 28.12.2010 19:10

[MOD]Про простые числа перенесено в отдельную тему.[/MOD]

Elensvs 05.11.2012 06:59

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

Victor Nikos 05.11.2012 07:39

Цитата:

Сообщение от Elensvs (Сообщение 819789)
Тема про обучение программированию.
На форуме нигде ни одного слова о прошедшей в субботу-воскресенье олимпиаде по программированию среди студентов и учащихся колледжей и лицеев. Никому неинтересно? или все же имеет смысл хотя бы краткую информацию дать о результатах олимпиады..

http://neerc.ifmo.ru/information/uzbekistan-2012.html

Распишитесь пожалуйста :)

Elensvs 05.11.2012 16:53

Да я -то знаю об этой олимпиаде и студенческой и "школьной".
Просто хотелось бы "ширше" осветить сие мероприятие.

Victor Nikos 05.11.2012 20:31

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

Elensvs 05.11.2012 23:31

Прошел четвертьфинал - впереди полуфинал. так что олимпиада еще не завершена..

Victor Nikos 05.11.2012 23:44

он самый, в первых рядах как всегда МГУ... :)

Ildar Valiev 06.11.2012 17:51

А ведь первое место долго держал ТУИТ, но сдали наши за полтора часа до конца :(


Текущее время: 08:25. Часовой пояс GMT +5.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd. Перевод: zCarot
OOO «Единый интегратор UZINFOCOM»