Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
moy_kursach.docx
Скачиваний:
16
Добавлен:
22.12.2018
Размер:
596 Кб
Скачать
☆

1.6. Листинг программы

Makefile

- служит для компиляции всех функций, используемых в программе в один исполняемый файл rele.exe

rele: vvod.o menu.o vivod.o shell_str.o save.o open.o q_sort.o shell.o del.o search.o

g++ -o rele vvod.o menu.o vivod.o shell_str.o save.o open.o q_sort.o shell.o del.o search.o

menu.o: menu.c rele.h

g++ -c menu.c

vvod.o: vvod.c rele.h

g++ -c vvod.c

vivod.o: vivod.cpp rele.h

g++ -c vivod.cpp

save.o: save.cpp rele.h

g++ -c save.cpp

open.o: open.cpp rele.h

g++ -c open.cpp

shell.o: shell.c rele.h

g++ -c shell.c

shell_str.o: shell_str.c rele.h

g++ -c shell_str.c

q_sort.o: q_sort.c rele.h

g++ -c q_sort.c

del.o: del.c rele.h

g++ -c del.c

search.o: search.c rele.h

g++ -c search.c

clean:

rm -rf *.o rele

rele.h

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

#include <iostream>

#include <fstream>

#include <stdio.h>

#include <ctype.h>

#include <stdlib.h>

#include <string.h>

using namespace std;

/*прототип функций*/

void vvod();

void vivod();

void shell();

void q_sort(int l, int r);

void shell_str();

void save(char *);

void open(char *);

void del();

void search();

/* объявление структуры*/

struct rele{

float U;

char marka[15];

int R,I,massa;

};

menu.c

  • menu.c содержит функцию main(int argc,char *argv[]), в которой реализуется буквенное меню справочника реле, и вызов всех, необходимых функций, по запросу пользователя.

#include "rele.h"

int i=0;

struct rele s[20];

/* argc-количество аргументов командной строки при запуске программы*/

/*argv[]-массив указателей на строки*/

int main(int argc, char *argv[]){

system("clear");

char x;

char c[100];

if(argc==1){

printf( "\nИмя файла не было указано при запуске!\n\n"

"Укажите его сейчас: ");

scanf("%90s",c);

while(getchar()!= '\n');

}else{

strcpy(c,argv[1]);

}

while(1){

printf("Справочник РЕЛЕ \n\n");

printf(" A.Ввод данных с использованием функций С\n");

printf(" B.Вывод данных c использованием функций С++\n");

printf(" C.Удаление записи из справочника\n");

printf(" D.Сортировка методом Шелла по полю строкового типа\n");

printf(" E.Быстрая сортировка по числовому полю (I)\n");

printf(" F.Сортировка методом Шелла по числовому полю (U) \n");

printf(" G.Поиск записи в справочнике по части названия марки\n");

printf(" S.Сохранение справочника в файле с использованием потоковых классов С++\n");

printf(" O.Открытие справочника из файла с использованием потоковых классов С++\n");

printf(" Q.Выxод\n");

printf("\nВведите необходимый пункт меню: ");

x = tolower(getchar());

while ( getchar() != '\n' );

switch(x){

case 'a': vvod(); break;

case 'b': vivod(); break;

case 'c': del(); break;

case 'd': shell_str(); break;

case 'e': q_sort(0,i-1);

if(i>1) printf("\n\nСортировка прошал успешно!\n\n");

break;

case 'f': shell();

break;

case 'g': search();

break;

case 's': save(c);break;

case 'o': open(c);break;

case 'q': printf("Выход из программы\n"); return 0;

default:{

printf( "\n\nНеправильно выбран пункт меню.\n");

printf( "Попробуйте выбрать снова\n");

continue;

}

}

}

}

vvod.c

- В файле vvod.c описана функция vvod (), выполняющая ввод данных в справочник с помощью стандартных функций ввода языка С. При вводе данных в справочник проверяется корректность вводимой информации.

#include"rele.h"

/*указывает компилятору на необходимость поиска определяющих объявлений в другом файле*/

extern int i;

extern struct rele s[20];

