Летняя школа 2017

В этом году традиционная CSC Summer School (летняя IT — школа) захватила часть осени и проходила сразу на двух базах: ФПМИ БГУ и СШ N 98 г. Минска.

Читались курсы для новичков (начала программирования и создания web-сайтов) и для тех ребят, которые уже несколько лет посещают наши занятия (сетевое программирование  на C# (.Net) и системное администрирование ).

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

 

Уроки по Java. Гурьянова Т.В.

В книге использованы тексты программ, выполненного учеником одной из средних школ Лос-Анджелоса Махдияром Бахреманом

Версия книги в pdf-формате

1-4 урок

Выполняем первые 10 уроков курса по Java с сайта JAVARUSH:  http://javarush.ru/login.html


5 урок

Решить задачи (каждую несколькими способами), оформить на
Java:

1. Найти сумму a и b, используя только операторы
присваивания вида:

переменная1=переменная2
переменная=число;
переменная=переменная+1.

(не используя оператор a+b)

a_plus_b

2. a и b числа. Найти a* b, используя арифметические
операции    вида +,-,=,<>.  (не используя оператор *). Сделать это упражнение для типов  int и float.

a_multiple_b

3. a и b числа. Вычислить частное  и остаток   при делении a на b,
не используя операции %. Сделать упражнение для типов  int и float .

a_percent_b

Цель выполнения упражнений 1-3: повторить и закрепить цикл for, арифметические операции, научиться находить остаток и целую часть от деления чисел, углубить знания по преобразованию типов.

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

Y_jaBCB42Qk

Урок 6

Понятие, описание и использование массива.

srednee_otmetok_part2_d_z

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

 Упражнение. Возведите заданное число А в пятую степень, в шестнадцатую степень.
Как возвести на Java a в степень b? Есть два варианта решения этой задачи: 1) можно написать возведение в степень с помощью умножения числа а на себя b раз; 2) воспользоваться функцией, которую написали разработчики Java. Мы советуем сделать это двумя этими способами и затем сравнить способ 1) с исходниками функции в способе 2).

Решение этой задачи с помощью 2) будет выглядеть примерно так:

pow_a_b.jpg

Упражнения. Возведение a в степень b  будем обозначать a^b. Найти значение выражений: 1) 3*a^3+2*b^2 и
2) 5*a^5+4*a^3+8*b^2+37 при заданных значениях a и b

Если вы правильно выполнили это упражнение, при a=5, b=10 ответ

1)20375

2)15625500424)

Очень полезно на каждом уроке выделять хотя бы 5-10 минут решению математических задач.
Возьмем, к примеру, книгу по математической логике Рэймонда М Смаллиана «как же называется эта книга?»
Примеры решения некоторых задач из этой книги

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

28 задача:

A-лжец B-лжец: высказывания не возможны
A-лжец B-рыцарь: высказывания не возможны
A-рыцарь B-рыцарь: высказывания не возможны
A-рыцарь B-лжец: высказывания возможны!!! (ответ)

A-лжец B-лжец: высказывания не возможны
A-лжец B-лжец: высказывания не возможны
A-лжец B-лжец: высказывания не возможны

34 задача:
Вот возможные ситуации:
A  B  C
л  р  л
р  л  л
В обоих случаях С — лжец (ответ).

37 задача

A B | ответы
=============
л р |  NO NO
л л |  YES YES
р л |  NO NO
р р |  YES YES

Как мы видим, во всех случаях ответы однотипны.

Задача 39:

task39_smalian

Урок 7

Задача. Нужно разбить натуральное число на сумму двух натуральных слагаемых всеми различными способами. Способы, отличающиеся только порядком слагаемых разными не считать!

 

1) способ: » пробегаем» все числа от 0 до N, если они в сумме дают N, выводим на экран:

for(int a=0;a<N;a++){

for(int b=0;b<N;b++){

if ((a+b)==N) {System.out.println(a+»+»+b+»=»+N)}

}

}

У такого решения есть недостаток: повторяющиеся пары. Так 5=2+3 и 5=3+2. Чтобы вывести только одну из них, можно либо уменьшить количество итераций в цикле, либо добавить еще одну проверку:

if (((a+b)==N)&&(a<=b))

2) способ более изящный. Если внимательно рассмотреть частные случаи разбиения 5, 7, 8, 9, 10, то можно выявить следующую закономерность и обойтись одним циклом и одной дополнительной переменной a:

for(int a=1;a<=N/2;a++){

System.out.println(a+»+»+(N-a)+»=»+N)

}

 

 Урок 8

Разложить число на три слагаемых различными способами

image001

Найти сумму всех натуральных чисел от 1 до введенного с клавиатуры

screen2_07

Упражнение. Исправить код программы так, чтобы не печатался последний знак «+» перед «=» в ответе.

Урок 9

Понятие факториала натурального числа n: n!=1*2*3*4*…*(n-1)*n

Упражнение. Переделайте  предыдущу задачу  (нахождение суммы всех натуральных чисел до чисила, введенного с клавиатуры) на нахождение факториала натурального числа (нужно найти произведение всех чисел до чисила, введенного с клавиатуры).
Упражнение. Выполнить первую лабораторную по Java Swing, используя видео (научиться создавать форму  JFrame, содержащую компоненты JLabel, JButton,…, уметь менять их свойства).

Имеет смысл обсудить решение задачи с туристом, рыцарем и лжецом (Турист подходит к перекрестку. Одна дорога идет у озеру, другая — нет. На перекрестке рыцарь и лжец. (Турист не знает, кто из них кто). Турист задает один вопрос,  получает от каждого ответ «да» или «нет» и по этому узнает, какая дорога идет  к озеру. Какой вопрос  задал турист?).

