Опис схеми алгоритму роботи функції 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Опис схеми алгоритму роботи функції



Блок 1 – зчитування даних про студента

Блок 2 цикл з 0 до кількості - і

Блок 3 – цикл з і + 1 до кількості студентів

Блок 4 – якщо i та j студенти мають однакове прізвище та навчаються на різних формах навчання, то вивести їх пару

Блок 5 – Кінець циклу

Блок 6 – Кінець циклу

 

Функція 4

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

Мета даної функції

Вивести на екран найменування вулиці заданого міста на якій живе більше всього студентів.

 

Ідея реалізації

При виклику даної функції відбувається запит у користувача про місто в якому шукати. Після цього система фільтрує студентів відповідно до міста, далі сортує відповідно до вулиці, далі перебираючи відсортований масив, шукає вулицю за найбільшою кількістю студентів.

 

Структури даних

*sts – динамічний масив з бази даних студентів

count – кількість записів в базі даних

buf – студент

name_max – ім’я вулиці за максимальною кількістю студентів.

Current_count – поточна кількість на вулиці

Max_count – максимальна кількість з усіх вулиць

 

Опис схеми алгоритму роботи функції

Блок 1 – отримання студентів з бази даних

Блок 2 – ввід міста для фільтру

Блок 3 – цикл для всіх студентів

Блок 4 – якщо студент з даного міста перенести його в масив

Блок 5 – кінець циклу

Блок 6 – Сортування студентів по вулиці

Блок 7 – Цикл для всіх студентів

Блок 8 – Збільшити current_count

Блок 9 – Якщо поточна вулиця не рівна вулиці наступного студента в масиві та current_count > max_count, то max_count = current_count та установка max_name в поточне

Блок 10 – Кінець циклу

Блок 11 – Вивід даних

 

Функція 5

Упорядкувати товари по зменшенню строків придатності. У межах одного строку товари розташувати по зменшенню ціни.

Мета даної функції

Порахувати, в якій групі найменше студентів, які проживають в гуртожитку.

 

Ідея реалізації

Для цього сортуємо студентів по групам, далі в циклі підрахуємо кількість студентів що проживають в гуртожитку, одночасно з можливим перевизначенням мінімальної кількості..

 

Структури даних

*sts – динамічний масив з бази даних студентів

count – кількість записів в базі даних

buf – студент

name_min – назва групи з мінімальною кількістю жителів гуртожитку

current_count – поточна кількість таких студентів.

min_count – мінімальна кількість таких студентів

 

Опис схеми алгоритму роботи функції

Блоки 1 – зчитування бази даних та записування її до масиву для подальшої роботи з нею

Блоки 2-9 – сортування студентів по групам

Блоки 10-15 – визначення мінімальної кількості таких студентів

Блок 16 – виведення назви групи та кількості таких студентів

 

 

Опис роботи профілю користувача

Оператор

Оператор програми має доступ до всіх функцій, окрім додавання та видалення записів. Для входження до режиму оператора потребується ввід логіна та пароля оператора.

Адміністратор

Адміністратор має доступ до усіх функцій програми. Для входження до режиму адміністратору треба увести пароль, який може складати як цифри, так і інші символи.

Опис роботи з базою даних

Усі дані програми про товари зберігаються в окремому файлі під назвою «db.bin». Користувач може відкривати цей файл для перегляду даних про товари в ньому. Також, файл відкривається у режимі перегляду для виконання програмних функцій.

У режимі адміністратору файл відкривається у режимі запису лише для відпрацювання функцій додавання та видалення товару з файлу.

При додаванні запису користувач додає один запис, після чого повертається до меню.

При видаленні запису користувач вказує усі параметри товару, якщо вони співпадають з параметрами одного з товарів у базі даних, товар буде видалено, про що на екран виведеться повідомлення.

Керівництво користувача

У даній програмі взаємодія користувача та системи відбувається в текстовому режимі. При вході до програми, користувач вводить логін та пароль після чого натискаючи “Enter”. Якщо введені дані невірні то він повертається на ввід. Після входження до програми, на екран виводиться певна кількість пронумерованих пунктів меню, при введенні цифри, яка відповідає обраному пункту, відпрацьовується функція, після чого, користувачу пропонується повернутися до меню при введенні будь-якого числа. Останній пункт меню – це вихід з програми. Під час переходу до пунктів меню, або самого меню, виконується очистка екрану.

Контрольний приклад

Після запуску програми, користувачу слід ввести логін та пароль:

 

Після аутентифікації, користувачу надається доступ до меню:

 

 

Нижче наведено відпрацювання деяких функцій програми.

 

 

Висновки

Для виконання курсової роботи був використаний теоретичний матеріал з дисципліни «Основи програмування». Розроблена програма – це проект, що має відносно складну структуру, здатний вирішувати поставлені переді мною завдання. Словесний опис алгоритмів, їх схеми та тестування дає змогу чітко зрозуміти, як реалізована кожна функція, наскільки корректно вона працює. В роботі представлені були виконані все 5 функцій, які представлені в завданні, деякі з них представлені скріншотами в Розділі 6 Контрольні приклади.

Таким чином, розробка курсової роботи дала мені досвід у сфері програмування, що можна використовувати в реальних проектах. Під час виконання я навчилася проектувати та розроблювати складні за структурою проекти. Отриманий досвід надасть змогу виконувати більш складні за структурою проекти.


 

Список літератури

1. Единая система программной документации. – М.: Изд-во стандартов, 1991. – 128 с.

2. Шилдт Г. Программирование на Borland C++ для профессионалов /Пер. с англ. – Мн.: ООО «Попурри», 1999. – 800 с.

3. Дейтел Х., Дейтел П. Как программировать наС: Третье издание. Пер. с англ. – М.: Бином-Пресс, 2002. – 1168 с.

4. Комлева Н.О., Кунгурцев О.Б. Основи програмування і алгоритмічні мови. – Одеса: Наука і техніка, 2005. – 136 с.

5. Кунгурцев О.Б. Об’єктно-оріентована технологія створення програмних продуктів. Уніфікований ітераційний процес. Навч. Посібник для вищих навчальних закладів. – Одеса: ВМВ, 2006. – 182 с.

6. Шилдт Г. Справочник программиста по С/С++ (4-е издание).

7. Методичні вказівки по дипломному проектуванню для студентів фаху 7.080403-програмне забезпечення автоматизованих систем/Авт.: В.А. Крісілов, Ф.С. Шапо, О.М. Паулін, Л.С. Жиро.- Одеса: Наука і техніка, 2010- 47 с.

 


 

Додаток 1

Лістинг програми

Файл “database.cpp”

#include "database.h"

char database_new(database_t **self, char *file_name, int item_len) {

*self = (database_t *)calloc(sizeof(database_t), 1);

(*self)->file = file_name;

(*self)->len = item_len;

 

return NULL;

}

char database_load(database_t *self, void **data, int *count) {

FILE *f = fopen(self->file, "rb");

if (!f) {

*data = NULL;

*count = 0;

return NULL;

}

fseek(f, 0, SEEK_END);

int total = ftell(f);

fseek(f, 0, SEEK_SET);

*count = total / self->len;

*data = (void *)calloc(total, 1);

fread(*data, 1, total, f);

fclose(f);

 

return NULL;

}

char database_save(database_t *self, void *data, int count) {

FILE *f = fopen(self->file, "wb");

int size = count * self->len;

fwrite(data, 1, size, f);

fclose(f);

 

return NULL;

}

 

char database_first(database_t *self, void **data) {

FILE *f = fopen(self->file, "rb");

*data = (void *)calloc(self->len, 1);

fread(*data, 1, self->len, f);

self->current = 0;

 

return NULL;

 

}

char database_next(database_t *self, void **data) {

self->current += self->len;

FILE *f = fopen(self->file, "rb");

 

*data = (void *)calloc(self->len, 1);

fseek(f, self->current, SEEK_SET);

fread(*data, 1, self->len, f);

fclose(f);

 

return NULL;

}

char database_append(database_t *self, void *data) {

FILE *f = fopen(self->file, "ab+");

 

fwrite(data, 1, self->len, f);

fclose(f);

 

return NULL;

}

 

char database_delete(database_t *self, int index) {

int count;

char *data;

database_load(self, (void **)&data, &count);

memmove(data + index * self->len, data + (index + 1) * self->len, (count - 1) * self->len);

 

database_save(self, data, count - 1);

 

return NULL;

}

Файл database.h

#pragma once

 

#include "stdafx.h"

 

typedef struct database_s database_t;

 

struct database_s {

char *file;

long current;

int len;

FILE *fhandle;

};

 

char database_new(database_t **self, char *file_name, int item_len);

char database_load(database_t *self, void **data, int *count);

char database_save(database_t *self, void *data, int count);

char database_delete(database_t *self, int index);

 

char database_first(database_t *self, void **data);

char database_next(database_t *self, void **data);

char database_append(database_t *self, void *data);

 

Файл deanery.cpp

// Deanery.cpp: Defines the entry point for the console application.

//

 

#include "stdafx.h"

#include "Student.h"

#include "database.h"

#include "program.h"

 

int main()

{

system("title Програма");

setlocale(LC_ALL, "rus");

program_login();

_getch();

return 0;

}

 

Файл program.cpp

#include "program.h"

 

char program_login() {

printf("You need to login:\nLogin:");

char *login = (char *)calloc(40, 1);

char *password = (char *)calloc(40, 1);

 

char *real_login_admin = "Admin";

char *real_password_admin = "qwerty";

 

char *real_login_moder = "Moder";

char *real_password_moder = "123456";

 

scanf("%s", login);

printf("Password: ");

 

int i = 0;

char ch;

while (1) {

if (i < 0) {

i = 0;

}

ch = getch();

 

if (ch == 13)

break;

if (ch == 8) /*ASCII value of BACKSPACE*/

{

putch('b');

putch(NULL);

putch('b');

i--;

continue;

}

 

password[i++] = ch;

ch = '*';

putch(ch);

}

 

if (!strcmp(login, real_login_admin)) {

if (!strcmp(password, real_password_admin))

program_menu(1);

else {

printf("Authorization failed.");

return NULL;

}

}

else if (!strcmp(login, real_login_moder)) {

if (!strcmp(password, real_password_moder))

program_menu(0);

else {

printf("Authorization failed.");

return NULL;

}

}

 

return NULL;

}

char program_menu(char is_admin) {

 

database_t *database;

database_new(&database, "db.bin", sizeof(student_t));

 

int answ;

 

while (1) {

system("cls");

printf("\n1) Task\n");

printf("2) Database\n");

printf("3) Function 1\n");

printf("4) Function 2\n");

printf("5) Function 3\n");

printf("6) Function 4\n");

printf("7) Function 5\n");

 

if (is_admin) {

printf("8) Add student\n");

printf("9) Delete student\n");

}

 

printf("10) Exit\n");

printf(">> ");

 

scanf("%d", &answ);

 

switch (answ)

{

case 1: program_task(); break;

case 2: program_db(database); break;

case 3: program_f1(database); break;

case 4: program_f2(database); break;

case 5: program_f3(database); break;

case 6: program_f4(database); break;

case 7: program_f5(database); break;

case 8: if (is_admin) program_add(database); else printf("Incorrect item"); break;

case 9: if (is_admin)program_delete(database); else printf("Incorrect item"); break;

case 10: return NULL;

default: printf("Incorrect item");

continue;

}

_getch();

}

 

 

return NULL;

}

 

char program_task() {

printf("Роботу виконала Наталія Матвєєва.\n\n");

 

printf("Програма передбачає роботу користувача в одному з двох режимiв роботи.\nПiсля запуску програми на виконання користувачевi надається можливiсть вибору режиму роботи: Администратор или Оператор.При виборi режиму Адмiнiстратор у користувача запитується пароль, вхiд в режимi Оператора вiдбувається без введення пароля.\nДалi на екранi вiдкривається головне меню з наступними командами:\n1. Завдання.\n2. Вмiст бази даних.\n3. Функцiя 1 (згiдно з варiантом).\n4. Функцiя 2 (згiдно з варiантом).\n5. Функцiя 3 (згiдно з варiантом).\n6. Функцiя 4 (згiдно з варiантом).\n7. Функцiя 5 (згiдно з варiантом).\n8. Додавання запису(тiльки для адмiнiстратора).\n9. Видалення запису(тiльки для адмiнiстратора).\n10. Вихiд.\nПри виборi користувачем пункту Завдання на екранi вiдображається текст завдання на розробку, данi про виконавця та керiвника роботи.По натисканню певної(або будь - якiй) клавiшi вiдбувається повернення в головне меню.Аналогiчний повернення проводиться при вiдпрацюваннi всiх iнших пунктiв меню, крiм пункту \"Вихiд\".\nВибiр \"Вмiсту бази даних\" дозволяє вiдобразити всi записи, що мiстяться у файлi даних.Необхiдно органiзувати виведення iнформацiї в зручнiй для сприйняття табличнiй формi.\nПри виборi користувачем пунктiв \"Функцiя 1\" - \"5\" виконуються вiдповiднi дiї i результат вiдображається на екранi.При цьому кожної функцiї завдання повиннi вiдповiдати розробленi студентом одна або бiльше програмнi функцiї.\nПункти меню \"Додавання запису\" i \"Видалення запису\" доступнi тiльки в режимi адмiнiстратора.При додаваннi нового запису необхiдно ввести значення для всiх полiв, а потiм додати запис в кiнець файлу.При видаленнi запису також необхiдно задати значення всiх полiв для iдентифiкацiї запису.У разi необхiдностi можна використовувати промiжнi змiннi i масиви.\nПри виборi користувачем пункту меню \"Вихiд\" необхiдно органiзувати вихiд з програми.При цьому повиннi бути закритi всi вiдкритi ранiше файли(файл).\nНеобхiдно передбачити контроль за дiями користувача таким чином, щоб помилки при введеннi даних або команд не приводили до аварiйного завершення програми i видавалося повiдомлення, що характеризує помилку.\nСтудент може використовувати спецiальнi засоби для створення iнтерфейсу.Проте в цьому випадку вiн повинен бути готовий дати вичерпну вiдповiдь про роботу i органiзацiю використовуваних програмних засобiв.Не припускається використання iнтерфейсних засобiв з об’єктно - орiєнтованою iдеологiєю. ");

 

printf("\n\nПредметная область – деканат. Объект – студент.\nДанные об объекте:\n-ФИО;\n-группа;\n-форма обучения(дневная / заочная, бюджет / контракт);\n-адрес;\n-необходимость в предоставлении общежития;\n-средний балл.\nФункции:\n1. Сгруппировать студентов по среднему баллу: < 60 (1 диапазон), 60 – 75 (2 диапазон), 76 – 94 (3 диапазон), 95 – 100 (4 диапазон).Внутри каждого диапазона отсортировать студентов по группам.\n2. Для каждой группы подсчитать средний балл студентов - заочников.\n3. Вывести данные обо всех возможных парах таких студентов - однофамильцев, чтобы один учился на дневной форме обучения, а другой – на заочной.\n4. Подсчитать, на какой улице заданного города проживает больше всего студентов.\n5. Подсчитать, в какой группе меньше всего студентов, проживающих в общежитии.");

_getch();

 

return NULL;

}

 

char program_db(database_t *database) {

student_t *students;

 

printf("\nStart load database\n");

int count;

database_load(database, (void **)&students, &count);

printf("Database loaded\n");

student_table(students, count);

 

return NULL;

}

 

