Опис алгоритму і програми
Після введення балу для розділення списку, функція зрівнює цей бал з кожним балом студентів у списку. В разі виконання умови (бал < введеного), студент виводиться на екран, після того як функція провірить всі елементи списку, буде провірятись виконання умови (бал? введеного) по такому ж алгоритму. Якщо список буде пустим, або не буде знайдено студентів з такою кількістю балів, то користувача буде… Читати ще >
Опис алгоритму і програми (реферат, курсова, диплом, контрольна)
У розробленому програмному продукті, окрім головної функції, використовуються наступні функції:
- · void AddElementToList ()
- · void PrintList ()
- · void SortAscBySurname ()
- · void SortAscByAvgBall ()
- · bool DeleteElementBySurname (char surname [])
- · void SplitByAverageBall (float avgBall)
- · void menu ()
Функція void AddElementToList () виконує додавання елемента у вже існуючий список. Причому додавання нових елементів відбуватиметься почергово у кінець списку. Фрагмент програмного коду:
//заполняем введенными данными элементы списка. strcpy (newRecord->surname, bufferSurname); newRecord->yearOfEntrance = bufferYear; newRecord->averageBall = bufferBall; //проверка:если элементов нет, то голова и конец — это первый элемент. if (head == NULL). {head = newRecord; tail = newRecord; head->prev = NULL;}. else. {//если в списке есть элементы, то добавляем в конец. tail->next = newRecord; newRecord->prev = tail; tail = tail->next;}. itemsInList++; tail->next = NULL; |
двозв’язний список програма алгоритм Функція void PrintList () виконує друк списку на екран монітора. Завдяки цій функції користувач може побачити вміст струтури даних. Вивід організований завдяки стандартній функції друку cout, а саме:
if (head==NULL). { CharToOemA («ОШИБКА: Список пуст! «, buf); cout< return;} //если список пуст вывести это и закончить функцию. list* Temp=head; // создаем временный указатель и указываем на голову списка. while (Temp≠NULL). {//пока не дойдем до конца списка. //вывод информации. CharToOemA («Фамилия: «, buf); cout< cout. CharToOemA («Год поступления: «, buf); cout< cout. CharToOemA («Средний балл: «, buf); cout< cout<" «; Temp=Temp->next;//указатель двигаем на след элемент списка}. |
Для того, щоб в консольному вікні ми могли бачити російські букви, ми використаємо функцію CharToOem — яка перетворює рядок у певний OEM набір символів. Також, якщо список буде пустим, то з’явиться відповідне повідомлення.
Функція void SortAscBySurname () виконує сортування списку в алфавітному порядку за значенням поля «Прізвище». Фрагмент коду:
//временные переменные для обмена местами элементов списка. char buffer[255]; int bufferYear; float bufferAvBall; //указываем на 1 элемент в списке. list *tempElement = head; //цикл сдвигает один элемент в конец, меняет местами данные в элементах. while (tempElement->next). if (strcmp (tempElement->next->surname, tempElement->surname) < 0). {strcpy (buffer, tempElement->next->surname); strcpy (tempElement->next->surname, tempElement->surname); strcpy (tempElement->surname, buffer); bufferYear = tempElement->next->yearOfEntrance; tempElement->next->yearOfEntrance = tempElement- >yearOfEntrance; tempElement->yearOfEntrance = bufferYear; bufferAvBall= tempElement->next->averageBall; tempElement->next->averageBall = tempElement->averageBall; tempElement->averageBall = bufferAvBall;}. tempElement = tempElement->next;}. |
Якщо список не пустий, і складається більше ніж з одного елементу, то буде виконане сортування. Ми створюємо тимчасові змінні для обміну місцями елементів списку. В даному циклі використаємо функцію strcmp — яка порівнює в лексикографічному порядку два рядки і повертає ціле значення, залежне наступним чином від результату порівняння:
- · якщо менше 0 — то перший рядок менше другого
- · якщо 0 — то рядки рівні
- · якщо більше 0 — то перший рядок більше другого
Функція void SortAscByAvgBall () аналогічна попередній функції. Ми використаємо її для сортування середнього балу при розділенні списку на два, щоб список студентів їх балами виводився по зростанню. В програмі це буде представлено так:
//временные переменные для обмена местами элементов списка. char buffer[255]; int bufferYear; float bufferAvBall; //указываем на 1 элемент в списке. list *tempElement = head; //цикл сдвигает один элемент в конец, меняет местами данные в элементах. while (tempElement->next). {if (tempElement->next->averageBall averageBall). {strcpy (buffer, tempElement->next->surname); strcpy (tempElement->next->surname, tempElement->surname); strcpy (tempElement->surname, buffer); bufferYear = tempElement->next->yearOfEntrance; tempElement->next->yearOfEntrance = tempElement->yearOfEntrance; tempElement->yearOfEntrance = bufferYear; bufferAvBall= tempElement->next->averageBall; tempElement->next->averageBall = tempElement->averageBall; tempElement->averageBall = bufferAvBall;}. tempElement = tempElement->next;}. |
Також для сортування використаємо функцію strcpy, в результаті якої бали студентів відсортуються в порядку зростання.
Функція bool DeleteElementBySurname (char surname []) виконує видалення елементу з введеним прізвищем. Це організовано наступним чином:
{bool isDeleted = false;//переменная для контроля того, удалился ли элемент. list *tempElement = head; while (tempElement)//пока элемент не будет NULL. {if (!(strcmp (surname, tempElement->surname))). {if (tempElement == head). {head = head->next; if (head). {head->prev = NULL;}. else. {tail = NULL;}. delete tempElement; isDeleted = true; itemsInList—; break;}. if (tempElement == tail). {tail = tail->prev; tail->next = NULL; delete tempElement; isDeleted = true; itemsInList—; break;}. tempElement->prev->next = tempElement->next; tempElement->next->prev = tempElement->prev; delete tempElement; isDeleted = true; itemsInList—; break;}. tempElement = tempElement->next}. return isDeleted;}. |
Спочатку ми вводимо прізвище, потім за допомогою функції strcmp зрівнюємо його з прізвищами студентів у списку, поки не найдемо потрібне, після чого ми видаляємо весь елемент. В разі, якщо прізвище не було найдене, з’явиться повідомлення про помилку, для цього ми використовуємо функцію bool isDeleted, яка видає значення true або false.
Функція void SplitByAverageBall (float avgBall) виконує розділення списку на два, по значенню поля «Середній бал». Це видно на фрагменту з програми:
bool isStudentLower = false; bool isStudentHigher = false; CharToOemA («Студенты, у которых средний балл < «, buf); cout< cout<<": «; list *tempElement = head; while (tempElement). {if (tempElement->averageBall < avgBall). {isStudentLower = true; cout<" «<» «;}. tempElement = tempElement->next;}. if (!isStudentLower). {CharToOemA («нет студентов «, buf); cout< |
Після введення балу для розділення списку, функція зрівнює цей бал з кожним балом студентів у списку. В разі виконання умови (бал < введеного), студент виводиться на екран, після того як функція провірить всі елементи списку, буде провірятись виконання умови (бал? введеного) по такому ж алгоритму. Якщо список буде пустим, або не буде знайдено студентів з такою кількістю балів, то користувача буде про це повідомлено.