Урок 10

Сделать заготовку калькулятора на Swing (сложение и умножение). Для этого разместить на форме два текстовых поля, кнопку  Button и Label. В рбработчик кнопки дописать код:

String str1 = jTextField1.getText();
String str2 = jTextField2.getText();
double a = Double.parseDouble(str1);
double b = Double.parseDouble(str2);
double sum=a+b;
jLabel1.setText(“Сумма чисел равна“+sum);

Задача. Ввести трехзначное число, вывести сумму цифр этого числа.
Выполнить с помощью Java Swing.   В обработчик кнопки вписать код:

String str1 = jTextField1.getText();
int a = Integer.parseInt(str1);
int b= h/10;//1 цифра числа a
h=h-b*100;//h без сотых
int c=h/10;//2 цифра числа a
int d=h-c*10;//3 цифра числа a
int sum=b+c +d;
jLabel1.setText(» сумма цифр равна » +sum);

Урок 11

Модернизируем калькулятор.

Задание. Улучшить дизайн и функционал

Уделяем внимание расположению кнопок и надписей, убираем нефункциональное пространство, работаем со шрифтом и цветом, дизайном кнопок.

Делаем окошко для отображения чисел и результатов (схожее со стандартным калькулятором Windows), применяем для отображения значений метод Display:

zaniatie11

Дополнительное задание *.

a) Добавить кнопки работы с памятью. (Исходники варианта выполнения тут: https://drive.google.com/folderview?id=0B4icNOfw8DwUfjF3dDF5czNERHNqYXRSLU1QSXA1S0EwWFg0UDh1c290amVhSGJHNGRLcXM&usp=sharing )

b) сделать и вставить 3-мерные кнопки, используя профессиональный графический редактор и/или найденные в интернете или библиотеках образцы. Свойства кнопок в Java Swing. Возможности анимирования кнопок (через Adobe Flash, Photoshop, создания анимированных картинок). Объяснение основных принципов анимации, создания 3D изображений.

Урок 12

Вставка анимированных gif’ов на кнопки в Java Swing .

ыфпцрныфкцшув

Подготовка анимированных gif-изображений. Создайте мультфильм с помощью какой-либо из программ (например, с помощью Flash), эспортируйте в анимированный gif

Урок 13

Делаем игру «крестики-нолики».  Смотри соответствующую лабораторную:

Усовершенствуем игру, используя книгу Я. Файна «Программирование на Java для детей, родителей, дедушек и бабушек».

 

Урок 14

Задача. Ввести количество суток, нажать на кнопку — программа должна вывести на экран, сколько в этих сутках часов, минут и секунд.

Создаем JFrame, перетягиваем на него компоненты JTextField1, JButton1, JLabel1, JLabel2, JLabel3, в обработчик кнопки пишем код:
String str1 = jTextField1.getText();
int i = Integer.parseInt(str1);

int h=i*24;
int m=h*60;
int s=m*60;

jLabel1.setText(«ЧАСОВ » +h);
jLabel2.setText(«МИНУТ » +m);
jLabel3.setText(«СЕКУНД » +s);

Улучшаем внешний вид программы. Должно получиться что-то на подобие:

screen14

В программу добавлена анимированная картинка, иллюстрирующая выражение «время — деньги»: песочные часы переходят в знак $.

Урок 15

Задача.  Исходное данное — стоимость товара, выраженная в рублях. Результаты — наименьшее количество банкнот по 25 руб., 10 руб. и 1 руб., которыми можно заплатить за товар.

Начало, как в предыдущей задаче: создаем JFrame, перетягиваем на него компоненты JTextField1, JButton1, JLabel1, JLabel2, JLabel3.

Объявляем переменные, в которые будем заносить стоимость товара и количества банкнот:

int sum=0;
int r25=0;
int  r10=0;
int r1=0;

В обработчик кнопки («Рассчитать») пишем код:

String str1 = jTextField1.getText();
sum = Integer.parseInt(str1);
r25=sum/25;
r10=(sum-r25*25)/10;
r1=sum-r25*25-r10*10;

jLabel1.setText(«банкнот по 25 руб. » +r25);
jLabel2.setText(«банкнот по 10 руб. » +r10);
jLabel3.setText(«банкнот по 1 руб.» +r1);

Усовершенствуем программу: добавляем textField2, в которую будем заносить цену, которую оплатил покупатель, а также JLabel4 и JLabel5, в которые будем заносить количество купюр, которыми выдается сдача (разница между стоимостью товара и оплатой). Делаем проверку, хватит ли того, что заплатили  чтобы рассчитаться за товар. Например, если товар стоит 250 рублей, а за него оплатили 100, то вывести сообщение «Пожалуйста, доплатите!» с указанием суммы доплаты.

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

Урок 16

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

Решим сначала подзадачу: разница между промежутками времени примерно час и вводятся только минуты. Например,  если промежутки времени 19 часов 5 минут и 19 часов 58 минут, то вводятся 5 и 58, 11-08 и 12-15 — вводятся 8 и 15. В результате должно получиться что-то вроде:

29_07_5

Создаем JFrame, перетягиваем на него компоненты JTextField1, JButton1, JLabel1, JLabel2.

Для начала, напишем программу, которая бы давала результат в минутах. Затем, если минут больше, чем 60, записываем 1 час, столько-то минут.
В обработчик кнопки пишем примерно такой код:

29_07
 Сделайте этот код рабочим.

Один из вариантов решения:

29_07_4

Упражнение. Можно ли улучшить этот код?
Делаем программу универсальной, подсчитывающей промежуток времени между любыми датами.

 

