Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.59/64: Рейтинг темы: голосов - 64, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 30.01.2014
Сообщений: 26
1

Электронный Журнал на С++

09.02.2017, 00:21. Показов 12887. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
помогите сделать программу «электронный журнал». Программа должна хранить о студенте данные: Фамилию, имя, оценку. Программа позволяет сделать следующие действия: заполнит журнал, и просмотр оценок.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2017, 00:21
Ответы с готовыми решениями:

Электронный журнал
Поделитесь может кто делал когда-то электронный журнал успеваемости и посещаемости на C#. Спасибо.

Электронный журнал
Здравствуйте, уважаемые программисты cyberforum-а! Прошу помощи у Вас для решения проблемы....

Электронный журнал
Здравствуйте. Нашел скрипт школьного журнал с нашего форума...

Электронный журнал
a = float(input()) b = float(input()) c = float(input()) d = float(input()) e = float(input())...

22
680 / 190 / 60
Регистрация: 04.05.2012
Сообщений: 879
Записей в блоге: 1
09.02.2017, 11:07 2
Kirillo,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <vector>
 
using namespace std;
 
struct Student{
    string familia;
    string name;
    int mark;
};
 
 
 
 
int main()
{
    vector<Student> Magazine;
    Magazine.reserve(3);
    Student S_struct;
 
    int i,count_student,mark,select;
    cout<<"Vvedite count student - ";
    cin>>count_student;
 
    for(i=0;i<=count_student-1;i++){
 
        cout<<"\nEnter familia: ";
        cin>>S_struct.familia;
 
        cout<<"\nEnter name: ";
        cin>>S_struct.name;
 
        cout<<"\nEnter mark: ";
        cin>>S_struct.mark;
 
 
        Magazine.push_back(S_struct);
 
    }
    cout<<"For show all mark enter - 1; for enter mark and show - 2\n";
    cin>>select;
    switch (select) {
    case 1:
        for(int i=0;i<=count_student-1;i++){
         cout<<"\n"<<i+1<<"."<<Magazine[i].familia<<" "<<Magazine[i].name<<" "<<Magazine[i].mark;
        }
        break;
 
    case 2:
       cout<<"Vvedite mark for show:";
       cin>>mark;
 
       for(int i=0;i<=count_student-1;i++){
           if(Magazine[i].mark == mark){
            cout<<"\n"<<Magazine[i].familia<<" "<<Magazine[i].name<<" "<<Magazine[i].mark;
           }
 
       }
        break;
 
    }
    return 0;
}
1
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
09.02.2017, 13:31 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <string>
#include <vector>
 
struct Student
{
    std::string surname, name;
    int mark;
};
 
class Journal
{
public:
    void addStudent(const Student &s)
    {
        m_data.push_back(s);
    }
    void print() const
    {
        for (const auto &s : m_data)
            std::cout << s.surname << " " << s.name << " " << s.mark << std::endl;
    }
 
protected:
    std::vector<Student> m_data;
};
 
int main()
{
    Journal j;
    j.addStudent({"Ivanov", "Ivan", 5});
    j.addStudent({"Kirillo", "Kirillo", 2});
    j.addStudent({"Pupkin", "Vasya", 3});
    j.print();
}
6
Людвиг Бодмер
09.02.2017, 13:38
  #4

Не по теме:

MrGluck, j.addStudent({"Kirillo", "Kirillo", 2}); :good:

0
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
09.02.2017, 13:41 5
MrGluck,
Интересный пример с initializer list. То есть в методе addStudent по типу параметра определяется что нужно создать объект? Я встречал только запись где можно передать сам объект подходящего типа(заранее созданный).
А у вас передается initializer list, и объект при этом создается уже в момент передачи, насколько я понял... (точнее компилятор наверное генерит создание объекта неявно)
Интересно... Это стандартная запись или зависит от компиляторов и т.д?
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
09.02.2017, 13:47 6
Цитата Сообщение от sys_beginner Посмотреть сообщение
Интересно... Это стандартная запись или зависит от компиляторов и т.д?
Цитата Сообщение от 8.5.4 List-initialization
1. List-initialization is initialization of an object or reference from a braced-init-list. Such an initializer is
called an initializer list, and the comma-separated initializer-clauses of the list are called the elements of the
initializer list. An initializer list may be empty. List-initialization can occur in direct-initialization or copyinitialization
contexts; list-initialization in a direct-initialization context is called direct-list-initialization and
list-initialization in a copy-initialization context is called copy-list-initialization. [ Note: List-initialization
can be used
— as the initializer in a variable definition (8.5)
— as the initializer in a new expression (5.3.4)
— in a return statement (6.6.3)
— as a for-range-initializer (6.5)
— as a function argument (5.2.2)
— as a subscript (5.2.1)
— as an argument to a constructor invocation (8.5, 5.2.3)
— as an initializer for a non-static data member (9.2)
— in a mem-initializer (12.6.2)
— on the right-hand side of an assignment (5.17)
[Example:
C++
1
2
3
4
5
6
7
8
int a = {1};
std::complex<double> z{1,2};
new std::vector<std::string>{"once", "upon", "a", "time"}; // 4 string elements
f( {"Nicholas","Annemarie"} ); // pass list of two elements
return { "Norah" }; // return list of one element
int* e {}; // initialization to zero / null pointer
x = double{1}; // explicitly construct a double
std::map<std::string,int> anim = { {"bear",4}, {"cassowary",2}, {"tiger",7} };
— end example ] — end note ]
)))
1
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
09.02.2017, 13:48 7
GbaLog-,
Я почему-то думал что внутри контейнеров есть специальные реализации конструкторы которые принимают initializer list как параметр
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
09.02.2017, 14:10 8
Цитата Сообщение от sys_beginner Посмотреть сообщение
Я почему-то думал что внутри контейнеров есть специальные реализации конструкторы которые принимают initializer list как параметр
Не, там, вроде, агрегатная инициализация.
http://en.cppreference.com/w/c... ialization

