2s (q->pre, q, head);q->number=q->number+q->next->number;q->next->number=q->number-q->next->number;q->number=q->number-q->next->number;if (q->pre==NULL)break;}}}printf ("Отсортировано");return;}“ writeFileB ”Функция writeFileB () - функция записи данных из памяти в бинарный файл. Если программа была запущена с параметрами, то в качестве имени файла выступит аргумент из командной строки.Функция написана с использованием потоковых классов С++Принимаемые значения: количество аргументов, принятых функцией main () из командной строки, указатель на массив указателей на строки, считанные как аргумент из командной строкиВозвращаемые значения: нет#include "my. h"using namespace std;void writeFileB (struct e *k, int argc, char **argv) {int i;char name [11];if (argc<2) {while (cin. get ()! ='\n')continue;readName (name);if (name [0] =='\0')return;} else strcpy (name, * (argv+1));ofstream f (name, ios:: binary);if (f. fail ()) {cout<<"Невозможно создать файл c именем"<<name<<endl;return;}system ("clear");cout<<"Файл с именем '"<<name;while (1) {f. write ( (char*) k->year,5);f. write ( (char*) k->name,40);f. write ( (char*) &k->a,4);f. write ( (char*) &k->db,2);f. write ( (char*) &k->p,2);if (k->next==NULL)break;else k=k->next;}if (f. fail ())cout<<"' не создан";if (! f. fail ())cout<<"' создан";f. close ();return;}“ readFileB ”Функция readFileB () - функция для чтения данных из файла.Если программа была запущена с параметрами, то в качестве имени файла выступит аргумент из командной строки.Функция написана с использованием потоковых классов С++Принимаемые значения: количество аргументов, принятых функцией main () из командной строки; указатель на массив указателей на строки, считанные как аргумент из командной строки; указатель на указатель на первый элемент; указатель на количество считанных элементовВозвращаемые значения: нет#include "my. h"using namespace std;void readFileB (struct e **head, int *n, int argc, char **argv) {char name [10];struct e *k;*head= (struct e*) malloc (sizeof (struct e));k=*head;if (argc>2)strcpy (name, * (argv+1));else{ while (cin. get ()! ='\n')continue;readName (name);if (name [0] =='\0')return;}ifstream f (name, ios:: binary);if (f. fail ()) {cout<<"Невозможно открыть файл c именем "<<name<<endl;return;}else cout<<"Файл с именем '"<<name<<"' прочитан";f. clear ();k->pre=NULL;for (*n=1;; (*n) ++) {f. read ( (char*) k->year,5);f. read ( (char*) k->name,40);f. read ( (char*) & (k->a),4);f. read ( (char*) & (k->db),2);f. read ( (char*) & (k->p),2);k->I=k;k->number=*n;if (f. peek ()! =EOF) {k->next= (struct e*) malloc (sizeof (struct e));k->next->pre=k;k=k->next;}else{ k->next=NULL;break;}}f. close ();return;}“ nameSort ”Функция nameSort () - функция для сортировки дискового файла по по полю с именем БП. Сортировка происходит методом пузырька. Если программа была запущена с параметрами, то в качестве имени файла выступит аргумент из командной строки.Принимаемые значения: Указатель на строку, содержащую имя файлаВозвращаемые значения: нет#include "my. h"void nameSort (char *fileName) {FILE *f;int n=1, i,l,k=0;char a [51];char b [51];char name [10];if (! (f=fopen (fileName,"rb+"))) {while (getchar ()! ='\n')continue;do{ readName (name);if (name [0] =='\0')return;printf ("Невозможно открыть файл c именем '%s'. \n",name);}while (! (f=fopen (name,"rb+")));system ("clear");printf ("Файл с именем '%s' отсортирован", name);}else printf ("Файл с именем '%s' отсортирован", fileName);while (n==1) {n=0;fseek (f,0,SEEK_SET);while (! feof (f)) {fread (a,1,51,f);fread (b,1,51,f);if (feof (f))break;if ( (strcmp ( (a+5), (b+5))) >0) {fseek (f,-102,SEEK_CUR);fwrite (b,51,1,f);fwrite (a,51,1,f);n=1;}fseek (f,-51,SEEK_CUR);}}fclose (f);return;}“ del. cpp ”Функция del () - удаляет одну запись по её номеруПринимаемые значения: Указатель на указатель на первый элемент, количество считанных элементовВозвращаемые значения: нет#include "my. h"void del (struct e **head, int n) {struct e *k;k=*head;int d;if (n==1) {printf ("Запись удалена");return;}printf ("Введите номер удаляемой записи\n");while (! scanf ("%d",&d)) {printf ("Неверное число\n");while (getchar ()! ='\n')continue;}if ( (d>n) || (n<=0)) {printf ("Такой записи нет");return;}while (k->number! =d)k=k->next;if (d==1) {*head=k->next;}else k->pre->next=k->next;if (d! =n)k->next->pre=k->pre;free (k);while (k->next! =NULL) {k=k->next;k->number--;}printf ("Запись удалена");return;}“ readName. cpp ”Функция readName () - вспомогательная функция. Она используется в функциях работающих с файлами. Считывает имя файла с клавиатуры и проверяет его корректность.Принимаемые значения: Указатель на строку, в которую будут записаны считанные данныеВозвращаемые значения: нет#include"my. h"void readName (char* name) {char i, c;printf ("Введите имя файла (не более 10 символов) \nЕсли вы передумали, просто нажмите клавишу 'Ввод'\n");c=1;while (c==1) c=0;fgets (name,11,stdin);for (i=0; i<10 && * (name+i)! ='\n'; i++)if (* (name+i) >126 return;}“ f2s. cpp ”Функция f2s () - вспомогательная функция. Она используется в функциях сортировки. Предназначена для обмена местами двух соседних элементов в связном списке.Принимаемые значения: указатель на первый элемент, указатель на второй элемент, указатель на указатель на первый элементВозвращаемые значения: нет#include "my. h"void f2s (struct e *f, struct e *s, struct e **head) {int n;if (f! =*head)f->pre->next=s;else *head=s;if (s->next! =NULL)s->next->pre=f;s->pre=f->pre;f->pre=s;f->next=s->next;s->next=f;return;}“Makefile”Файл необходимый для работы утилиты make2: my. h vvod. o vyvodAll. o vyvodOne. o 2. cpp max3. o min4. o buble. o insertion. o f2s. o readFileB. o writeFileB. o nameSort. o del. o readName. o readFileBC. o writeFileBC. o vvodC. og++ - o 2 2. cpp vvod. o vyvodAll. o vyvodOne. o max3. o min4. o insertion. o buble. o f2s. o writeFileB. o readFileB. o nameSort. o del. o readName. o readFileBC. o writeFileBC. o vvodC. ovvod. o: my. h vvod. cppg++ - c vvod. cppvvodC. o: my. h vvodC. cppg++ - c vvodC. cppvyvodAll. o: my. h vyvodAll. cppg++ - c vyvodAll. cppvyvodOne. o: my. h vyvodOne. cppg++ - c vyvodOne. cppmax3. o: my. h max3. cppg++ - c max3. cppmin4. o: my. h min4. cppg++ - c min4. cppbuble. o: my. h buble. cpp f2s. cppg++ - c buble. cppinsertion. o: my. h insertion. cpp f2s. cppg++ - c insertion. cppf2s. o: my. h f2s. cppg++ - c f2s. cppreadFileB. o: my. h readFileB. cppg++ - c readFileB. cppwriteFileB. o: my. h writeFileB. cppg++ - c writeFileB. cppreadFileBC. o: my. h readFileBC. cppg++ - c readFileBC. cppwriteFileBC. o: my. h writeFileBC. cppg++ - c writeFileBC. cppnameSort. o: my. h nameSort. cppg++ - c nameSort. cppdel. o: my. h del. cppg++ - c del. cppreadName. o: my. h readName. cppg++ - c readName. cppclean:rm - rf *. o 2В процессе написания программы часть функций была переведена на язык С++. Ниже представлены листинги этих функций написанные на языке С. Свойства этих функций такие же как и у их аналогов, поэтому я не буду делать к ним описание, а просто приведу их исходный код.“readFileBC. с”#include "my. h"void readFileBC (struct e **head, char *fileName, int *n) {int i;char name [10];struct e *k;*head= (struct e*) malloc (sizeof (struct e));k=*head;FILE *f;if (! (f=fopen (fileName,"rb"))) {while (getchar ()! ='\n')continue;do{ readName (name);if (name [0] =='\0')return;printf ("Невозможно открыть файл c именем '%s'. \n",name);}while (! (f=fopen (name,"rb")));system ("clear");printf ("Файл с именем '%s' прочитан", name);}else printf ("Файл с именем '%s' прочитан", fileName);k->pre=NULL;(*n) =0;while (1) {fread (k->year,1,5,f);fread (k->name,1,40,f);fread (& (k->a),4,1,f);fread (& (k->db),2,1,f);fread (& (k->p),2,1,f);(*n) ++;k->I=k;k->number=*n;if ( (fread (&i,4,1,f))) {k->next= (struct e*) malloc (sizeof (struct e));k->next->pre=k;k=k->next;}else{ k->next=NULL;break;}fseek (f,-4,SEEK_CUR);}fclose (f);return;}“vvodC. с”#include "my. h"int vvodC (struct e *k, int n) {struct e *q;q=k;int i=0,c;char y;while ( (getchar ())! ='\n')continue;if (n! =0) {while (k->next! =NULL)k=k->next;k->next=malloc (sizeof (struct e));k=k->next;k->pre=q;}for (; y! ='y'; n++) {printf ("Введите год БП №%d\n",n+1);c=1;while (c==1) k->year [i] <48)c=1;if (c==1)printf ("Недопустимый символ\n");if (i==4)while ( (getchar ())! ='\n')continue;elsek->year [i] ='\0';printf ("Введите название БП №%d\n",n+1);c=1;while (c==1) c=0;fgets (k->name,40,stdin);for (i=0; i<39 && k->name [i]! ='\n'; i++)if (k->name [i] >126 printf ("Введите количество разьёмов БП №%d\n",n+1);while (! scanf ("%d",&k->a))while (getchar ()! ='\n')continue;printf ("Введите мощность БП №%d\n",n+1);while (! scanf ("%hd",&k->p))while (getchar ()! ='\n')continue;while ( (getchar ())! ='\n')continue;printf ("Закончить (y/any key) \n");scanf ("%c",&y);while ( (getchar ())! ='\n')continue;k->this=k;k->number=n+1;if (y=='y') {k->next=NULL;}else{ k->next=malloc (sizeof (struct e));k->next->pre=k;k=k->next;}}system ("clear");printf ("Ввод закончен");return n;}“writeFileBC. с”#include "my. h"void writeFileBC (struct e *k, char *fileName) {FILE *f;int i;char name [11];if (! (f=fopen (fileName,"wb"))) {while (getchar ()! ='\n')continue;do{ readName (name);if (name [0] =='\0')return;printf ("Невозможно создать файл c именем '%s'. \n",name);}while (! (f=fopen (name,"wb")));system ("clear");printf ("Файл с именем '%s' создан", name);}else printf ("Файл с именем '%s' создан", fileName);while (1) {fwrite (& (k->year),5,1,f);fwrite (& (k->name),40,1,f);fwrite (& (k->a),sizeof (int),1,f);fwrite (& (k->p),sizeof (short),1,f);if (k->next==NULL)break;else k=k->next;}fclose (f);return;}Вместе с исходным кодом программы прилагается файл такого содержания |
год | название | разъёмы | шум | мощность | | 2009 | Thermaltake EVO_Blue 650W (W0307RU) | 24 | 22 | 650 | | 2008 | ETG ESP-550X-S 550W | 24 | 30 | 550 | | 2009 | FSP Group ATX-600PNR 600W | 20 | 27 | 600 | | 2009 | Antec HCG-620 620W | 20 | 22 | 620 | | 2010 | Thermaltake TR2 RX 750W | 24 | 25 | 750 | | | ЗаключениеРезультатом выполнения данной работы является информационно-поисковый справочник "Блок питания". В нём были реализованы следующие функции: 1. Создание справочника в памяти 2. Вывод справочника на экран 3. Удаление записи 4. Два способа сортировки 5. Сортировка дискового файла 6. Сохранение справочника в файле 7. Открытие справочника из файла Я пришел к выводу, что связные списки хоть и усложняют обработку данных, но при этом дают программе гибкость в вопросе выделения памяти. Так же такой способ хранения данных позволяет экономить ресурсы компьютера, ведь место выделяется лишь по необходимости, а не резервируется при запуске программы. От себя могу сказать, что я не только углубил имеющиеся знания, но и получил новые. Список использованной литературы1. Герберт Шилдт. Полный справочник по С++. Ossborne. 2003 2. Стивен Прата. /Язык программирования С. - М. Издательство "Диасофт", 2002. - 896 с. 3. П. Дейтел, X. Дейтел. / Как программировать на С++. - М, Издательство "Бином" 2001 - 1152 стр.
Страницы: 1, 2
|