Урок 17

Начнем изучать графику.

Рассмотрим  пример программы, которая строит прямые по двум точкам. Эти точки и цвет линий выбираются случайным образом.  Попробуйте откомпилировать его и запустить на выполнение. (см. http://stackoverflow.com/questions/5801734/how-to-draw-lines-in-java)

(файл назовите LinesComponent.java)

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedList;

import java.*;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class LinesComponent extends JComponent{

private static class Line{
final int x1;
final int y1;
final int x2;
final int y2;
final Color color;

public Line(int x1, int y1, int x2, int y2, Color color) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
this.color = color;
}
}

private final LinkedList<Line> lines = new LinkedList<Line>();

public void addLine(int x1, int x2, int x3, int x4) {
addLine(x1, x2, x3, x4, Color.black);
}

public void addLine(int x1, int x2, int x3, int x4, Color color) {
lines.add(new Line(x1,x2,x3,x4, color));
repaint();
}

public void clearLines() {
lines.clear();
repaint();
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Line line : lines) {
g.setColor(line.color);
g.drawLine(line.x1, line.y1, line.x2, line.y2);
}
}

public static void main(String[] args) {
JFrame testFrame = new JFrame();
testFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
final LinesComponent comp = new LinesComponent();
comp.setPreferredSize(new Dimension(350, 200));
testFrame.getContentPane().add(comp, BorderLayout.CENTER);
JPanel buttonsPanel = new JPanel();
JButton newLineButton = new JButton(«New Line»);
JButton clearButton = new JButton(«Clear»);
buttonsPanel.add(newLineButton);
buttonsPanel.add(clearButton);
testFrame.getContentPane().add(buttonsPanel, BorderLayout.SOUTH);
newLineButton.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
int x1 = (int) (Math.random()*320);
int x2 = (int) (Math.random()*320);
int y1 = (int) (Math.random()*200);
int y2 = (int) (Math.random()*200);
Color randomColor = new Color((float)Math.random(), (float)Math.random(), (float)Math.random());
comp.addLine(x1, y1, x2, y2, randomColor);
}
});
clearButton.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
comp.clearLines();
}
});

testFrame.pack();
testFrame.setVisible(true);
}

}

Как начертить прямую линию?