Добавлено через 2 минуты
Ан-нет, есть там такие.
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
09.02.2017, 14:27 9
Цитата Сообщение от sys_beginner Посмотреть сообщение
Я почему-то думал что внутри контейнеров есть специальные реализации конструкторы которые принимают initializer list как параметр
Есть, но для генерации набора элементов. И это справедливо для конструкторов (пример вектор)
C++
1
2
vector (initializer_list<value_type> il,
       const allocator_type& alloc = allocator_type());
У меня же используется метод push_back. А он умеет лишь
C++
1
2
void push_back (const value_type& val);
void push_back (value_type&& val);
То есть тут за инициализацию полей отвечает встроенная в язык фигурная инициализация, а в качестве аргумента push_back уже приходит временный объект типа Student.
Само по себе создание объекта Student не отличается от такого:
C++
1
Student{"Ivanov", "Ivan", 5}
1
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
09.02.2017, 15:58 10
Цитата Сообщение от MrGluck Посмотреть сообщение
а в качестве аргумента push_back уже приходит временный объект типа Student.
и судя по всему срабатывает вот этот метод void push_back (const value_type& val);
но временный объект после того как заканчивается метод addStudent вроде как должен быть уничтожен
означает ли это что мы получаем в данном случае висячую ссылку внутри вектора? или он создаст копию значения которое пришло по ссылке?
наверное да... копию. Там же не ссылки хранятся которые тем более должны быть инициализированы в момент объявления
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
09.02.2017, 16:01 11

Не по теме:

Цитата Сообщение от MrGluck Посмотреть сообщение
Критика приветствуется
Кстати, мне кажется, что тут лучше использовать не push_back, а emplace_back, тогда не будет этих перемещений и т.п., а элемент сразу создастся в векторе. :)
Или есть какие-то причины этого не делать?



Добавлено через 53 секунды

Не по теме:

А, тьфу ты, там же через addStudent всё делается. Затупил, опять. )))

0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
09.02.2017, 16:11 12
sys_beginner,
Во-первых, как раз для временных объектов придумали мув семантику.
Во-вторых, const Obj & продлевает время жизни объекта.
В-третьих,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
 
struct S
{
    S() { std::cout << "S()\n"; }
    S(const S &) { std::cout << "S(const S &)\n"; }
    S(S &&) { std::cout << "S(S &&)\n"; }
    S& operator=(const S &) { std::cout << "operator=(const S &)\n"; return *this; }
    S& operator=(S &&) { std::cout << "operator=(S &&)\n"; return *this; }
    ~S() { std::cout << "~S()\n"; }
};
 
int main()
{
    std::vector<S> v;
    v.push_back({});
}
0
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
09.02.2017, 16:18 13
Цитата Сообщение от MrGluck Посмотреть сообщение
Во-первых, как раз для временных объектов придумали мув семантику.
Так в вашем примере не будет использован перемещающий конструктор
Относительно вызова m_data.push_back(s); s является lvalue
Цитата Сообщение от MrGluck Посмотреть сообщение
Во-вторых, const Obj & продлевает время жизни объекта.
Да но до конца жизни самой функции addStudent

А почему в примере с кодом объект создается два раза? т.е вызывается конструктор без параметров и конструктор перемещения и дважды деструктор
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
09.02.2017, 16:23 14
Цитата Сообщение от sys_beginner Посмотреть сообщение
А почему в примере с кодом объект создается два раза?
Потому что сначала создаётся временный объект с помощью конструктора по умолчанию, а потом он добавляется в вектор с помощью перемещающего конструктора.
1
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
09.02.2017, 16:33 15
MrGluck,
Точно. Спасибо
Я думал компилятор оптимизирует это, и конструктор будет вызван 1 раз

