С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 29.10.2015
Сообщений: 72

Расчет среднего балла по предметам

01.12.2021, 23:35. Показов 1247. Ответов 11

Студворк — интернет-сервис помощи студентам
У меня в данный момент имеется БД, в которой для решения задачи имеются таблица оценок, предметов и студентов. В программе я использую элемент WindowsFormsHost и библиотеку System.Windows.Forms.DataVisualization.C harting; для вывода диаграмм разного типа, к примеру:


Структура таблицы оценок:
Название: tyUKI.png
Просмотров: 86

Размер: 4.1 Кб
Структура таблицы предметов:
Название: ti3bz.png
Просмотров: 81

Размер: 1.9 Кб
Структура таблицы студентов:
Название: 7USXE.png
Просмотров: 78

Размер: 3.2 Кб
Вывод диаграмм происходит следующим образом:
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
private void UpdateChart(object sender, SelectionChangedEventArgs e)
    {
        if (TypesOfDiagramCombo.SelectedItem is SeriesChartType currentType)
        {
            Series currentSeries = ChartStudentProgress.Series.FirstOrDefault();
            currentSeries.ChartType = currentType;
            currentSeries.Points.Clear();
            var counter = 0;
            var sum = 0;
            var gradesList = ClassForData.DBEntity.Grades.Where(it => it.ID_Student == users.ID).ToObservableCollection();
            currentSeries.Points.AddXY(currentSubjectGrade.FirstOrDefault().Subjects.Title, AverageGrades.ToString());
           
            foreach (var item in gradesList)
            {
                counter++;
                sum += item.Grade.Value;
            }
            AverageGrades = sum / counter;
 
            foreach (var item in gradesList)
            {
                currentSeries.Points.AddXY(item.Subjects.Title, AverageGrades.ToString());
            }
        }
    }
Код для расчета среднего балла здесь просто для наглядности. Проблема в данный момент заключается в том, что я не могу додумать, как рассчитать средний балл для каждого предмета на основании оценок, которые относятся к данному предмету в бд, и вывести без повторений эти предметы...

Добавление данных в диаграмме по оси x и y здесь:
C#
1
currentSeries.Points.AddXY(item.Subjects.Title, AverageGrades.ToString());
!Данные принимаются только в строковом типе!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.12.2021, 23:35
Ответы с готовыми решениями:

Определение среднего балла
Доброго всем времени суток. Передо мной стоит следующая задача: Учащиеся одного класса (известно,что их не больше 20) сдают 4 экзамена....

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

Программа вычисления среднего балла
Задана таблица успеваемости учеников 10 класса за первое полугодие по 14 предметам. Составить программу вычисления среднего балла каждого...

11
 Аватар для Andrey-MSK
3317 / 2204 / 387
Регистрация: 14.08.2018
Сообщений: 7,411
Записей в блоге: 4
02.12.2021, 08:43
Цитата Сообщение от Devilion123 Посмотреть сообщение
как рассчитать средний балл для каждого предмета на основании оценок, которые относятся к данному предмету в бд, и вывести без повторений эти предметы...
ну как бы запросом из БД - AVG (Transact-SQL)
0
1 / 1 / 0
Регистрация: 29.10.2015
Сообщений: 72
02.12.2021, 16:15  [ТС]
Andrey-MSK Я понимаю
У меня есть точно возможность реализовать это при помощи SQLConnection, однако хотелось бы попробовать реализовать это с помощью LINQ to SQL, но там, насколько я знаю, нет возможности использовать соединение LEFT JOIN (которое нужно мне при написании запроса для данной задачи)
0
 Аватар для Andrey-MSK
3317 / 2204 / 387
Регистрация: 14.08.2018
Сообщений: 7,411
Записей в блоге: 4
02.12.2021, 16:27
Devilion123, я имею ввиду написать запрос в БД и получить оттуда таблицу с необходимыми данными, а как это будет происходить (SqlCommand, SqlDataReader, EF) совершенно не важно. Если не знаете как написать это с помощью EF, напишите на сервере хранимку, или табличную функцию, с нужным запросом и вызовите ее в коде. Функция удобнее, ее вызов идет через простой SELECT с параметрами.
0
1 / 1 / 0
Регистрация: 29.10.2015
Сообщений: 72
02.12.2021, 18:41  [ТС]
Andrey-MSK Написал запрос в MS SQL Server
T-SQL
1
SELECT SUM(Grade)/CONVERT(float, COUNT(Grade), 2) as 'Средний балл', Title as 'Название предмета' FROM Grades g  left join Subjects s on g.[ID Subject] = s.[ID Subject] WHERE [ID Student] = 1 GROUP BY s.Title
Вот код для выполнения данного запроса и считывания данных:
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
 string connectionString = "Data Source=DESKTOP-J9KRE1V;Initial Catalog=Electronic_diary;Integrated Security=True";
                string sql = $"SELECT SUM(Grade)/CONVERT(float, COUNT(Grade), 2), Title FROM Grades g left join Subjects s on g.[ID Subject] = s.[ID Subject] WHERE [ID Student] = {users.ID} GROUP BY s.Title";
                try
                {
                    using (SqlConnection sqlConnection = new SqlConnection(connectionString))
                    {
                        sqlConnection.Open();
                        SqlCommand command = new SqlCommand(sql, sqlConnection);
                        SqlDataReader reader = command.ExecuteReader();
                        if (reader.HasRows)
                        {
                            while (reader.Read())
                            {
                                AverageGrades = (int)reader.GetFloat(0);
                                SubjectTitles = reader.GetString(1);
                                currentSeries.Points.AddXY(SubjectTitles, AverageGrades.ToString());
                            }
                        }
                        reader.Close();
                    }
                }
                catch (SqlException ex)
                {
                    new CustomMessageBox(ex.Message.ToString(), CustomMessageBox.MessageType.Error, CustomMessageBox.MessageButtons.Ok).ShowDialog();
                }
Свойство AverageGrades имеет тип float.

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


Теперь вот думаю, как можно исправить эту ситуацию, так как до попытки преобразования средних баллов из int во float все выводилось нормально
0
 Аватар для Andrey-MSK
3317 / 2204 / 387
Регистрация: 14.08.2018
Сообщений: 7,411
Записей в блоге: 4
02.12.2021, 20:33
Цитата Сообщение от Devilion123 Посмотреть сообщение
C#
1
AverageGrades = (int)reader.GetFloat(0);
Берёте float и конвертите в int - зачем? Чем вас float не устраивает?
И какой-то запрос у вас странный для среднего, я ведь вам показал функцию AVG.
0
1 / 1 / 0
Регистрация: 29.10.2015
Сообщений: 72
02.12.2021, 21:12  [ТС]
Andrey-MSK
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Берёте float и конвертите в int - зачем? Чем вас float не устраивает?

Упс, это последняя версия кода, в которой я уже начал экспериментировать
До этого конвертации в int не было

Добавлено через 12 минут
Все остальные махинации я проделываю для того, чтобы представить число с плавающей точкой, так как в результате выполнения запроса мы получаем целое число. К примеру, мы же не можем вывести просто 3 при делении 7 на 2, ибо нам нужно именно 3.5 и т.д.
0
2810 / 1679 / 885
Регистрация: 14.04.2015
Сообщений: 5,723
03.12.2021, 01:10
Devilion123,
хотелось бы попробовать реализовать это с помощью LINQ to SQL, но там, насколько я знаю, нет возможности использовать соединение LEFT JOIN
https://docs.microsoft.com/en-... uter-joins
0
 Аватар для Andrey-MSK