(см. http://www.sbp-program.ru/java/sbp-graphics.htm)

Метод drawLine класса Graphics начертит прямую линию:

g.drawLine(20, 30, 360, 30);

здесь 20, 30 — это координаты x, y начала линии,
360, 30 — координаты конца линии.

«Заливка»

Метод setColor класса Graphics сделает текущим новый цвет:

// Запоминаем исходный цвет;
Color oldColor = g.getColor();
// Создаём синий цвет;
Color newColor = new Color(0, 0, 255);
// Устанавливаем синий цвет;
g.setColor(newColor);
// Чертим линию синим цветом;
g.drawLine(20, 30, 360, 30);
// Восстанавливаем исходный цвет;
g.setColor(oldColor);

Аргументы конструктора new Color(0, 0, 255) — это красный, зелёный и синий цвета соответственно (rgb).

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

Color newColor = new Color(255, 0, 0);

А это чисто зеленый цвет:

Color newColor = new Color(0, 255, 0);

Значения составляющих цвета изменяются от 0 до 255.

Светло-синий цвет, который мы использовали для заливки прямоугольника:

newColor = new Color(0, 215, 255);

Цвет фона

Задать цвет фона можно методом setBackground:

mainFrame.setBackground(Color.white);

Нарисовать прямоугольник

можно с помощью метода drawRect класса Graphics:

g.drawRect(20, 40, 340, 20);

20, 40 — это координаты верхнего левого угла прямоугольника;
340 — длина;
20 — высота прямоугольника.

Залить прямоугольник цветом

можно с помощью метода fillRect класса Graphics:

newColor = new Color(0, 215, 255);
g.setColor(newColor);
g.fillRect(21, 41, 339, 19);
g.setColor(oldColor);

Нарисовать прямоугольник с закругленными углами

можно с помощью метода drawRoundRect класса Graphics.

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

g.drawRoundRect(20, 70, 340, 30, 20, 15);

первые 4 аргумента как у обычного прямоугольника. Пятый аргумент — 20 — это ширина прямоугольника, в который вписана часть овала сопряжения. Шестой аргумент — 15 — это высота прямоугольника, в который вписана часть овала сопряжения.

Нарисовать овал

можно с помощью метода drawOval класса Graphics:

g.drawOval(20, 110, 150, 60);

Аргументы определяют прямоугольник, в который вписан овал.

Нарисовать окружность

можно с помощью метода drawOval класса Graphics:

g.drawOval(200, 110, 60, 60);

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

Нарисовать дугу

можно с помощью метода drawArc класса Graphics:
g.drawArc(280, 110, 80, 60, 0, 180);
первые 4 аргумента как у обычного прямоугольника. Пятый аргумент — 0 — это угол, от которого отсчитывается угол самой дуги. 180 — это угол дуги. Углы отсчитывают от горизонтальной оси: по часовой стрелке отрицательное направление, протв — положительное. В примере 180 градусов (величина дуги) отсчитываем от горизонтальной линии.

Вывести строку

можно с помощью метода drawString класса Graphics:

g.drawString(«Yes», 50, 190);

строка «Yes» будет выведена от точки с координатами 50, 190.

Как задать цвет текста

Чтоб задать цвет текста создадим и установим в графический контекст новый цвет:
newColor = new Color(0, 0, 255);
g.setColor(newColor);
Здесь мы создали чисто синий цвет. А теперь выводим строку синим цветом:
g.drawString(«SBP», 270, 220);

Как начертить график

Сначала начертим координатные оси:
// Draw axes;
g.drawLine(20, 220, 20, 350);
g.drawLine(20, 350, 360, 350);
g.drawString(«Y», 25, 230);
g.drawString(«X», 350, 346);

https://habrahabr.ru/company/alee/blog/117430/
Попробуйте реализовать эти функции в примере:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class Paint8 extends JComponent{

public void paint(Graphics g){
g.drawLine(20, 20, 360, 20);
Color oldColor = g.getColor();
Color newColor = new Color(0, 0, 255);
g.setColor(newColor);
g.drawLine(20, 30, 360, 30);
g.setColor(oldColor);
g.drawRect(20, 40, 340, 20);
newColor = new Color(0, 215, 255);
g.setColor(newColor);
g.fillRect(21, 41, 339, 19);
g.setColor(oldColor);
g.drawRoundRect(20, 70, 340, 30, 20, 15);
g.drawOval(20, 110, 150, 60);
g.drawOval(200, 110, 60, 60);
g.drawArc(280, 110, 80, 60, 0, 180);
int[] arrayX = {20, 100, 100, 250, 250, 20, 20, 50};
int[] arrayY = {180, 180, 200, 200, 220, 200, 200, 190};

g.drawString(«SPB», 270, 220);

g.setColor(oldColor);

g.drawLine(20, 220, 20, 350);
g.drawLine(20, 350, 360, 350);
g.drawString(«Y», 25, 230);
g.drawString(«X», 350, 346);

int[] xArray = {20, 40, 60, 80, 100, 120, 130, 140, 280, 332};
int[] yArray = {350, 345, 340, 310, 290, 280, 275, 273, 271, 269};
int nPoint = 10;
g.setColor(newColor);
g.drawPolyline(xArray, yArray, nPoint);
g.setColor(oldColor);
g.drawString(«y = f(x)», 180, 267);
}

public static void main(String[] args) {
JFrame testFrame = new JFrame();
testFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
final LinesComponent comp = new LinesComponent();
comp.setPreferredSize(new Dimension(400, 400));
testFrame.getContentPane().add(comp, BorderLayout.CENTER);

testFrame.pack();
testFrame.setVisible(true);
}

}

screan_paint2

 

XIII Республиканская научно-практическая конференция молодых ученых и студентов

УДК 37.013.45

Гурьянов Д.В.

Полотнюк В.В.

Селедцов Д.Е.

РАЗРАБОТКА КУРСА ПО UNITY3D ДЛЯ ОБУЧЕНИЯ ШКОЛЬНИКОВ

БГУ, Минск

Научный руководитель: Гурьянова Т.В.

 

Массовое увлечение школьников компьютерными играми можно направить в конструктивное русло с помощью курса по Unity3D. Легкость, с которой в этой программной среде с минимумом затрачиваемых усилий, получить очень весомый эффект выглядит очень привлекательным. Но через некоторое время ребята понимают, что чтобы написать хорошию игру, нужно хорошо знать и язык высокого уровня и алгоритмы, и уметь работать с графическими редакторами, анимацией,… Но процесс уже пошел и цель видна. Поэтому курс по Unity3D очень важная составляющая обучения информатике.

Цель нашего исследования — разработать курс для быстрого изучения основ Unity3D школьниками, не предполагающего никакой предварительной подготовки по информатике.

  1. Этап. Подготовка видеоуроков.

На Unity3D Денисом Селедцовым была написана видео игра, которая послужила основой для подготовки видеоуроков. В этих видеоуроках планировалось рассказать, как эта игра создавалась.

Вот эти уроки:

https://youtu.be/Ilnn61L9WCg

https://youtu.be/ObvKicBdUIU

https://youtu.be/4AnKH6UjJq8

Но уроки получились вполне не зависимыми от этой игры и вполне пригодными для самостоятельного изучения школьниками, которые увлечены программированием и знания которых по информатике нельзя считать «нулевыми». Что же касается начинающих, то многим эти уроки оказались не под силу.

  1. Этап. Подготовка примеров. С учащимися «Юни-центра XXI» было подготовлено ряд примеров (Для просмотра примеров необходимо загрузить и Веб-плеер Unity: http://unity3d.com/ru/webplayer/ ):

http://csc.minsk.by/beta/Unity3D/common.html

http://csc.minsk.by/beta/Unity3D/fly/fly.html

http://csc.minsk.by/beta/Unity3D/fantasy.html

http://csc.minsk.by/beta/Unity3D/roads.html

http://csc.minsk.by/beta/Unity3D/cars_respouned/cars_respouned.html

http://csc.minsk.by/beta/Unity3D/get_thingth/person_get_things.html

http://csc.minsk.by/beta/Unity3D/bunnihop.html

на которых планировалось разработать конкретные задания и написать инструкции по их выполнению.

на которых планировалось разработать конкретные задания и написать инструкции по их выполнению.

    Этап. Разработка заданий.

Вот задания

  1. Создать простой ландшафт с fpscontroller, добавить логотип

(см. common.html).

2, 3. Фантастический ландшафт с ветром (fantasy.html) и водой (на воду пишем скрипт для придания ей реалистичности при погружении)

Сделать Ландшафт с дорогой (roads.html).
Добавить 3D-объект, сделать возможным респаунить (вернуть в определенную точку карты)

главный персонаж нажатием определенной клавиши на клавиатуре (в примере — «e»). (cars_respouned.html).

6, 7. Добавить возможность подобрать объект нажатием клавиши на клавиатуре (в примере — «e») и нести его перед собой, удерживая эту клавишу. Добавить объект из другой программы, например оружие из CS GO, созданной в Photoshop’е

(person_get_things.html).

8. Сделать простой Баннихоп и отладить для Web(bunnihop.html).

    Этап. Подготовка лабораторных работ.

Вот подготовленные лабораторные работы,

http://csc.minsk.by/beta/?p=551,

которые были предложены к изучению учащимся «Юни-центра XXI» и всем желающим через социальные сети.

Что планируется сдалать. Мы планируем еще более тщательно расписать методику курса с целью, чтобы его можно было достаточно быстро освоить как учащимся, так и преподавателям.

Вопросы, которые требуют дополнительного исследования:

— Смогут ли по этому курсу учащиеся заниматься самостоятельно. С какого возраста?

— Насколько подробно необходимо расписывать задания. Как гармонично вплести в изучение курса творческую составляющую.

— Нужно ли прилагать исходники всех примеров, насколько они будут востребованы.

Уроки по C#. Роман Свистунов

=====================================
Здравствуйте! Я для начала скажу, что это обучающая страница. Для программирования на C# нам понадобится компилятор. Я рекомендую Microsoft Visual Studio. В частности по этой ссылке http://www.visualstudio.com/ru-ru/products/visual-stu.. можно найти Visual Studio 2013 Express. Подбирайте под себя, хотя мне нравится Express 2013 для Windows Desktop. Наверняка у кого то уже стоит Visual Studio, тогда новый устанавливать не обязательно. То что ещё нужен компьютер, клавиатура и мышка желательно надеюсь можно не говорить. : — )
Почему именно C#?

Многие задают этот вопрос. C# — один из самых современных языков программирования. На нём затрачивая минимальное время можно писать полезные программы. Возможности работы с файлами открывают новые возможности вплоть до создания новой системы программирования. А в общем C# — простой и многофункциональный язык программирования.

А теперь давайте перейдём к программированию.

Для начала запускаем Visual Studio. Далее мы с вами создадим консольное приложение. Это самое простое приложение, в смысле, что оно поддерживает только текст, никакой графики. И так. Следуем по инструкции:
Файл (File) —> Создать проект (grete project) —> Консольное приложение (Console Application) Вводим внизу имя и жмём ОК. Должен был появиться код типа:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
}
}
}

