Создание программы для windows самому

Cоздать программу самому? Это очень просто! Не верите? Давайте сделаем небольшую программу, которая станет вашей отправной точкой в мир программирования.

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

Не буду рассуждать на тему зачем может потребоваться писать самостоятельно программу, у каждого свои причины. Оговорюсь сразу, что в данной статье будет использоваться язык программирования C# и среда разработки Microsoft Visual Studio, у которой имеется бесплатная редакция, возможностей которой хватит «за глаза» любому.

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

Из выше сказанного, написание программы можно разделить на следующие этапы:

  1. Определение цели, какую задачу ваша программа помочь вам решить
  2. Разработка алгоритма работы программы.
  3. Дизайн пользовательского интерфейса. 
  4. Написание логики программы. На этом этапе вдыхается жизнь в вашу програму. Это и есть наиболее важный этап создания программы, для успешной реализации которого понадобится много знаний и умений.
    Где взять знания и умения? Книги, профильные сайты, курсы. Сейчас в интернете можно найти бесчисленное множество обучающих материалов, посвященных данной теме.
    Отдельно хочется упомянуть ресурсы для освоения C#:

    • бесплатную книгу Fundamentals of Computer Programming with C#
    • сайт METANIT.COM
    • Документация по C# на сайте Microsoft

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

Да, в блокноте вполне реально создать программу, но на это у вас уйдет гораздо больше времени и такими «извращениями» могут заниматься реально крутые программисты. Для остальных-же Microsoft Visual Studio — это именно тот инструмент, который будет помогать создавать новые и управлять существующими проэктами.

Из ключевых возможностей Visual Studio хочется отметить:

  • Разработка для популярных платформ Windows, Linux, MacOS
  • Веб разработка: ASP.NET, Node.js, Python, JavaScript, and TypeScript
  • Популярные языки программирования: C#, C++, Visual Basic, Python, JavaScript
  • Визуальное редактирование пользовательского интерфейса
  • IntelliSense — интеректуальный помощник при написании кода
  • Управление версиями. Интеграция с GitHub
  • Совместная разработка
  • Расширение возможностей путем установки дополнений.

Поэтому Microsoft Visual Studio — это именно то, с чего стоит начать свою карьеру программиста. 

Примечание.
Ранее, когда Visual Studio не была бесплатной, как альтернативу можно было рассматривать SharpDevelop, бесплатную IDE с открытым исходным кодом, которая предоставляла функционал сходный с Visual Studio и в некоторых случаях его было достаточно для создания проэктов любой сложности. Но теперь, в виду стагнации процесса разработки SharpDevelop, и стремительного развития Visual Studio, альтернативы продукту от Microsoft просто нет.

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

Давайте создадим программу — калькулятор. Почему-бы и нет? Изобретать велосипед — это-же так весело! :) А если серъезно, то ничего зазорного в этом нет, ведь клепают-же хелловорлды во всех учебниках и не стесняются. Мы в этом плане даже чем-то лучше.

Как уже оговаривалось выше, язык программирования будет использован C#,

  1. Нажимаем кнопку Create a new project.
  2. Шаг Create new project:

    • Выбираем фильтр:

      • Язык программирования: C#
      • Платформа: Windows
      • Тип проекта: Desktop
    • Выбираем Windows Forms App (Net. Framework) — нажимаем Next
  3. Шаг Configure your project:
    Название проэкта: CalculatorApp
    Название решения: Calculator.
    Framework: Оставляем по умолчанию, на данном этапе не важно какая версия Net. Framework
  4. Нажимаем Create

Открылось главное окно Visual Studio,

Перетащите кнопку Button на форму главного окна, только что созданного проекта.

Эта кнопка не делает ничего связанного с вычислениями — при её нажатии будет закрываться программа. На примере этой кнопки вы увидите насколько просто наполнять окно программы необходимыми элементами пользовательского интерфейса.

Настройте только что добавленную кнопку в панели свойств:

  • Свойство Text, меняем значение на Close
  • Name меняем на bnClose
  • Anchor: Bottom,Right

Добавьте обработчик события нажатия кнопки: делаем двойное нажатие на кнопке, программа автоматически создаст необходимый метод bnClose_Click. Внутри метода пишем: this.Close();

private void bnClose_Click(object sender, EventArgs e)
{
	this.Close();
}

Запускаем программу:

При нажатии кнопки Close, окно программы закроется, в след за этим завершит работу и сама программа.

Примечание
За всеми проделанными выше действиями с созданием конпки и редактирования ее свойств, лежит создание кода программы средой разработки VisualStudio.

Откойте файл Form1.Designer.cs. Как видите, все те действия, что вы делали в настройках, отображены здесь в виде кода программы:

// 
// bnClose
// 
this.bnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bnClose.Location = new System.Drawing.Point(750, 350);
this.bnClose.Name = "bnClose";
this.bnClose.Size = new System.Drawing.Size(75, 23);
this.bnClose.TabIndex = 0;
this.bnClose.Text = "Close";
this.bnClose.UseVisualStyleBackColor = true;
this.bnClose.Click += new System.EventHandler(this.bnClose_Click);

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

Примечание
Если вы поставили Visual Studio и хотите изменить язык интерфейса на другой язык, то это можно сделать в настройках программы Tools — Options — Internetional Settings. Если языка, который вам нужен нет в списке, доустановите его через Microsoft Visual Studio Installer. После этого опять откройте Tools — Options — Internetional Settings, и измените язык интерфейса.

Сделаем что-нибудь посложнее, чем просто вывод текста на экран

В большинстве учебников для начинающих программистов первая программа выводит простое сообщение «Hello world!». Мне кажется это немного тупо, так как для того, чтоб заинтересовать начинающего программиста, нужно показать нечто большее и полезное, нежели просто окно с текстом.

Для того чтоб оценить возможности языка программирования C# и .Net Framework, давайте в нашей программе реализуем возможность выполнения простейших арифметических операций. Мне кажется это будет гораздо полезней.

Итак, давайте создадим следующие элементы интерфейса программы

  • Четыре кнопки:

    • Сложение

      • Text: «+»
      • Name: bnPlus
    • Вычитание

      • Text: «-«
      • Name: bnMinus
    • Умножение

      • Text: «*»
      • Name: bnMult
    • Деление

      • Text: «/»
      • Name: bnDiv
  • Три текстовых поля: два для выполнения арифметических операций и один для результата.

    • Оператор 1

      • Name: tbOperand1
    • Оператор 2

      • Name: tbOperand2
    • Результат

      • Name: tbResult
  • Надписи (Labels) для них имя не важно, так как к ним мы обращаться не будем, но лучше имя все-таки дать:

    • Name: lblOperand1
    • Name: lblOperand2
  • Кнопка закрытия окна осталась из примера, рассмотренного ранее

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

Как видите, добавлять элементы интерфейса программы весьма просто — перетягиваем их из панели инструментов (или создаем копии уже существующих) в то место окна, где должен находиться элемент, изменяем размер, свойства и положение.

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

Высота текстового поля tbResult регулируется за счет изменения размера шрифта.

