50288 (Работа с языками С и С++), страница 2
Описание файла
Документ из архива "Работа с языками С и С++", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "50288"
Текст 2 страницы из документа "50288"
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->ppre->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 именем"< return; } system ("clear"); cout<<"Файл с именем '"< 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 именем "< return; } else cout<<"Файл с именем '"< 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 || * (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. 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. o g++ - 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. o vvod. o: my. h vvod. cpp g++ - c vvod. cpp vvodC. o: my. h vvodC. cpp g++ - c vvodC. cpp vyvodAll. o: my. h vyvodAll. cpp g++ - c vyvodAll. cpp vyvodOne. o: my. h vyvodOne. cpp g++ - c vyvodOne. cpp max3. o: my. h max3. 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; iyear [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); c=1; while (c==1) { c=0; fgets (k->name,40,stdin); for (i=0; iname [i]! ='\n'; i++) if (k->name [i] >126 || k->name [i] <31) c=1; if (c==1) printf ("Недопустимый символ\n"); if (i==39) while ( (getchar ())! ='\n') continue; else k->name [i] ='\0'; } 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 Результатом выполнения данной работы является информационно-поисковый справочник "Блок питания". В нём были реализованы следующие функции: Создание справочника в памяти Вывод справочника на экран Удаление записи Два способа сортировки Сортировка дискового файла Сохранение справочника в файле Открытие справочника из файла Я пришел к выводу, что связные списки хоть и усложняют обработку данных, но при этом дают программе гибкость в вопросе выделения памяти. Так же такой способ хранения данных позволяет экономить ресурсы компьютера, ведь место выделяется лишь по необходимости, а не резервируется при запуске программы. От себя могу сказать, что я не только углубил имеющиеся знания, но и получил новые. Герберт Шилдт. Полный справочник по С++. Ossborne. 2003 Стивен Прата. /Язык программирования С. - М. Издательство "Диасофт", 2002. - 896 с. П. Дейтел, X. Дейтел. / Как программировать на С++. - М, Издательство "Бином" 2001 - 1152 стр.
Заключение
Список использованной литературы