VC++ №2. Работа со структурами и классами в консоли

Структуры в C++

Данный урок visual c++ посвящен работе со структурами: синтаксис, примеры задач с решениями

Структуры — специальный (агрегатный ) тип данных, который может содержать в себе разнотипные элементы. В С++ возможно два стиля объявления структур: одно — характерное для языка C, другое — для C++.

 

Рассмотрим вариант синтаксиса именно для языка C++:

struct Name
{
    type atribute;
    // остальные элементы структуры
} 
structureVar1, structureVar2, ...;

здесь:

  • struct — определение структуры начинается с данного ключевого слова
  • Name — имя структуры
  • type — тип данных, который имеет элемент структуры
  • atribute — сам элемент структуры
  • structureVar1-2 — переменные структурны
Задание:

  1. Создайте консольной приложение.
  2. Напишите следующий исходный код:
#include "stdafx.h"
#include 
 
using namespace std;
// Объявление структуры.
struct MYSTRUCTURE
{
char sName[100];
int iAge;
};
 
void main(void)
{
MYSTRUCTURE MyStructure; // объявляем переменную MyStructure типа MYSTRUCTURE
strcpy(MyStructure.sName, "Ivan" ); // копируем строку 'Ivan' в элемент данных MyStructure.sName
MyStructure.iAge = 13;
cout << "Меня зовут ";
cout << MyStructure.sName;
cout << " я являюсь  ";
cout << MyStructure.iAge;
cout << " лет." << endl;
system ("pause");
}

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

Элементами данных структуры являются: Строка sName и целое iAge

Программирование с++ классы

Пример: Необходимо написать программу для учета успеваемости студентов

Основные понятия:

Группу студентов можно представить, как класс языка C++. Классы в программировании состоят из свойств и методов. Свойства — это любые данные-характеристики объекта класса. В нашем примере студент — объект класса, а его свойства — имя, фамилия, оценки и средний балл. Методы — это функции, которые могут выполнять какие-либо действия над данными (свойствами) класса.

Модификаторы доступа public и private

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

Недоступные (приватные) для общего пользования данные класса размещаются после модификатора доступа private. Если отсутствует модификатор public, то все функции и переменные, по умолчанию являются закрытыми.

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

Выполнение:

  1. Создайте заголовочный файл students.h, в котором будет находиться класс Students: меню ПроектЗаголовочный файл (.h).

Описание будущего кода:

В нашем случае, объектом класса является студент, а его свойствами — имя, фамилия, оценки и средний балл.

У каждого студента есть имя — name и фамилия last_name . Также, у него есть промежуточные оценки за весь семестр. Эти оценки мы будем записывать в целочисленный массив из пяти элементов. После того, как все пять оценок будут проставлены, определим средний балл успеваемости студента за весь семестр — свойство sred_ball.

Добавим в наш класс функцию calculate_sred_ball(), которая будет определять средний балл успеваемости ученика.

  1. Добавьте в созданный файл код:
/* students.h */
 
#include 
using namespace std;
 
class Students{
public:
// Установка имени студента
void set_name(string student_name)
{
name = student_name;
}
 
// Получение имени студента
string get_name()
{
return name;
}
 
// Установка фамилии студента
void set_last_name(string student_last_name)
{
last_name = student_last_name;
}
 
// Получение фамилии студента
string get_last_name()
{
return last_name;
}
 
// Установка промежуточных оценок
void set_scores(int student_scores[])
{
for (int i = 0; i < 5; i++){
  scores[i] = student_scores[i];
}
}
 
// Установка среднего балла
void set_sred_ball(float ball)
{
sred_ball = ball;
}
 
// Получение среднего балла
float get_sred_ball()
{
return sred_ball;
}
 
private:
 
// Промежуточные оценки
int scores[5];
// Средний балл
float sred_ball;
// Имя
string name;
// Фамилия
string last_name;
};

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

Функция set_sred_ball() воспринимает средний балл в качестве параметра и присваивает его значение закрытой переменной sred_ball.
Функция get_sred_ball() просто возвращает значение этой переменной.

  1. Теперь в главный файл проекта добавьте следующее содержимое:
/* main.cpp */
#include "stdafx.h"
#include "students.h"
using namespace std;
 
bool score_is_valid (int test_score)
{
if (test_score <= 5 && test_score > 0)      // оценка от 1 до 5
  return true;
else
  return false;
}
 
int main()
{
SetConsoleCP(1251);// использование кирилицы
SetConsoleOutputCP(1251); // использование кирилицы
 
// Создание объекта класса Student
Students student;
string name;
string last_name;
 
// Ввод имени с клавиатуры
cout << "Name: ";
getline (cin, name);
 
// Ввод фамилии
cout << "Last name: ";
getline (cin, last_name);
 
// Сохранение имени и фамилии в объект класса Students
student.set_name(name);
student.set_last_name(last_name);
int scores[5]; // Оценки
int sum = 0; // Сумма всех оценок
 
// Ввод промежуточных оценок
for (int i = 0; i < 5; i++){
  cout << "Grade " << i+1 << ": "; do { cin >> scores[i];
  if (score_is_valid(scores[i])) {
     sum += scores[i];
     break;
  }
  else {
     cout << "Make correct input. Grade " << i+1 << ": ";
  }
} while (true);
}
 
// Сохраняем промежуточные оценки в объект класса Student
student.set_scores(scores);
 
// Считаем средний балл
float sred_ball = sum / 5.0;
 
// Сохраняем средний балл в объект класса Students
student.set_sred_ball(sred_ball);
 
// Выводим данные по студенту
cout << "Average grade of student " << student.get_name() << " "
<< student.get_last_name() << " equal: "
<< student.get_sred_ball() << endl;
system("pause");
return 0;
}

В начале программы определяется объект класса Students. Нужно понимать, что сам класс является только описанием его объекта. Так, класс Students является описанием любого из студентов, у которого есть имя, фамилия и возможность получения оценок.

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

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

Введенные данные передаются set-функциям, которые присваивают их закрытым переменным класса. После введения промежуточных оценок высчитывается средний балл на основе этих оценок, а затем сохраняется это значение в закрытом свойстве sred_ball, с помощью функции set_sred_ball().