Обратите внимание, что имя элементов назначаются автоматически и, если не давать им осмысленные имена, и при достаточно большом их количестве, очень легко потеряться в хаосе, состоящем из элементов с названиями button1, button2, button3, textBox1, textBox2, textBox3 и так далее. Сразу после создания элементов, не ленитесь, давайте им осмысленые имена — дальше, при создании обработчиков событий, имена методов будут генерироваться автоматически на основании имени элемента управления. Думаю никто не сомневается в том, что имя метода ButtonAdd_Click() гораздо более осмысленно, чем Button1Click()

Назначим обработчики событий нажатия кнопок

Выбираем по очереди каждую кнопку.Даблкликом создаем обработчик нажатия кнопки(Click). Если нужно добавить обработчик другого события, или выбрать уже существующий метод — следует открыть вкладку События (значок в виде молнии)  и там уже выбрать необходимое событие.

Пишем код обработчика

private void bnAdd_Click(object sender, EventArgs e)
{
	tbResult.Text = (float.Parse(tbOperand1.Text) + float.Parse(tbOperand2.Text)).ToString();
}

private void bnSubstr_Click(object sender, EventArgs e)
{
	tbResult.Text = (float.Parse(tbOperand1.Text) - float.Parse(tbOperand2.Text)).ToString();
}

private void bnMultiply_Click(object sender, EventArgs e)
{
	tbResult.Text = (float.Parse(tbOperand1.Text) * float.Parse(tbOperand2.Text)).ToString();
}

private void bnDivide_Click(object sender, EventArgs e)
{
	tbResult.Text = (float.Parse(tbOperand1.Text) / float.Parse(tbOperand2.Text)).ToString();
}

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

Давайте на примере операции сложения разберем как работает наша программа.

tbResult.Text = (float.Parse(tbOperand1.Text) + float.Parse(tbOperand2.Text)).ToString();

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

  1. float.Parse(tbOperand1.Text) — Извлекается значение свойства Text переменной tbOperand1 и передается в качестве параметра статичскому методу Parse() типа System.Single результат записывается в промежуточную переменную A
  2. float.Parse(tbOperand2.Text) — то-же самое, результат записывается в промежуточную переменную B
  3. Производится сложение промежуточных переменных (A + B) в промежуточную переменную C
  4. C.ToString() — Преобразовуется переменная C в строку. Так как любая переменная в C# это объект, то путем обращения к методу ToString() этого объекта мы можем получить его строковое представление.

Более сложные типы, такие как DateTime, могут иметь несколько мeтодов ToString().

Проверяем работу программы

Нажмите кнопку Пуск на панели инструментов, или нажмите клавишу F5

Программа работает и делает то, что от нее требовалось:

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

Давайте теперь перепишем программу, чтоб она могла выводить предупреждение, в случае, если было введено некорректное значение одного из операторов. Скопируйте следующий метод к себе в файл Form1.cs, там где находятся остальные обработчики *_Click:

private void bnMathAction_Click(object sender, EventArgs e)
{
	// эти переменные нужны для out параметров float.TryParse(string s, out v)
	float A, B;
	// Эта строковая переменная хранит имя кнопки, 
	// будет использована для определения того, какая кнопка нажата
	string senderName = ((Button)sender).Name;

	// if(bool && bool)
	// оба метода должны вернуть истину
	if (float.TryParse(tbOperand1.Text, out A) && float.TryParse(tbOperand2.Text, out B))
	{
		// Проверяем по имени какая кнопка нажата и в соответствии с выбором
		// вызываем требуемую арифметическую операцию
		switch (senderName)
		{
			case "bnAdd":
				tbResult.Text = (A + B).ToString();
			break;
			case "bnSubstr":
				tbResult.Text = (A - B).ToString();
				break;
			case "bnMultiply":
				tbResult.Text = (A * B).ToString();
				break;
			case "bnDivide":
				tbResult.Text = (A / B).ToString();
				break;
		}
	}
	else
	{
		MessageBox.Show("Неправильно введено значение оператора!");
	}
}

Этот метод принимает параметр  object sender, который используется для определения того, какая кнопка была нажата. Здесь использован основополагающий принцип ООП — Полиморфизм. Объект типа Button можно абстрагировать до типа object, но при этом информация, специфичная для типа Button никуда не пропала — для того, чтоб к ней обратиться, нужно sender привести к типу Button. Например:

Button btn = new Button(); // Объект типа Button
object obj = new object(); // Объект типа object

// Объект типа Button является наследником типа object, поэтому возможно неявное преобразование типа
object obj2 = btn;
object obj3 = new Button() { Name = "bnTest", Text = "Test"};

//obj3.Text = "Test 1"; // Ошибка. Нельзя напрямую обратиться к полю Text
((Button)obj3).Text = "Test 1"; // А вот так обратиться к полю Text  вполне даже можно

// Тип object не может стать типом Button. Рожденный ползать летать не может
//Button btn2 = obj;         // Ошибка. 
//Button btn2 = (Button)obj; // Ошибка. 

Теперь перейдите в конструктор формы (Shift + F7) и для каждой кнопки, в качестве обработчика события Click выберите метод bnMathAction_Click.

Если перейти к коду, то можно увидеть, что ссылок на этот метод стало четыре, а на остальные методы обработчики теперь никто не ссылается — ссылок ноль. Их можно спокойно удалить.

В итоге вы должны получить файл Form1.cs следующего вида:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CalculatorApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void bnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void bnMathAction_Click(object sender, EventArgs e)
        {
            // эти переменные нужны для out параметров float.TryParse(string s, out v)
            float A, B;
            // Эта строковая переменная хранит имя кнопки, 
            // будет использована для определения того, какая кнопка нажата
            string senderName = ((Button)sender).Name;

            // if(bool && bool)
            // оба метода должны вернуть истину
            if (float.TryParse(tbOperand1.Text, out A) && float.TryParse(tbOperand2.Text, out B))
            {
                // Проверяем по имени какая кнопка нажата и в соответствии с выбором
                // вызываем требуемую арифметическую операцию
                switch (senderName)
                {
                    case "bnAdd":
                        tbResult.Text = (A + B).ToString();
                    break;
                    case "bnSubstr":
                        tbResult.Text = (A - B).ToString();
                        break;
                    case "bnMultiply":
                        tbResult.Text = (A * B).ToString();
                        break;
                    case "bnDivide":
                        tbResult.Text = (A / B).ToString();
                        break;
                }
            }
            else
            {
                MessageBox.Show("Неправильно введено значение оператора!");
            }
        }
    }
}

Код проекта доступен на GitHub.

Первый опыт написания полноценной программы

Время на прочтение
17 мин

Количество просмотров 16K

Каждый начинающий программист мечтает реализовать свой собственный проект. Не написать простенький код, по заданию преподавателя, а воплотить в жизнь свои идеи. Так и я, изучая C++ 3-4 месяца, решился попробовать разработать макет электронного журнала для преподавателей.

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

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

  1. Регистрацию (Reg),

  2. Авторизацию (Authon),

  3. Выбор группы (GroupSelection),

  4. Возможность выставлять оценки (Grades),

  5. Возможность выставлять посещаемость (Attendance),

  6. Возможность писать комментарии к датам (Comment),

  7. Возможность устанавливать dedlin’ы (Deadline).

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

блок-схема программы

блок-схема программы

Аналогично, были созданы блок схемы для каждой функции.

авторизация

авторизация
регистрация
регистрация
выбор группы
выбор группы
выставление оценок
выставление оценок
простановка посещаемости
простановка посещаемости
написание комментариев к датам
написание комментариев к датам
установка dedlin’ов
установка dedlin’ов