А почему вызвался конструктор перемещения? Там же относительно push_back lvalue

Добавлено через 6 минут
Точнее во втором примере rvalue, а в исходном lvalue
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
09.02.2017, 16:42 16
Цитата Сообщение от sys_beginner Посмотреть сообщение
Точнее во втором примере rvalue, а в исходном lvalue
Верно. Но только из-за того, что нет версии addStudent, принимающей rvalue
C++
1
2
3
4
void addStudent(S &&s)
{
    m_data.push_back(std::move(s));
}
А не из-за ограничений метода push_back.

Добавлено через 1 минуту
Цитата Сообщение от sys_beginner Посмотреть сообщение
Да но до конца жизни самой функции addStudent
А там уже будет вызван конструктор копий
1
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
09.02.2017, 17:00 17
Цитата Сообщение от MrGluck Посмотреть сообщение
Но только из-за того, что нет версии addStudent, принимающей rvalue
Эмм... так даже в этом случае void addStudent(S &&s) s внутри метода по любому вроде бы будет lvalue, разве нет?
Думаю можно было бы оставить сигнатуру addStudent как есть, и просто поменять m_data.push_back(s); на m_data.push_back(std::move(s));

Цитата Сообщение от MrGluck Посмотреть сообщение
А там уже будет вызван конструктор копий
Я вот это хотел уточнить. Спасибо
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
09.02.2017, 17:26 18
Цитата Сообщение от sys_beginner Посмотреть сообщение
просто поменять m_data.push_back(s); на m_data.push_back(std::move(s));
Так делать нельзя т.к. можно случайно передать объект, который далее будет использоваться.
Я вообще про мув семантику заговорил т.к. вы затронули тему временных объектов.
0
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
09.02.2017, 17:36 19
Цитата Сообщение от MrGluck Посмотреть сообщение
Так делать нельзя т.к. можно случайно передать объект, который далее будет использоваться.
А почему нельзя?
Ведь в конечном счете внутри функции переменная всегда бывает lvalue независимо от того аргумент является rvalue или lvalue. То есть будь сигнатура void addStudent(const S &s) либо void addStudent(S &&s) внутри функции всегда s это lvalue, и move фактически все равно. Разве не так?

Добавлено через 56 секунд
Цитата Сообщение от MrGluck Посмотреть сообщение
можно случайно передать объект, который далее будет использоваться.
Тут не совсем понял что имеется ввиду
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
09.02.2017, 18:30 20
Цитата Сообщение от sys_beginner Посмотреть сообщение
о есть будь сигнатура void addStudent(const S &s) либо void addStudent(S &&s) внутри функции всегда s это lvalue, и move фактически все равно. Разве не так?
Что делает мув? Он фактически преобразовывает полученный lvalue reference в rvalue reference. Вы предложили
Цитата Сообщение от sys_beginner Посмотреть сообщение
можно было бы оставить сигнатуру addStudent как есть, и просто поменять m_data.push_back(s); на m_data.push_back(std::move(s));
Что же произойдёт?
После работы std::move мы получим тип const Student &&, а далее перед компилятором будет стоять выбор из двух преобразований для соответствия одной из двух перегруженных версий метода push_back (ни одна явно не соответствует типу):
Цитата Сообщение от MrGluck Посмотреть сообщение
C++
1
2
void push_back (const value_type& val);
void push_back (value_type&& val);
И он без зазрения совести выберет первый вариант и кастанёт обратно тип в const Student & т.к. он имеет квалификатор const.

Добавлено через 2 минуты
Цитата Сообщение от sys_beginner Посмотреть сообщение
Тут не совсем понял что имеется ввиду
Если мы вызываем конструктор перемещения, то объект, из которого он создавался, принимает состояние "unspecified state", что значит, что данные в нём могут уже и не находиться.

Добавлено через 5 минут
Цитата Сообщение от sys_beginner Посмотреть сообщение
Тут не совсем понял что имеется ввиду
То есть, если бы в нашем примере было написано:
C++
1
2
3
4
void addStudent(S &s)
{
    m_data.push_back(std::move(s));
}
То был бы риск, что кто-то сделает так:
C++
1
2
3
S s;
j.addStudent(s); // s принимает состояние unspecified state
// какая-то работа с переменной s
1
09.02.2017, 18:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.02.2017, 18:30
Помогаю со студенческими работами здесь

Электронный журнал
Здравствуйте! Помогите сделать БД электронный журнал по моему предмету! А точнее нужно...

[WPF] Электронный журнал
Здравствуйте всем! Помогите, пожалуйста, с написанием одного проекта. Мне надо сделать електронный...

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

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru