Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой 2009 (без таблицы).doc
Скачиваний:
9
Добавлен:
01.03.2025
Размер:
100 Кб
Скачать
☆

Постановка задачи.

Разработать и реализовать на языке С/С++ информационно -поисковый справочник «ж/к индикаторов».

При запуске программы на исполнение, должно появиться буквенное меню, посредством которого должны вызываться следующие пункты, реализованные в программе как отдельные функции:

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;

}