Написание кода программы

Первым шагом написания программы является добавления необходимых заголовочных файлов, а именно:

  1. iostream — заголовочный файл с классами, функциями и переменными для организации ввода-вывода.

  2. string —  это заголовочный файл для взаимодействия с
    классами string (строками).

  3. fstream — заголовочный файл, включающий набор классов, методов и функций, которые предоставляют интерфейс для чтения/записи данных из/в файл.

Далее была добавлена глобальная переменная, то есть переменная, область действия которой охватывает всю программу. Использование такой переменной потребовалось для реализации удобного взаимодействия с информацией.

std::string nameofgroup;

Чтобы удобно группировать данных в одной переменной для каждого объекта, который оперирует этими данными, мною было объявлено несколько классов, а именно:

Класс данных о преподавателе – DataofTeature.

class DataofTeature
{
public:
	std::string name; //имя преподавателя
	std::string surname; //фамилия преподавателя
	std::string patronymic; //отчество преподавателя
	std::string login; //логин преподавателя
	std::string password; //пароль преподавателя
};

Класс данных о студенте – DataofStudent.

class DataofStudent
{
public:
	std::string group; //название группы студента
	std::string name; //имя студента
	std::string surname; //фамилия студента
};

Основываясь на ранее представленных блок схемах, был написан код для всех функций. Разберемся с каждой функций подробнее.

Reg

Функция Reg реализует полноценную регистрацию, с записью данных о пользователе в текстовый файл.

В ходе выполнения функции, пользователю предлагается ввести ФИО, логин и пароль. После получения программой логина, проверяется его наличие в системе, если логин совпадает с ранее записанным в базу логинов, то пользователя предлагается ввести логин повторно. Как только программа получает ФИО, пароль и уникальный логин, происходит запись логина в базу для логинов (при открытие базы данных используется режим открытия ios_base::app, позволяющий открыть файл для записи в конец файла, при этом, сохраняя ранее записанные данные), создание специализированного файла для регистрационных данных пользователя, и запись в него ФИО, аналогично создается специальный файл для хранения логина и пароля конкретного пользователя. Формирования уникальных файлов происходит по принципу сложения строк. Например, path=path+teature1.login+txt, где path-путь к директории, в которой хранятся файлы программы, teature1.login – уникальный логин пользователя, txt- строка, хранящая в себе “.txt”.

void Reg()
{
	std::string path = "C:\\journal\\regdata", datalog = "C:\\journal\\logdata.txt", txt = ".txt", user = "C:\\journal\\", delfile = "C:\\journal\\delfile.txt"; //объявление переменных типа string
	bool flag = 1; //объявление переменной типа bool
	DataofTeature teature1; //объявление переменной класса DataofTeature
	std::ofstream fout; //объявление переменной класса ofstream
	std::ifstream fin; //объявление переменной класса ifstream
	std::cout << "\t\t\tРегистрация:\n"; //ввод даных, необходимых для регистрации
	std::cout << "Введите фамилию: ";
	std::cin >> teature1.surname;
	std::cout << "Введите имя: ";
	std::cin >> teature1.name;
	std::cout << "Введите отчество: ";
	std::cin >> teature1.patronymic;
	std::cout << "Введите логин: ";
	std::cin >> teature1.login;
	while (flag)
	{
		bool flag2 = 0;
		fin.open(datalog);
		if (fin.is_open())
		{
			std::string data = "";
			while (!fin.eof())
			{
				std::getline(fin, data);
				if (teature1.login == data)		//проверка на существование данного логина в файле
				{
					flag2 = 1;
					flag = 1;
				}
			}
		}
		else
		{
			std::cout << "ERROR"; //Файл не удалось создать или открыть
		}
		if (flag2)
		{
			std::cout << "Данный логин уже существует, придумайте другой логин: "; //прозьба ввести логин повторно, если введенный до этого уже существует
			std::cin >> teature1.login;
			flag = 1;
		}
		else
		{
			flag = 0; //изменение булевой переменной для выхода из цыкла
		}
		fin.close();
	}
	path = path + teature1.login + txt; //формирование пути, для создания файла с ФИО аккаунта
	fout.open(path);
	if (fout.is_open())
	{
		fout << teature1.surname << "\n";
		fout << teature1.name << "\n";			//запись данных в файл
		fout << teature1.patronymic << "\n";
	}
	else
	{
		std::cout << "ERROR"; //Файл не удалось создать или открыть
	}
	fout.close();
	std::cout << "Введите пароль: ";
	std::cin >> teature1.password;		//ввод пароля
	fout.open(datalog, std::ios_base::app); //открыть файл для записи в конец файла
	if (fout.is_open())
	{
		fout << teature1.login << "\n"; //запись данных в файл
	}
	else
	{
		std::cout << "ERROR"; //Файл не удалось создать или открыть
	}
	fout.close();
	user = user + teature1.login + txt; //формирование пути хранения логина и пароля
	fout.open(user); //открытия файла
	if (fout.is_open())
	{
		fout << teature1.login << "\n";
		fout << teature1.password << "\n";		//запись данных в файл
	}
	else
	{
		std::cout << "ERROR"; //Файл не удалось создать или открыть
	}
	fout.close();
}

Authon

Функция Authon реализует авторизацию пользователя в программу.

В ходе выполнения функции, пользователю предлагается ввести логин и пароль. Следом идет проверка наличия логина в базе логинов, если логина в базе нет, пользователю
предлагается ввести логин повторно. Получив логин, программа открывает
специализированный файл пользователя, получая к нему путь, методом сложения
строк. В этом файле проверяется верность пароля, если пароль не совпадает, то
предлагается ввести пароль повторно. Как только все данные проверены, программа
открывает файл с ФИО пользователя и выводит на экран приветствие, используя ФИО
пользователя.

void Authon()
{
	std::string path = "C:\\journal\\regdata", datalog = "C:\\journal\\logdata.txt", txt = ".txt", user = "C:\\journal\\", delfile = "C:\\journal\\delfile.txt", login, password, filelog = ""; //объявление переменных типа string
	DataofTeature teature1; //объявление переменной класса DataofTeature
	std::ifstream fin; //объявление переменной класса ifstream
	bool flag = 1; //объявление переменной типа bool
	std::cout << "\t\t\tАвторизация:\n";
	std::cout << "Введите логин: ";
	std::cin >> login;			//ввод логина
	while (flag)
	{
		bool flag2 = 0;
		fin.open(datalog);		//проверка наличия логина в базе логинов
		if (fin.is_open())
		{
			while (!fin.eof())
			{
				std::getline(fin, filelog);
				if (login == filelog)
				{
					flag = 0;
					flag2 = 0;
					break;
				}
				else
				{
					flag2 = 1;
				}
			}
		}
		else
		{
			std::cout << "ERROR"; //Файл не удалось создать или открыть
		}
		if (flag2)
		{
			std::cout << "Такого логина не существует, введите логин повторно: \n";			//просьба ввести логин повторно
			std::cin >> login;
		}
		fin.close();
	}
	user = user + login + txt; //формирования пути нахождения файла с логинами и паролями
	flag = 1;
	std::cout << "Введите пароль: ";		//ввод пароля
	std::cin >> password;
	while (flag)
	{
		bool flag2 = 0;
		fin.open(user);
		if (fin.is_open())
		{
			while (!fin.eof())
			{
				std::getline(fin, filelog);
				if (password == filelog)
				{								//проверка верности пароля
					flag = 0;
					flag2 = 0;
					break;
				}
				else
				{
					flag2 = 1;
				}
			}
		}
		else
		{
			std::cout << "ERROR"; //Файл не удалось создать или открыть//
		}
		if (flag2)
		{
			std::cout << "Пароль введен не верно, попробуйте еще раз: \n";		//просьба ввести пароль повторно
			std::cin >> password;
		}
		fin.close();
	}
	std::cout << "Добро пожаловать ";
	path = path + login + txt;
	fin.open(path);
	if (fin.is_open())
	{
		std::string data = "";					//вывод приветствия на экран
		while (!fin.eof())
		{
			std::getline(fin, data);
			std::cout << data << " ";
		}
	}
	else
	{
		std::cout << "ERROR"; //Файл не удалось создать или открыть
	}
	fin.close();
	std::cout << "\n";
}

