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.


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

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