char program_f1(database_t *database) {

student_t *sts;

int count;

database_load(database, (void **)&sts, &count);

 

student_t buf;

for (int i = 0; i < count; i++) {

for (int j = 0; j < count - i - 1; j++) {

if (sts[j].mark > sts[j + 1].mark) {

buf = sts[j];

sts[j] = sts[j + 1];

sts[j + 1] = buf;

}

}

}

 

int cnt1 = 0;

for (int i = 0; i < count; i++) if (sts[i].mark < 60.0)cnt1 = i + 1; else break;

int cnt2 = 0;

for (int i = cnt1; i < count; i++) if (sts[i].mark < 75.0 && sts[i].mark >= 60.0)cnt2 = i + 1; else break;

int cnt3 = 0;

for (int i = cnt2; i < count; i++) if (sts[i].mark < 95.0 && sts[i].mark >= 75.0)cnt3 = i + 1; else break;

int cnt4 = count - cnt1 - cnt2 - cnt3;

 

for (int i = 0; i < cnt1; i++) {

for (int j = 0; j < cnt1 - i - 1; j++) {

if (strcmp(sts[j].groupe, sts[j + 1].groupe) > 0) {

buf = sts[j];

sts[j] = sts[j + 1];

sts[j + 1] = buf;

}

}

}

for (int i = cnt1; i < cnt2; i++) {

for (int j = 0; j < cnt2 - i - 1; j++) {

if (strcmp(sts[j].groupe, sts[j + 1].groupe) > 0) {

buf = sts[j];

sts[j] = sts[j + 1];

sts[j + 1] = buf;

}

}

}

for (int i = cnt2; i < cnt3; i++) {

for (int j = 0; j < cnt3 - i - 1; j++) {

if (strcmp(sts[j].groupe, sts[j + 1].groupe) > 0) {

buf = sts[j];

sts[j] = sts[j + 1];

sts[j + 1] = buf;

}

}

}

for (int i = cnt3; i < cnt4; i++) {

for (int j = 0; j < cnt4 - i - 1; j++) {

if (strcmp(sts[j].groupe, sts[j + 1].groupe) > 0) {

buf = sts[j];

sts[j] = sts[j + 1];

sts[j + 1] = buf;

}

}

}

 

printf("\n1st groupe (<60):\n");

student_table(sts, cnt1);

printf("\n2st groupe (<75):\n");

student_table(sts + cnt1, cnt2);

printf("\n3st groupe (<95):\n");

student_table(sts + cnt1 + cnt2, cnt3);

printf("\n4st groupe (<100):\n");

student_table(sts + cnt1 + cnt2 + cnt3, cnt4);

 

return NULL;

}

char program_f2(database_t *database) {

student_t *sts;

int count;

database_load(database, (void **)&sts, &count);

 

student_t buf;

for (int i = 0; i < count; i++) {

for (int j = 0; j < count - i - 1; j++) {

if (strcmp(sts[j].groupe, sts[j + 1].groupe) > 0) {

buf = sts[j];

sts[j] = sts[j + 1];

sts[j + 1] = buf;

}

}

}

printf("\nGroups sorted\n");

float sum = 0;

int n = 0;

 

for (int i = 0; i < count - 1; i++) {

n++;

sum += sts[i].mark;

if (strcmp(sts[i].groupe, sts[i + 1].groupe)) {

printf("Group %s = %f\n", sts[i].groupe, sum / n);

sum = 0;

n = 0;

}

}

 

if (count > 1 && strcmp(sts[count - 1].groupe, sts[count - 2].groupe)) {

printf("Group %s = %f\n", sts[count - 1].groupe, sts[count - 1].mark);

}

 

return NULL;

}

char program_f3(database_t *database) {

student_t *sts;

int count;

database_load(database, (void **)&sts, &count);

 

student_t buf;

for (int i = 0; i < count; i++) {

for (int j = 0; j < count - i - 1; j++) {

if (strcmp(sts[j].name.lastname, sts[j + 1].name.lastname) > 0) {

buf = sts[j];

sts[j] = sts[j + 1];

sts[j + 1] = buf;

}

}

}

 

int pair = 1;

for (int i = 0; i < count - 1; i++) {

for(int j = i + 1; j < count; j++){

if (!strcmp(sts[i].name.lastname, sts[j].name.lastname) && sts[i].study_type.daytime!= sts[j].study_type.daytime) {

char *name1, *name2, *address1, *address2;

 

student_get_full_name(&sts[i], &name1);

student_get_full_name(&sts[j], &name2);

 

student_get_full_address(&sts[i], &address1);

student_get_full_address(&sts[j], &address2);

 

printf("\nPair %-d:\n1: Name: %-20s, Address: %-20s, Mark: %-5.2f", pair, name1, address1, sts[i].mark);

printf("\n2: Name: %-20s, Address: %-20s, Mark: %-5.2f", name2, address2, sts[j].mark);

pair++;

}

}

}

 

return NULL;

}