GroupSelection

Функция реализует полноценный выбор группы в программе.

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

void GroupSelection()
{
	DataofStudent stud1; //объявление переменных класса DataofStudent
	std::string allgroup = "", path = "C:\\journal\\allgroup\\allgroup.txt", delfile = "C:\\journal\\allgroup\\delfile.txt", path2 = "C:\\journal\\allgroup\\", txt = ".txt", choice = ""; //объявление переменных типа string
	bool flag = 1; //объявление переменных типа bool
	std::ifstream fin; //объявление переменной класса ifstream
	std::ofstream fout; //объявление переменной класса ofstream
	std::cout << "Полный список групп: \n";
	fin.open(path);
	if (fin.is_open())
	{
		std::string data = "";
		while (!fin.eof())
		{
			std::getline(fin, data);		//вывод а экран полного списка групп
			std::cout << "\t\t\t" << data << "\n";
		}
	}
	else
	{
		std::cout << "ERROR"; //Файл не удалось создать или открыть//
	}
	fin.close();
	std::cout << "Введите название группы, которую хотите открыть: ";
	std::cin >> stud1.group;	//ввод название необходимой группы
	while (flag)
	{
		bool flag2 = 1;
		fin.open(path);
		if (fin.is_open())
		{
			std::string data = "";
			while (!fin.eof())
			{
				std::getline(fin, data);
				if (stud1.group == data)	//проверка на наличие введенной группы в списке групп
				{
					flag2 = 0;
					flag = 0;
				}
			}
		}
		else
		{
			std::cout << "ERROR"; //Файл не удалось создать или открыть
		}
		if (flag2)
		{
			std::cout << "Данной группы не существует, введите другую группу: ";
			std::cin >> stud1.group;	//просьба ввести название группы повторно
			flag = 1;
		}
		else
		{
			flag = 0;	//изменение буливой переменной для выхода из цыкла
		}
		fin.close();
	}
	nameofgroup = stud1.group; //присваивание названия группы в глобальную переменную
}

Grades

Функция Grades реализует, простановку оценок студентам.

В ходе выполнения функции, пользователю предлагается ввести дату, за которую он хочет выставить оценку. После получения программой даты, происходит проверка на существование файла с оценками на данную дату. Если файл существует, то происходит его запись в специализированный промежуточный файл, это происходит для реализации корректной и органичной записи в файл отметок, без потерь данных. Если файл не существует, то программа копирует данные из файла со списком группы в промежуточный файл. Следом, на экран выводится полный список группы с отметками (если они есть). Пользователю предлагается ввести фамилию и имя студента, которому он хочет выставить оценку. Как только программа получает эти данные, происходит проверка на наличие данного студента в группе, если его нет, то пользователю предлагается ввести фамилию и имя повторно. После получения данных программой, происходит создание файла для оценок на данную дату (принцип нахождения пути файла и формирования его название – сложение строк). Следом, идет поиск данного студента в промежуточном файле. Принцип поиска и записи таков: если фамилия и имя не совпадает с введенными пользователем, то происходит запись этих данных в файл с оценками, если ФИ совпали, то пользователю предлагается ввести студенту оценку, полученная строчка записывается в файл с оценками. В конце работы функции, на экран выводится список группы с внесенными изменениями.

void Grades()
{
	DataofStudent student1; //объявление переменных класса DataofStudent
	std::string way = "C:\\journal\\allgroup\\", delfile = "delfile.txt", txt = ".txt", attendance = "\\grade", choice = ""; //объявление переменных типа string
	bool flag = 0, flag2 = 1; //объявление переменных типа bool
	std::ofstream fout; //объявление переменной класса ofstream
	std::ifstream fin; //объявление переменной класса ifstream
	std::cout << "Введите дату за которую вы хотите проставить оценки: ";
	std::cin >> choice;	//ввод даты 
	fin.open(way + nameofgroup + attendance + choice + txt);
	if (fin.is_open())
	{
		flag = 1;		//проверка наличия файла с оценками на данную дату
	}
	fin.close();
	if (flag)
	{
		fin.open(way + nameofgroup + attendance + choice + txt);
		fout.open(way + delfile);
		if (fin.is_open() and fout.is_open())
		{
			std::string data = "";
			while (!fin.eof())		//запись данных существующего файла в специализированный файл
			{
				std::getline(fin, data);
				fout << data << "\n";
			}
		}
		else
		{
			std::cout << "ERROR"; //Файл не удалось создать или открыть
		}
		fin.close();
		fout.close();
	}
	else
	{
		fin.open(way + nameofgroup + txt);
		fout.open(way + delfile);
		if (fin.is_open() and fout.is_open())
		{
			std::string data = "";
			while (!fin.eof())
			{									//запись  в специализированный файл списка группы 
				std::getline(fin, data);
				fout << data << "\n";
			}
		}
		else
		{
			std::cout << "ERROR"; //Файл не удалось создать или открыть
		}
		fin.close();
		fout.close();
	}
	fin.open(way + delfile);
	if (fin.is_open())
	{
		std::string data = "";
		while (!fin.eof())	//вывод списка группы на экран
		{
			std::getline(fin, data);
			std::cout << data << "\n";
		}
	}
	else
	{
		std::cout << "ERROR"; //Файл не удалось создать или открыть
	}
	fin.close();
	std::cout << "Введите фамилию и имя студента. которому вы хотите выставить оценку: " << std::endl;
	std::cin >> student1.name;	//ввод фамили и имени студента
	while (flag2)
	{
		fin.open(way + delfile);
		if (fin.is_open())
		{
			std::string data = "";
			while (!fin.eof())
			{
				std::getline(fin, data);
				if (data == student1.name)
				{
					flag2 = 0;	//проверка наличия данно ФИ в списке группы
				}
			}
		}
		else
		{
			std::cout << "ERROR"; //Файл не удалось создать или открыть
		}
		if (flag2)
		{
			std::cout << "Такого студента не существует, повторите ввод фамилии и имени: "; //повторный ввод ФИ студента
			std::cin >> student1.name;
		}
		fin.close();
	}
	fin.open(way + delfile);
	fout.open(way + nameofgroup + attendance + choice + txt);
	if (fin.is_open() and fout.is_open())
	{
		std::string data = "";
		while (!fin.eof())
		{
			std::getline(fin, data);
			if (data == student1.name)
			{
				bool flag3 = 1;
				for (int i = 0; i < data.length(); i++)
				{											//процесс нахождения ФИ студента в файле
					if (flag3 and data[i] != '\t')
					{
						fout << data[i];	//запись данных в файл с оценками
					}
					else
					{
						flag3 = 0;
					}

				}
				std::string choice2;
				std::cout << "Введите оценку: ";	//ввод оценки
				std::cin >> choice2;
				fout << "\t" << choice2 << "\n";	//запись данных в файл с оценками
			}
			else
			{
				fout << data << "\n";	//запись данных в файл с оценками
			}
		}
	}
	else
	{
		std::cout << "ERROR"; //Файл не удалось создать или открыть
	}
	fin.close();
	fout.close();
	std::cout << "\n";
	fin.open(way + nameofgroup + attendance + choice + txt);
	if (fin.is_open())
	{
		std::string data = "";
		while (!fin.eof())
		{
			std::getline(fin, data);
			std::cout << "\t\t\t" << data << "\n";	//вывод измененных данных на экран
		}
	}
	else
	{
		std::cout << "ERROR"; //Файл не удалось создать или открыть
	}
	fin.close();
}

