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;
}
