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

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

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

Студворк — интернет-сервис помощи студентам
помогите сделать программу «электронный журнал». Программа должна хранить о студенте данные: Фамилию, имя, оценку. Программа позволяет сделать следующие действия: заполнит журнал, и просмотр оценок.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.02.2017, 00:21
Ответы с готовыми решениями:

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

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

Электронный журнал
Здравствуйте. Нашел скрипт школьного журнал с нашего форума https://www.cyberforum.ru/php-beginners/thread948672.html#post9023338 прочитал...

22
 Аватар для Юля_программист
682 / 192 / 60
Регистрация: 04.05.2012
Сообщений: 886
Записей в блоге: 1
09.02.2017, 11:07
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Эксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
09.02.2017, 13:31
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

Не по теме:

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

0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
09.02.2017, 13:41
MrGluck,
Интересный пример с initializer list. То есть в методе addStudent по типу параметра определяется что нужно создать объект? Я встречал только запись где можно передать сам объект подходящего типа(заранее созданный).
А у вас передается initializer list, и объект при этом создается уже в момент передачи, насколько я понял... (точнее компилятор наверное генерит создание объекта неявно)
Интересно... Это стандартная запись или зависит от компиляторов и т.д?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
09.02.2017, 13:47
Цитата Сообщение от 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
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
09.02.2017, 13:48
GbaLog-,
Я почему-то думал что внутри контейнеров есть специальные реализации конструкторы которые принимают initializer list как параметр
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
09.02.2017, 14:10
Цитата Сообщение от sys_beginner Посмотреть сообщение
Я почему-то думал что внутри контейнеров есть специальные реализации конструкторы которые принимают initializer list как параметр
Не, там, вроде, агрегатная инициализация.
http://en.cppreference.com/w/c... ialization

Добавлено через 2 минуты
Ан-нет, есть там такие.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
09.02.2017, 14:27
Цитата Сообщение от 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
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
09.02.2017, 15:58
Цитата Сообщение от MrGluck Посмотреть сообщение
а в качестве аргумента push_back уже приходит временный объект типа Student.
и судя по всему срабатывает вот этот метод void push_back (const value_type& val);
но временный объект после того как заканчивается метод addStudent вроде как должен быть уничтожен
означает ли это что мы получаем в данном случае висячую ссылку внутри вектора? или он создаст копию значения которое пришло по ссылке?
наверное да... копию. Там же не ссылки хранятся которые тем более должны быть инициализированы в момент объявления
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
09.02.2017, 16:01

Не по теме:

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



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

Не по теме:

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

0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
09.02.2017, 16:11
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
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
09.02.2017, 16:18
Цитата Сообщение от MrGluck Посмотреть сообщение
Во-первых, как раз для временных объектов придумали мув семантику.
Так в вашем примере не будет использован перемещающий конструктор
Относительно вызова m_data.push_back(s); s является lvalue
Цитата Сообщение от MrGluck Посмотреть сообщение
Во-вторых, const Obj & продлевает время жизни объекта.
Да но до конца жизни самой функции addStudent

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

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

Добавлено через 6 минут
Точнее во втором примере rvalue, а в исходном lvalue
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
09.02.2017, 16:42
Цитата Сообщение от 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
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
09.02.2017, 17:00
Цитата Сообщение от 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Эксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
09.02.2017, 17:26
Цитата Сообщение от sys_beginner Посмотреть сообщение
просто поменять m_data.push_back(s); на m_data.push_back(std::move(s));
Так делать нельзя т.к. можно случайно передать объект, который далее будет использоваться.
Я вообще про мув семантику заговорил т.к. вы затронули тему временных объектов.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
09.02.2017, 17:36
Цитата Сообщение от MrGluck Посмотреть сообщение
Так делать нельзя т.к. можно случайно передать объект, который далее будет использоваться.
А почему нельзя?
Ведь в конечном счете внутри функции переменная всегда бывает lvalue независимо от того аргумент является rvalue или lvalue. То есть будь сигнатура void addStudent(const S &s) либо void addStudent(S &&s) внутри функции всегда s это lvalue, и move фактически все равно. Разве не так?

Добавлено через 56 секунд
Цитата Сообщение от MrGluck Посмотреть сообщение
можно случайно передать объект, который далее будет использоваться.
Тут не совсем понял что имеется ввиду
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
09.02.2017, 18:30
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.02.2017, 18:30
Помогаю со студенческими работами здесь

Электронный журнал
a = float(input()) b = float(input()) c = float(input()) d = float(input()) e = float(input()) print('{:.0f} {:.0f} {:.0f} {:.0f}...

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru