Разработка приложения для работы со структурами

Понятие и назначение структуры как конструкции большинства языков программирования. Работа с полями структуры и работа с двоичным файлом. Пример сортировки по ключу. Операция копирования структур. Разработка структурной схемы работы приложения в C++.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 28.01.2015
Размер файла 1,2 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Введение

C++ -- компилируемый статически типизированный язык программирования общего назначения. Поддерживает такие парадигмы программирования как процедурное программирование, модульность, раздельная компиляция, обработка исключений, абстракция данных, типы (объекты), виртуальные функции, объектно-ориентированное программирование, обобщенное программирование, контейнеры и алгоритмы, сочетает свойства как высокоуровневых, так и низкоуровневых языков. В сравнении с его предшественником-- языком C,-- наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования. Название «C++» происходит от названия языка C, в котором унарный оператор ++обозначает инкремент переменной.

Являясь одним из самых популярных языков программирования, C++ широко используется для разработки программного обеспечения. Область его применения включает создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраиваемых систем, высокопроизводительных серверов, а также развлекательных приложений (например, видеоигры). Существует несколько реализаций языка C++ -- как бесплатных, так и коммерческих. Наиболее популярныпроект GNU, Microsoft, Intel и Embarcadero (Borland). C++ оказал огромное влияние на другие языки программирования, в первую очередь на Java и C#

1. Теоретическая часть

1.1 Понятие и назначение структур

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

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

Итак Структура - это объединение одного либо более объектов (переменных, массивов, указателей, других структур). Как и массив, она представляет собой совокупность данных, но отличается от него тем, что к ее элементам необходимо обращаться по имени, и ее различные элементы не обязательно должны принадлежать одному типу.

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

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

struct тип {тип элемента 1 имя элемента 1; тип элемента n имя элемента n; };

Именем элемента может быть любой идентификатор. В одной строке можно записывать через запятую несколько идентификаторов одного типа.

Например:

struct date { int day;

int month;

int year;} ;

Русские буквы использовать в идентификаторе в языке СИ нельзя.

Следом за фигурной скобкой, заканчивающей список элементов, могут записываться переменные данного типа, например:

struct date {…} a, b, c;

При этом выделяется соответствующая память.

Выведенное имя типа можно использовать для объявления записи, например: struct date day;. Теперь переменная day имеет тип date.

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

Например:

struct УЧЕНИК { char Фамилия [15];

имя [15];

struct DATA ДАТА РОЖДЕНИЯ;

int класс, возраст;};

Определенный выше тип DATA включает три элемента: День, Месяц, Год, содержащие целые значения (int). Запись УЧЕНИК включает элементы: ФАМИЛИЯ [15]; ИМЯ[15]; ДАТА РОЖДЕНИЯ, КЛАСС, ВОЗРАСТ. ФАМИЛИЯ [15] и ИМЯ [15] - это символьные массивы из 15 компонент каждый. Переменная ДАТА РОЖДЕНИЯ представлена составным элементом (вложенной структурой) ДАТА. Каждой дате рождения соответствуют день месяца, месяц и год. Элементы КЛАСС и ВОЗРАСТ содержат значения целого типа (int). После введения типов ДАТА и УЧЕНИК можно объявить переменные, значения которых принадлежат этим типам.

Например:

struct УЧЕНИК УЧЕНИКИ [50];

Массив УЧЕНИКИ состоит из 50 элементов типа УЧЕНИК.

В языке СИ разрешено использовать массивы структуры; записи могут состоять из массивов и других записей.

Чтобы обратиться к отдельному компоненту структуры, необходимо указать ее имя, поставить точку и сразу за ней написать имя нужного элемента.

Например:

Ученики [1]. КЛАСС = 3;

Ученики [1]. ДАТА РОЖДЕНИЯ. ДЕНЬ=5;

Ученики [1]. ДАТА РОЖДЕНИЯ. МЕСЯЦ=4;

Ученики [1]. ДАТА РОЖДЕНИЯ. ГОД=1979;

Первая строка указывает, что 1-й ученик учится в третьем классе, а последующие строки - его дату рождения: 5.04.79.

Каждый тип элемента структуры определяется соответствующей строкой объявления в фигурных скобках. Например, массив УЧЕНИКИ имеет тип УЧЕНИК, год является целым числом. Так как каждый элемент записи относится к определенному типу, его составное имя может появляться везде, где разрешено использовать значение этого типа.

Для использования структур в программе необходимо выполнить три действия:

1 Задать шаблон структуры.

2 По смыслу это означает определение нового типа данных, который впоследствии можно использовать для определения переменных этого типа.

3 Определить экземпляр структуры.

4 Этот этап подразумевает инициализацию конкретной переменной заранее определенной (с помощью шаблона) структурой.

5 Организовать обращение к элементам структуры.

""Очень важно, чтобы вы с самого начала уяснили, в чем разница между описанием структуры в программе и ее определением.

Описать структуру в программе означает лишь указать ее схему или шаблон; память при этом не выделяется.

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

Определить структуру -- значит, дать указание транслятору выделить память и присвоить этой области памяти символическое имя.

Описать структуру в программе можно только один раз, а определить -- любое количество раз.

1.2 Работа с полями структуры

1.2.1 Обращение по имени

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

Book b;

strcpy ( b.author, “ А.С. Пушкин ” );

b.year = 1998;

1.2.2 Обращение по адресу

Пусть известен адрес структуры в памяти. Как известно, адрес может быть записан в указатель - специальную переменную для хранения адреса. Для обращения к полю структуры по ее адресу используют специальный оператор ->.

Book b;

Book *p;

p = &b;

strcpy ( p->author, “ А.С. Пушкин ” );

p->year = 1998;

1.3 Ввод и вывод

1.3.1 Поэлементный ввод и вывод

При вводе с клавиатуры и выводе на экран или в текстовый файл с каждым полем структуры надо работать отдельно, как с обычной переменной. В приведенном примере данные вводятся в структуру типа Book с клавиатуры и записываются в файл.

Book b;

FILE *fp;

printf("Автор ");

gets(b.author);

printf("Название книги ");

gets(b.title);

printf("Год издания, кол-во страниц ");

scanf("%d%d", &b.years, &b.pages );

fp = fopen("books", "a");

fprintf("%s\n%s\n%d %d\n",

b.author, b.title, b.years, b.pages );

fclose ( fp );

1.4 Работа с двоичным файлом

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

Book b;

int n;

FILE *fp;

fp = fopen("books", "rb");

n = fread (&b, sizeof(Book), 1, fp);

if ( n == 0 ) {

printf ( “Ошибка при чтении из файла” );

}

fclose ( fp );

Можно было также вместо sizeof(Book) написать sizeof(b), поскольку запись b - это как раз один экземпляр структуры. Функция fread возвращает число удачно прочитанных элементов (в нашем случае - структур). Поэтому если в примере переменная n равно нулю,чтение закончилось неудачно и надо вывести сообщение об ошибке.

Для записи структуры в двоичный файл используют функцию fwrite. Ее параметры - те же, что и у fread. Пример ниже показывает добавление структуры в конец двоичного файла.

Book b;

FILE *fp;

... // здесь надо заполнить структуру

fp = fopen("books", "ab");

fwrite(&b, sizeof(Book), 1, fp);

fclose ( fp );

1.5 Массивы структур

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

Book A[20];

...

A[12].pages = 50;

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

puts(A[i].title);

Если вы работаете с двоичными файлами, то чтение и запись всего массива структур выполняется в одну строчку. Покажем приемы работы с двоичным файлом на примере задачи.

Поскольку известно, что структур меньше ста, заранее выделяем в памяти массив на 100 структур.

Book b[100];

При чтении из файла вызываем пытаемся читать все 100 структур:

n = fread ( &b[0], sizeof(Book), 100, fp );

Чтобы определить, сколько структур было в действительности прочитано, используем значение n, которое возвращает функция fread возвращает в качестве результата. Ниже приводится полная программа.

#include <stdio.h>

struct Book {

char author[40];

char title[80];

int year;

int pages;

};

void main()

{

Book b[100];

int i, n;

FILE *fp;

fp = fopen("books", "rb");

n = fread( &b[0], sizeof(Book), 100, fp);

fclose ( fp );

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

b[i].year = 2002;

fp = fopen("books", "wb");

fwrite ( b, sizeof(Book), n, fp );

fclose ( fp );}

1.6 Динамическое выделение памяти

Предположим, что надо создать массив структур, размер которого выясняется только во время работы программы. Для этого надо

1. Объявить переменную типа указатель на нужный тип данных.

2. Вызвать функцию выделения памяти или оператор new.

3. Запомнить в переменной адрес выделенного блока памяти.

4. Использовать новую область как обычный массив.

Book *B;

int n;

printf("Сколько у вас книг? ");

scanf ( "%d", &n );

B = new Book[n];

... // здесь работаем с массивом B

delete A;

Иногда требуется выделить в памяти одну структуру. При этом мы получаем ее адрес,который записываем в переменную-указатель. Как при этом получить доступ к полю структуры?

Один из вариантов - «разыменовать» указатель, то есть обратиться к той структуре, на которую он указывает. Если p - указатель на структуру типа Book, то обратиться к ее полюauthor можно как (*p).author. Эта запись означает "мне нужно поле author той структуры, на которую указывает указатель p".

В языке Си существует и другой способ обратиться к полю структуры - можно также написать и p->author, что значит то же самое, но считается лучшим стилем программирования. В следующем примере динамически выделяется память на 1 структуру, ее поля считываются с клавиатуры, и затем структура записывается в конец текстового файла.

Book *p;

FILE *fp;

p = new Book;

printf("Автор "); gets ( p->author );

printf("Название книги "); gets ( p->title );

printf("Год издания, кол-во страниц ");

scanf("%d%d", &p->years, &p->pages);

fp = fopen("books", "a");

fprintf("%s\n%s\n%d %d\n",

p->author, p->title, p->years, p->pages);

fclose ( fp );

delete p;

1.7 Структуры как параметры процедур

Структуры, так же, как и любые другие типы, могут быть параметрами функций и процедур. В этом разделе будут показаны три способа передачи структур в процедуры и функции и описаны их отличия. Рассмотрим процедуру, которая записывает в поле year (год издания книги) значение 2002.

1.7.1 Передача по значению

Если параметр процедуры объявлен как:

void Year2002( Book b )

{

b.year = 2002;

}

void main()

{

Book b;

Year2002 ( b );

}

то при работе процедуры создается КОПИЯ этой структуры в стеке (специальной области памяти, где хранятся параметры и локальные переменные процедур и функций) и процедура работает с этой копией. Такой подход имеет два недостатка

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

_ Во-вторых, самое главное - структуры могут быть достаточно больших размеров и создание новой копии может исчерпать стек (по умолчанию он всего 4 Кб).

1.7.2 Передача по ссылке

Поэтому чаще всего параметры-структуры передаются в процедуры и функции поссылке (при объявлении за именем типа структуры ставят знак &).

void Year2002( Book &b )

{

b.year = 2002;

}

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

1.7.3 Передача по адресу

Передача по ссылке возможна только при использовании языка Си++ (она не входит в стандарт языка Си). Тем не менее, в классическом Си можно передать в качестве параметра адрес структуры. При этом обращаться к полям структуры внутри процедуры надо через оператор ->.

void Year2002( Book *b )

{

b->year = 2002;

}

void main()

{

Book b;

Year2002 ( &b );

1.8 Сортировка по ключу

Поскольку в структуры входит много полей, возникает вопрос: а как их сортировать? Это зависит от конкретной задачи, но существуют общие принципы, о которых будем говорить.

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

И еще одна проблема - при сортировке элементы массива меняются местами. Структуры могут быть достаточно больших размеров, и копирование этих структур будет занимать очень много времени. Поэтому сортировку массива структур выполняют по указателям.

Мы уже использовали этот прием для сортировки массива символьных строк. В памяти формируется массив указателей p, и сначала они указывают на структуры в порядке расположения их в массиве, то есть указатель p[i] указывает на структуру с номером i. Затем остается только расставить указатели так, чтобы ключевые поля соответствующих структур были отсортированы в заданном порядке. Для решения задачи удобно объявить новый тип данных PBook - указатель на структуру Book.

typedef Book *PBook;

Пример ниже показывает сортировку массива структур по году выпуска книг. Основной алгоритм сортировки массива указателей заложен в процедуру SortYear, которая имеет два

параметра - массив указателей и число структур.

void SortYear ( PBook p[], int n )

{

int i, j;

PBook temp;

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

for ( j = n-2; j >= i; j -- )

if ( p[j+1]->year < p[j]->year )

{

temp = p[j];

p[j] = p[j+1];

p[j+1] = temp;

}

}

Основная программа, которая выводит на экран информацию о книгах в порядке их выхода,выглядит примерно так:

#include <stdio.h>

const N = 20;

struct Book {

char author[40];

char title[80];

int year;

int pages;

};

typedef Book *PBook;

... // здесь надо расположить процедуру SortYear

void main()

{

Book B[N];

PBook p[N];

... // здесь ввод данных в структуры

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

p[i] = &B[i];

SortYear ( p, N );

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

printf("%d: %s\n", p[i]->year, p[i]->title);}

1.9 Операции над структурами

Операция принадлежности (точка) используется совместно с именем структуры (или объединения) для задания элемента этой структуры (иди объединения). Если name является именем структуры, а member - элементом, указанным в структурном шаблоне, то name.member определяет этот элемент структуры. Операцию принадлежности можно аналогичным образом применять и к объединениям.

Пример:

struct {

int code;

float cost;

} item;

item.code = 1265;

Выполняется присваивание значения элементу code структуры item.

Косвенная адресация (определение принадлежности) элемента используется совместно с указателем на структуру (или объединение) для идентификации того или иного элемента этих структур (или объединения). Предположим, что ptrstr является указателем на структуру, a member - элементом, указанным в структурном шаблоне. Тогда ptrstr -> member определяет, что это элемент структуры, на которую ссылается указатель. Операцию косвенной адресации элемента можно применять аналогичным образом и к объединениям.

Пример:

struct {

int code;

float cost;

} item, *ptrst;

ptrst = &item;

ptrst-> code = 3451;

Эти операторы присваивают значение элементу code структуры item. Следующие три выражения эквивалентны:

ptrst -> code item.code (*ptrst).code

1.9.1 Операция копирования структур

В языке Си реализована операция копирования структур -- присваивание значений элементов одной структуры элементам другой структуры того же типа при помощи операции присваивания. Первые компиляторы Си не обеспечивали этой возможности.

В прим. 1 показано, как в функцию передается структура и как функция возвращает структурное значение.

Пример 1

#include <stdio.h>

#include "emp.h"/* содержит шаблон структуры emp */

int main()

{

struct emp prgmr, raise(struct emp, double);

...

printf("Old salary: %.2f\n", prgmr.salary);

prgmr = raise(prgmr, .12);

printf("New salary: %.2f\n", prgmr.salary);

}

struct emp raise(struct emp person, double increase)

{

person.salary *= (1+ increase);

return person;

}

Данная программа выполнялась бы более эффективно, если в функцию raise() передавался указатель на структуру. В этом случае при передаче управления в функцию передается лишь значение указателя, что делает доступными в функции элементы структуры. Этот вариант программы показан в прим. 2.

Пример 2

#include <stdio.h>

#include "emp.h" /* содержит шаблон структуры emp */int main()

{

struct emp prgmr;

void raise(struct emp *, double);

...

printf("Old salary: %.2f\n", prgmr.salary);

raise(&prgmr, .12);

printf("New salary: %.2f\n", prgmr.salary);

}

void raise(struct emp *person, double increase)

{

person->salary *= (1+ increase);}

1.9.2 Операция доступа к элементу структуры

Операции доступа к элементу структуры (операция . и операция ->) могут применяться и к объединениям. Допустимы массивыобъединений и указатели на объединения. Объединения могут передаваться функции как параметры и возвращаться функцией.

Пример 1

struct s_tag{

char c;

int i;

doubl d;

} s_item;

Пример 2

union u_tag{

char c;

int i;

doubl d;

} u_item;

В отличие от структуры, объединение может в любой момент времени содержать только один из своих элементов. Объединение позволяет использовать одну область памяти для хранения различных видов данных в разные моменты времени. Фактически, объединение -- это структура, в которой все поля начинаются со смещением 0, таким образом, поля накладываются друг на друга.

Пример 3

printf("размер структуры = %d\n", sizeof(s_item));

printf("размер объединения = %d\n", sizeof(u_item));

Вывод:

размер структуры = 16

размер объединения = 8

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

Пример 4

/* содержит информацию о работающих служащих и пенсионерах */

struct mail {

char id;/* a - active (), r - retired()*/

union{

struct{char name[30];

char dept[10];

char location[3];

} active;

struct{char name[30];

char street[20];

char city_state[3];

char zip[5];

} retired;

} info;

} preson;

Структура типа struct mail используется для хранения почтового адреса работающего служащего или пенсионера. При заполнении структуры этого типа информацией в нее заносится порция данных, соответствующая элементам active или retired объединения info. Поле id устанавливается равным 'a' или 'r' для указания фактически записанного в объединении элемента. При применении объединения используется меньше памяти, чем в случае применения структуры, которая имела бы идентичные поля, но некоторые из них не использовались бы.

2. Практическая часть

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

Разработать программу для работы со структурами, выполняющую следующие функции: Ввод студента в структуру, вывод списка всех студентов, поиск студента по одному из параметров.

2.2 Разработка структурной схемы работы приложения

На рисунке 1 представлена структурная схема работы приложения.

рисунок 1.Сруктурная схема работы приложения

2.3 Программная реализация

#include <conio.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

typedef struct

{

int BorlandC;

int Metodi;

int Istoria;

}OCENKI;

typedef struct

{

char Name [33];//32 + '\0'

char Family[33];//32 + '\0'

int Age;

OCENKI ocenka;

int NoGroup;

int NoGroupp;

void *pred; //ykazatel na predidywiy element spiska

void *next; //ykazatel na sled. element spiska

}STUDENT;

int UpdateIntParam(char * sMSG, int *iParam);

int UpdateStrParam(char * sMSG, char *sParam);

STUDENT * init (STUDENT * pList);

STUDENT * first(STUDENT * pList);

STUDENT * last (STUDENT * pList);

int input(STUDENT * pList, int *isInit);

int print(STUDENT pSTUD);

int poiskOnFam(STUDENT * pList, char * sFam);

int poiskOnNum(STUDENT * pList, int NoGroup);

int poiskOnNumm(STUDENT * pList, int NoGroupp);

int isInit = 0;

int main()

{

STUDENT *pList = NULL;

printf("\tBaza dannix studentov\n");

printf("Najmite luduyu klavishu\n");

getch();

pList = init(pList);

char Family[32] = {0};

int NoGroup = 0;

int NoGroupp = 0;

int count = 0;

int iMenu = 1;

char command = 0;

while(iMenu)

{

printf(" BAZA DANNIX STUDENTOV GRUPPI TIS\n");

printf(" Yspexov v poiske \n");

printf("1.Vvod informaci o studentax \n");

printf("2.Vivod soderjimogo\n");

printf("3.Poisk po Famylyu v gruppe \n");

printf("4.Poisk po Nomeru gruppi \n");

printf("5.Poisk po nomeru v spiske\n\n");

printf("------Chtobi viyti najmite ESC---------\n");

printf("\nVvedite nomer pynkta menu\n");

printf("Your input : %c\n",command = getch());

switch (command)

{

case '1':

if(!input(pList, &isInit))

printf("INPUT ERROR\n");

break;

case '2':

pList = first(pList);

while(pList)

{

print(*pList);

pList = (STUDENT *)pList->next;

}

break;

case '3':

if(UpdateStrParam("Vvedite Family Studenta : ", Family))

if(!(count = poiskOnFam(pList,Family)))

printf("Basa dannih ne soderjit family %s\n",Family);

else

printf("Vsego naideno %d studentov s family %s\n",count,Family);

break;

case '4':

if(UpdateIntParam("Vvedite Nomer Group : ", &NoGroup))

if(!(count = poiskOnNum(pList,NoGroup)))

printf("Basa dannih ne soderjit groupy s No %d\n",NoGroup);

else

printf("Vsego naideno %d studentov s groupy No %d\n",count,NoGroup);

break;

case '5':

if(UpdateIntParam("Vvedite Nomer v spiske Group : ", &NoGroupp))

if(!(count = poiskOnNumm(pList,NoGroupp)))

printf("Basa dannih ne soderjit v spiske groupy s No %d\n",NoGroupp);

else

printf("Vsego naideno %d studentov v spiske groupy No %d\n",count,NoGroupp);

break;

case 27:

iMenu = 0;

break;

default:

printf("Neverniy pynkt menu\n");

break;

}

}

return 0;

}

int UpdateIntParam(char * sMSG, int *iParam)

{

int iRet = 0;

char chr = '\0';

if

(

(printf(sMSG) && !scanf("%d", iParam))

|| (chr = getchar()) != '\n'

)

{

//вытираем лишние данные из буфера

while(chr != '\n')

chr = getchar();

printf("Bad input\n");

}

else

iRet = 1;

return iRet;

}

int UpdateStrParam(char * sMSG, char *sParam)

{

int iRet = 0;

char chr = '\0';

if

(

(printf(sMSG) && !scanf("%32s", sParam))

|| (chr = getchar()) != '\n'

)

{

//вытираем лишние данные из буфера

while(chr != '\n')

chr = getchar();

printf("Bad input\n");

}

else

iRet = 1;

return iRet;

}

STUDENT * init (STUDENT * pList)

{

pList = (STUDENT *)malloc(sizeof(STUDENT));

pList->next = NULL;

pList->pred = NULL;

return pList;

}

STUDENT * first(STUDENT * pList)

{

STUDENT * ptr = pList;

while(ptr->pred)

ptr = (STUDENT *)ptr->pred;

return ptr;

}

STUDENT * last(STUDENT * pList)

{

STUDENT * ptr = pList;

while(ptr->next)

ptr = (STUDENT *)ptr->next;

return ptr;

}

int input(STUDENT * pList, int *isInit)

{

int iRet = 0;

STUDENT * pAdd = NULL;

pAdd = init(pAdd);

pList = last(pList);

if(UpdateStrParam("Vvedite Imia Studenta : " , pAdd->Name))

if(UpdateStrParam("Vvedite Family Studenta : " , pAdd->Family))

if(UpdateIntParam("Vvedite vozrast studenta : ", &pAdd->Age))

if(UpdateIntParam("Vvedite nomer gruppi : " , &pAdd->NoGroup))

if(UpdateIntParam("Vvedite nomer v spiske gruppi : " , &pAdd->NoGroupp))

if(UpdateIntParam("Vvedite Ocenku po Borland C++ for dos : ", &pAdd->ocenka.BorlandC))

if(UpdateIntParam("Vvedite Ocenku po Metodi optimizacii : " , &pAdd->ocenka.Metodi))

if(UpdateIntParam("Vvedite Ocenku po istorii : " , &pAdd->ocenka.Istoria))

{

if(!(*isInit))

{

memcpy((void *)pList,(void *)pAdd,sizeof(STUDENT));

free((void *)pAdd);

(*isInit) = 1;

}

else

{

pAdd->pred = pList;

pList->next= pAdd;

}

iRet = 1;

}

return iRet;

}

int print(STUDENT pSTUD)

{

int iRet = 0;

if(printf("Imia Studenta : %s\n",pSTUD.Name))

if(printf("Family Studenta : %s\n",pSTUD.Family))

if(printf("vozrast studenta: %d\n",pSTUD.Age))

if(printf("nomer gruppi : %d\n",pSTUD.NoGroup))

if(printf("nomer v spiske gruppi : %d\n",pSTUD.NoGroupp))

if(printf("Ocenka po Borland C++ for dos : %d\n", pSTUD.ocenka.BorlandC))

if(printf("Ocenka po Metodi optimizacii : %d\n", pSTUD.ocenka.Metodi))

if(printf("Ocenka po istorii : %d\n", pSTUD.ocenka.Istoria))

iRet = 1;

return iRet;

}

int poiskOnFam(STUDENT * pList, char * sFam)

{

int count = 0;

pList = first(pList);

while(pList)

{

if(strcmp(pList->Family,sFam) == 0)

{

count = count + 1;

print(*pList);

}

pList = (STUDENT *)pList->next;

}

return count;

}

int poiskOnNum(STUDENT * pList, int NoGroup)

{

int count = 0;

pList = first(pList);

while(pList)

{

if(pList->NoGroup == NoGroup)

{

count = count + 1;

print(*pList);

}

pList = (STUDENT *)pList->next;

}

return count;

}

int poiskOnNumm(STUDENT * pList, int NoGroupp)

{

int count = 0;

pList = first(pList);

while(pList)

{

if(pList->NoGroupp == NoGroupp)

{

count = count + 1;

print(*pList);

}

pList = (STUDENT *)pList->next;

}

return count;

}

2.4 Тестирование

На рисунке 1 представлено главное меню программы.

Рисунок 1.Главное меню программы

На рисунке 2 представлен ввод информации в базу данных

Рисунок 2.Ввод информации в базу данных

На рисунке 3 представлен вывод информации на экран

Рисунок 3.Вывод информации на экран

На рисунке 4 представлен поиск в базе данных по фамилии

Рисунок 4.Поиск по фамилии в базе данных

На рисунке 5 представлен поиск по группе студента

Рисунок 5.Поиск студента по группе

На рисунке 6 представлен поиск по номеру в списке группы

Рисунок 6.Поиск студента по номеру в списке группы

Заключение

В ходе выполнения курсовой работы было разработано приложение для работы со структурами. Были рассмотрены функции для работы со структурами.

приложение программирование структура

Список используемых источников

1) <<Программирование на языке Си>> К. Поляков 1995-2002 г.

2) <<Программирование на языке Си>> Ю.А. Шпак 2006 г.

3) <<Язык программирования Си. 2-е издание>> Б. Керниган, Д. Ритчи

4) Интернет-ресурс www.wikipedia.org.

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.