50288 (Работа с языками С и С++), страница 2

2016-07-30СтудИзба

Описание файла

Документ из архива "Работа с языками С и С++", который расположен в категории "". Всё это находится в предмете "информатика" из 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


Заключение

Результатом выполнения данной работы является информационно-поисковый справочник "Блок питания". В нём были реализованы следующие функции:

  1. Создание справочника в памяти

  2. Вывод справочника на экран

  3. Удаление записи

  4. Два способа сортировки

  5. Сортировка дискового файла

  6. Сохранение справочника в файле

  7. Открытие справочника из файла

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

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


Список использованной литературы

  1. Герберт Шилдт. Полный справочник по С++. Ossborne. 2003

  2. Стивен Прата. /Язык программирования С. - М. Издательство "Диасофт", 2002. - 896 с.

  3. П. Дейтел, X. Дейтел. / Как программировать на С++. - М, Издательство "Бином" 2001 - 1152 стр.

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Нет! Мы не выполняем работы на заказ, однако Вы можете попросить что-то выложить в наших социальных сетях.
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
4098
Авторов
на СтудИзбе
667
Средний доход
с одного платного файла
Обучение Подробнее