аріант індивідуального завдання 21

Завдання:Ввести з клавіатури масив рядків символів з даними про успішність групи: прізвище, № залікової, оцінки з 5 предметів. Впорядкувати масив за прізвищами студентів. Виділити складові частини рядків та записати їх у відповідні поля структури. Знайти середній бал кожного студента та записати його у додаткове поле кожної структури. Переписати масив у двонаправлений лінійний список динамічної пам’яті. Виключити зі списку студентів, середній бал яких нижчий від введеного з клавіатури значення. Переписати список у двійковий файл. Вміст файлу вивести на екран у формі таблиці. Усі дії оформити у окремих функціях.

Код програми:

//#include "stdafx.h"

#include <iostream>

#include <string>

#include <vector>

#include <stdio.h>

#include <conio.h>

#include <algorithm>

#include <fstream>

#define k 5 // кількість оцінок

 

using namespace std;

using namespace System;

 

typedef struct student

{

char *name; // вказівник на рядок з прізвищем

int zalikovka; // змінна з номером заліковки

int bal[5]; // масив з балами

} stud; // структура опису студента

 

typedef struct list{

stud std; // Поле даних

struct list *next, *prev; // вказівники на попередній і наступний елементи

} list; // структура опису двозв'язного списку

 

void ReadStrings(char a[][40], int n); // функція зчитування масиву рядків

void Rozbuttia(char info[][40],stud a[],int n); // функція створеня масиву структур

list* NewElement(stud a); // функція створення нового вузла в список

void InsertElem(list *pnew); // додавання вузла до списку

void SortList(float); // сортування списку

void WriteToFile(); // запис у файл

void ReadFromFile(); // зчитування з файлу

 

void SortArr(int);

list *Head, *Tail; // глобальні змінні

stud a[10];

void main()

{

int n,i,bs;

// масив структур

char info[10][40]; // масив рядків

printf ("How much students add ");

scanf("%d", &n); // зчитуємо кількість студентів

fflush(stdin); // очищуємо буфер клавіатури

ReadStrings(info, n); // зчитуємо рядки

 

Rozbuttia(info, a, n); // створюємо масив структур

SortArr(n);

for (i=0;i<n;i++)

InsertElem(NewElement(a[i])); // створюємо двозв'язний список

 

WriteToFile(); // заносимо список в файл

ReadFromFile(); // виводимо вміст файлу на екран

printf ("\n Input bal: ");

scanf("%d", &bs);

SortList(bs);

WriteToFile();

ReadFromFile();

putchar('\n');

system ("PAUSE"); // пауза

}

 

 

void SortArr(int _k)

{

for(int i = 0; i < _k; i++)

{

for(int j = 1; j < _k; j++)

{

if(strcmp(a[j-1].name,a[j].name) > 0)

{

stud _s;

_s = a[j-1];

a[j-1] = a[j];

a[j] = _s;

}

}

}

}

 

/***********************************************************************************/

/* Функція зчитування рядків з клавіатури */

/* Вхідними даними є масив рядків, та кількість студентів */

void ReadStrings(char a[][40], int n)

{

printf("Input information about Students in next format \n");

for (int i=0;i<=55;i++) putch('-');

printf("\n \Surname \Zalikova Bal[1] Bal[2] Bal[3] Bal[4] Bal[5]\"\n");

for (int i=0;i<=55;i++) putch('-');

putchar('\n');

for (int i=0;i<n;i++)

gets(a[i]); // зчитуємо рядок

}

/***********************************************************************************/

/* Функція, яка розбиває рядок на складові елементи та заносить їх в структуру */

/* Вхідними даними є масив рядків, масив структур, кількість студентів */

void Rozbuttia(char info[][40],stud a[],int n)

{

int i,j;

for (i=0;i<n;i++) // цикл по рядках

{

a[i].name=strtok(info[i]," "); // виділяємо прізвище

a[i].zalikovka=atoi(strtok(NULL," ")); // виділяємо номер заліковки

for (j=0;j<k;j++)

a[i].bal[j]=atoi(strtok(NULL," ")); // виділяємо оцінки

}

}

 

/***********************************************************************************/

/* Функція для створення елементу списку */

/* Вхідними даними є структура з інформацією */

list* NewElement(stud a)

{

list *pel;

pel = new list; // виділяємо динамічну пам'ять

pel->std=a; // заповнюємо інформаційне поле елемента

pel->next=pel->prev=NULL; // занулюємо показники

return pel; // вертаємо елемент

}

 

/***********************************************************************************/

