Постановка задачи.
Разработать и реализовать на языке С/С++ информационно -поисковый справочник «ж/к индикаторов».
При запуске программы на исполнение, должно появиться буквенное меню, посредством которого должны вызываться следующие пункты, реализованные в программе как отдельные функции:
1. Создание справочника в памяти ( Ввод данных).
2. Вывод справочника на экран с использованием потоковых классов языка С/С++
3. Добавление записи в справочник.
4. Сортировка методом пузырька по полю целочисленного типа.
5. Сохранение справочника в файле с использованием функций языка С.
6. Открытие справочника из файла с использованием функций языка С.
7. Сортировка дискового файла с использованием потоковых классов языка С/С++.
8. Выход из программы.
Каждая запись должна состоять из 5 полей: марка (строковой тип); остальные 4 поля выбираются самостоятельно из справочников и должны представлять реальные параметры радиодеталей. При работе с программой также должны вводиться реальные марки и соответствующие им параметры деталей. Таблица с параметрами должна быть приведена в приложении.
При разработке программы создать собственный заголовочный файл, включающий директивы препроцессора, определение структуры данных, объявление массива структур, прототипы используемых функций.
Предусмотреть защиту программы от ввода пользователем некорректных данных.
Листинг программы:
makefile
makefile служит для компиляции всех функций, используемых в программе в один исполняемый файл spravo4nik.exe
spravo4nik: in.o prog.o out.o plus.o puz.o sv.o op.o vst.o
g++ in.o prog.o out.o plus.o puz.o sv.o op.o vst.o -o spravo4nik
prog.o: in.c out.cpp plus.c puz.c sv.c op.c vst.o my.h
g++ -c prog.c
in.o: in.c my.h
g++ -c in.c
out.o: out.cpp my.h
g++ -c out.cpp
plus.o: plus.c my.h
g++ -c plus.c
puz.o: puz.c my.h
g++ -c puz.c
sv.o: sv.c my.h
g++ -c sv.c
op.o: op.c my.h
g++ -c op.c
vst.o: vst.cpp my.h
g++ -c vst.cpp
my.h
my.h – заголовочный файл, в который включены библиотеки ввода-вывода, библиотеки, для работы с строковыми типами данных, а также объявлены функции, глобальные переменные, структура данных, и массив структуры, используемые в программе.
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#include<iomanip>
#include<iostream>
#include<fstream>
using namespace std;
void insert();
void out();
void ps();
void puz();
void vst();
void save();
void open();
struct st{
int I;
char marka[20];
char colour[10];
float u;
int r;
};
extern struct st s[20];
extern int i;
prog.c
prog.c содержит функцию main(int argc,char *argv[]), в которой реализуется буквенное меню справочника ж/к индикаторов, и вызов всех, необходимых функций, по запросу пользователя.
#include"my.h"
int i;
struct st s[20];
int main(int argc,char *argv[]){
int a;
char z;
FILE *f;
if(argc>1){
if((f=fopen(argv[1],"r+b"))==NULL){
printf("Ошибка открытия файла!!\nНАЖМИТЕ ENTER");
getchar();
exit(1);
}
else{
fread(&i,sizeof(int),1,f);
for(a=0;a<i;a++)
fread(&s[a],sizeof(struct st),1,f);
fclose(f);
}
}
while(1){
while(1){
system("clear");
printf("--------------------------------------------------\n");
printf("| Выберите операцию: |\n");
printf("| Ввод данных ................................ a |\n");
printf("| Вывод справочника на экран ................. b |\n");
printf("| Добавление записи .......................... c |\n");
printf("| Сортировка по кол разрядов ................. d |\n");
printf("| Сохранить файл ............................. e |\n");
printf("| Сортировка дискового файла ................. f |\n");
printf("| Открыть файл ............................... g |\n");
printf("| Завершение работы .......................... h |\n");
printf("--------------------------------------------------\n");
z = getchar ();
if (z < 97 || z > 104) {
printf("Введены неверные данные!!!\nНАЖМИТЕ ENTER\n");
while(getchar()!='\n');
cin.get();
}
else
break;
}
switch(z){
case 97: while(getchar()!='\n');insert();break;
case 98: out();break;
case 99: while(getchar()!='\n');ps();break;
case 100: puz();break;
case 101: save();break;
case 102: vst();break;
case 103: open();break;
case 104: {
system("clear");
return 0;
}
}
}
}
in.c
В файле in.c описана функция insert (), выполняющая ввод данных в справочник с помощью стандартных функций ввода языка С. При вводе данных в справочник проверяется корректность вводимой информации.
#include"my.h"
void insert(){
int k=0,j,n=0;
char c;
system("clear");
for(i=0;i<20;){
printf("Введите марку %d жк-индикатора:\n",i+1);
gets(s[i].marka);
if(s[i].marka=='\0')
continue;
do{
n=0;
printf("Введите цвет %d жк-индикатора:\n",i+1);
scanf("%s",&s[i].colour);
for(j=0;j<strlen(s[i].colour);j++){
if(isdigit(s[i].colour[j])){
printf("Введены не корректные данные!\nНАЖМИТЕ ENTER\n");
n=1;
while(getchar()!='\n');
getchar();
system("clear");
}
}
while(getchar()!='\n');
}while(n==1);
while(1){
printf("Введите кол разрядов %d жк-индикатора:\n",i+1);
if(!(scanf("%d",&s[i].r)) || s[i].r<0){
while(getchar()!='\n');
printf("Ввелены не коррекные данные!\nНАЖМИТЕ ENTER");
getchar();
system("clear");
}
else{
while(getchar()!='\n');
break;
}
}
while(1){
printf("Введите системму исчисления %d \nжк-индикатора (2-ичная, 8-ричная, 10-тиричная, 16-тиричная):\n",i+1);
if(!(scanf("%d",&s[i].I)) || s[i].I<0){
while(getchar()!='\n');
printf("Ввелены не коррекные данные!\nНАЖМИТЕ ENTER");
getchar();
system("clear");
}
else{
break;
while(getchar()!='\n');
}
}
while(1){
printf("Введите допустимое напряжение %d жк-индикатора:\n",i+1);
if(!(scanf("%f",&s[i].u)) || s[i].u<0){
while(getchar()!='\n');
printf("Ввелены не коррекные данные!\nНАЖМИТЕ ENTER");
getchar();
system("clear");
}
else{
while(getchar()!='\n');
break;
}
}
i++;
while(c!='y' && c!='Y' && c!='n' && c!='N'){
printf("Хотите ввести ещё данные?(Y/N)\n");
c=getchar();
while(getchar()!='\n');
if(c=='N' || c=='n'){
system("clear");
k=1;
c='\0';
break;
}
if(c=='Y' || c=='y'){
system("clear");
k=0;
c='\0';
break;
}
if(c!='Y' || c!='y' || c!='n' || c!='N'){
printf("Введён не неизвесный оператор, попробуйте ещё!\n");
c='\0';
}
}
if(k==1)
break;
}
return;
}
puz.c
В файле puz.c описана функция сортировки данных методом выборки по числовому полю.
#include"my.h"
void puz(){
int k,j;
struct st buf;
for(k=0;k<i;k++)
for(j=0;j<i-1;j++)
if(s[j+1].r < s[j].r){
buf=s[j+1];
s[j+1]=s[j];
s[j]=buf;
}
printf("Массив успешно отформатирован!!!\nНАЖМИТЕ ENTER\n");
getchar();
getchar();
return;
}
plus.c
В файле plus.с находится описание функции добавления записи с помощью функций ввода С.
#include"my.h"
void ps(){
int k=0,j,n=0;
char c;
system("clear");
for(i;i<20;){
printf("Введите марку %d жк-индикатора:\n",i+1);
gets(s[i].marka);
if(s[i].marka=='\0')
continue;
do{
n=0;
printf("Введите цвет %d жк-индикатора:\n",i+1);
scanf("%s",&s[i].colour);
for(j=0;j<strlen(s[i].colour);j++){
if(isdigit(s[i].colour[j])){
printf("Введены не корректные данные!\nНАЖМИТЕ ENTER\n");
n=1;
while(getchar()!='\n');
getchar();
system("clear");
}
}
while(getchar()!='\n');
}while(n==1);
while(1){
printf("Введите кол разрядов %d жк-индикатора:\n",i+1);
if(!(scanf("%d",&s[i].r)) || s[i].r<0){
while(getchar()!='\n');
printf("Ввелены не коррекные данные!\nНАЖМИТЕ ENTER");
getchar();
system("clear");
}
else{
while(getchar()!='\n');
break;
}
}
while(1){
printf("Введите системму исчисления %d \nжк-индикатора (2-ичная, 8-ричная, 10-тиричная, 16-тиричная):\n",i+1);
if(!(scanf("%d",&s[i].I)) || s[i].I<0){
while(getchar()!='\n');
printf("Ввелены не коррекные данные!\nНАЖМИТЕ ENTER");
getchar();
system("clear");
}
else{
break;
while(getchar()!='\n');
}
}
while(1){
printf("Введите допустимое напряжение %d жк-индикатора:\n",i+1);
if(!(scanf("%f",&s[i].u)) || s[i].u<0){
while(getchar()!='\n');
printf("Ввелены не коррекные данные!\nНАЖМИТЕ ENTER");
getchar();
system("clear");
}
else{
while(getchar()!='\n');
break;
}
}
i++;
while(c!='y' && c!='Y' && c!='n' && c!='N'){
printf("Хотите ввести ещё данные?(Y/N)\n");
c=getchar();
while(getchar()!='\n');
if(c=='N' || c=='n'){
system("clear");
k=1;
c='\0';
break;
}
if(c=='Y' || c=='y'){
system("clear");
k=0;
c='\0';
break;
}
if(c!='Y' || c!='y' || c!='n' || c!='N'){
printf("Введён не неизвесный оператор, попробуйте ещё!\n");
c='\0';
}
}
if(k==1)
break;
}
return;
}
sv.c
В файле sv.c описана функция сохранения справочника в дисковом файле с помощью функций языка С.
#include"my.h"
struct kart;
void save(){
char k[8];
int a,I=0;
FILE *f;
while(1){
system("clear");
printf("Введите имя файла:\n");
getchar();
gets(k);
if((f=fopen(k,"w"))==NULL){
fprintf(stderr,"Ошибка открытия файла!!\nНАЖМИТЕ ENTER");
getchar();
}
else
break;
}
fwrite(&i,sizeof(int),1,f);
for(a=0;a<i;a++)
fwrite(&s[a],sizeof(struct st),1,f);
fclose(f);
printf("Файл успешно сохранён.\nНАЖМИТЕ ENTER");
getchar();
return;
}
op.c
В файле sv.c описана функция сохранения справочника в дисковом файле с помощью функций языка С.
#include"my.h"
void open(){
int a,r;
char e,k[8];
FILE *f;
while(1){
system("clear");
printf("Введите имя файла:\n");
getchar();
gets(k);
if((f=fopen(k,"r+b"))==NULL){
printf("Ошибка открытия файла!!\nНАЖМИТЕ ENTER");
getchar();
exit(1);
}
else
break;
}
fread(&i,sizeof(int),1,f);
for(a=0;a<i;a++)
fread(&s[a],sizeof(struct st),1,f);
fclose(f);
printf("Данные успешно прочтены из файла '%s'!!!НАЖМИТЕ ENTER\n",k);
getchar();
return;
}
out.cpp
В файле out.cpp находится описание функции вывода созданного справочника на экран с помощью потоков языка С++.
#include"my.h"
void out(){
int f;
system("clear");
cout<<"Параметры ж - к индикаторов"<<"\n"
<<"=========================================================="<<"\n";
cout.setf(ios::right);
cout<<setw(2)<<"N|"
<<setw(15)<<"Марка"
<<setw(15)<<"Раб.напряжение"
<<setw(10)<<"Цвет"
<<setw(12)<<"Разрядность"
<<setw(16)<<"Сис. исчисления"<<"\n"
<<setw(2)<<"|"
<<setw(15)<<"индикатора"
<<setw(15)<<"B."
<<setw(10)<<" "
<<setw(12)<<" "
<<setw(16)<<" "<<"\n"
<<"=========================================================="<<"\n";
for(f=0;f<i;f++){
cout<<setw(1)<<f+1<<"|"
<<setw(15)<<s[f].marka
<<setw(15)<<s[f].u
<<setw(10)<<s[f].colour
<<setw(12)<<s[f].r
<<setw(16)<<s[f].I<<"\n";
}
cout<<"======================================================"<<endl;
getchar();
getchar();
return;
}
vst.cpp
В файле vst.cpp описана функция сортировки дискового файла методом вставки по числовому полю с использованием потоковых классов языка С++.
#include"my.h"
void vst(){
int r,l;
char k[16];
struct st buf,buf1;
system("clear");
cout << "Введите имя файла: ";
getchar();
gets(k);
std::fstream infile(k);
if(!infile){
cout << "Ошибка открытия файла!!\nНАЖМИТЕ ENTER";
getchar();
exit(1);
}
else{
infile.read((char*)&i, sizeof(int));
for (r = 1; r < i; r++) {
infile.seekg(sizeof(int)+sizeof(struct st)*r,ios::beg);
infile.read ((char*)&buf, sizeof(struct st));
l=r-1;
infile.seekg(sizeof(int)+sizeof(struct st)*l,ios::beg);
infile.read ((char*)&buf1, sizeof(struct st));
for(l; l>=0 && buf.r < buf1.r; l){
infile.seekp(sizeof(int)+sizeof(struct st)*(l+1),ios::beg);
infile.write((char*)&buf1, sizeof(struct st));
l--;
if (l<0) break;
infile.seekg(sizeof(int)+sizeof(struct st)*l,ios::beg);
infile.read ((char*)&buf1, sizeof(struct st));
}
infile.seekp(sizeof(int)+sizeof(struct st)*(l+1),ios::beg);
infile.write((char*)&buf, sizeof(struct st));
}
cout << "Массив отсортирован успешно!\nНАЖМИТЕ ENTER";
cin.get();
infile.close();
}
return;
}
