#include"my. h"
void max3 (struct e *k) {
struct e *q;
q=k;
while (1) {
if (k->a>q->a)
q=k;
if (k->next==NULL)
break;
k=k->next;
}
printf ("Максимальным количеством разъёмов обладает БП #%d: %d",q->number,q->a);
return;
}
“min4. cpp”
функция min4 () - поиск БП минимальной мощности
Принимаемые значения: указатель на первый элемент
Возвращаемые значения: нет
#include"my. h"
void min4 (struct e *k) {
struct e *q;
q=k;
while (1) {
if (k->p<q->p)
q=k;
if (k->next==NULL)
break;
k=k->next;
}
printf ("Минимальным количеством разъёмов обладает БП #%d: %hhd",q->number,q->p);
return;
}
“buble. cpp”
Функция buble () - сортировка методом пузырька для количества разъёмов (по возростанию)
Принимаемые значения: количество считанных элементов, указатель на указатель на первый элемент
Возвращаемые значения: нет
#include "my. h"
void buble (struct e **head, int n) {
struct e *k;
k=*head;
int f,j;
for (j=0; j< (n-1); j++) {
for (f=0; f< (n-1); f++) {
if ( (k->a) > (k->next->a)) {
f2s (k,k->next,head);
k=k->pre;
k->number=k->number+k->next->number;
k->next->number=k->number-k->next->number;
k->number=k->number-k->next->number;
}
k=k->next;
}
k=*head;
}
printf ("Отсортировано");
return;
}
“insertion. cpp”
Функция insertion () - сортировка вставками для мощности (по убыванию)
Принимаемые значения: указатель на указатель на первый элемент
Возвращаемые значения: нет
#include "my. h"
void insertion (struct e **head) {
struct e *q;
q= (*head) - >next;
while (q->next! =NULL) {
for (q= (*head) - >next; q->next! =NULL && q->p<=q->pre->p;)
q=q->next;
if (q->p>q->pre->p) {
while (q->p>q->pre->p) {
f2s (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"
voidreadName (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 || * (name+i) <32)
c=1;
if (c==1)
printf ("Название содержит недопустимые символы. Попробуйте ещё раз\n");
if (i==10)
while ( (getchar ())! ='\n')
continue;
else
* (name+i) ='\0';
}
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”
Файл необходимый для работы утилиты make
2: my. hvvod. ovyvodAll. ovyvodOne. o2. cppmax3. omin4. obuble. oinsertion. of2s. oreadFileB. owriteFileB. onameSort. odel. oreadName. oreadFileBC. owriteFileBC. ovvodC. o
g++ - o2 2. cppvvod. ovyvodAll. ovyvodOne. omax3. omin4. oinsertion. obuble. of2s. owriteFileB. oreadFileB. onameSort. odel. oreadName. oreadFileBC. owriteFileBC. ovvodC. o
vvod. o: my. hvvod. cpp
g++ - cvvod. cpp
vvodC. o: my. hvvodC. cpp
g++ - cvvodC. cpp
vyvodAll. o: my. hvyvodAll. cpp
g++ - cvyvodAll. cpp
vyvodOne. o: my. hvyvodOne. cpp
g++ - cvyvodOne. cpp
max3. o: my. hmax3. cpp
g++ - c max3. cpp
min4. o: my. h min4. cpp
g++ - c min4. cpp
buble. o: my. h buble. cpp f2s. cpp
g++ - c buble. cpp
insertion. o: my. h insertion. cpp f2s. cpp
g++ - c insertion. cpp
f2s. o: my. h f2s. cpp
g++ - c f2s. cpp
readFileB. o: my. h readFileB. cpp
g++ - c readFileB. cpp
writeFileB. o: my. h writeFileB. cpp
g++ - c writeFileB. cpp
readFileBC. o: my. h readFileBC. cpp
g++ - c readFileBC. cpp
writeFileBC. o: my. h writeFileBC. cpp
g++ - c writeFileBC. cpp
nameSort. o: my. h nameSort. cpp
g++ - c nameSort. cpp
del. o: my. h del. cpp
g++ - c del. cpp
readName. o: my. h readName. cpp
g++ - c readName. cpp
clean:
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) {
c=0;
fgets (k->year,5,stdin);
for (i=0; i<4 && k->year [i]! ='\n'; i++)
if (k->year [i] >57 || k->year [i] <48)
c=1;
if (c==1)
printf ("Недопустимый символ\n");
if (i==4)
while ( (getchar ())! ='\n')
continue;
else
k->year [i] ='\0';
}
printf ("Введите название БП №%d\n",n+1);