Attendance

Функция Attendance реализует простановку посещаемости студентов с последующей записью в файл.

В ходе выполнения функции, пользователю предлагается ввести дату, за которую он хочет выставить посещаемость. После получения программой даты, происходит проверка на существование файла с посещаемостью на данную дату. Если файл существует, то происходит его запись в специализированный промежуточный файл, это происходит для реализации корректной и органичной записи в файл посещаемости, без потерь данных. Если файл не существует, то программа копирует данные из файла со списком группы в промежуточный файл. Следом, на экран выводится полный список группы с посещаемостью (если она есть). Пользователю предлагается ввести фамилию и имя студента, которому он хочет выставить посещаемость. Как только программа получает эти данные, происходит проверка на наличие данного студента в группе, если его нет, то пользователю предлагается ввести фамилию и имя повторно. После получения данных программой, происходит создание файла для посещаемости на данную дату (принцип нахождения пути файла и формирования его название – сложение строк). Следом, идет поиск данного студента в промежуточном файле. Принцип поиска и записи таков: если фамилия и имя не совпадает с введенными пользователем, то происходит запись этих данных в файл с оценками, если ФИ совпали, то пользователю предлагается ввести посещаемость студента, полученная строчка записывается в файл с посещаемостью. В конце работы функции, на экран выводится список группы с внесенными изменениями.

void Attendance()
{
	DataofStudent student1; //объявление переменной класса DataofStudent
	std::string way = "C:\\journal\\allgroup\\", delfile = "delfile.txt", txt = ".txt", attendance = "\\attendance", choice = "";//объявление переменных типа string
	bool flag = 0, flag2 = 1; //объявление переменной типа bool
	std::ofstream fout; //объявление пременной класса ofstream
	std::ifstream fin; //объявление переменной класса ifstream
	std::cout << "Введите дату за которую вы хотите проставить посещаемость: ";
	std::cin >> choice; //ввод даты
	fin.open(way + nameofgroup + attendance + choice + txt);
	if (fin.is_open())
	{
		flag = 1;	//проверка на наличие файла
	}
	fin.close();
	if (flag)
	{
		fin.open(way + nameofgroup + attendance + choice + txt);
		fout.open(way + delfile);
		if (fin.is_open() and fout.is_open())
		{
			std::string data = "";
			while (!fin.eof())	//запись данных файла в промежуточный файл
			{
				std::getline(fin, data);
				fout << data << "\n";
			}
		}
		else
		{
			std::cout << "EROR";
		}
		fin.close();
		fout.close();
	}
	else
	{
		fin.open(way + nameofgroup + txt);
		fout.open(way + delfile);
		if (fin.is_open() and fout.is_open())
		{
			std::string data = "";
			while (!fin.eof())
			{						//запись списка группы в промежуточный файл
				std::getline(fin, data);
				fout << data << "\n";
			}
		}
		else
		{
			std::cout << "EROR";
		}
		fin.close();
		fout.close();
	}
	fin.open(way + delfile);
	if (fin.is_open())
	{
		std::string data = "";
		while (!fin.eof())
		{
			std::getline(fin, data);
			std::cout << data << "\n";	//ввывод списка группы на экран
		}
	}
	else
	{
		std::cout << "EROR";
	}
	fin.close();
	std::cout << "Введите фамилию и имя студента. которому вы хотите выставить посещаемость: " << std::endl;
	std::cin >> student1.name;	//ввод фамили и имени студента
	while (flag2)
	{
		fin.open(way + delfile);
		if (fin.is_open())
		{
			std::string data = "";
			while (!fin.eof())
			{
				std::getline(fin, data);
				if (data == student1.name)	//проверка на наличие данного студента в группе
				{
					flag2 = 0;
				}
			}
		}
		else
		{
			std::cout << "EROR";
		}
		if (flag2)
		{
			std::cout << "Такого студента не существует, повторите ввод фамилии и имени: ";	//повторный ввод ФИ студента
			std::cin >> student1.name;
		}
		fin.close();
	}
	fin.open(way + delfile);
	fout.open(way + nameofgroup + attendance + choice + txt);
	if (fin.is_open() and fout.is_open())
	{
		std::string data = "";
		while (!fin.eof())
		{
			std::getline(fin, data);
			if (data == student1.name)
			{
				bool flag3 = 1;
				for (int i = 0; i < data.length(); i++)
				{
					if (flag3 and data[i] != '\t')
					{
						fout << data[i];	//процесс нахождения студента в файле
					}
					else
					{
						flag3 = 0;
					}

				}
				std::string choice2;
				std::cout << "Введите посещаемость: ";
				std::cin >> choice2; //ввод посещаемости
				fout << "\t" << choice2 << "\n";
			}
			else
			{
				fout << data << "\n";
			}
		}
	}
	else
	{
		std::cout << "EROR";
	}
	fin.close();
	fout.close();
	std::cout << "\n";
	fin.open(way + nameofgroup + attendance + choice + txt);
	if (fin.is_open())
	{
		std::string data = "";
		while (!fin.eof())
		{
			std::getline(fin, data); //вывод измененных данных на экран
			std::cout << "\t\t\t" << data << "\n";
		}
	}
	else
	{
		std::cout << "ERROR"; //Файл не удалось создать или открыть
	}
	fin.close();
}

Comment

Функция Comment реализует в программе написание комментария к дате.

В ходе выполнения функции, пользователю предлагается ввести дату, для которой он хочет написать комментарий. При получении программой даты, происходит открытие файла с режимом открытия ios_base::app (открыть файл для записи в конец файла). Наименование файла и путь его нахождения формируется, путем сложения строк. Пользователю предлагается ввести комментарий. Происходит запись данных в файл. После на экран выводятся изменённые данные файла.