void vvod(){

char c;

int n;

system("clear");

while(1){

if(i==20){

system("clear");

printf("\n\nСправочник заполнен!\n\n");

return;

}

printf("Введите марку %d реле: ",i+1);

fgets(s[i].marka,20,stdin);

for (n = 0; s[i].marka[n] != '\n'; n++);

s[i].marka[n] = '\0';

if(strlen(s[i].marka) == 0){

printf("\nВведите данные\n");

continue;

}

while(1){

printf("Введите номинальное сопротивление (R,Ом) %d реле: ",i+1);

if(!(scanf("%d",&s[i].R)) || s[i].R <= 0){

while(getchar()!='\n');

system("clear");

printf("Введены некорректные данные!\n");

}

else{

while(getchar()!='\n');

break;

}

}

while(1){

printf("Введите рабочее напряжение (U,в) %d реле: ",i+1);

if(!(scanf("%f",&s[i].U)) || s[i].U <= 0){

while(getchar()!='\n');

system("clear");

printf("Введены некорректные данные!\n");

}

else{

while(getchar()!='\n');

break;

}

}

while(1){

printf("Введите рабочую силу тока(I,mA) %d реле: ",i+1);

if(!(scanf("%d",&s[i].I)) || s[i].I <= 0){

while(getchar()!='\n');

system("clear");

printf("Введены некорректные данные!\n");

}

else{

while(getchar()!='\n');

break;

}

}

while(1){

printf("Введите массу (г) %d реле: ",i+1);

if(!(scanf("%d",&s[i].massa)) || s[i].massa <= 0){

while(getchar()!='\n');

system("clear");

printf("Введены некорректные данные!\n");

}

else{

while(getchar()!='\n');

break;

}

}

i++;

printf("\n\nХотите ввести ещё данные?(Y/N): ");

c=getchar();

if(c=='\n'){

system("clear");

break;

}

while(getchar()!='\n');

if(c=='N' || c=='n'){

system("clear");

break;

}else

if(c=='Y' || c=='y'){

system("clear");

continue;

}else{

system("clear");

printf("Введён неизветсный оператор! Переход в главное меню\n");

break;

}

}

return;

}

vivod.cpp

- в файле vivod.cpp находится описание функции вывода созданного справочника на экран с помощью потоков языка С++.

#include "rele.h"

void vivod(){

extern struct rele s[20];

extern int i;

system("clear");

if(i==0){

cout << "\n\nОшибка!!!!\n\nСправочник пуст\n\n";

return;

}

cout << "Справочник РЕЛЕ\n";

cout.setf(ios::right);

cout << "===============================================================\n";

cout << "| N|Марка РЕЛЕ |R номинальное|U рабочее |I рабочее| масса |\n";

cout << "===============================================================\n";

for (int a=0;a<i;a++){

cout << "|";

cout.width(2);

cout << a + 1 << "|";

cout.width(15);

cout << s[a].marka << "|";

cout.width(13);

cout << s[a].R<< "|";

cout.width(10);

cout << s[a].U << "|";

cout.width(9);

cout << s[a].I << "|";

cout.width(7);

cout << s[a].massa << "|\n";

}

cout<<"===============================================================\n";

}

save.cpp

- в файле save.cpp описана функция сохранения справочника в дисковом файле с помощью функций языка С++.

#include "rele.h"

void save(char * file){

system("clear");

extern struct rele s[20];

extern int i;

if(i == 0){

cout << "\nСправочник пуст\n";

return;

}

ofstream os(file, ios::binary);

os.write((char *)s, i*sizeof(rele));

if(!os)

cout << "\nНевозможно сохранить файл\n";

os.close();

cout << "\nЗапись выполнена\n";

return;

}

open.cpp

-в файле open.cpp описана функция, предназначенная для открытия справочника из файла с помощью функций языка С++.

#include "rele.h"

void open(char * file){

system("clear");

extern int i;

extern struct rele s[20];

ifstream is(file, ios::in | ios::binary);

if(!is){

cout << "\nНевозможно открыть файл\n";

return;

}

i = 0;

while(1){

is.read((char*)(&s[i]), sizeof(rele));

if(!is)

break;

i++;

}

cout << "\nСправочник загружен" << "\n";

return;

}

shell.c

- в файле shell.c описана функция, предназначенная для сортировки реле по их маркам по полю строкового типа методом Шелла с помощью потоков языка С.

#include "rele.h"