char program_f4(database_t *database) {

student_t *sts;

int count;

database_load(database, (void **)&sts, &count);

 

char *city = (char *)calloc(40, 1);

printf("\nEnter city: ");

scanf("%s", city);

 

student_t *cit = (student_t *)calloc(count, sizeof(student_t));

int cnt = 0;

for (int i = 0; i < count; i++) {

if (!strcmp(sts[i].address.city, city)) {

cit[cnt] = sts[i];

cnt++;

}

}

 

student_t buf;

for (int i = 0; i < cnt; i++) {

for (int j = 0; j < cnt - i - 1; j++) {

if (strcmp(cit[j].address.street, cit[j + 1].address.street) > 0) {

buf = cit[j];

cit[j] = cit[j + 1];

cit[j + 1] = buf;

}

}

}

 

char *name_max = 0;

int current_count = 0;

int max_count = 0;

for (int i = 0; i < cnt - 1; i++) {

current_count++;

if (strcmp(cit[i].address.street, cit[i + 1].address.street)) {

 

if (current_count > max_count) {

max_count = current_count;

name_max = cit[i].address.street;

}

current_count = 0;

}

}

 

printf("\nFounded max: %d at street %s of city %s\n", max_count, name_max, city);

return NULL;

}

char program_f5(database_t *database) {

student_t *sts;

int count;

database_load(database, (void **)&sts, &count);

 

student_t buf;

for (int i = 0; i < count; i++) {

for (int j = 0; j < count - i - 1; j++) {

if (strcmp(sts[j].groupe, sts[j + 1].groupe) > 0) {

buf = sts[j];

sts[j] = sts[j + 1];

sts[j + 1] = buf;

}

}

}

 

char *name_min = 0;

int current_count = 0;

int min_count = (1 << 31) - 1;

for (int i = 0; i < count; i++) {

if (sts[i].need_hostel) current_count++;

if (strcmp(sts[i].groupe, sts[i + 1].groupe)) {

if (current_count < min_count) {

min_count = current_count;

name_min = sts[i].groupe;

}

current_count = 0;

}

}

 

printf("\nLeast of all need a hostel in %s = %d\n", name_min, min_count);

 

return NULL;

}

 

char program_add(database_t *database) {

student_t *student;

student_new(&student);

printf("Enter student data:\n");

printf("Lastname: "); scanf("%s", student->name.lastname);

printf("Surname: "); scanf("%s", student->name.surname);

printf("Patronymic: "); scanf("%s", student->name.patronymic);

printf("City: "); scanf("%s", student->address.city);

printf("Street: "); scanf("%s", student->address.street);

printf("Building: "); scanf("%d", &student->address.building);

printf("Flat: "); scanf("%d", &student->address.flat);

printf("Groupe: "); scanf("%s", student->groupe);

printf("Buget?1/0: "); scanf("%d", &student->study_type.budget);

printf("Daytime?1/0: "); scanf("%d", &student->study_type.daytime);

printf("Need hostel?1/0: "); scanf("%d", &student->need_hostel);

printf("Mark: "); scanf("%f", &student->mark);

 

database_append(database, student);

return NULL;

}

char program_delete(database_t *database) {

printf("Choose index from database: \n");

program_db(database);

int index;

printf("Enter index to delete: ");

scanf("%d", &index);

database_delete(database, index - 1);

return NULL;

}

 

Файл program.h

#pragma once

 

#include "stdafx.h"

#include "database.h"

#include "Student.h"

 

char program_login();

char program_menu(char is_admin);

 

char program_task();

char program_db(database_t *database);

 

char program_f1(database_t *database);

char program_f2(database_t *database);

char program_f3(database_t *database);

char program_f4(database_t *database);

char program_f5(database_t *database);

 

char program_add(database_t *database);

char program_delete(database_t *database);

 

