Использование метода Варнье для программирования совместной обработки четырёх файлов

Автор: Пользователь скрыл имя, 20 Декабря 2012 в 17:44, лабораторная работа

Описание работы

ПОСТАНОВКА ЗАДАЧИ
Ознакомиться с методом Варнье, рассмотреть особенности совместной обработки нескольких последовательных файлов; применить метод Варнье для проектирования программ совместной обработки четырех файлов.
На входе используются файлы, содержащие данные о деталях: остаток, приход, расход. Четвертый файл содержит данные о потерях, хищениях.
На выходе необходимо получить следующие результаты: скорректированный файл учета; машинограмму учета движения деталей; машинограмму ошибок, где содержатся сведения о деталях с отрицательными остатками и отсутствующих в справочнике.

Работа содержит 1 файл

mytrpo3.docx

— 351.07 Кб (Скачать)

Министерство  образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное  учреждение

высшего профессионального образования 

«Ижевский государственный технический университет  им. М. Т. Калашникова»

Кафедра «Программное обеспечение»

 

 

 

 

 

 

 

 

 

 

 

 

 

Отчет

по  лабораторной работе № 3

«Использование метода Варнье для программирования совместной обработки четырёх файлов»

по  дисциплине

«Технология разработки программного обеспечения»

 

 

 

 

 

 

 

 

 

 

Выполнил 

cтудент группы            x 

Принял  z 

 

 

 

 

 

 

 

 

 

 

 

x

2012 

1. ПОСТАНОВКА ЗАДАЧИ

Ознакомиться  с методом Варнье, рассмотреть  особенности совместной обработки  нескольких последовательных файлов; применить метод Варнье для проектирования программ совместной обработки четырех  файлов.

На входе  используются файлы, содержащие данные о деталях: остаток, приход, расход. Четвертый файл содержит данные о потерях, хищениях.

На выходе необходимо получить следующие результаты: скорректированный файл учета; машинограмму учета движения деталей; машинограмму ошибок, где содержатся сведения о деталях с отрицательными остатками и отсутствующих в справочнике.

Количество  записей по ключу: приход - одна, расход – несколько.

В контрольном  примере предусмотреть проверку всех ветвей обработки. Данные в файлах должны соответствовать предметной области.

2. ТАБЛИЦА РЕШЕНИЙ  ДЛЯ ОСНОВНОЙ ОБРАБОТКИ

 

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 – машинограмма ошибок

 

 

 

 

 


 

3. ДИАГРАММЫ ВАРНЬЕ

Структуры выхода и входа:

 

 

Структура программы в  логических последовательностях:

 

 

4. БЛОК-СХЕМА ПРОГРАММЫ  В ЛОГИЧЕСКИХ ПОСЛЕДОВАТЕЛЬНОСТЯХ

 

к стр. 7


к стр. 7


к стр. 7



 

из  стр. 6


из  стр. 6


из  стр. 6


 

5. ТЕКСТ ПРОГРАММЫ

Основной файл программы (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%s%-7ld%s\n",

                    "| ",

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

};

6. КОНТРОЛЬНЫЙ ПРИМЕР

 

  1. Набор данных для входных файлов:

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):

 

 

 

  1. Проверка  работоспособности программы с  заполненным файлом удаления:

Информация о работе Использование метода Варнье для программирования совместной обработки четырёх файлов