39426

Разработать программное обеспечение для работы со структурными типами данных с реализацией премирования по факультетам

Курсовая

Коммуникация, связь, радиоэлектроника и цифровые приборы

Функции. Она работает с определенной конкретной базой данных; в ней в основном используются сложные типы данных структуры и функции то есть структура программы не требует много ресурсов. Они создаются из базовых: Массивы объектов заданного типа; Функции с параметрами заданных типов возвращающие значение заданного типа; Указатели на объекты или функции заданного типа; Ссылки на объекты или функции заданного типа; Константы которые являются значениями заданного типа; Классы содержащие последовательности объектов...

Русский

2013-10-04

371 KB

2 чел.

PAGE  16

Белорусский национальный технический университет

Факультет информационных технологий и робототехники

Кафедра программного обеспечения вычислительной техники

и автоматизированных систем

КУРСОВАЯ РАБОТА

по дисциплине  «Основы алгоритмизации и программирования»

Тема: «Разработать программное обеспечение для работы со структурными типами данных с реализацией премирования по факультетам».

        Исполнитель:             Щерба Алексей Анатольевич    

                                                                     Студент 1 курса, группы 107326    

                        

                                    Руководитель:             Лапанович Ирина Олеговна     

Минск 2007

Белорусский национальный технический университет

Кафедра программного обеспечения вычислительной техники

и автоматизированных систем

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к  курсовой  работе

по дисциплине «Основы алгоритмизации и программирования»

Тема: «Работа со структурными типами данных».

        Исполнитель:             Щерба Алексей Анатольевич    

                                                                     Студент 1 курса, группы 107326    

                        

                                    Руководитель:             Лапанович Ирина Олеговна     

Минск 2007

СОДЕРЖАНИЕ

[1] ВВЕДЕНИЕ

[2] 1  ТЕОРЕТИЧЕСКИЕ ОСНОВЫ

[2.1] 1.1 Сложные типы данных

[2.2] 1.2. Функции

[2.3] 1.3 Понятие структуры

[2.4] 1.4 Объединения

[3] 2 ОПИСАНИЕ ПРОГРАММЫ

[3.1] 2.1 Постановка задачи

[3.2] 2.3 Описание функций

[3.3] 2.4 Блок – схемы алгоритмов

[4] 3 РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

[5] ЗАКЛЮЧЕНИЕ

[6]
ЛИТЕРАТУРА

[7] ПРИЛОЖЕНИЕ А

[8] Листинг программы

[9] ПРИЛОЖЕНИЕ Б

[10] Содержимое файла «Program.txt»

[11] ПРИЛОЖЕНИЕ В

[12] Распечатка результатов работы программы

ВВЕДЕНИЕ

Данный курсовой проект разработан на тему обработки структурированных данных; его целью является создание программы, включающей в себя такие аспекты, как работа с данными, записанными на внешнем носителе,  вывод необходимой информации на экран и сортировка ее в отдельных функциях в соответствие определенным условиям.

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

Настоящая программа является небольшим по объему приложением,  написанным на языке Visual C++ 6.0. Она работает  с определенной, конкретной базой данных; в ней в основном используются сложные типы данных (структуры и функции), то есть структура программы  не требует много ресурсов. К тому же, программа достаточно проста в эксплуатации, что не вызывает вопросов при работе с ней.  

                                   

1  ТЕОРЕТИЧЕСКИЕ ОСНОВЫ

1.1 Сложные типы данных

Производными типами данных называют сложные типы данных. В настоящем курсовом проекте рассматривается работа с двумя сложными типами данных — структурами и объединениями, хотя в данное время существует огромное количество таких типов. Они создаются  из базовых:

  1.  Массивы объектов заданного типа;
  2.  Функции с параметрами заданных типов, возвращающие значение заданного типа;
  3.  Указатели на объекты или функции заданного типа;
  4.  Ссылки на объекты или функции заданного типа;
  5.  Константы, которые являются значениями заданного типа;
  6.  Классы, содержащие последовательности объектов различных типов, набор функций для работы с ними и набор ограничений на доступ к этим объектам и функциям;
  7.  Структуры, которые являются классами без ограничений на доступ к объектам и функциям-членам структуры;
  8.  Объединения, являющиеся структурами, способными содержать объекты разных типов в разные моменты времени.

1.2. Функции

Функцией называют программный блок, включающий совокупность объявлений и определений данных и операторов предназначенных для реализации конкретной задачи. В программе функции можно располагать последовательности и программу разрешается подразделять на любое число файлов, которые в итоге объединяются в общий модуль. Одна функция ( её определение) не может быть включено в другую функцию. Спецификатор записи функции имеет следующий вид:

[ спецификатор_класса_памяти ] [ спецификатор_типа ]  имя_функции

(формальные параметры)

{

тело функции

}

- спецификатор класса памяти – задает класс памяти ( static или extern).

- спецификатор типа – определяет тип возвращаемого результата. Это может быть любой стандартный тип, а так же тип, определяемый пользователем.

Функция явно возвращает только одно значение. Допускается реализация функций, не имеющих параметров или не возвращающих ни каких значений. Возвращаемое значение указывается  после оператора return и используется в точке вызова функции. Если тип результата опущен, то предполагается что возвращается результат типа int.

Оператор return завершает выполнение функции, в которой он встретился и передает управление в вызывающую программу в точку вызова. Такой точкой вызова может быть оператор, следующий за вызовам функции либо какие-то выражения.

Оператор return имеет следующий формат:

return [ ( выражение ) ]

Выражение заключается в ( ) (но это  не обязательно).

 Return;

return 0;

return x+y;

return ptr.

 Оператор return в теле функции может быть записан несколько раз. Значение выражения вычисляемого в этом операторе возвращается в вызываемую функцию в качестве результата выполнения этой функции. Если функция возвращает результат, то ее вызов можно использовать в качестве операндов в выражении:

 y=a*fun(x,у);  

z=х+у+z+sum(k,p);

где fun и sum – имена функций.

Если в операторе return отсутствует выражение, то функция некого значения явно не возвращает. В случае, если return отсутствует управление в точку вызова будет передано  после выполнения последнего операнда функции. В этом случае функция также не возвращает результата. И перед именем такой функции и в ее прототипе, и в ее определении должен быть записан void. Функция не может в качестве результата возвращать массив. Функция не может вернуть функцию, но может пережать результат указателя на функцию. Любая функция может завершать выполнение системной функции  abort ( )  или exit (n); где n – целое число, являющееся кодом завершения.

Следует отличать прототип функции и определение функции. Прототип функции – это ее имя с указанием типа возвращаемого результата и перечислением типов поступающих параметров. Прототип функции завершается в точке с запятой ( ; ).

Пример:

double summa ( double, double );

int add ( int x, int y );

Прототип является предварительным объявлением данных функции. Прототип функции необходим компилятору для того, чтобы проконтролировать корректность вызова функции. И в случае необходимости выполнить приведение аргументов к типу принимаемых параметров, а также сгенерировать корректно возвращаемый результат. В прототипе тело функции отсутствует.  В этом случае, когда  в функцию не передается аргумент, в прототипе в ( ) вместо списка параметров записывается void или оставляется пустое место.

1.3 Понятие структуры

Структура – это собрание одного или более объектов, которые для удобства работы с ними сгруппированы под одним именем. Они позволяют группу связанных как одно целое элементов использовать как множество. Как и массивы, структуры являются совокупностью данных, но отличаются тем, что к ее компонентам необходимо обращаться по имени и тип элементов может быть различен. Структуры целесообразно использовать там, где необходимо использовать разнообразные данные.

Определение структуры состоит из двух шагов;

- объявление шаблона структуры (задание нового типа данных, определенного пользователем);

- определение переменных типа объявляемого шаблона.

      Объявление шаблонов имеет следующий вид:

                     Struct имя_шаблона

                          { тип1   имя_переменной1;

  тип2   имя_переменной2;

      *       *       *       *        *      

    типN   имя переменнойN

};

Задание шаблона начинается со слова struct, имена шаблонов должны быть уникальны в пределах области определения. Имена элементов так же должны быть уникальны.

ПРИМЕЧАНИЕ. В разных шаблонах можно использовать одинаковые имена элементов.     

В качестве примера рассмотрим банковский депозитный сертификат (Certificate of Deposit):

             struct Cdaccount

     {double ballanse;

      double interest_rate;

      int termin;

      };

Ключевое слово struct указывает, что это определение типа структуры. Идентификатор Cdaccount является именем типа этой структуры или тегом. Тегом структуры может быть любой идентификатор, но не ключевое слово. Хотя язык С++ этого не требует, в тегах структуры обычно используют строчные и заглавные буквы, причем начинается он с заглавной буквы. Идентификаторы, объявленные внутри фигурных скобок, называются членами структуры. Как видно из примера, определение структуры заканчивается фигурной скобкой и точкой с запятой.

Определение типа структуры обычно размещается вне определения функций ( подобно определениям глобальных именованных констант). Тогда этот тип становится доступным для всего последующего кода.

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

Определение структурной переменой имеет такой вид:

struct имя_шаблона  имя_переменной.

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

 

1.4 Объединения

Особым видом класса является объединение. Характерной чертой является то, что для него нужно столько памяти, сколько нужно для размещения самого большого элемента объединения. Каждый элемент начинается с одного и того же адреса. В каждый момент времени только одному элементу объединения можно присвоить значение.

Определение объединения аналогично определению (вместо ключевого слова class употребляется ключевое слово union). Пример объединения таков:

union Fast

{

char  puttn;

char  poinv;

int  chislo;

};

Поскольку больше всего памяти необходимо для типа double, то размер данного объединения равен размеру типа double. По умолчанию все элементы объединения являются общими. Имя типа объединения может использоваться так же, как и имя любого класса, для спецификации типа в определениях. К элементам объединения можно обращаться с помощью операции выбора элемента. Элементы объединения можно объявлять как общие, защищенные или частные.

Для объединения можно определять функции-элементы, в том числе конструкторы и деструкторы.

В объединениях сначала присваивается значение элементу, а потом этот элемент используется вплоть до присваивания значения какому-либо другому элементу. Нельзя, присвоив значение одному элементу объединения, после этого осуществлять доступ к другому его элементу.

Для избежания подобных ошибок, обычно определяют служебную переменную, которая позволяет следить за типом значения, хранящегося в данный момент в объединении. Такую переменную называют дискриминантом объединения. Обычно для этого объединение встраивают в класс, одним из элементов которого делают дискриминант. Есть специальный вариант объединения, который называется безымянным объединением. Это объединение без имени типа, и за определением которого не следует имя никакого объекта.

Union Fast

{

char  puttn;

char  poinv;

int  chislo;

};

Для обращения к элементам такого объединения не используется операция выбора элемента — доступ к ним осуществляется непосредственно по имени. Элементы безымянного объединения попадают в объемлющую область видимости. В безымянном объединении не может быть закрытых или защищенных элементов, а также функций-элементов. Безымянное объединение, определенное в файловой области видимости, должно сопровождаться описателем static.

Отметим также, что имена шаблонов и полей могут совпадать с именами меток и переменных. Имя шаблона может совпадать с именем поля. На шаблоны распространяется понятие области определения (области видимости). При описании шаблона внутри блока шаблон называют локальным, то есть он может использоваться только в пределах блока. Нельзя описать шаблон с реквизитом EXTERN. После задания шаблона возможно непосредственное определение объединения, состоящего из заданного типа, UNION c именем шаблона и имени переменной объединения. В случае, если по одному шаблону необходимо определить несколько объединений, то вид описания таков:

 Union <имя_шаблона>, <переменная1>,<переменная2>;

Синтаксис языка С++ разрешает совместное описание шаблона и определение переменных по данному шаблону.

Все элементы объединений размещаются в одной области памяти с одного адреса. Память, которая выделяется под объединение, определяется размером наиболее длинного элемента объединения.

2 ОПИСАНИЕ ПРОГРАММЫ

2.1 Постановка задачи

Используя язык программирования Visual C++, требуется разработать консольное приложение для обработки структурированных данных.

Реализовать программу премирования по каждому факультету десяти студентов, которые учатся на 4  и 5. Специальностей на факультете не более 10, студентов в группе не более 30, экзаменов не более 5. Список выводится по алфавиту, кодировка оценок: 0 – неявка, 1 – недопуск. Список к оплате вывести в алфавитном порядке. Новых списков не составлять. Исходный список сохранить.

Кроме того, требуется реализовать свои функции сравнения.

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

Данные о студентах заносятся в массив gruppa Gruppa[5], который можно представить таким образом:

     gruppa Gruppa[5]={{Группа 1},{Группа 2},{Группа 3},{Группа 4},{Группа5}}.

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

При этом в дальнейшем программа обеспечивает вывод информации о студентах на экран на основании значений структуры.

Приведем ниже структуру программы, описав ниже некоторые переменные (в данной программе глобальные переменные использовать не разрешено ) и функции.

Структура, предназначенная для хранения информации об одной группе:

typedef struct

{

 student Student[30];

}

gruppa;

Структура, предназначенная для хранения четырех списков студентов каждой из пяти групп:

typedef struct

{

 student spisok[5][4][7];

}

spisok_studentov;

 

Прототип функции для формирования списков студентов:

spisok_studentov FormSpisok(gruppa Gruppa[5]);

Прототип функции для сохранения исходных списков студентов:

void SaveSpisok(spisok_studentov s);

Прототип функции для сортировки списков студентов:

spisok_studentov SortSpisok(spisok_studentov s);

Прототип функции для вывода на экран списков студентов:

void PrntSpisok(spisok_studentov s);

Поддержка вывода текста на русском языке:

void rus(char *s);

2.3 Описание функций

В данной программе были реализованы следующие функции:

Функция main( ) – главная функция программы.

Функция, сравнивающая алфавитный порядок двух строк ( если первая строка меньше второй, то функция возвращает значение 1, если первая строка больше второй, то функция возвращает значение 0):

int string_comparation(char *a, char *b);

Функция для формирования списков студентов (как видно из программы, эта функция формирует их в соответствие со словом признаков ):

spisok_studentov FormSpisok(gruppa Gruppa[5]);

 Функция для сохранения исходных списков студентов (результаты сохраняются в файл «Program.txt»). Она выводит сообщение об ошибке в том случае, когда невозможно записать данные в текстовый файл. Запись информации о студентах происходит согласно их разделению по группам:

void SaveSpisok(spisok_studentov s)4

Функция для сортировки списков студентов (она организует цикл по группам и по спискам, определяет количество студентов в списке, сортирует их по методу «пузырька», то есть пошаговое сравнение i – го элемента со всеми последующими):

spisok_studentov SortSpisok(spisok_studentov s);

Функция для вывода на экран списков студентов (вывод на экран списков студентов в соответствие битовым признакам ):

void PrntSpisok(spisok_studentov s);

Так же в программе была реализована функция поддержки русского языка:

 void prntf(char *s), что обеспечивает пользователю наибольшие удобства при работе с программой.

2.4 Блок – схемы алгоритмов 

Приведем блок - общую блок – схему       алгоритма          (Рисунок 2.4.1).

Рисунок 2.4.1 - Схема общего алгоритма программы.

Приведем блок - схему алгоритма функции формирования списка студентов (Рисунок 2.4.2).

                                        1

                                                 i <=4

                                                 3

                                                4

                                              5

                         да                  

              6

                                                         нет

               7

                                                            

                                                  

                                                                         

                                

                                                   8

Рисунок 2.4.2 - Схема функции формирования списка студентов.

Ниже приведем схему блок–схему алгоритма функции, обеспечивающую сортировку списков студентов (Рисунок 2.4.3).

            1

                                                                     2

                                                            

                                                            4                                                    

                                                            5

                                                            

                                                            7

                            

                        8      

                         9

 

                                                                 6

                                                              10

                                                                4

                                                           3

                                                             3

                                                            2

                                                      

                                                            11

Рисунок 2.4.3 - Схема функции для сортировки списка студентов.

Приведем далее блок - схему алгоритма функции, поддерживающую вывод текста на русском языке (Рисунок 2.4.4).

 

                                                              1  

                                                                

                    

                                                               2

                            

                                      3

                                                                    нет

                                         да           5

                                        4

                                                                                     нет

          да          7

                                                           6

                            нет

                                   9   

       да

                                               8

               да  

                  10  

          11  нет

                                    

                                       2

                                       12

                                      

  Рисунок 2.4.3 - Схема функции, поддерживающей вывод текста на русском языке.

3 РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

Для того, чтобы начать работу с программой, следует запустить исполняемый файл «Program.exe»

После запуска программы в консоли будет отображено ее назначение. Пользователю не придется вводить какие – либо данные, так как информация о студентах храниться в самой программе в функции main(). Программа написана таким образом, что пользователю будет необходимо лишь контролировать ее  нажатием любой клавиши ( что бы началось выполнение следующей функции). Каждая функция сопровождается сообщением об успешном окончании ее работы или выводит сообщение о наличии ошибки.

Функции будут выполнятся в следующей последовательности:  формирование, сохранение, сортировка и вывод на экран упорядоченных данных о студентах.

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

ЗАКЛЮЧЕНИЕ

Данный курсовой проект посвящен обработке структурированных данных.

При анализе методов ввода исходной информации о студентах был отдано предпочтение созданию базы данных студентов, проинициализированной в головном модуле и записанной в файл «Program.txt» на внешнем носителе. Этот выбор был сделан для того, чтобы позволить пользователю сэкономить время при редактировании записей базы данных и не осуществлять заново ввод базы данных при каждой загрузке программы.

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

Довольно часто возникает необходимость в использовании небольших клиентских приложений, с помощью которых конечный пользователь может получить нужную информацию из базы или внести изменения в данные базы. Такие приложения не универсальны - это позволяет создавать их простыми в использовании, требующими для работы мало ресурсов. В качестве такого примера и служит разработанная программа.


ЛИТЕРАТУРА

1.  К. Паппас, У. Мюррей «Полное руководство по Visual C++». Издательство «ООО Попурри», Минск, 1999 год.

2.  А. Мешков, Ю. Тихомиров «Visual C++». Издательство «БХВ», Санкт-           Петербург, 1999 год.

3. У. Савич «Программирование». Издательство «БХВ», Санкт-Петербург, 2004 год.

4.    Кузнецов А. Р. «Программирование на Visual C++ 6.0». Издательство “Крол”, Москва, 2001 год.

5.   Холзнер С. «Visual C++6: учебный курс». Издательство «Питер», Санкт-Петербург, 2001 год.

6.   Основы программирования на С++, Дж. Липпман, СПБ, 2002 год.

ПРИЛОЖЕНИЕ А

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

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

//

#include "stdafx.h"

#include <stdio.h>

#include <stdlib.h>

#include <iostream.h>

#include <string.h>

 

#include <conio.h>

//Структура для хранения информации

// об одном студенте

typedef struct

{

char *SName; // Фамилия Имя Отчество

int Smark[5];// пять оценок

 

} student;

//Структура, предназначенная для хранения

//информации об одной группе

typedef struct

{

 student Student[30];

}

gruppa;

//Структура, предназначенная для хранения

//4 списков студентов каждой из пяти групп

typedef struct

{

 student spisok[5][4][10];

}

spisok_studentov;

// Прототип функции инфо о программе

void ShowAbout();

//Прототип функции для формирования списков студентов

spisok_studentov FormSpisok(gruppa Gruppa[5]);

//Прототип функции для сортировки списков студентов

spisok_studentov SortSpisok(spisok_studentov s);

//Прототип функции для сохранения исходных списков студентов

void SaveSpisok(spisok_studentov s);

//Прототип функции для вывода на экран списков студентов

void PrntSpisok(spisok_studentov s);

//Прототип функции для вывода на экран русского текста

void prntf(char *s);

//Функция, сравнивающая алфавитный порядок двух строк

//Если первая строка меньше второй, то функция возвращает значение 1

//Если первая строка больше второй, то функция возвращает значение 0

int string_comparation(char *a, char *b);

void main(int argc, char* argv[])

{

gruppa Gruppa[5]={

//1 группа

{

"Витаминов Виктор Викторович",        {5,5,5,4,5},

"Лимонов Леонид Леонидович",          {5,5,3,4,5},

"Горчишников Григорий Георгиевич",    {5,4,5,5,5},

"Нарзанов Николай Николаевич",        {1,2,3,4,5},

"Оливникова Ольга Олеговна",          {5,1,5,5,5},

"Дубницкая Диана Дмитриевна",         {1,2,3,4,5},

"Бананов Борис Борисович"   ,         {1,2,3,4,5},

"Абрикосова Алла Анатольевна",        {5,5,5,4,5},

"Евстигнеев Евгений Евгеньевич",      {1,2,3,4,5},

"Калинина Карина Константиновна",     {1,2,3,4,5},

"Мозгалев Максим Максимович",         {1,5,5,4,5}

},

//2 группа

{

"Викторенко Виталия Витальевна",      {5,5,5,4,5},

"Моржов Максим Максимович",           {1,2,3,4,5},

"Комаренко Константин Константинович",{1,2,3,4,5},

"Голышников Георгий Григорьевич",     {4,5,5,4,5},

"Долгопалов Дмитрий Дмитриевич",      {1,2,3,4,5},

"Антоненко Анатолий Анатольевич",     {4,5,5,4,5},

"Ермакова Евгения Евгеньевна",        {1,2,3,4,5},

"Лосева Лидия Леонидовна",            {4,5,5,4,5},

"Баранов Борис Борисович",            {1,2,3,4,5},

"Носорогова Наталья Николаевна",      {1,2,3,4,5},

"Климов Дмитрий Иванович",            {4,5,5,4,5},

"Серебристый Клим Иванович",          {4,5,5,4,5},

"Топоногин Сергей Васильевич",        {5,4,5,4,4},

"Владивирова Анна Сергеевна",         {4,5,5,5,5}

},

//3 группа

{

"Петров Петр Петрович",               {1,2,3,4,5},

"Орлов Олег Олегович",                {1,2,3,4,5},

"Ферницкий Фома Фомич",               {1,2,3,4,5},

"Соколова Света Семеновна",           {1,2,3,4,5},

"Рогов Родислав Родиславович",        {1,2,3,4,5},

"Тарзанова Татьяна Тимуровна",        {4,4,4,4,4},

"Ухтинская Улита Ивановна",           {1,2,3,4,5}

},

//4 группа

{

"Хомякова Ирина Чеславовна",          {1,2,3,4,5},

"Черенков Аркадий Аркадьевич",        {1,2,3,4,5},

"Яношко Янина Яковлева",              {1,2,3,4,5},

"Шестопалов Николай Николаевич",      {1,2,3,4,5},

"Щербатый Петр Иванович",             {1,2,3,4,5},

"Ценная Светлана Сергеевна",          {1,2,3,4,5},

"Юрский Юрий Юрьевич",                {1,2,3,4,5}

},

//5 группа

{

"Семипалов Сергей Сергеевич",         {5,5,5,4,5},

"Радович Ростислав Ростиславович",    {1,2,3,4,5},

"Петрова Полина Петровна",            {4,5,5,4,5},

"Семенов Семен Семенович",            {1,2,3,4,5},

"Тихий Тимур Тимурович",              {4,5,5,4,5},

}

};

//В каждой из 5 групп 4 списка студентов, не более семи человек в каждом

//1-й список : отличники

spisok_studentov Spisok={""};

ShowAbout();

//Формирование списков студентов

prntf("Формирование списка студентов ...\n");

Spisok=FormSpisok(Gruppa);

prntf("Операция прошла успешно...\n");

prntf("Нажмите клавишу для продолжения...\n\n");

getch();

//Сохранение списков студентов

prntf("Сохранение     списков студентов...\n");

SaveSpisok(Spisok);

prntf("Операция успешно завершена!\n");

prntf("Просмотрите файл ''Program.txt''.\n");

prntf("Нажмите любую клавишу для продолжения...\n\n");

getch();

//Сортировка списков студентов

prntf("Сортировка     списков студентов...\n");

Spisok=SortSpisok(Spisok);

prntf("Операция успешно завершена!\n");

prntf("Нажмите любую клавишу для продолжения...\n\n");

getch();

//Вывод на экран списков студентов

prntf("Вывод на экран отсортированных списков студентов...\n");

prntf("Нажмите любую клавишу для начала...\n\n");

getch();

PrntSpisok(Spisok);

prntf("Операция успешно завершена!\n\n");

prntf("Нажмите любую клавишу для выхода из программы...\n\n");

getch();

}

void ShowAbout()

{

prntf(" ----------------------------------------------------  \n");

prntf("|                  Программа                         | \n");

prntf("|                                                    | \n");

 prntf("|             'Премирование студентов'               | \n");

prntf("|                                                    | \n");

prntf("|         Разработал              Щерба А. А.        | \n");

prntf("|                                                    | \n");

prntf("|                    Минск, 2007                     | \n");

prntf(" ----------------------------------------------------  \n");

}

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

spisok_studentov FormSpisok(gruppa Gruppa[5])

{

int n1;

spisok_studentov s={{""}};

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

{

 n1=0;

 

 for (int j=0; j<=24; j++)

 {

  // отличник

  if (((Gruppa[i].Student[j].Smark[0]!=1)

        &&(Gruppa[i].Student[j].Smark[0]!=2)

            &&(Gruppa[i].Student[j].Smark[0]!=3)) &&

   ((Gruppa[i].Student[j].Smark[1]!=1)

        &&(Gruppa[i].Student[j].Smark[1]!=2)

            &&(Gruppa[i].Student[j].Smark[1]!=3)) &&

   ((Gruppa[i].Student[j].Smark[2]!=1)

        &&(Gruppa[i].Student[j].Smark[2]!=2)

            &&(Gruppa[i].Student[j].Smark[2]!=3)) &&

   ((Gruppa[i].Student[j].Smark[3]!=1)

        &&(Gruppa[i].Student[j].Smark[3]!=2)

            &&(Gruppa[i].Student[j].Smark[3]!=3)) &&

   ((Gruppa[i].Student[j].Smark[4]!=1)

        &&(Gruppa[i].Student[j].Smark[4]!=2)

            &&(Gruppa[i].Student[j].Smark[4]!=3))

      

   

   )

  {

   //i-ая группа

   //0-ой список

   //j-ый студент

   if (n1<10) s.spisok[i][0][n1]=Gruppa[i].Student[j];

   n1++;

  };

  

 };

};

return s;

};

//Функция для сохранения исходных списков студентов

//Результаты сохраняются в файл "Program.txt"

void SaveSpisok(spisok_studentov s)

{

FILE *f;

if ((f=fopen("Program.txt","w"))==NULL)

 {

 prntf("\nВнимание! Не удалось сохранить списки студентов в файл!\n");

 return;

};

//Цикл по спискам

for (int k=0; k<1; k++)

 {

  fputs("Списки студентов-отличников по группам:\n\n",f);

 

 //Цикл по группам

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

 {

  fputs("Группа #",f);

  char s_gr[2];

  s_gr[0]=(char)(i+49);

  s_gr[1]='\0';

  fputs(s_gr,f);

  fputs("\n",f);

  int st_count=0;

  //Цикл по студентам в списке

  for (int j=0; j<=9; j++)

   {

   //Если имя студента не задано

   if (!(s.spisok[i][k][j].SName))

    break;

   else

   {

    //Запись в файл ФИО

    fputs(s.spisok[i][k][j].SName,f);

    //Заполнение пробелами

    for (int t=40-strlen(s.spisok[i][k][j].SName); t>=1; t--)

     fputs(" ",f);

    //Запись в файл оценок

    for(int d=0; d<5;d++)

    {      

     char strANSI[1];

     _itoa((unsigned int)s.spisok[i][k][j].Smark[d],strANSI,10);

     fputs(strANSI,f);

    }

    fputs("\n",f);

    st_count++;

   };

  };

  if (!st_count)

  {

   fputs("В этой группе нет студентов-отличников",f);

   fputs(".\n",f);

  };

  fputs("\n",f);

 };

 fputs("\n",f);

};

};

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

spisok_studentov SortSpisok(spisok_studentov s)

{

char s_min[40];

student st;

 int n;

//Цикл по спискам

for (int k=0; k<=3; k++)

{

 //Цикл по группам

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

 {

  //Определим количество студентов в списке

  for(int max_j=0; max_j<=9; max_j++)

  {

   //Если имя студента не задано

   if (!(s.spisok[i][k][max_j].SName))

    break;

  }

  if (max_j==7)

   max_j-=1;

  

  //Сортировка методом пузырька

  //Цикл по студентам в (k+1)-ом списке (i+1)-ой группе

  for (int j=0; j<=max_j-1; j++)

  {

   strcpy(s_min,s.spisok[i][k][j].SName);

   n=j;

   for (int t=j+1; t<=max_j; t++)

   {

    if (!(s.spisok[i][k][t].SName))

     continue;

   

    if (string_comparation(s.spisok[i][k][t].SName,s_min))

    {

     strcpy(s_min,s.spisok[i][k][t].SName);

     n=t;

    }

   }

   

   st=s.spisok[i][k][n];

   s.spisok[i][k][n]=s.spisok[i][k][j];

   s.spisok[i][k][j]=st;

  };

 };

};

return s;

};

//Функция для вывода на экран списков студентов

void PrntSpisok(spisok_studentov s)

{

//Цикл

for (int k=0; k<1; k++)

 {

 switch (k)

 {

  case 0: prntf("Списки студентов-отличников по группам:\n\n");

    break;

  

 }  

 //Цикл по группам

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

 {

  prntf("Группа #");

  char s_gr[2];

  s_gr[0]=(char)(i+49);

  s_gr[1]='\0';

  prntf(s_gr);

  prntf("\n");

  

  int st_count=0;

  //Цикл по студентам в списке

  for (int j=0; j<=9; j++)

   {

   if (!(s.spisok[i][k][j].SName))

    break;

   else

   {

    //Запись в файл ФИО

    prntf(s.spisok[i][k][j].SName);

    //Заполнение пробелами

    for (int t=45-strlen(s.spisok[i][k][j].SName); t>=1; t--)

     prntf(" ");

    prntf("\n");

    st_count++;

   };

  };

  if (!st_count)

  {

   prntf("В этой группе нет студентов-отличников");

   prntf(".\n");

  };

  prntf("\n");

  getch();

 };

 

 prntf("\n");

};

};

 

//вывода текста на русском языке

void prntf(char *s)

{

for (unsigned int i=0; i<strlen(s); i++)

{

 if ((s[i]>='А') && (s[i]<='п'))         putch(s[i]-64);

 else if ((s[i]>='р') && (s[i]<='я')) putch(s[i]-16);

 else         putch(s[i]);

};

}

 

//Функция, сравнивающая алфавитный порядок двух строк

//Если первая строка меньше второй, то функция возвращает значение true

//Если первая строка больше второй, то функция возвращает значение false

int string_comparation(char *a, char *b)

{

int len=strlen(a);

if (strlen(b)<strlen(a))

 len=strlen(b);

int a_less_b=1;//В начале считаем, что первая строка меньше второй

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

{

 if ((a[i]==' ')||(b[i]==' '))

  break;

 if (a[i]>b[i])

 {

  a_less_b=0; //значит первая строка больше второй

  break;

 }

 else if (a[i]<b[i])

 {

  a_less_b=1; //значит первая строка меньше второй

  break;

 };

}

return (a_less_b);

}

ПРИЛОЖЕНИЕ Б

Содержимое файла «Program.txt»

Списки студентов-отличников по группам:

Группа #1

Витаминов Виктор Викторович             55545

Горчишников Григорий Георгиевич         54555

Абрикосова Алла Анатольевна             55545

Группа #2

Викторенко Виталия Витальевна           55545

Голышников Георгий Григорьевич          45545

Антоненко Анатолий Анатольевич          45545

Лосева Лидия Леонидовна                 45545

Климов Дмитрий Иванович                 45545

Серебристый Клим Иванович               45545

Топоногин Сергей Васильевич             54544

Владивирова Анна Сергеевна              45555

Группа #3

Тарзанова Татьяна Тимуровна             44444

Группа #4

В этой группе нет студентов-отличников.

Группа #5

Семипалов Сергей Сергеевич              55545

Петрова Полина Петровна                 45545

Тихий Тимур Тимурович                   45545

ПРИЛОЖЕНИЕ В

Распечатка результатов работы программы

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

Рисунок В.1 - Выполнение функций по формированию, сохранению, сортировке и выводе на экран списков студентов.

Рисунок В.2 - Вывод на экран студентов-отличников по группам.


 

А также другие работы, которые могут Вас заинтересовать

19219. Ионное распыление. Диссипация энергии атомных частиц при взаимодействии с твердым телом 288.5 KB
  Лекция № 15. Ионное распыление. Диссипация энергии атомных частиц при взаимодействии с твердым телом. Торможение быстрых частиц в твердом теле. Эмиссия атомных частиц. XV. ИОННОЕ распыление 15.1. Характеристики ионного распыления. Явление распыления твердого ...
19220. ИОНИЗАЦИЯ И ВОЗБУЖДЕНИЕ ЧАСТИЦ В ГАЗЕ 163 KB
  ИОНИЗАЦИЯ И ВОЗБУЖДЕНИЕ ЧАСТИЦ В ГАЗЕ Плазму как среду состоящую из заряженных частиц характеризует степень ионизации или соотношение между количеством заряженных и нейтральных частиц: концентрация электронов конц...
19221. ТЕРМОДИНАМИЧЕСКОЕ РАВНОВЕСИЕ В ГАЗЕ 101.5 KB
  Лекция 2 ТЕРМОДИНАМИЧЕСКОЕ РАВНОВЕСИЕ В ГАЗЕ Одним из известных подходов к описанию плазмы является ее сопоставление с термодинамической системой. При этом состояние плазмы характеризуется такими величинами как температура энтропия и т.д. В термодинамик...
19222. ДВИЖЕНИЕ ЗАРЯЖЕННЫХ ЧАСТИЦ В ГАЗЕ 112.5 KB
  Движение заряженных частиц в газе Ввиду рассмотрения тока в слабоионизованном газе или в низкотемпературной плазме требуется определить основные величины связанные с подвижностью электронов и ионов. Существует ряд экспериментов в которых были найдены значен...
19223. ЭЛЕКТРИЧЕСКИЙ ТОК В ГАЗЕ 122 KB
  ЭЛЕКТРИЧЕСКИЙ ТОК В ГАЗЕ Одной из первых теорий газовых разрядов явилась теория Таунсенда. Данный вид разряда названный его именем – таунсендовский имеет очень слабый ток I=1010105 А и практически не имеет видимого свечения темновой разряд. При увеличении си...
19224. Создание базы данных, состоящей из двух таблиц 187.03 KB
  Оставим Режим таблицы и щелкним по кнопке ОК. Появится пустая таблица, поля которой не определены и не имеют названия. Тип поля будет выбран автоматически в зависимости от введенной информации.
19225. ТЛЕЮЩИЙ РАЗРЯД 87.5 KB
  ТЛЕЮЩИЙ РАЗРЯД Тлеющий разряд имеет свои принципиальные особенности по сравнению с другими видами газовых разрядов. Ввиду этого рассмотрим сравнительную вольтамперную характеристику основных газовых разрядов рис.1. Для получения данной экспериментально
19226. ПОЛОЖИТЕЛЬНЫЙ СТОЛБ ТЛЕЮЩЕГО РАЗРЯДА 111.5 KB
  Положительный столб тлеющего разрядА Тлеющий разряд открытый еще в XIX веке стал детально исследоваться с появлением основных соотношений физики плазмы для различных процессов свойственных газовым разрядам. К наиболее важным областям разряда наряду с катодной обл
19227. ДУГОВОЙ РАЗРЯД 98 KB
  Дуговой разряд Дуговой разряд является одним из наиболее известных разрядов нашедших большое практическое применение. Первооткрывателем разряда считается российский ученый Петров В.В. который в 1802 г. впервые получил данный разряд на угольных электродах пр...