void shell(){

system("clear");

extern struct rele s[20];

struct rele temp;

extern int i;

if(i<2){

printf("Справочник пуст либо присутствует только 1 запись\n");

return;

}

int a=0,j;

int step = i / 2;

while (step > 0){

for (a=0;a<(i-step);a++){

j=a;

while ((j >= 0) && (s[j].U > s[j + step].U)){

temp = s[j];

s[j] = s[j + step];

s[j + step] = temp;

j--;

}

}

step = step / 2;

}

printf("\n\nСортировка прошла успешно\n\n");

return;

}

shell_str.c

- в файле shell_str.c описана функция, предназначенная для сортировки реле по числовому полю (U) методом Шелла.

#include "rele.h"

void shell_str(){

system("clear");

extern struct rele s[20];

struct rele temp;

extern int i;

if(i<2){

printf("Справочник пуст либо присутствует только 1 запись\n");

return;

}

int f=0,j;

int step = i / 2;

while (step > 0){

for (f = 0; f < (i - step); f++){

j = f;

while ((j >= 0) && (strcmp(s[j].marka , s[j + step].marka))>0){

temp = s[j];

s[j] = s[j + step];

s[j + step] = temp;

j--;

}

}

step = step / 2;

}

printf("\n\nСортировка прошла успешно\n\n");

}

q_sort.c

  • в файле q_sort.c описывается функция, предназначенная для сортировки реле по числовому полю (I) методом быстрой сортировки.

#include "rele.h"

void q_sort (int l, int r) {

system ("clear");

if(r<1){

printf("\nСправочник пуст либо присутствует только 1 запись\n\n");

return;

}

extern struct rele s[20];

struct rele swap;

if (l>=r)

return;

int i = l, j = r;

int x = s[(r+l)/2].I;

do{

while (s[i].I < x) i++;

while (s[j].I > x) j--;

if (i<=j){

swap = s[i];

s[i] = s[j];

s[j] = swap;

i++;

j--;

}

} while(!(i>j));

q_sort(l, j);

q_sort(i, r);

return;

del.c

- в файле del.c описывается функция, предназначенная для удаления записи из справочника.

#include "rele.h"

extern int i;

extern struct rele s[20];

void del(){

int a,j;

char c;

system("clear");

while(1){

if(i==0){

printf("\n\nСправочник пуст\n\n");

return;

}

printf("\nВведите номер удаляемой записи (всего %d записей): ",i);

if(scanf("%d",&a)!=1){

system("clear");

printf("Неккоректный ввод.повторите\n");

while(getchar()!='\n');

continue;

}else

if(a < 1 || a > i){

printf("\n\nЗапись N%d отсутствует\n\n",i);

continue;

}

while(getchar()!='\n');

i--;

for(j=a-1;j<i;j++){

s[j]=s[j+1];

}

system("clear");

printf("\nЗапись успешно удалена\n");

printf("\nХотите ещё удалить данные?(Y/N): ");

c=getchar();

if(c=='\n'){

printf("\nПереход в главное меню\n\n");

return;

}

while(getchar()!='\n');

if(c=='N' || c=='n'){

system("clear");

break;

}else

if(c=='Y' || c=='y'){

system("clear");

continue;

}else{

printf("Введён неизвесный оператор\nПереход в главное меню\n");

while(getchar()!='\n');

system("clear");

break;

}

}

return;

}

search.c

  • в файле search.c описывается функция, предназначенная для поиска записи в справочнике по части названия марки реле.

#include"rele.h"

extern struct rele s[20];

extern int i;

void search(){

system("clear");

if(i==0){

printf("\n\nСправочник пуст\n");

return;

}

int a,r[i],j=0;

char g[16];

printf("Введите часть марки детали: ");

fgets(g,15,stdin);

for(a = 0 ; g[a] != '\n'; a++);

g[a] = '\0';

for(a=0;a<i;a++)

if(strstr(s[a].marka,g)!=NULL){

r[j]=a;

j++;

}

if(j==0){

printf("Нет данных содержащих \"%s\"\n",g);

return;

}

printf("Записи содержащие подстроку \"%s\"\n",g);

printf("===============================================================\n");

printf("| N|Марка РЕЛЕ |R номинальное|U рабочее |I рабочее| масса |\n");

printf("===============================================================\n");

for(a=0;a<j;a++)

printf("|%2d|%15s|%13d|%10.1f|%9d|%7d|\n",a+1,s[r[a]].marka,s[r[a]].R,s[r[a]].U,s[r[a]].I,s[r[a]].massa);

printf("================================================================\n");

return;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]