Автор: Пользователь скрыл имя, 20 Декабря 2012 в 17:44, лабораторная работа
ПОСТАНОВКА ЗАДАЧИ
Ознакомиться с методом Варнье, рассмотреть особенности совместной обработки нескольких последовательных файлов; применить метод Варнье для проектирования программ совместной обработки четырех файлов.
На входе используются файлы, содержащие данные о деталях: остаток, приход, расход. Четвертый файл содержит данные о потерях, хищениях.
На выходе необходимо получить следующие результаты: скорректированный файл учета; машинограмму учета движения деталей; машинограмму ошибок, где содержатся сведения о деталях с отрицательными остатками и отсутствующих в справочнике.
Министерство образования и науки Российской Федерации
Федеральное
государственное бюджетное
высшего профессионального образования
«Ижевский
государственный технический
Кафедра «Программное обеспечение»
Отчет
по лабораторной работе № 3
«Использование метода Варнье для программирования совместной обработки четырёх файлов»
по дисциплине
«Технология разработки программного обеспечения»
Выполнил
cтудент группы x
Принял
z
x
2012
Ознакомиться с методом Варнье, рассмотреть особенности совместной обработки нескольких последовательных файлов; применить метод Варнье для проектирования программ совместной обработки четырех файлов.
На входе используются файлы, содержащие данные о деталях: остаток, приход, расход. Четвертый файл содержит данные о потерях, хищениях.
На выходе необходимо получить следующие результаты: скорректированный файл учета; машинограмму учета движения деталей; машинограмму ошибок, где содержатся сведения о деталях с отрицательными остатками и отсутствующих в справочнике.
Количество записей по ключу: приход - одна, расход – несколько.
В контрольном примере предусмотреть проверку всех ветвей обработки. Данные в файлах должны соответствовать предметной области.
id детали |
Действие | ||||||
F1 |
F2 |
F3 |
F4 |
V1 |
V2 |
V3 | |
0 |
0 |
0 |
0 |
φ |
φ |
φ | |
0 |
0 |
0 |
1 |
+ | |||
0 |
0 |
1 |
0 |
+ | |||
0 |
0 |
1 |
1 |
+ | |||
0 |
1 |
0 |
0 |
+ |
+ |
||
0 |
1 |
0 |
1 |
+ | |||
0 |
1 |
1 |
0 |
+ | |||
0 |
1 |
1 |
1 |
+ | |||
1 |
0 |
0 |
0 |
+ |
|||
1 |
0 |
0 |
1 |
+ |
|||
1 |
0 |
1 |
0 |
+ |
+ |
||
1 |
0 |
1 |
1 |
+ |
+ |
||
1 |
1 |
0 |
0 |
+ |
+ |
||
1 |
1 |
0 |
1 |
+ |
+ |
||
1 |
1 |
1 |
0 |
+ |
+ |
||
1 |
1 |
1 |
1 |
+ |
+ |
F1 – остаток F2 – приход F3 – расход F4 – хищение, потери
V1 – скорректированный файл V2 – машинограмма учёта движения деталей V3 – машинограмма ошибок
|
|
Структуры выхода и входа:
Структура программы в логических последовательностях:
к стр. 7
к стр. 7
к стр. 7
из стр. 6
из стр. 6
из стр. 6
Основной файл программы (main.cpp ):
#include <stdio.h>
#include <stdlib.h>
#include "UMainMenu.h"
#include <iostream>
int main(int argc, char** argv)
{
setlocale(LC_ALL, "Russian");
PrintMenu();
return (EXIT_SUCCESS);
}
Загловок модуля вывода главного меню программы (UMainMenu.h):
void PrintMenu();
Модуль вывода главного меню программы (UMainMenu.сpp):
#include <stdlib.h>
#include <stdio.h>
#include "UProcessing.h"
#include "UMainMenu.h"
void PrintMenu()
{
char s[3];
printf("%s\n", "Программа обработки 4-х файлов");
printf("%s\n", "Предметная область: остаток, приход и расход деталей");
printf("%s\n", "Главное меню программы:");
printf("%s\n", "1. Редактирование входных файлов;");
printf("%s\n", "2. Обработка файлов;");
printf("%s\n", "3. Просмотр скорректированного файла;");
printf("%s\n", "4. Просмотр машинограммы учета движения акций;");
printf("%s\n", "5. Просмотр ошибок;");
printf("%s\n", "0. Выход.");
printf("%s", "Введите номер пункта:");
scanf("%s", s);
while (s[0] != '0')
{
switch(s[0])
{
case '1':
{
system("notepad.exe F1.txt");
system("notepad.exe F2.txt");
system("notepad.exe F3.txt");
system("notepad.exe F4.txt");
break;
}
case '2':
{
Processing();
printf("%s\n", "Обработка файлов завершена.");
printf("%s\n", "---------------------------")
break;
}
case '3':
{
system("notepad.exe V1.txt");
break;
}
case '4':
{
system("notepad.exe V2.txt");
break;
}
case '5':{
system("notepad.exe V3.txt");
break;
}
}
printf("%c\n", ' ');
printf("%s\n", "Программа обработки 4-х файлов");
printf("%s\n", "Предметная область: остаток, приход и расход деталей");
printf("%s\n", "Главное меню программы:");
printf("%s\n", "1. Редактирование входных файлов;");
printf("%s\n", "2. Обработка файлов;");
printf("%s\n", "3. Просмотр скорректированного файла;");
printf("%s\n", "4. Просмотр машинограммы учета движения акций;");
printf("%s\n", "5. Просмотр ошибок;");
printf("%s\n", "0. Выход.");
printf("%s", "Введите номер пункта:");
scanf("%s", s);
}
}
Модуль типов данных (UTypes .h):
#ifndef UTYPES_H
#define UTYPES_H
struct OnHand
{
unsigned id;
long kol;
};
typedef struct OnHand TOnHand;
struct Income
{
unsigned id;
long kol;
};
typedef struct Income TIncome;
struct Refund
{
unsigned id;
long kol;
};
typedef struct Refund TRefund;
struct Losses
{
unsigned id;
long kol;
};
typedef struct Losses TLosses;
struct Results
{
unsigned id;
long kol;
};
typedef struct Results TResults;
struct FlowAccounting{
unsigned id;
long kol;
long incomeKol;
long refundKol;
long lossesKol;
long sum;
};
typedef struct FlowAccounting TFlowAccounting;
struct Error{
unsigned id;
char message[100];
};
typedef struct Error TError;
#endif
Заголовок библиотеки обработки файлов (UProcessing.h):
#include "UTypes.h"
void WriteFile(int outcomeFileType, TOnHand *ptr1, TIncome *ptr2, TRefund *ptr3, TLosses *ptr4, int errno);
void ReadFile(int incomeFileType, void *ptr);
void Processing();
Библиотека Обработки файлов (UProcessing.cpp):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include "UTypes.h"
#include "UProcessing.h"
FILE *tmpInFile1;
FILE *tmpInFile2;
FILE *tmpInFile3;
FILE *tmpInFile4;
FILE *tmpOutFile1;
FILE *tmpOutFile2;
int KonF;
const char f1[7] = "F1.txt";
const char f2[7] = "F2.txt";
const char f3[7] = "F3.txt";
const char f4[7] = "F4.txt";
const char v1[7] = "V1.txt";
const char v2[7] = "V2.txt";
const char v3[7] = "V3.txt";
void WriteFile(int outcomeFileType, TOnHand *ptr1, TIncome *ptr2, TRefund *ptr3, TLosses *ptr4, int errnum)
{
TResults tmpResult;
TFlowAccounting tmpFlowAccounting;
TLosses tmpLosses;
TError tmpError;
switch (outcomeFileType)
{
case 1:
{
long kol = ((ptr4->id != RAND_MAX) || (ptr4->id == ptr1->id)) ? (ptr1->kol - ptr4->kol) : ptr1->kol;
if (kol < 0)
{
tmpOutFile2 = fopen(v3, "a");
tmpError.id = ptr1->id;
fprintf(tmpOutFile2, "%s%d%s\n", "Запись № ", tmpError.id, " содержит отрицательный остаток! ");
fclose(tmpOutFile2);
}
else
{
tmpOutFile1 = fopen(v1, "a");
fprintf(tmpOutFile1, "%s%-10u%s%-9ld%s\n","| ", ptr1->id, " | ",kol, "|");
}
break;
}
case 2:
{
tmpOutFile1 = fopen(v2, "a");
tmpFlowAccounting.id = ptr1->id;
tmpFlowAccounting.kol = ((ptr4->id != RAND_MAX) || (ptr4->id == ptr1->id)) ? (ptr1->kol - ptr4->kol) : ptr1->kol;
tmpFlowAccounting.incomeKol = ptr2->kol;
tmpFlowAccounting.refundKol = ptr3->kol;
tmpFlowAccounting.sum = (tmpFlowAccounting.kol + tmpFlowAccounting.incomeKol -
tmpFlowAccounting.refundKol);
tmpLosses.kol = (ptr4->id == RAND_MAX) ? 0 : ptr4->kol;
if (tmpFlowAccounting.refundKol > (tmpFlowAccounting.kol + tmpFlowAccounting.incomeKol - tmpLosses.kol))
{
tmpOutFile2 = fopen(v3, "a");
tmpError.id = tmpFlowAccounting.id;
fprintf(tmpOutFile2, "%s%d%s\n", "Запись № ", tmpError.id, " содержит отрицательный остаток! ");
fclose(tmpOutFile2);
}
else
{
fprintf(tmpOutFile1, "%s%-6u%s%-9ld%s%-8ld%s%-8ld%
"| ",
tmpFlowAccounting.id, " | ",
tmpFlowAccounting.kol, "| ",
tmpFlowAccounting.incomeKol, "| ",
tmpFlowAccounting.refundKol, "| ",
tmpFlowAccounting.sum, "| "
);
}
break;
}
case 3:
{
switch (errnum)
{
case 1:
{
tmpOutFile1 = fopen(v3, "a");
fprintf(tmpOutFile1, "%s", "Отсутствует запись в файле остатка деталей (F1)\n");
break;
}
case 2:
{
tmpOutFile1 = fopen(v3, "a");
fprintf(tmpOutFile1, "%s", "Файл остатка деталей (F1) пуст\n");
break;
}
}
break;
}
}
fclose(tmpOutFile1);
}
void ReadFile(int incomeFileType, void *ptr)
{
switch (incomeFileType)
{
case 1:
{
if (fscanf(tmpInFile1, "%u%ld", &(((TOnHand *)ptr)->id), &(((TOnHand *)ptr)->kol)) == EOF)
KonF = 1;
break;
}
case 2:
{
if (fscanf(tmpInFile2, "%u%ld", &(((TIncome *)ptr)->id), &(((TIncome *)ptr)->kol)) == EOF)
((TIncome *)ptr)->id = RAND_MAX;
break;
}
case 3:
{
if (fscanf(tmpInFile3, "%u%ld", &(((TRefund *)ptr)->id), &(((TRefund *)ptr)->kol)) == EOF)
((TRefund *)ptr)->id = RAND_MAX;
break;
}
case 4:
{
if (fscanf(tmpInFile4, "%u%ld", &(((TLosses *)ptr)->id), &(((TLosses*)ptr)->kol)) == EOF)
((TLosses *)ptr)->id = RAND_MAX;
break;
}
}
}
void PrintHeader(int outcomeFileType)
{
switch (outcomeFileType)
{
case 1:
{
fprintf(tmpOutFile1, "%s\n", "-------------------------");
fprintf(tmpOutFile1, "%s\n", "| id деталь | остаток |");
fprintf(tmpOutFile1, "%s\n", "-------------------------");
break;
}
case 2:
{
fprintf(tmpOutFile2, "%s\n", "-----------------------------
fprintf(tmpOutFile2, "%s\n", "| id деталь | остаток | приход | расход | итого |");
fprintf(tmpOutFile2, "%s\n", "-----------------------------
break;
}
}
}
void Processing()
{
unsigned bkl;
TOnHand *ptrF1 = (TOnHand *) malloc(sizeof(TOnHand));
TIncome *ptrF2 = (TIncome *) malloc(sizeof(TIncome));
TRefund *ptrF3 = (TRefund *) malloc(sizeof(TRefund));
TLosses *ptrF4 =(TLosses *) malloc(sizeof(TLosses));
tmpInFile1 = fopen(f1, "r");
tmpInFile2 = fopen(f2, "r");
tmpInFile3 = fopen(f3, "r");
tmpInFile4 = fopen(f4, "r");
tmpOutFile1 = fopen(v1, "w");
PrintHeader(1);
fclose(tmpOutFile1);
tmpOutFile2 = fopen(v2, "w");
PrintHeader(2);
fclose(tmpOutFile2);
tmpOutFile1 = fopen(v3, "w");
fclose(tmpOutFile1);
KonF = 0;
ReadFile(1, ptrF1);
ReadFile(2, ptrF2);
ReadFile(3, ptrF3);
ReadFile(4, ptrF4);
if (KonF)
WriteFile(3, NULL, NULL, NULL, NULL, 2);
else
{
do
{
if (ptrF1->id < ptrF2->id)
bkl = ptrF1->id;
else
bkl = ptrF2->id;
if (ptrF3->id < bkl)
bkl = ptrF3->id;
if (ptrF4->id < bkl)
bkl = ptrF4->id;
if (ptrF1->id == bkl)
{
WriteFile(1, ptrF1, ptrF2, ptrF3, ptrF4, 0);
if (ptrF2->id == bkl)
WriteFile(2, ptrF1, ptrF2, ptrF3, ptrF4, 0);
else if (ptrF3->id == bkl)
WriteFile(2, ptrF1, ptrF2, ptrF3, ptrF4, 0);
}
else
{
if (ptrF2->id == bkl)
{
if (ptrF3->id == bkl)
WriteFile(3, ptrF1, ptrF2, ptrF3, ptrF4, 1);
else
if (ptrF4->id != bkl)
{
WriteFile(1, ptrF1, ptrF2, ptrF3, ptrF4, 0);
WriteFile(2, ptrF1, ptrF2, ptrF3, ptrF4, 0);
}
}
else
{
if (ptrF3->id == bkl)
WriteFile(3, ptrF1, ptrF2, ptrF3, ptrF4, 1);
else if (ptrF4->id == bkl)
WriteFile(3, ptrF1, ptrF2, ptrF3, ptrF4, 1);
}
}
if (ptrF1->id == bkl)
ReadFile(1, ptrF1);
if (ptrF2->id == bkl)
ReadFile(2, ptrF2);
if (ptrF3->id == bkl)
ReadFile(3, ptrF3);
if (ptrF4->id == bkl)
ReadFile(4, ptrF4);
}
while(KonF == 0);
}
fclose(tmpInFile1);
fclose(tmpInFile2);
fclose(tmpInFile3);
fclose(tmpInFile4);
};
F1 F2 F3 Файл F4 пуст
id детали |
остаток |
id детали |
приход |
id детали |
расход | ||
4 |
23 |
4 |
5 |
4 |
10 | ||
8 |
11 |
8 |
7 |
8 |
7 | ||
15 |
15 |
15 |
3 |
15 |
4 | ||
16 |
9 |
16 |
2 |
16 |
2 | ||
23 |
10 |
23 |
1 |
23 |
3 |
Ожидаемый результат работы программы:
Скорректированный файл (V1) Машинограмма учета движения акций (V2)
id детали |
остаток |
id детали |
остаток |
приход |
расход |
итого | |
4 |
23 |
4 |
23 |
5 |
10 |
18 | |
8 |
11 |
8 |
11 |
7 |
7 |
11 | |
15 |
15 |
15 |
15 |
3 |
4 |
14 | |
16 |
9 |
16 |
9 |
2 |
2 |
9 | |
23 |
10 |
23 |
10 |
1 |
3 |
8 |
Машинограмма ошибок (V3) пуста.
Полученный результат работы программы:
Скорректированный файл (V1):
Машинограмма учета движения акций (V2):
Машинограмма ошибок (V3):