Мы не будем сейчас разбирать его, это станет ясно позже. Важно лишь что появившийся код это уже готовая программа. Только она ничего не делает.
Однако существует своего рода традиция программирования писать «Hello, World» — программу, выводящую на экран фразу «Hello, World».
Мы же с вами отступать от традиций не будем и напишем такую программу. Для этого будем использовать команду Console.WriteLine(SomeString), где SomeString — некоторая строка. Строка задаётся в двойных кавычках «…». Здесь надо сказать что в C# после каждой команды ставится точка с запятой «;». Добавляем команду и получаем код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(«Hello, World»);
}
}
}

Чтобы запустить программу нажимаем наверху кнопку «Запустить» («Run»). Как видим, программа работает, но сразу закрывается, что не даёт увидеть результата. Тогда добавим ожидание нажатия любой клавиши командой Console.ReadKey(). Важно сказать, что C# чувствителен к регистру, то есть «привет» и «ПРИВЕТ» это совсем не одно и тоже. Код должен получатся таким:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(«Hello, World»);
Console.ReadKey();
}
}
}

Такая программа работает корректно. На этом всё. Сами можете попробовать сделать программы, выводящие на экран какие либо слова и тексты.

Теперь мы рассмотрим,
как хранить данные в C#.
————————
В C# имеются переменные. Переменная — именованная область памяти. В переменную данные можно записывать и считывать. Данные, записанные в переменной называются значением переменной.
C# — язык жёсткой типизации. Это значит, что в нём каждая переменная имеет конкретный тип данных. Ниже приведены встроенные типы данных C#.

sbyte: числа от -128 до 127
byte: от 0 до 255
bool: true или false
short: от -32768 до 32767
ushort: от 0 до 65535
int: от -2147483648 до 2147483647
uint: от 0 до 4294967295
long: от -9223372036854775808 до 9223372036854775807
ulong: от 0 до 18446744073709551615
float: Число с плавающей запятой. Область значений не указываю (Самому не известна). Точность 7 разрядов.
double: Число с плавающей запятой. Область значений не указываю (Самому не известна). Точность 16 разрядов.

для того, чтобы использовать переменную, нужно её сначала объявить. Тут скажу, что после символов // идёт комментарий до конца строки. Многострочный комментарий объявляется /* комментарий */:

int a; //объявляем переменную а типа int
a = 5; //записываем в переменную а значение 5
int b, c; //можно объявлять сразу несколько переменных через запятую
bool d; //создаём переменную типа bool
d = true; //записываем в переменную d значение истина
float e = 6.4f; //для записи числа с плавающей точкой типа float нужно после числа добавлять
//суффикс f

При использовании переменной, которой не присвоено значение компилятор выдаст ошибку «Use of unassigned local variable [имя_переменной]»:

int a;
Console.WriteLine(a); // ошибка.

Имя переменной должно отображать суть её значения. Не стоит называть переменные ни о чём не говорящими именами a, b, c, используйте английские слова: высота — height, возраст — age.

НИКОГДА не используйте русские буквы в именах переменных.

Преобразование типов данных.
—————————-
Переменные одного типа могут быть преобразованы к другому типу. Преобразование бывает явным и неявным. Неявное преобразование выполняет компилятор. Пример неявного преобразования:

int a = 35000;
short b = 10;
a = b; //Неявное преобразование возможно, так как int большего размера, чем short.
b = a; //Ошибка. Нельзя неявно преобразовывать типы большего размера в меньшего.

