Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсач 2-й семестр.doc
Скачиваний:
3
Добавлен:
21.09.2019
Размер:
311.81 Кб
Скачать

4) Метод решения.

Исходные данные с помощью цикла с предусловием построчно считываются из файла вплоть до достижения конца файла и сразу заносятся в очередную структуру, память под которую выделяется динамически.

После формирования списка со структурами весь список заносится в файл с выходными данными.

Далее осуществляется сортировка структур по возрастанию методом пузырька, по значению поля «Цена» путем перестановки местами значений полей соседних элементов списка.

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

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

5) Структура программы.

Программа состоит из 5 следующих модулей:

а) Подпрограмма main. В ней осуществляются вывод условия выполняемой задачи, запросы на ввод имени исходного и выходного файла, вызов всех остальных подпрограмм, вывод информационного сообщения о завершении работы программы.

b) Подпрограмма input. В ней осуществляется проверка на существование и корректное открытие исходного и выходного файлов, считывание данных из исходного файла, проверка их на корректность, и занесение их в список структур.

с) Подпрограмма out. Осуществляет проверку на открытие файла выходных данных, а также вывод самих исходных и обработанных данных в выходной файл.

d) Подпрограмма sort. Осуществляет сортировку всего списка структур методом пузырька.

e) Подпрограмма del. Осуществляет удаление из списка структур по условию, указанному в постановке задачи. Освобождает память из-под удаленных структур.

6) Описание алгоритмов программы.

Алгоритм подпрограммы main():

Алгоритм подпрограммы input():

Алгоритм подпрограммы sort():

Алгоритм подпрограммы del():

Алгоритм подпрограммы out():

7) Текст программы.

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>

#include <string.h>

#define CONFIG struct configuration

CONFIG // Podstructura adresov zavodov

{

char proc_type[15]; //

float ram, //

hdd, //

takt; //

char monit_type[10];

};

#define RECORD struct record

RECORD //

{

char mark[20]; //

float price; //

char proiz[25]; //

CONFIG config; //

RECORD *prev,

*next;

};

RECORD *input( char fin[30] ) // podprogramma schitivaniya ishodnih dannih

{

RECORD *head = NULL, // ukazatel' na 1-y element

*curr = 0, // ukazatel' na tekushiy element

*prev =0; // ukazatel' na predidushiy element

FILE *f; // failovaya peremennaya

if( (f = fopen( fin, "rt")) == 0 ) // Proverka otkritiya faila dlya chteniya

{

printf("\n\n BHUMAHUE! Fail ishodnih dannih ne nayden!\n Rabota programmi zavershena..");

getch();

exit(1);

}

else

if( getc(f) == -1 ) //Proverka na nalishie dannih v faile

{

printf("\n\n BHUMAHUE! Fail ishodnih dannih pustoy!\n Rabota programmi zavershena..");

getch();

exit(1);

}

else

{

// Chtenie pervoy EVM-ki

head = ( RECORD* ) malloc( sizeof( RECORD ));

// Proverka na korrektnost' ishodmih dannih

if( fscanf(f, "%s%f%s%s%f%f%f%s", &head->mark, &head->price, &head->proiz, &head->config.proc_type, &head->config.ram, &head->config.hdd, &head->config.takt, &head->config.monit_type) != 8 )

{

printf("\n\n BHUMAHUE! Ishodnie dannie nevernogo formata..\n Rabota programmi zavershena.");

getch();

exit(1);

}

head->prev = NULL;

head->next = NULL;

prev = head;

while( !feof( f ) ) // Chtenie ostal'nih EVM-ok

{

curr = ( RECORD* ) malloc( sizeof( RECORD ));

if( fscanf(f, "%s%f%s%s%f%f%f%s", &curr->mark, &curr->price, &curr->proiz, &curr->config.proc_type, &curr->config.ram, &curr->config.hdd, &curr->config.takt, &curr->config.monit_type) != 8 )

{

printf("\n\n BHUMAHUE! Ishodnie dannie nevernogo formata..\n Rabota programmi zavershena.");

getch();

exit(1);

}

curr->prev = prev;

curr->next = NULL;

prev->next = curr;

prev = curr;

}

}

fclose( f );

return head;

} // end input();

void out( RECORD *head, int flag, char fout[30] ) // podprogramma vivoda dannih v fail s rezul'tatami

{

RECORD *out = 0;

FILE *f; // failovaya peremennaya dlya zapisi v rezul'tiryushiy fail

//Vivod ishodmoy structuri v fail

switch( flag )

{

case 0:

{

f = fopen( fout, "w" ); // Otkrivaem fail dlya zapisi

if( !f ) // esli fail ne nayden

{

printf("\n\n BHUMAHUE! Oshibka otkritiya faila s resul'tatami!\n Rabota programmi zavershena.");

getch();

exit( 1 );

}

else

{

fprintf( f, "\n ----- ishodnaya structura imeet vid: -----\n\n");

out = head;

while( out ) // Vivod spiska na

{

fprintf( f, " Marka: %s\n Cena: %.0f pyb\n Proiz-l: %s\n Proc-r: %s\n Oper: %.1f Gb\n HDD: %.0f Gb\n Takt: %.2f GHz\n Monitor: %s\n\n", out->mark, out->price, out->proiz, out->config.proc_type, out->config.ram, out->config.hdd, out->config.takt, out->config.monit_type);

out = out->next;

}

}

fprintf( f, "_______________________________________________________________________________\n\n");

fprintf( f, " ----- otsortirovannaya i sokrashennaya structura imeet vid: -----\n\n");

fclose( f ); // zakritie faila s resul'tatami

break;

} // end case 0

case 1:

{

// dozapis' rezultiryushey structuri v fail

f = fopen( fout, "a" ); // Otkrivaem fail dlya DOzapisi

if( !f ) // esli fail ne nayden

{

printf("\n\n BHUMAHUE! Oshibka otkritiya faila s resul'tatami!\n Rabota programmi zavershena.");

getch();

exit(1);

}

else

{

out = head;

while(out) // Vivod spiska na

{

fprintf( f, " Marka: %s\n Cena: %.0f pyb\n Proiz-l: %s\n Proc-r: %s\n Oper: %.1f Gb\n HDD: %.0f Gb\n Takt: %.2f GHz\n Monitor: %s\n\n", out->mark, out->price, out->proiz, out->config.proc_type, out->config.ram, out->config.hdd, out->config.takt, out->config.monit_type);

out = out->next;

}

}

fclose( f ); // zakritie faila s resul'tatami

break;

} // end case 1

} // end switch

} // end out();

void sort( RECORD *p ) // Podprogramma sortirovki i sokrasheniya structuri

{

RECORD *curr = NULL; // tekushiy

char mark_temp[20], // peremennaya dlya zameni marki

proizv_temp[25]; // peremennaya dlya zameni proiazvoditelya

float price_temp; // peremennaya dlya zameni ceni

CONFIG config_temp; // peremennaya dlya zameni configuraciy

int flag = 1, // flag dlya puzir'ka

i = 0; // schetchik dlya sort;

// sortirovka po cene

while( flag )

{

curr = p->next;

while( curr )

{

if ( curr->price < curr->prev->price ) // elsi ydalyaemiy yavlyaetsya poslednim v spiske

{

// zapis' tekushih znacheniy vo vremennie peremennie

strcpy( mark_temp, curr->mark );

price_temp = curr->price;

strcpy( proizv_temp,curr->proiz );

config_temp = curr->config;

// meniyaem znacheniya poley

strcpy( curr->mark, curr->prev->mark );

strcpy( curr->proiz, curr->prev->proiz );

curr->price = curr->prev->price;

curr->config = curr->prev->config;

// meniyaem znacheniya poley

strcpy( curr->prev->mark, mark_temp );

curr->prev->price = price_temp;

strcpy( curr->prev->proiz, proizv_temp );

curr->prev->config = config_temp;

i = 1;

}

curr = curr->next;

}

if ( i == 0 ) flag = 0;

else i = 0;

}

} // end sort();

RECORD *del( RECORD *p, char fout[30] )

{

RECORD *curr = NULL,

*left = NULL,

*right = NULL,

*temp = NULL,

*head = p;

FILE *f;

// Ydalenie mashin s EGA-monitorom

curr = p;

while( curr )

{

if( strcmp( curr->config.monit_type, "EGA" ) == 0 )

{

printf("\n ..Ydalyaem element: Marka: %s\n Cena: %.0f pyb\n Monitor: %s\n", curr->mark, curr->price, curr->config.monit_type);

if( curr->next == NULL && curr->prev == NULL )

{

f = fopen( fout, "a" ); // Otkrivaem fail dlya dozapisi

if( !f ) // esli fail ne nayden

{

printf("\n\n BHUMAHUE! Oshibka otkritiya faila s resul'tatami!\n Rabota programmi zavershena.");

getch();

exit(1);

}

else

{

fprintf( f, " V structure vse mashini s EGA-monitorom. Spisok EVM pust.. \n\n");

}

fclose( f ); // zakritie faila s resul'tatami

printf("\n\n Rabota so structuroy zakonchena, rezul'tat zapisan v fail \"%s\"\n", fout);

getch();

exit(1);

}

else

if ( curr->next == NULL ) // elsi ydalyaemiy element posledniy

{

temp = curr->prev;

curr->prev->next = NULL;

free(curr);

curr = temp;

}

else

if ( curr->prev == NULL ) // elsi ydalyaemiy element perviy

{

head = curr->next;

curr->next->prev = NULL;

free(curr);

curr = head;

}

else

{

left = curr->prev;

right = curr->next;

left->next = right;

right->prev = left;

free(curr);

curr = left;

}

} // end if

else

curr = curr->next;

} // end while

return( head ); // Vozvrashaem ykazatel' na structuru

} // end del();

void main()

{

char fin[30],

fout[30];

RECORD *p,

*deleted;

clrscr(); // ochistka ekrana

printf("\n Gryppa SVBS-21 Solodov D.S. Korsovoy proekt Variant 19 \n");

printf("\n ----------------------------------------------------------------\n");

printf(" Napisat' programmy kotoraya vvodit iz faila strukturi, \n");

printf(" razmeshaet ih v dvunapravlenniy lineyniy spisok \n");

printf(" i vipolnyaet obrabotku spiska, a rezultat vivodit v fail. \n");

printf(" Otsortirovat' spisok po cene i udalit' mashini s EGA-monitorom ");

printf("\n ----------------------------------------------------------------\n");

printf("\n Vvedite put' i nazvanie faila ishodnih dannih: ");

scanf("%s", &fin);

printf("\n Vvedite put' i nazvanie faila s rezul'tatami: ");

scanf("%s", &fout);

p = input( fin ); // Vizov podprogrammi chteniya dannih iz faila

out( p, 0, fout ); // Vizov podprogrammi zapisi ishodnoy strukturi v fail

sort( p ); // Vizov podprogrammi sortirovki spiska

deleted = del( p, fout ); // Vizov podprogrammi ydaleniya mashin s EGA-monitorom

out( deleted, 1, fout ); // Vizov podprogrammi zapisi rezul'tatov v fail

printf("\n\n Rabota so structurami zakonchena, rezul'tat zapisan v fail \"%s\"\n", fout);

getch();

};