Файл student.cpp

#include "Student.h"

 

char student_new(student_t **self) {

*self = (student_t *)calloc(sizeof(student_t), 1);

 

return NULL;

}

char student_get_full_address(student_t *self, char **address) {

if (!self) {

*address = NULL;

return NULL;

}

const int PLACE_FOR_NUMS = 10;

*address = (char *)calloc(1,

strlen(self->address.city) + strlen(self->address.street) + PLACE_FOR_NUMS + 1);

 

strcat(*address, self->address.city);

strcat(*address, ", ");

strcat(*address, self->address.street);

strcat(*address, ", ");

 

char *buf = (char *)calloc(PLACE_FOR_NUMS, 1);

itoa(self->address.building, buf, 10);

strcat(*address, buf);

strcat(*address, "/");

buf[0] = '\0';

itoa(self->address.flat, buf, 10);

strcat(*address, buf);

strcat(*address, "\0");

 

return NULL;

}

 

char student_get_full_name(student_t *self, char **fname) {

if (!self) {

fname = NULL;

return NULL;

}

 

 

*fname = (char *)calloc(1,

strlen(self->name.lastname) +

strlen(self->name.surname) +

strlen(self->name.patronymic)

+ 3);

 

strcat(*fname, self->name.lastname);

strcat(*fname, " ");

strcat(*fname, self->name.surname);

strcat(*fname, " ");

strcat(*fname, self->name.patronymic);

strcat(*fname, "\0");

 

return NULL;

}

 

 

char student_set_address(student_t *self, char *city, char *street, int building, int flat) {

if (!self) return NULL;

 

 

self->address.city[0] = 0;

self->address.street[0] = 0;

 

strcat(self->address.city, city);

strcat(self->address.street, street);

self->address.building = building;

self->address.flat = flat;

 

return NULL;

}

 

 

char student_set_name(student_t *self, char *last_name, char *sur_name, char *patronymic) {

if (!self) return NULL;

 

self->name.lastname[0] = 0;

self->name.surname[0] = 0;

self->name.patronymic[0] = 0;

 

strcat(self->name.lastname, last_name);

strcat(self->name.surname, sur_name);

strcat(self->name.patronymic, patronymic);

 

return NULL;

}

 

char student_table(student_t *self, int count) {

printf("+----+----------------------------+---------------------------------+----------+----------+----------+--------+--------+\n");

printf("| N | FIO | Address | Groupe | Budget | Daytime | Hostel | Mark |\n");

printf("+----+----------------------------+---------------------------------+----------+----------+----------+--------+--------+\n");

for (int i = 0; i < count; i++) {

char *name, *address;

student_get_full_name(&self[i], &name);

student_get_full_address(&self[i], &address);

printf("|%4d|%28s|%33s|%10s|%10s|%10s|%8s|%8.2f|\n", i + 1, name, address, self[i].groupe, self[i].study_type.budget? "+": "-", self[i].study_type.daytime? "+": "-", self[i].need_hostel? "+": "-", self[i].mark);

free(name);

free(address);

printf("+----+----------------------------+---------------------------------+----------+----------+----------+--------+--------+\n");

}

 

return NULL;

}

Файл student.h

#pragma once

#include "stdafx.h"

typedef struct student_s student_t;

 

struct student_s

{

struct {

char surname[STRLEN];

char lastname[STRLEN];

char patronymic[STRLEN];

} name;

 

char groupe[STRLEN];

 

struct {

int budget;

int daytime;

} study_type;

 

struct {

char city[STRLEN];

char street[STRLEN];

int building;

int flat;

} address;

 

float mark;

int need_hostel;

};

 

char student_new(student_t **self);

char student_set_address(student_t *self, char *city, char *street, int building, int flat);

char student_set_name(student_t *self, char *last_name, char *sur_name, char *patronymic);

char student_get_full_address(student_t *self, char **address);

char student_get_full_name(student_t *self, char **fname);

char student_table(student_t *self, int count);

 



Поделиться:


Последнее изменение этой страницы: 2017-02-10; просмотров: 68; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.219.63.90 (0.421 с.)