Для явного преобразования непосредственно перед именем переменной в скобках указывается тип, к которому её необходимо преобразовать:

int a = 35000;
short b = 10;
b = (short)a; // На этот раз ошибки не будет. Максимальный размер типа short 32767, из за этого будет потеря данных.

Константы

Константа — переменная, значение которой нельзя изменить (Константа — неизменяется никогда). Константы используются для того, чтобы получить полную уверенность, что значение соответствующей переменной не изменится в ходе программы.
Для объявления константы используется ключевое слово const:

const int month = 12; // Объявляем константу, с фиксированным количеством месяцев.
month = 13; // Ошибка компиляции. Константа неизменяема.

Константы на самом деле бывают двух типов: простые и литералы:

Console.WriteLine(45); //45 всегда есть 45, это константа, а точнее числовой литерал.
Console.WriteLine(«Good»); //А здесь строка «Good» будет являться строчным литералом.

Ключевое слово var

Начиная с версии C# 3.0 в языке появилось новое ключевое слово var (от variable — переменная). С его помощью вам не понадобиться определять тип переменной. Это сделает за вас компилятор. Но банальности компьютера не обойдёшь — всё равно, тип определился сразу и потом его изменить уже нельзя. Пример:

var number = 5; // Переменной автоматически присваивается тип int
number = «SomeText»; // Ошибка, тип int — не строка

Типы данных.
————-
Все типы данных, рассмотреные выше являлись структурными. Ещё существуют ссылочные типы. Базовыми типами ссылочных типов являются object и string.
Object является базовым типом для всех остальных типов данных. String используется для хранения строк. Пример:

string text = «Hello, world!»; // Создание переменной типа string
Console.WriteLine(text); // Использование такой переменной. Выводит на экран «Hello, world!»

Структурные типы хранятся в стеке.

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

Ссылочные данные имеют ссылку в стеке, но хранятся в куче.

Куча — область памяти, выделенная программе для хранения данных. Доступ к куче медленнее, чем к стеку.

Ввод данных

Команда консоли Console.ReadLine() считывает введённую пользователем строку:

string a;
a = Console.ReadLine(); // Данные, введённые с клавиатуры сохраняются в переменную
Console.WriteLine(a); //Выводит введённые с клавиатуры данные.

Теперь мы поговорим об
арифметических и логических операциях,
————————————-
которые являются обязательными в программах (точнее они очень важны и без них НЕЛЬЗЯ написать сложную и полезную программу.)

Все основные операции делятся на 2 типа: унарные и бинарные. Унарные — это те, в которых участвует один операнд, в бинарных операндов 2. (Операнд — какое либо значение, используемое для операторов. Например в записи 2+5 числа 2 и 5 являются операндами) Арифметические операторы:

оператор +: бинарный, оператор сложения
оператор -: бинарный, оператор вычитания
оператор *: бинарный, оператор умножения
оператор /: бинарный, оператор деления
оператор %: бинарный остаток от деления (9%5 = 4, так как 9/5 = 1(ост.4))

Оператор деление имеет важную особенность — при делении целых чисел результат будет целым числом, то есть 9/5=1. Чтобы ответ был в формате float, то есть точным надо добавлять суффикс f: 9/5f = 1.8.

В программировании чтобы повысить приоритет операции также используются скобки: 2+2*2=6, (2+2)*2=8.

Если использовать оператор + для строк, то произойдёт конкатенация. Конкатенация — объединение нескольких объектов (в том числе строк) в один.

Унарные арифметические операторы

Унарных арифметических операторов в C# только два: инкрементация «++» и дискрементация «—«. Инкрементация это увеличение на 1 то есть а++ = а+1, дискрементация это уменьшение на 1.
++++++++++++++++++++++++++++++++++++++++++++++++++++

Возможно у вас возникал вопрос: «Зачем мне вообще эти консольные приложения?»

