Консультация № 178298
09.05.2010, 13:07
40.37 руб.
0 1 1
Учет успеваемости по группам. Составить базу данных учета успеваемости по группам, содержащую следующие данные: номер зачетной книжки, фамилия, имя, отчество студента, год рождения, шифр группы, наименование предмета, оценка, преподаватель, кафедра и др.. Вычислить: среднюю оценку студента, группы, средний балл по предмету и количество студентов по группе, получивших оценку "отл.", "хор.", "удовл.", "неуд.".Создать файл таблицы на диске с помощью утилиты Database Desktop.Разработать Windows-приложение в среде Borland C++ Builder для работы с созданной таблицей.используется наиболее простой тип плоских таблиц dBase for Windows .компоненты Table, DataSource, DBGrid, DBNavigator Спасибо за помощь

Обсуждение

давно
Старший Модератор
17042
808
10.05.2010, 16:58
общий
это ответ
Здравствуйте, Питулин Александр Михайлович!
Собственно, задача аналогична уже решённой.
Код задачи см. в приложении, код комментирован, файл проекта Borland C++ Builder 6 можно скачать по ссылке: students.zip (895.0 кб)
P.S. Для корректной работы программы папка students из архива должна быть расположена на диске C:


Приложение:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "MainUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ShowButtonClick(TObject *Sender)
{
// Разбивка студентов группы по полученным оценкам
AnsiString sGroup = ""; // Шифр группы
AnsiString sNewGroup; // Переменная для загрузки шифра группы из БД
InputQuery("Ввод группы", "Введите шифр группы: ", sGroup);
if(sGroup == "") return; // Если пользователь ничего не ввёл, выходим

// Оценка, отлично, хорошо, удовлетворительно, плохо
int iMark, iExcellent = 0, iGood = 0, iSatisfactory = 0, iBad = 0;
// Закрываем запрос, если был открыт
Query->Close();
// Очищаем SQL запрос
Query->SQL->Clear();
// и формируем новый
Query->SQL->Add("SELECT GROUP_NAME, MARK FROM Students");
// Открываем запрос
Query->Open();
// Переходим на первую запись таблицы
Query->First();
// Пока не достигнут конец файла БД
while(!Query->Eof)
{
// Получаем название группы из таблицы
sNewGroup = Query->FieldByName("GROUP_NAME")->AsString;
// Если оно совпадает с введённым,
if(sGroup == sNewGroup)
{
// получаем оценку студента из БД
iMark = Query->FieldByName("MARK")->AsInteger;
if(iMark == 5) iExcellent++; // Увеличиваем число отличников и т.д.
else if(iMark == 4) iGood++;
else if(iMark == 3) iSatisfactory++;
else if(iMark == 2) iBad++;
}
Query->Next(); // Переходим к следующей записи
}

// Отсутствие оценок считаем признаком того, что группа не найдена.
if(iExcellent == 0 &&
iGood == 0 &&
iSatisfactory == 0 &&
iBad == 0)
{
MessageBox(0, "Группа не найдена!", "Нет данных", MB_ICONWARNING | MB_OK);
}
else
{
AnsiString sMessage = "В группе " + sGroup + " студентов, получивших\n"отлично": " + IntToStr(iExcellent)
+ "\n"хорошо": " + IntToStr(iGood) + "\n"удовлетворительно": " + IntToStr(iSatisfactory)
+ "\n"плохо": " + IntToStr(iBad);
ShowMessage(sMessage); // Формируем сообщение и показываем его
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::AverageMarkButtonClick(TObject *Sender)
{
// Вычисление средней оценки студента
AnsiString sStudentsName = ""; // Имя студента, введённое пользователем
AnsiString sName, sLastName; // и полученное из БД
InputQuery("Ввод имени", "Введите фамилию и имя студента, разделённые пробелом: ", sStudentsName);
if(sStudentsName == "") return; // Если пользователь ничего не ввёл, выходим

float fMark = 0.0; // Сумма оценок студента
int iNumber = 0; // Число полученных оценок
Query->Close();
Query->SQL->Clear();
Query->SQL->Add("SELECT LAST_NAME, NAME, MARK FROM Students");
Query->Open();
Query->First();
while(!Query->Eof)
{
// Получаем имя студента из БД
sName = Query->FieldByName("NAME")->AsString;
// Получаем фамилию студента из БД
sLastName = Query->FieldByName("LAST_NAME")->AsString;
// Имя студента - фамилия и имя, разделённые пробелом
sLastName = sLastName + " " + sName;
// Если полученное имя соответствует введённому,
if(sLastName == sStudentsName)
{
// Получаем оценку и прибавляем к сумме
fMark += Query->FieldByName("MARK")->AsFloat;
iNumber++;
}
Query->Next(); // Переходим к следующей записи
}

if(fMark == 0.0) MessageBox(0, "Студент не найден!", "Нет данных", MB_ICONWARNING | MB_OK);
else
{
fMark = fMark / (float)iNumber; // Вычисляем среднюю оценку
AnsiString sMessage = "Средняя оценка студента: " + FloatToStr(fMark);
ShowMessage(sMessage); // Формируем сообщение и показываем его
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::AverageGroupMarkButtonClick(TObject *Sender)
{
AnsiString sGroup = ""; // Шифр группы, введённый пользователем
AnsiString sNewGroup; // Шифр группы, полученный из БД
InputQuery("Ввод группы", "Введите шифр группы: ", sGroup);
if(sGroup == "") return; // Если пользователь ничего не ввёл, выходим

float fMark = 0.0; // Сумма оценок в группе
int iNumber = 0; // Число полученных оценок
Query->Close();
Query->SQL->Clear();
Query->SQL->Add("SELECT GROUP_NAME, MARK FROM Students");
Query->Open();
Query->First();
while(!Query->Eof)
{
// Получаем шифр группы из БД
sNewGroup = Query->FieldByName("GROUP_NAME")->AsString;
// Если он совпадает с введённым,
if(sGroup == sNewGroup)
{
// получаем оценку
fMark += Query->FieldByName("MARK")->AsFloat;
iNumber++;
}
Query->Next(); // Переходим к следующей записи
}

if(fMark == 0.0) MessageBox(0, "Группа не найдена!", "Нет данных", MB_ICONWARNING | MB_OK);
else
{
fMark = fMark / (float)iNumber; // Вычисляем среднюю оценку группы
AnsiString sMessage = "Средняя оценка группы: " + FloatToStr(fMark);
ShowMessage(sMessage); // Формируем сообщение и показываем его
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::AverageSubjectMarkButtonClick(TObject *Sender)
{
// Всё аналогично обработчику выше, но выборку делаем по предмету
AnsiString sSubject = "";
AnsiString sNewSubject;
InputQuery("Ввод предмета", "Введите название предмета: ", sSubject);
if(sSubject == "") return; // Если пользователь ничего не ввёл, выходим

float fMark = 0.0;
int iNumber = 0;
Query->Close();
Query->SQL->Clear();
Query->SQL->Add("SELECT SUBJECT, MARK FROM Students");
Query->Open();
Query->First();
while(!Query->Eof)
{
sNewSubject = Query->FieldByName("SUBJECT")->AsString;

if(sSubject == sNewSubject)
{
fMark += Query->FieldByName("MARK")->AsFloat;
iNumber++;
}
Query->Next(); // Переходим к следующей записи
}

if(fMark == 0.0) MessageBox(0, "Предмет не найден!", "Нет данных", MB_ICONWARNING | MB_OK);
else
{
fMark = fMark / (float)iNumber;
AnsiString sMessage = "Средняя оценка по предмету: " + FloatToStr(fMark);
ShowMessage(sMessage); // Формируем сообщение и показываем его
}
}
//---------------------------------------------------------------------------

Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Форма ответа