void Comment()
{
	DataofStudent student1;//объявление переменной класса DataofStudent
	std::string way = "C:\\journal\\allgroup\\", delfile = "delfile.txt", txt = ".txt", attendance = "\\comment", choice = ""; //объявление переменнх типа string
	std::ofstream fout;//объявление переменной класса ofstream
	std::ifstream fin;//объявление переменной класса ifstream
	std::cout << "Введите дату для которой вы хотите оставить коментарий: ";
	std::cin >> choice; //ввод даты
	fout.open(way + nameofgroup + attendance + choice + txt, std::ios_base::app);
	if (fout.is_open())
	{
		std::string choice2;
		std::cout << "Введите коментарий: "; //ввод коментария
		std::cin >> choice2;
		fout << choice2 << "\n";
	}
	else
	{
		std::cout << "ERROR"; //Файл не удалось создать или открыть
	}
	std::cout << "\n";
	fout.close();
	fin.open(way + nameofgroup + attendance + choice + txt);
	if (fin.is_open())
	{
		std::string data = "";
		while (!fin.eof())
		{
			std::getline(fin, data);	//вывод изменненных данных на экран
			std::cout << "\t\t\t" << data << "\n";
		}
	}
	else
	{
		std::cout << "ERROR"; //Файл не удалось создать или открыть
	}
	fin.close();

}

Deadline

Функция Deadline реализует в программе создание dedlin’а и комментария к нему, с записью этих данных в файл.

В ходе выполнения функции, пользователю предлагается ввести дату, на которую он хочет установить deadline. При получении программой даты, происходит открытие файла с режимом открытия ios_base::app (открыть файл для записи в конец файла). Наименование файла и путь его нахождения формируется, путем сложения строк. Пользователю предлагается ввести комментарий. Происходит запись данных в файл. После на экран выводятся изменённые данные файла.

void Deadline()
{
	DataofStudent student1; //объявление переменной класса DataofStudent
	std::string way = "C:\\journal\\allgroup\\", delfile = "delfile.txt", txt = ".txt", attendance = "\\deadline", choice = ""; //объявление переменной типа string
	std::ofstream fout; //объявление переменной класса ofstream
	std::ifstream fin; //объявление переменной класса ifstream
	std::cout << "Введите дату на которую вы хотите установить deadline: ";
	std::cin >> choice; //ввод даты
	fout.open(way + nameofgroup + attendance + choice + txt, std::ios_base::app);
	if (fout.is_open())
	{
		std::string choice2;
		std::cout << "Введите коментарий к deadlin'у: "; //ввод коментария 
		std::cin >> choice2;
		fout << choice2 << "\n";
	}
	else
	{
		std::cout << "ERROR"; //Файл не удалось создать или открыть
	}
	std::cout << "\n";
	fout.close();
	fin.open(way + nameofgroup + attendance + choice + txt);
	if (fin.is_open())
	{
		std::string data = "";
		while (!fin.eof())
		{
			std::getline(fin, data);
			std::cout << "\t\t\t" << data << "\n"; //вывод измененных данных на экран
		}
	}
	else
	{
		std::cout << "ERROR"; //Файл не удалось создать или открыть
	}
	fin.close();
}

Main

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

В ходе выполнения программы, на экран выводится меню. Пользователю предлагается выбрать один из пунктов. При выборе пункта 1, вызывается функция Reg, а затем функция Authon; При выборе пункта 2, вызывается функция Authon; При выборе пункта 3 происходит выход из программы. После успешной авторизации вызывается функция GroupSelection. После выбора группы на экран выводится меню дальнейших действий. Пользователю предлагается выбрать один из пунктов. При выборе пункта 1 вызывается функция Grades; При выборе пункта 2 вызывается функция Attendance; При выборе пункта 3 вызывается функция Deadline; При выборе пункта 4 вызывается функция Comment; При выборе пункта 5 происходит выход из программы.

void main()
{
	std::string choice = ""; //объявление переменной типа string
	bool flag = 1; //объявление переменной типа bool
	setlocale(0, ""); //установка языкового стандарта для яязыка
	std::cout << "\t\t\tДобро пожаловать в электронный журнал\n"; //вывод меню на экран
	std::cout << "\t\t\tЕсли вы ходите зарегистрироваться введите 1\n\t\t\tЕсли выхотите авторизоваться введите 2\n\t\t\tЕсли вы хотите закрыть программу введите 3\n";
	std::cin >> choice;//ввод символа, отвечающего за выбор пункта меню
	if (choice == "3")
	{
		return; //выход из программы
	}
	while (flag)
	{
		if (choice == "1")
		{
			flag = 0;
			Reg(); //регистрация
			Authon();//авторизация
		}
		else
		{
			if (choice == "2" and flag)
			{
				Authon(); //авторизация
				flag = 0;
			}
			else
			{
				std::cout << "Сделайте выбор повторно: ";
				std::cin >> choice; //повторное осуществленеи выбора пункта меню
			}
		}
	}
	GroupSelection(); //выбор группы
	std::cout << "\n\t\t\tВыберете дальнейшее действие:\n"; //вывод меню выбора дальнейших действий
	std::cout << "\t\t\tЕсли вы хотите поставить оценку студенту, введите 1\n\t\t\tЕсли проставить посещаемость, введите 2\n\t\t\tЕсли вы хотите установить дату конца дедлайна, введите 3\n\t\t\tЕсли вы хотите написать коментарий, введите 4\n\t\t\tЕсли вы хотите закрыть программу введите 5\n";
	std::cin >> choice; // ввод символа, отвечающего за выбор пункта меню
	flag = 1;
	while (flag)
	{
		if (choice == "1")
		{
			flag = 0;
			Grades(); //простанока оценки
		}
		if (choice == "2")
		{
			flag = 0;
			Attendance(); //простановка посещаемости
		}
		if (choice == "3")
		{
			flag = 0;
			Deadline(); //установка deadlin'a
		}
		if (choice == "4")
		{
			flag = 0;
			Comment(); //написание комментария
		}
		if (choice == "5")
		{
			return; //выход из программы
		}
		if (choice != "1" and choice != "2" and choice != "3" and choice != "4" and choice != "5")
		{
			flag = 1;
			std::cout << "Повторите ввод: ";
			std::cin >> choice; //повторное осуществление выбора пункта меню
		}
	}
}

Для реализации полноценной работоспособности моей программы необходимо создать несколько текстовых файлов и директорий согласно диаграмме.

диаграмма

диаграмма

В файл allgroup.txt необходимо записать название группы. Также папке allgroup нужно создать папку с название группы и текстовый документ с названием группы, в который необходимо занести список группы.

Тестирование и отладка программы

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

Тестирование работы регистрации

Тестирование работы регистрации
Тестирование авторизации
Тестирование авторизации
Тестирование выбора группы
Тестирование выбора группы
Тестирование постановки оценки
Тестирование постановки оценки
Тестирование постановки посещаемости
Тестирование постановки посещаемости
Тестирование установки даты конца дедлайна
Тестирование установки даты конца дедлайна
Тестирование написания комментария к дате
Тестирование написания комментария к дате

В ходе тестирования программы критических ошибок выявлено не было.

Заключение

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

  • Класс DataofTeature, хранящий в себе информацию о преподавателе.

  • Класс DataofStudent, хранящий в себе информацию о студенте.

  • Функция Reg, реализующая регистраци.

  • Функцию Authon, реализующая авторизацию в программу.

  • Функция GroupSelection, реализующая выбор группы.

  • Функция Grades, реализующая простановку оценок.

  • Функция Attendance, реализующая простановку посещаемости.

  • Функция Comment, отвечающая за возможность написания комментария к дате.

  • Функция Deadline, дающая возможность установить дэдлайн и написать к нему комментарий.

  • Функция main, в которой реализовано основное взаимодействие пользователя с программой (меню и т.д.).

Весь код программы был написан в среде разработки Visual Studio 2022. Суммарный объем строк в тексте программы составляет 724.

Компьютерные программы стали неотъемлемой частью жизни современного человека. Мы сталкиваемся с ними повсюду: начиная от простых электронных часов и заканчивая сложной вычислительной техникой (ноутбуки, смартфоны, планшеты и прочие электронные девайсы). Находясь в окружении программ, полезно знать, что они собой представляют.

Что такое программа

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

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

Как создать собственную программу

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

Существует 2 типа инструментов для создания программ:

  1. Визуальные среды разработки. Простые в освоении, но зачастую имеют ограниченный функционал. Позволяют создавать программы с нулевыми знаниями языка, через визуальный редактор. Подобные инструменты отлично подойдут для новичков, желающих быстро создать свою первую программу.
  2. Интегрированные среды разработки (IDE). Серьезные инструменты, с практически безграничным функционалом. Для работы в подобных средах, требуются знание и понимание языка программирования. Современные IDE обладают простым и удобным интерфейсом, что значительно упрощает создание программ.

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

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

Выбор инструмента для создания программ

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

Мы ценим время наших гостей, и поэтому отобрали лучшие инструменты для программирования и поместили их в единый каталог. Чтобы помочь вам выбрать идеальную среду разработки, к каждому материалу было добавлено подробное описание и обучающий материал в форме видеокурса. Скачивайте программы для создания программ абсолютно бесплатно, через торрент или файлообменные сервисы (Яндекс.Диск и MEGA).

Приятного дня и удачи в работе!

Добрый день!

С выходом Windows 8, разработчикам был представлен абсолютно новый тип приложений – приложения в стиле Modern UI. Ну, как новый? Подобные приложения уже разрабатывались для Windows Phone. Данные приложения не имели ничего общего с привычными Windows-приложениями. Такие приложения не совместимы с предыдущими версиями Windows, обладают абсолютно новым интерфейсом (Modern) и для их разработки используется новый WinRT API (Windows Runtime API) и Windows XAML (язык разметки интерфейса).

Никаких проблем для написания только Windows 8-версии своего приложения не было, однако, если требовалось написать приложение не только для Windows, но и для Windows Phone, нужно было преодолеть определенные трудности. Все дело в том, что Windows Phone для своих приложений использует Silverlight и Windows Phone API, тогда, как Windows 8 использует Windows XAML и WinRT API. Они имеют некоторые существенные отличия.

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

В Microsoft знали об этой проблеме и долгое время работали над ее решением. Результатом этой работы стали так называемые универсальные приложения Windows (Universal Windows Apps), которые доступны начиная с Windows 8.1 Update 1 и Windows Phone 8.1 (которая до конца лета будет доступна для установки всем устройствам на Windows Phone 8). Можно предположить, что теперь приложения будут работать без перекомпиляции как на Windows, так и на Windows Phone, но это не совсем так.

Каждое приложение все так же будет создаваться и компилироваться отдельно для каждой платформы, но объем требуемой работы теперь существенно сократился. Все дело в том, что Microsoft наконец-то унифицировали большую часть API для Windows и Windows Phone. Больше всего изменений было выполнено именно на стороне Windows Phone. Отныне для написания приложений для этих двух платформ (скоро будет три, Xbox One туда же) используется WinRT API и Windows XAML. Конечно же привычный для Windows Phone Silverlight никуда не делся и даже обзавелся некоторыми дополнительными возможностями, но не о нем сейчас разговор.

Универсальные приложения теперь используют среду выполнения Windows (тот самый Windows Runtime). Эти нововведения позволяют программисту свести платформозависимый код к минимуму, ведь большинство вызовов к API идентичны.

Тестовое приложение

Сегодня предлагаю вам попробовать написать простое универсальное приложение, имя которому «Hello, World!». Писать будем на языке C# (требуются как минимум начальные знания языка и XAML). Для этого минимально нам понадобится:

• Windows 8.1 (x86)

• Visual Studio Express 2013 для Windows с обновлением 2

Это совсем минимально. С таким комплектом вы сможете разработать универсальное приложение и отлаживать его Windows-версию на своем текущем компьютере. Windows Phone-версию приложения вы сможете отлаживать только на реальном устройстве (причем требуется аккаунт разработчика).

Чтобы иметь возможность отлаживать свое приложение в эмуляторе Windows Phone, вам потребуется:

• Windows 8.1 Профессиональная (x64)

• Процессор с поддержкой аппаратной виртуализации для клиента Hyper-V (подходит даже бюджетный Celeron G1610 и вроде даже Pentium 4 на LGA775)

• Visual Studio Express 2013 для Windows с обновлением 2

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

Я же буду использовать Visual Studio Ultimate 2013 и показывать все буду именно на ней. Не волнуйтесь, от бесплатной Express интерфейс практически не отличается. Начнем!

Универсальный «Hello, World!»

Запустим Visual Studio и создадим новый проект.

В разделе «Приложения Магазина Windows» есть различные шаблоны приложений как для Windows, так и для Windows Phone. Нас интересуют именно универсальные приложения, шаблоны которых доступны в специальном подразделе.

На выбор дается два варианта: пустое приложение и приложение с Hub (это такой классный элемент управления). Остановимся на пустом приложении, ведь мы пока только учимся, и сразу лезть в дебри не следует. Пойдем от простого.

Введите имя для создаваемого приложения. Я назвал его «UniversalHelloWorld», четко и ясно. Нажимаем «ОК» и ожидаем, пока Visual Studio создает проект. Давайте рассмотрим структуру созданного проекта.

Весь проект подразделен на три части:

• Windows — содержит код и элементы, доступные только Windows-версии приложения

• Windows Phone — содержит код и элементы, доступные только Windows Phone-версии приложения

• Shared – содержит код и элементы, которые доступны сразу для двух платформ

Обратите внимание, что на данный момент общим являются только один элемент: App.xaml ( и App.xaml.cs). Этот элемент отвечает за запуск и остановку приложения.

Вы уже можете попробовать запустить приложение. И для этого нажмите F5. Для прекращения отладки, вернитесь в Visual Studio и нажмите «Shift+F5». Вы должны увидеть пустой экран. Первоначально будет запущена Windows-версия приложения. Чтобы выбрать, какую версию приложения запустить, найдите на панели инструментов кнопку отладки (зеленый треугольник).

Здесь вы можете выбрать, где запускать отладку вашего приложения. Имитатор выполняет имитацию Windows-планшета, у которого вы можете менять ориентацию, разрешение дисплея и прочие вещи. Кнопка «Удаленный компьютер» предназначена для запуска отладки на внешнем Windows 8 устройстве. Я для этих целей использую Surface RT.

Вернемся к смене запускаемой версии. В подменю «Запускаемый проект» вы можете выбрать «Windows Phone 8.1». После этого содержимое базового меню изменится и на ваш выбор будет доступно множество эмуляторов.

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

Пока каждая версия приложения имеет отдельную главную страницу MainPage.xaml. Так как наше приложения очень простое, нам совсем не требуется разный дизайн страницы на каждой платформе. Перенесите MainPage.xaml в раздел Shared, и затем удалите его из разделов Windows и Windows Phone. Структура проекта станет такой:

Открыв данный файл, вы увидите эту страну в визуальном редакторе, а также ее код разметки. Пока мы имеем следующий код:

Он всего лишь создает корневую сетку страницы, закрашенную стандартным цветом страницы. Давайте добавим на страницу одноименную надпись и кнопку для приветствия. Разместите в Grid элемент TextBlock. Код элемента будет таков:

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

Также добавим на страницу кнопку, которая покажет нам небольшое сообщение. Код этой кнопки такой:

Добавим для этой кнопки обработчик события ее нажатия (Click). Для этого дважды щелкните кнопку, и вы автоматически перейдете к редактору кода C#. Автоматически сгенерировался пустой обработчик:

Мы его еще наполним содержимым. В этом обработчике мы создадим экземпляр диалогового окна и вызовем его. Для начала добавьте следующую директиву using вверху страницы:

Она требуется нам для того, чтобы получить возможность создать и отобразить диалоговое окно. Создаем экземпляр класса MessageDialog с заданным сообщением, который как раз и представляет собой диалоговое окно, и затем показываем его методом ShowAsync().

Готово! Теперь можно запустить приложение на каждой из платформ и с радостью обнаружить, что все работает как надо.

Итог

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

Я думаю, что это не последняя статья, и, возможно, получится даже небольшая серия статей. В следующей статье мы напишем уже не простой «ХеллоВорлд», а более интересное приложение, которое будет работать с некоторыми данными и будет иметь более сложный интерфейс.

Скачать исходный код проекта можно по этой ссылке.

С удовольствием отвечу на все ваши вопросы.

С уважением,

Роман Гладких.

Научим детей и подростков программировать

Поможем создать свой первый проект, который можно добавить в портфолио и показать друзьям

Научим детей и подростков программировать

Редактор кода

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

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

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

1. Sublime Text

Популярный и простой в освоении редактор, который подойдет начинающим разработчикам. Его отличительная черта — очень быстрая загрузка. Поэтому Sublime Text часто используют не только для редактирования кода, но и для хранения быстрых заметок, тем более что это приложение для программирования автоматически сохраняет все содержимое вкладок при закрытии. Даже если вы забудете нажать Ctrl + S перед выходом, программа заботливо сохранит ваши труды в свой кеш.

К другим приятным фичам Sublime Text можно отнести автодополнение, одновременное редактирование нескольких строк и удобный поиск.

Скачать Sublime Text

2. Atom

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

Кстати, авторы этого редактора — компания GitHub, и основные инструменты контроля версий интегрированы в Atom из коробки. Создать новую ветку или закоммитить изменения можно в пару кликов или нажатий горячих клавиш прямо из окна редактора. Если пока вам не очень понятно, о чем идет речь, не переживайте: о системах контроля версий мы еще поговорим ниже.

Скачать Atom

3. Visual Studio Code

Еще одно популярное ПО для программирования — разработка Microsoft под названием Visual Studio Code, или сокращенно VSCode. Как и Atom, он содержит интеграцию с системой контроля версий, а также встроенный терминал, собственный отладчик и набор инструментов для рефакторинга.

Из минусов: приложение достаточно долго загружается, но работает быстро.

Скачать Visual Studio Code

4. Vim

У этого олдскульного редактора кода нет интерфейса. Совсем. И тем не менее Vim стабильно занимает высокие места в списках лучших бесплатных редакторов кода. Это неудивительно, ведь многие бывалые разработчики не жалуют мышку и тачпад: использовать горячие клавиши и текстовые команды куда быстрее.

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

Скачать Vim

5. WebStorm

Среда для разработки на JavaScript с автоматической проверкой кода, поддержкой JS-библиотек и фреймворков, инструментами для командной работы, предпросмотром HTML-файлов и множеством других полезных для веб-разработки фич.

Это платный софт — индивидуальная подписка обойдется в 5,90 $ в месяц, но ученики онлайн-школы программирования Skysmart Pro получают ее бесплатно на время прохождения курсов.

Скачать WebStorm

Редактор кода и IDE. В чем разница? 🤔

IDE, или среда разработки, — этакая программа-мультитул, которая включает в себя, помимо редактора кода, еще компилятор и отладчик (то есть умеет превращать строки кода в работающее приложение и помогает программисту искать баги), а также другие полезные штуки, например интеграцию с системой контроля версий.
Примеры IDE — Microsoft Visual Studio, PyCharm, Eclipse.

Стартуй в программировании прямо сейчас

Реши свою первую настоящую задачу на JavaScript и поделись крутым результатом с друзьями

Стартуй в программировании прямо сейчас

Система контроля версий

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

  1. Два разработчика одновременно редактируют один и тот же компонент. Без использования системы контроля версий есть шанс, что один из них затрет работу другого. А так система проанализирует изменения и уведомит о возможных конфликтах.

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

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

Git

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

Пользоваться Git можно по-разному: через графический интерфейс (Git GUI), через терминал или же через редактор кода, если в нем такой функционал предусмотрен.

Скачать Git

Git и GitHub — это одно и то же? 🤔

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

Выберите идеального наставника по программированию

15 000+ проверенных преподавателей со средним рейтингом 4,8. Учтём ваш график и цель обучения

Выберите идеального наставника по программированию

Терминал

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

И на Windows, и на MacOS уже есть встроенные терминалы, но их возможностей зачастую не хватает разработчикам, поэтому они используют более навороченный сторонний софт. Вот пара примеров, с которых можно начать.

Cmder

Эмулятор консоли для Windows, легкий, быстрый и симпатичный. Он не нуждается в установке: достаточно скачать exe-файл и запустить его, и вот вы уже работаете в консоли, как заправский программист.

Скачать Cmder

iTerm2

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

Скачать iTerm2

Какие еще программы пригодятся для создания программ

Работа программиста, который пишет софт для беспилотных автомобилей, отличается от работы программиста, который создает игры на Xbox. Поэтому мы и предупредили в начале статьи, что перечислить все нужные приложения для программирования на ПК не получится: итоговый набор будет разным в зависимости от задач конкретного разработчика.

Так, если ваша работа будет связана с созданием интерфейсов, например мобильных приложений или интернет-магазинов, то наверняка понадобится графический редактор. Самые популярные на сегодняшний день — Figma, Adobe XD, Sketch. Но, скорее всего, вам выбирать и не придется: за вас это сделает ваш коллега-дизайнер. 🙂

А еще любому программисту нужно видеть результат своих стараний — и мы пока не про зарплату. Если ваша цель — разработка веб-приложений, то вам повезло, ведь вы сразу сможете увидеть результат работы прямо в браузере. А как быть, если вы собираетесь заниматься созданием приложений для Android? Неужели каждый раз загружать код в телефон? Нет, конечно. Для этого существуют эмуляторы — программы, которые имитируют работу нужной вам ОС или устройства.

Например, работоспособность приложений для Android можно проверить на эмуляторе Genymotion, а можно воспользоваться встроенным эмулятором в IDE Android Studio.

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

  • Создание приложения для ios на windows
  • Создание программного рейда windows 10
  • Создание программного обеспечения для windows
  • Создание приложения на python для windows
  • Создание приложения windows forms на c в visual studio