/* Функція для додавання елементу до списку */

/* Вхідними даними є вказівник на елемент */

void InsertElem(list* pnew)

{

if (Head==NULL) // якщо список пустий

{

pnew->next=pnew->prev=NULL; // занулюємо вказівники

Head=Tail=pnew; // Голова і хвіст вказують на перший елемент

}

else

{

Tail->next=pnew; // хвіст вказує на вхідний елемент

pnew->prev=Tail; // вказівник попереднього на хвіст

pnew->next=NULL; // вкзівник наступного на NULL

Tail=pnew; // Хвіст вказує на потчний

};

}

 

 

/***********************************************************************************/

/* Функція для сортування списку */

/* Вхідних даних немає */

void SortList(float _ser)

{

list *temp=Head;

 

while (temp!=NULL) // прохід по списку

{

float ser=(temp->std.bal[0]+temp->std.bal[1]+temp->std.bal[2]+temp->std.bal[3]+temp->std.bal[4])/5 ;

if(ser < _ser)

{

 

 

if(temp->next != NULL)

{

if(temp->prev != NULL)

{

temp->next->prev = temp->prev;

temp->prev->next = temp->next;

}

temp->next->prev = NULL;

}

else

{

temp->prev->next = NULL;

}

 

}

 

temp = temp->next;

}

}

 

/***********************************************************************************/

/* Функція для занесення списку в файл */

/* Вхідних даних немає */

void WriteToFile()

{

FILE *fp; // файлова змінна

char *way={"result.txt"}; // шлях до файлу

fp=fopen(way, "a"); // відкритя файлу

list *temp=Head; // темп вказує на голову

while (temp!=NULL) // прохід по списку

{

fprintf (fp, "%15s%8d%3d%3d%3d%3d%3d\n",temp->std.name, temp->std.zalikovka,

temp->std.bal[0], temp->std.bal[1], temp->std.bal[2],

temp->std.bal[3], temp->std.bal[4]); // запис в файл

temp=temp->next; // перехід до наступного елемента

}

fprintf (fp, "%15s%8d%3d%3d%3d%3d%3d\n","-", 0,

0, 0, 0,

0, 0); // запис в файл

fclose(fp); // закриття файлу

}

 

/***********************************************************************************/

/* Функція для виведення інформації на екран */

/* Вхідних даних немає */

void ReadFromFile()

{

FILE *fp; // файлова змінна

int i=0, ser;

char *way={"result.txt"}, temp[1][40]; // шлях до файлу, масив з одного рядка

stud temp1[1]; // інформаційна структура

for (i=0;i<55;putchar('-'),i++);

printf ("\n Surname Zalikova [1] [2] [3] [4] [5] Seredne\n");

for (i=0;i<55;putchar('-'),i++);

putchar('\n');

fp=fopen(way, "r"); // відкриваємо файл для читання

while (fgets(temp[0], 40, fp)!=NULL) // цикл по рядках файлу

{

Rozbuttia(temp,temp1,1); // розбиваємо зчитаний рядок на поля

ser=(temp1->bal[0]+temp1->bal[1]+temp1->bal[2]+temp1->bal[3]+temp1->bal[4])/k ;

printf("%15s%9d%5d%4d%4d%4d%4d%4d\n", temp1->name, temp1->zalikovka,

temp1->bal[0], temp1->bal[1], temp1->bal[2], temp1->bal[3], temp1->bal[4], ser);

ser=0;

}

}

 

 

Опис функцій:

void SortArr – Сортує масив по алфавіту за прізвищем за допомогою бульбашкового алгоритму сортування.

void ReadStrings – Функція зчитує введені значення з клавіатури написані через пробіл.

void Rozbuttia - Функція, яка розбиває рядок на складові елементи та заносить їх в структуру.

list* NewElement - Функція для створення елементу списку. Вхідними даними є структура з інформацією .

void InsertElem - Функція для додавання елементу до списку. Вхідними даними є вказівник на елемент

void ReadFromFile - Функція для виведення інформації на екран. У ній також відбувається підрахунок серебнього балу кожного студента та створення нової колонки таблиці.

 

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

 

Результати виконання

Введення інформації:

 

Введення оцінки для видалення студентів, у яких вона нижче введеної:

 

Знаходження файлу для запису результатів виконання:

 

Вміст файлу після виконання програми:

 

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

 

Список використаної літератури:

Язык программирования Си – Керніган, Рітчі, 3 видання.

Программирование на языке Си – Поляков, 1995-2012

Язык программирования С++ - Стефан Прата, 2012, 6 видання