3317 / 2204 / 387
Регистрация: 14.08.2018
Сообщений: 7,411
Записей в блоге: 4
03.12.2021, 08:22
Devilion123, И ридером лучше пользоваться примерно так, с проверками на null и указанием полей, откуда что берётся.
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
using (SqlDataReader sqlDataReader = await sqlCommand.ExecuteReaderAsync())
{
    while (await sqlDataReader.ReadAsync())
    {
        drawSpecifications.Add(new DrawSpecification
        {
            DrawSpecID = (int)sqlDataReader["ID_DrawSpec"],
            DrawSystemID = (int)sqlDataReader["ID_DrawSys"],
            DSPositionNum = (short)sqlDataReader["SpecPos"],
            DSKKS = sqlDataReader["KKS"] as string ?? "",
            DSDesignation = sqlDataReader["Designation"] as string ?? "",
            DSName = sqlDataReader["SName"] as string ?? "",
            DSQuantity = sqlDataReader["Quantity"] ==
                DBNull.Value ? null : (double?)sqlDataReader["Quantity"],
            DSQuantityAssembly = sqlDataReader["QuantityA"] ==
                DBNull.Value ? null : (double?)sqlDataReader["QuantityA"],
            DSMeasure = sqlDataReader["Measure"] as string ?? "",
            DSMaterial = sqlDataReader["Material"] as string ?? "",
            DSUnitWeight = sqlDataReader["UnitWeight"] ==
                DBNull.Value ? null : (double?)sqlDataReader["UnitWeight"],
            DSWorkOrder = sqlDataReader["ID_WorkOrder"] ==
                DBNull.Value ? null : (int?)sqlDataReader["ID_WorkOrder"],
            DSWorkOrderAssembly = sqlDataReader["ID_WorkOrderA"] ==
                DBNull.Value ? null : (int?)sqlDataReader["ID_WorkOrderA"]
        });
    }
}
0
Эксперт .NET
 Аватар для Usaga
14111 / 9328 / 1349
Регистрация: 21.01.2016
Сообщений: 35,031
03.12.2021, 08:26
Цитата Сообщение от Devilion123 Посмотреть сообщение
однако хотелось бы попробовать реализовать это с помощью LINQ to SQL
Это тот самый LINQ to SQL, развитие которого забросили десять лет назад, а то и больше?) Решили сразу учиться на legacy технологиях?)
0
 Аватар для Andrey-MSK
3317 / 2204 / 387
Регистрация: 14.08.2018
Сообщений: 7,411
Записей в блоге: 4
03.12.2021, 09:13
Usaga, странно что его ещё до сих пор не убрали из новой студии
Миниатюры
Расчет среднего балла по предметам  
0
Эксперт .NET
 Аватар для Usaga
14111 / 9328 / 1349
Регистрация: 21.01.2016
Сообщений: 35,031
03.12.2021, 09:20
Andrey-MSK, так а куда им деваться?) Приходится тащить ворох старых технологий.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.12.2021, 09:20
Помогаю со студенческими работами здесь

Составить программу вычисления среднего балла
1 Задана таблица успеваемости учеников 10 класса за первое полугодие по 14 предметам. Составить программу вычисления среднего балла каждого...

Опредение среднего балла по данным из файла
Дан текстовый файл (in.txt) содержащий список учащихся и их оценки по трем предметам: математике, физике, информатике. Формат файла:...

Ошибка FormatException не обработано при вычислении среднего балла
Добрый день. Написал простенькую программу вычисления среднего балла по трем предметам. После запуска программы и ввода чисел вылазит...

Структура с именем student. Упорядочить записи по возрастанию среднего балла
Создайте структуру с именем student, содержащую поля: фамилия и инициалы, номер группы, успеваемость (массив из пяти элементов). Создать...

Составить программу вычисления среднего балла каждого из 34 учеников класса
Задана таблица успеваемости учеников 10 класса за первое полугодие по 14 предметам. Составить программу вычисления среднего балла каждого...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru