- •Назначение программы.
- •Требования к программе.
- •Требования к обеспечению надежного функционирования программы.
- •Требования к составу технических средств.
- •Требования к информационной и программной совместимости.
- •Требования к программной документации.
- •Стадии и этапы разработки.
- •4) Метод решения.
- •5) Структура программы.
- •6) Описание алгоритмов программы.
- •7) Текст программы.
- •8) Тестовые примеры.
- •9) Выводы.
- •10) Литература.
- •11) Приложение.
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();
};