На него несомненно есть ответ. Во первых зачем тратить время на разработку сложного приложения, если вам нужно, что-бы пользователь вам ответил «да» или «нет». Вы укажете формат и всё нормально. Они поддерживают те-же функции, что и сложные игры, но отсутствует графика. Но её можно заменить и написать примитивную игру уже в консоли (в качестве примера можете скачать по ссылке http://rusfolder.com/42959665 с файлобменника крестики-нолики). Консоль идеально подходит для обучения.

В целом консольные приложения полезны. Главное научиться их использовать!
+++++++++++++++++++++++++++++++++++++++++++++++++++

Поговорим о логических операторах в C#.
—————————————-

Все эти операторы определяют истинность некоторого условия, то есть возвращают true или false в зависимости от условия.

Оператор «НЕ»
Унарный оператор, обозначающийся «!» и возвращающий обратное. А именно:
!true // false
!false // true

Оператор равенства
Бинарный оператор, обозначающийся «==». Проверяет равенство значений. Имеет важные особенности при работе с ссылочными типами данных:
string a = «Hello, world»; // Объявляем переменную ссылочного типа
string b = a, c = a; // Присваиваем её значения ещё в две переменные
string d = b, e = c; //Присваиваем из новых переменных ещё в две
d == e; //false, ссылаются на разные объекты

Оператор !=
Бинарный оператор, обратный оператору сравнения, или оператор «неравно»

Оператор «ИЛИ»
Бинарный оператор, обозначаемый ||, Возвращает ложь, если оба операнда ложны, иначе истину

Оператор «И»
Бинарный оператор, обозначаемый &&, возвращает истину, если оба операнда истинны, иначе ложь

Операторы сравнения
Название обо всём говорит, их список(кроме равно и не равно, о которых сказано выше):

> больше
< меньше >= больше или равно
<= меньше или равно Задание Это первое задание, которое вам даётся. здесь задача будет следующая: с клавиатуры вводится число, нажимается Enter и вводится ещё одно число. Числа — длины катетов прямоугольного треугольника. После этого выдаётся два числа. Первое — длина гипотенузы треугольника, второе — его площадь. Используйте теорему Пифагора. В помощь понадобится функция Convert.ToInt32([какая-то_строка,_преобразуемая к числу]). Высылаем свои коды с первым словом на отдельной строке «Треугольники» (Чтобы было понятно, что это именно к этому заданию). Ищем лучшего. Этот победитель своеобразного конкурса будет объявлен (Можно будет делать репосты и т.д. ил проста для результата). Оценивается количество кода и вообще работоспособность программы.

 
Задание 2.
Сделать программу, которая спрашивает у пользователя его имя и возраст. Возраст приводим к Юпитерскому (год на Юпитере равен 12 Земным) и выдаёт данные на подтверждение (Земной и Юпитерский возраста, имя).

Условные операторы.
Обязательно стоит попрактиковаться. Тема очень важная!

Итак. Нам нередко нужно проверять что либо на истинность. Мы ждём друга в гости и в зависимости от того, пришёл он или не пришёл выполняем разные действия (радуемся встрече или звоним другу). В C# проверка условий реализована тремя способами. Все они будут сейчас рассмотрены.

if-else
Одна из конструкций. Синтаксис:

if ([условие])
{
//код 1
}else{
//код 2
}

объясню. [условие] — обязательно типа bool. Тут можно применять операторы сравнения. Если оно истинно, исполняется код 1, иначе код 2. Рассмотрим более сложный вариант:
if([условие1])
{
//код 1
}
else if([условие2])
{
//код 2
}
else
{
//код 3
};
Тут принцип тот-же, но else if задаёт дополнительное условие. Во всей коеструкции else можно опускать. Если команда только одна, то скобки можно опустить:
if(a)
Console.WriteLine(«1″);
else
Console.WriteLine(«2″);
работает корректно.

switch
Синтаксис:

switch(a)
{
case [значение1]:
//код 1
break;

default:
//код х
break;
};
Аналог в if else:
if(a == [значение1])
{
//код 1
}

else
{
//код х
};
Здесь default аналогично можно опустить.

Тернарный оператор ?:
Этот тернарный оператор имеет следущий синтаксис:
[условие]?[команда1]:[команда2];
Аналог в if-else:
if([условие])
[команда1];
else
[команда2];
Команды только по одной.

Консоль — примитивное устройства ввода — вывода.

История консоли
Раньше компьютеры были огромными. На предприятиях компьютер устанавливали в отдельном помещении, а к сотрудникам выводили только экран и клавиатуру. Сотрудник вводил данные с клавиатуры. Текстовая информация выводилась на экран. Он и назывался консолью.

Реализация консоли в C#
Во-первых. В C# консоль разноцветная. Как изменить её цвет будет показано после разбора некоторых основных принципов. плюс консоль умеет «пищать» (как старые ПК, когда переключаешь режимы Num loock, Caps look, scroll look).
ООП
C# объектно-ориентированный язык программирования. Рассмотрим, что же такое объектно-ориентированное программирование (ООП).
Все машины имеют что то общее. У них у всех есть вес, максимальная скорость, мощность двигателя, привод, тип тормоза и т.д. Тогда зачем описывать каждую машину с нуля, если сделать так называемый «класс» объектов, у которых будут такие общие пункты.
Именно так можно сделать в C#.

Из чего «сделано» ООП
ООП — понятие широкое. Тем не менее в нём есть:
1. Классы
2. Структуры
3. Интерфейсы
4. Пространства имён
5. Делегаты
6. События
При этом всё это ещё из чего то состоит. Всё это будет рассмотрено подробнее далее. Сегодня начнём изучать классы.

Анализ прошлых программ
Как вы помните, все прошлые программы начинались так:
using System;
using System.Text;
using System.Linq;
using System.Collections.Generic;

namespase ConsoleApplication1
{
class Programm
{

}
}

Тут уже объявляется класс.

Класс
класс объявляется с помощью ключевого слова class.
Общая форма объявления класса следующая:
class #имя_класса#
{
//начинка
}

Модификатор доступа
модификатор доступа — своеобразное ограничение. Часто куда то пройти могут все. На других видна табличка «посторонним вход запрещён». В ООП четыре модификатора доступа:
1. public — доступ из любой точки кода
2. private — доступ только из класса объявления
3. protected и internal &#8212 будут рассмотрены в последующих уроках
Теперь начнём начинять класс.

Поле
Поле, это как бы переменная. разница лишь в том, из какой части кода она доступна. Она доступна по имени класса или его экземпляру (в зависимости от того, статическая она или нет. Статические элементы начинки рассмотрим далее) посредством оператора-точка. Общая форма объявления поля:
#модификатор_доступа# #тип_поля# #имя поля#;
Теперь создадим программу с классом. всё помечено в комментариях.
using System;
using System.Text;
using System.Linq;
using System.Collections.Generic;

namespase ConsoleApplication1
{
class Building
{
public int floors;
}
class Programm
{
public static void Main()
{
Building house = new Building();//Объявляется экземпляр класса Building
house.floors = 3;//присвоить полю floors значение 3
Console.WriteLine(«В доме » + house.floors + » этажей»);
Console.ReadKey();
}
}
}
Эта программа показывает, как объявлять экземпляры класса и использовать их поля. Вы можете создать другой экземпляр, например office, но учтите, поле floors у каждого экземпляра разное. То есть если его изменить в экземпляре office, то ничего не изменится в house. Можете поэкспериментировать с классами и их экземплярами.

очередной элемент класса — Метод.

Метод — последовательность команд, рассматриваемых как единое целое.
Общая форма объявления метода:
#модификатор_доступа# [#ключевые_слова#] #возвращаемый_тип# #имя_метода#([#список_аргументов#]){ #команды# }
О ключевых словах речь пойдёт позже
Возвращаемый тип
возвращаемый тип — любой встроенный тип, имя класса или структуры(о них речь пойдёт позже) либо ключевое слово void, которое означает, что метод ничего не возвращает.
Аргументы
Аргументы передаются списком через запятую. Общий вид параметра:
[#ключевые_слова#] #тип_параметра# #имя_параметра#

Главный метод — начало исполнения
Строка public static void Main(string[] args) объявляет метод. В C# выполнение программы начинается с метода Main.

Методы — применение на практике
В прошлом уроке мы создали класс Building. Сегодня мы его усовершенствуем — добавим целочисленное поле occupants — кол-во людей в здании и поле типа double — area, общая площадь. А также метод AreaForPeople(), который будет вычислять площадь на человека. программа примет следующий вид:
using System;
using System.Text;
using System.Linq;
using System.Collections.Generic;

namespase ConsoleApplication1
{
class Building
{
public int floors;
public double area;
public int occupants;
public double AreaForOne(){//Объявление метода без параметров возвращающего тип double
return area/occupants;
}
}
class Programm
{
public static void Main()
{
Building house = new Building();
house.area = 10.10;
house.occupants = 10;
Console.WriteLine(house.AreaForOne());
}
}
}
В результате появится надпись «1.01»

Методы с параметрами.
Итак, как такие методы объявляются.

Общий синтаксис:
#модификатор доступа# #возвращаемый тип# #имя метода#(#тип параметра 1# #имя параметра 1#, #тип параметра 2# #имя параметра 2#…){ #код#}
То есть, объявление метода с параметрами ничем не отличается от методов без параметров, однако нужно дополнительно указывать тип и имя параметра в скобках.

Обращение к параметру
В методах с параметрами необходимо к параметрам обращаться, ведь иначе зачем вообще нужны параметры? :) на самом деле это просто. параметры, это как переменные. Из метода можно написать имя параметра, что и означает обращение к нему.

Передача параметра
Чтобы передать параметры методу в скобках нужно указать их значения в порядке объявления. Параметры также можно передавать явно. Тогда нужно писать имя параметра, затем двоеточие и потом значение. Все параметры нужно передавать одним способом. При явной передаче можно не соблюдать очерёдность.

Ключевое слов ref
Если перед именем параметра установить ключевое слово ref, то в параметр попадёт не значение, которое мы передаём, а ссылка на него. Если обычный параметр, какие бы значения мы в методе ему не присваивали вне его не изменится, то есть переменная, которую мы передадим, сохранит значение. А ecли передать переменную параметру со словом ref, то все изменения в методе будут изменять и переменную. При передаче параметра ref нужно указывать ключевое слово, как и при объявлении. Переменная, переданная параметру ref должна быть инициализирована, то есть должна иметь значение.

Ключевое слово out
Ключевое слово out выполняет ту же функцию, что и ключевое слово ref, но перед передачей переменная не обязательно должна быть инициализирована.
Вопросы можно задавать тут

С чего начать в сфере ИТ? Михаил Макей

С чего начать в сфере ИТ?

С чего начать в сфере ИТ? Этот вопрос интересует многих, кого тянет в область
информационных технологий. Есть 3 основных специальности: программист, тестировщик
и дизайнер. Также можно выделить бизнес-аналитика и пр.

Начнём с того, что надо разобраться в том, как устроена сфера ИТ. Есть фрилансеры,
владельцы собственных продуктов и работники в ИТ-компаниях. Начнём с последних.
В ИТ-компании всё происходит так: компания получает заказ, бизнес-аналитики,
менеджеры и прочие рассматривают проект и распределяют роли. Дизайнеры, изучая
требования к продукту, приступают к отрисовке интерфейса, вообще созданию внешнего
вида продукта. Программисты же всё это реализуют. Тестировщики проверяют работу
программистов, ищут ошибки, а программисты всё это дорабатывают.

Но с чего же вообще начать? С изучения английского. Почему? А потому что во-первых
работа идёт чаще всего с зарубежными заказчиками, понятия не имеющих о русском.
А общаться с заказчиками критически необходимо. Во-вторых программисты используют
специально предназначенный для программирования софт и прочие инструменты, которые
сразу выходят на английском. А пока за год этот софт и документацию переведут на
русский, выйдет более совершенная версия. В-третьих программисты постоянно
оттачивают свои навыки, а всякая информация содержится в основном на английском
(судите сами, до 80% сайтов в Интернете — англоязычные). Думаю, теперь всё ясно.

Далее определяемся с направлением. Пройдите мини-тест ниже.

— Вам нравится творить, создавать что-то новое, да и вы любите творческую
деятельность? Вам в дизайнеры.

— Вы любите проверять всё созданное, пользоваться готовым, указывать на ошибки,
проверять на вшивость? Да вы тестировщик.

— Вы любите реализовывать проекты, воплощать задуманное в жизнь, аналитически
мыслить, применять свои знания для решения поставленных задач? Вы же
программист!

Думаю, Вы определились с направлением своей деятельности. В следующий раз мы
обсудим, с чего же начать программисту.

Спасибо за внимание, дополняйте статью в своём комментарии.