Обработка неверных входных значений.

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

Электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра робототехники и автоматизации производственных систем.

 

Курсовая РАБОТА

По дисциплине «Программирование и основы алгоритмизации».

Тема: «Учет товаров на складе с функцией поиска и сортировки позиций».

 

 

Студент гр. 8871   Примаченко П.Н.
Преподаватель   Армашев А.А.

 

 

Санкт-Петербург

2019

 

 

Содержание:

1.Введение.

2.Цель проекта.

3.Основные задачи.

4.Описание разработки.

4.1. Хранение информации.

4.2. Чтение файла.

4.3. Поиск.

4.4. Сортировка.

4.5. Полученный результат.

4.6. Обработка неверных входных значений.

4.7. Ввод команд.

5.Заключение.

6.Список используемой литературы.

 

1. Введение:

 

Данная курсовая работа выполнена на языке программирования высокого уровня С++ с использованием компилятора Microsoft Visual Studio 2008. Этот язык был разработан в начале 80-х годов в Bell Laboratories. С++ - расширение С, т.е. он обеспечивает кардинальное преимущество языка С++, как над своим предшественником языком С так и над другими языками высокого уровня: поддержка объектно-ориентированного программирования, перегруженных операций и возможность разработки полномасштабных windows-приложений.

Можно сказать, что язык С++ является одним из совершенных и сложных языков программирования на сегодняшний день.

 С помощью языка С++ можно решать всевозможные задачи, ставящиеся перед современным программистом: написание системных программ, разработка полноценных windows-приложений, объектное моделирование. Благодаря тому, что язык С++ первоначально разрабатывался как язык системного программирования, то он предоставляет программисту широкие возможности для работы с аппаратурой. Но так как язык С++ подвергся полномасштабной обработки, то он обеспечивает пользователя широким набором средств для решения задач объектно-ориентированного программирования, благодаря этому язык С++ позволяет осуществить интеграцию принципов объектно-ориентированного программирования на аппаратный уровень.

В этой курсовой работе проиллюстрированы основные разделы программирования, изучаемые в курсе программирования на языке С++.

2. Цель проекта:

Получение навыков постановки задачи, алгоритмизации, программирования и отладки приложений на примере решения задачи учета продукции в некоторой предметной области.

 

 

3. Основные задачи:

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

 

 

Вариант продукции:

5. Лампа. Параметры: Имя, Напряжение, Частота, Ёмкость, Тип цоколя.

Описание разработки.

Хранение информации.

Формат текстового файла является «Блокнот».

«Блокнот» мы используем для хранения и редактирования информации о лампах, в нём указаны параметры и названия ламп.

Стоит заметить, что в «Блокноте» используется: Имя, Напряжение, Частота, Ёмкость и Тип цоколя.

Для того чтобы использовать информацию о Лампах в Си, нужно использовать структуры. Структура — это объединение нескольких объектов, возможно, различного типа под одним именем, которое является типом структуры. В качестве объектов могут выступать переменные, массивы, указатели и другие структуры. Она позволяет трактовать группу связанных между собой объектов не как множество отдельных элементов, а как единое целое. Структура представляет собой сложный тип данных составленных из простых типов.

В нашем случае это основная структура «Lamp»:

Как показано на рисунке, в структуре «Lamp» используются типы данных: char (целочисленный тип) и double (числа с плавающей запятой).

Для возвращения строкового значения свойств объекта «Lamp» используется функция «getPropertyValue». В которой заключён цикл и благодаря командам strcmp и strcpy производится копирование и проверка значений между собой.

Чтение файла.

Для чтения информации из файла, необходимо применять специальные функции. В языке Си есть следующие функции:

«Fgets»- читает строку из файла

В коде этот цикл читает построчно, пока не достигнет конца файла, если строка пустая и длиной не более 8 символов. Далее «парсим» строку и записываем в массив по индексу.

 «Fgetc»- считывает символ из файла

В коде этот цикл считывает символы ,пока не достигнет конца файла и увеличивает количество строк на одну, чтобы не потерять информацию ,так как индексация производится от нуля.

«Fopen»- открывает файл

В нашем случае эти функции применяются в функции:

Поиск.

Для осуществления поиска я использовал функции «searchItem» и «isComporator»

«searchItem»-выводит записи, удовлетворяющим условиям

«isComporator»- определяет, является ли входное слово word компаратором (знаком сравнения), а затем применятся в теле функции «searchItem» сравнивая второй аргумент,если он окажется символом сравнения , то работаем с числовыми данными.

       В поиске присутствуют функции работы со строками:

“strtod”- функция преобразует строку (с числом с плавающей точкой) в число типа double. Число с плавающей точкой - форма представления действительных чисел, в которой число хранится в форме мантиссы и показателя степени

 

“strcmp”- функция побайтно сравнивает коды символов двух строк, на которые указывают аргументы функции. Сравнение продолжается до встречи первого отличающегося символа или пока не будут проверены все символы строк.

 

“strlen”- вычисляет количество символов в строке до первого вхождения символа конца строки. При этом символ конца строки не входит в подсчитанное количество символов.

Иначе говоря, мы пользуемся линейным поиском.

Этот алгоритм перебирает все элементы в массиве, сравнивая их с заданным ключом, из-за полного перебора скорость поиска намного меньше, чем в других алгоритмах. Его обычно используют, если в отрезке поиска находится мало элементов, в ином случае используют другие алгоритмы поиска. В нашем случае т.к. наш массив данных не отсортирован мы используем именно этот алгоритм.

 

Сортировка.

       Этому разделу я уделю больше внимания, т.к. сортировка является одной из целей этой курсовой работы.

Сортировка в Си – цель сортировки заключается в упорядоченности каких-либо значений, строк и символов.

       В данном приложении используется «сортировка Пузырьком» или по-другому говоря «sort Bubble».

       Как работает «сортировка Пузырьком»?

Внутренний цикл снова и снова пробегает по массиву и сравнивает текущий элемент с предыдущим (поэтому пробег начинается с 1) и, если текущий меньше, переставляет его с предыдущим. Место перестановки запоминается в переменной k, и в конце прохода в k находится индекс, начиная с которого массив отсортирован.

Для нашей сортировки используются функции: “swap” и “sortDb”

 

Функция “swap” меняет местами два элемента с индексами LeftIndex и rightIndex.

 

4.5. Полученный результат.

В конце концов мы переходим в функцию «main».

Опишем его строение.

Вставляем название входного файла по умолчанию, изменяем название файла, если оно указано в параметрах. Загружаем информацию из файла в базу данных. Осуществляем выход из программы, если файл пустой или отсутствует. Объявленные переменны для запроса и цикл, работающий до тех пор, пока пользователь не введёт директиву выхода.

Обработка неверных входных значений.

       Если пользователь ввёл не правильную команду в коде приложения присутствует функция «initLamp». В теле этой функции используется оператор «→» обращающийся к отдельным элементам структур и объеденений.

Ввод команд.

      

      

Заключение.

В данной работе была создана программа, которая осуществляет вывод, внесение, удаление записей о товарах, хранящихся в отельном файле. Программа хранит записи о лампах, такие как вольтаж, частота, мощность и тип цоколя. В ходе выполнения данной работы были использованы стандартные библиотеки языка Си.

Содержание файла data.txt.txt приведено в приложении 1

Весь код программы содержится в приложении 2.

6. Список используемой литературы:

1.Шевченко А.В. Ш 37 Программирование и основы алгоритмизации: Учеб. Пособие, СПб.: Изл0во СПбГЭТУ «ЛЭТИ» ,2011.120с.

2.Шилтд Г. Полный справочник по С++, 4-е изд.М.: Вильямс, 2011

3.Мюссер Д., Дердж Ж., Сейни А. С++ и SLT: Справочное руководство ,2-е изд.М.: Вильямс,2010

4.Вирт Н. Алгоритмы и структуры данных М.: Мир, 1989.

5Кнут Д. Искосство программирования Т.1-3. М.:Вильямс 2007-2008.

 

Приложение 1.

Приложение 2.

#in#include <stdio.h>

clude <string.h>

#include <stdlib.h>

#define PROPERTIES_COUNT 5

#define MAX_LENGTH_VALUE 256

 

int DB_SIZE = 0;

 

struct Lamp {

char name[MAX_LENGTH_VALUE];

double voltage;

double frequency;

double capacity;

char socleType[MAX_LENGTH_VALUE];

};

 

void initLamp(struct Lamp* lamp) {

strcpy(lamp->name, "Unknown");

lamp->frequency = 11;

lamp->voltage = 10;

lamp->capacity = 15;

strcpy(lamp->socleType, "Unknown");

}

 

void printRecord(struct Lamp item) {

printf("Name: %s; Voltage: %f; Frequency: %f; Capacity: %f; Socle Type: %s\n",

    item.name, item.voltage, item.frequency, item.capacity, item.socleType);

}

 

void printDb(struct Lamp* db) {

for (int i = 0; i < DB_SIZE; ++i)

    printRecord(db[i]);

}

 

struct Lamp parseLine(char* line) {

struct Lamp info;

initLamp(&info);

char* word;

double numberVal = 0.0;

word = strtok(line, ";");

for (int i = 0; i < PROPERTIES_COUNT && word != NULL && strcmp(word,"\0") != 0; ++i) {

    word[strcspn(word, "\n")] = '\0';

    if (i != 0 && i != PROPERTIES_COUNT -1)

         numberVal = abs(strtod(word, NULL));

    else if (numberVal != 0)

         numberVal = 0;

    switch (i) {

         case 0:

              strcpy(info.name, word);

              break;

         case 1:

              info.voltage = numberVal;

              break;

         case 2:

              info.frequency = numberVal;

              break;

         case 3:

              info.capacity = numberVal;

              break;

         case 4:

              strcpy(info.socleType, word);

              if (strlen(info.socleType) >= strlen(word))

                   info.socleType[strlen(word)-1] = '\0';

         break;

    }

    word = strtok(NULL, ";");

}

return info;

}

 

struct Lamp* parseFile(char* fileName) {

FILE *inputFile = fopen(fileName, "r");

printf("Opening %s...\n", fileName);

if (inputFile == NULL) {

    printf("Error while opening file.\n");

    perror("Error");

    return NULL;

}

char ch;

unsigned int lineLengthMax = 0, lineLength = 0, totalChars = 0;

printf("Reading file...\n");

while ((ch = fgetc(inputFile)) != -1) {

    if (ch == '\n') {

         if (lineLength > lineLengthMax)

              lineLengthMax = lineLength;

         totalChars += lineLength;

         // увеличиваем размер БД

         if (lineLength > 0 && lineLength >= 9)

              ++DB_SIZE;

         lineLength = 0;

    }

    ++lineLength;

}

if (lineLength > 0 && lineLength >= 9)

    ++DB_SIZE;

if (lineLength > lineLengthMax)

lineLengthMax = lineLength;

if (lineLength > lineLengthMax)

    totalChars += lineLength;

printf("Total characters: %d.\n", totalChars);

printf("Total lines: %d.\n", DB_SIZE);

printf("Max line length: %d.\n", lineLengthMax);

struct Lamp* db = (struct Lamp*)malloc(sizeof(struct Lamp) * DB_SIZE);

printf("DB memory allocated.\n");

char* lineBuf = (char*)malloc((size_t)lineLengthMax * sizeof(char));

fclose(inputFile);

inputFile = fopen(fileName, "r");

int index = 0;

printf("Opened a file...\n");

while (fgets(lineBuf, lineLengthMax, inputFile)) {                          

    if (strlen(lineBuf) != 0 && (strlen(lineBuf) >= 9)) {                    

         db[index] = parseLine(lineBuf);

         ++index;

    }

}

printDb(db);

return db;

}

 

void showHelp() {

printf("Program commands:\n"

    "\tSEARCH________________________________________\n"

    "\tSearch by Name: n <lamp_name>\n"

    "\tSearch by Voltage: v =/>/< <value>\n"

    "\tSearch by Frequency: f =/>/< <value>\n"

    "\tSearch by Capacity: c =/>/< <value>\n"

    "\tSearch by Socle Type: st <type_name>\n"

    "\tSORT__________________________________________\n"

    "\tSort all entries by Name: sn <asc|desc>\n"

    "\tSort all entries by Voltage: sv <asc|desc>\n"

    "\tSort all entries by Frequency: sf <asc|desc>\n"

    "\tSort all entries by Capacity: sc <asc|desc>\n"

    "\tSort all entries by SocleType: sst <asc|desc>\n"

    "\tShow all entries: s or all - show all entities\n"

    "\tExit: exit - Exit\n");

}

 

int isComparator(char* word) {

int ans = -1;

if (strcmp(word, "<") == 0 || strcmp(word, "<=") == 0|| strcmp(word, "=") == 0||        

strcmp(word, "==") == 0 || strcmp(word, ">") == 0 || strcmp(word, ">=") == 0)

    ans = 0;

return ans;

}

 

char* getPropertyValue(struct Lamp record, char* property) {

char* value = malloc(sizeof(char) * MAX_LENGTH_VALUE);

    if (strcmp(property, "name") == 0)

         strcpy(value, record.name);                                                   

    if (strcmp(property, "voltage") == 0)

         snprintf(value, (size_t)(MAX_LENGTH_VALUE), "%.5f", record.voltage);

    if (strcmp(property, "frequency") == 0)

         snprintf(value, (size_t)(MAX_LENGTH_VALUE), "%.5f", record.frequency);

    if (strcmp(property, "capacity") == 0)

         snprintf(value, (size_t)(MAX_LENGTH_VALUE), "%.5f", record.capacity);

    if (strcmp(property, "socleType") == 0)

         strcpy(value, record.socleType);

return value;

}

 

void searchItems(struct Lamp* db, char* searchProperty, char* secondParameter, char* inputValue) {

int foundEntries = 0;

if (isComparator(secondParameter) == 0) {

    double threshold = strtod(inputValue, NULL);

    int showFlag = 0;

    for (int i = 0; i < DB_SIZE; ++i) {

         showFlag = 0;

         double value = strtod(getPropertyValue(db[i], searchProperty), NULL);

         if (strcmp(secondParameter, "=") == 0 && value == threshold ||

              (strlen(secondParameter) > 1 && secondParameter[1] == '='

               && value == threshold))

              showFlag = 1;

         if (secondParameter[0] == '>' && value > threshold)

              showFlag = 1;

         else if (secondParameter[0] == '<' && value < threshold)

              showFlag = 1;

         if (showFlag == 1) {

              ++foundEntries;

              printRecord(db[i]);

         }

    }

} else {

    for (int i = 0; i < DB_SIZE; ++i) {

         if (strcmp(secondParameter, getPropertyValue(db[i], searchProperty)) == 0) {

              ++foundEntries;

              printRecord(db[i]);

         }

    }

}

printf("Total found: %d\n", foundEntries);

}

 

void swap(struct Lamp** db, int leftIndex, int rightIndex) {

struct Lamp temp = (*db)[leftIndex];

(*db)[leftIndex] = (*db)[rightIndex];

(*db)[rightIndex] = temp;

}

 

void sortDb(struct Lamp** db, char* property, char* sortType) {

if (sortType == NULL || strcmp(sortType, "asc") != 0 || strcmp(sortType, "desc") != 0) {

    sortType = "asc";

    printf("Sort type is changed to \"ascendent\"\n");

}

for (int i = 0; i < DB_SIZE; ++i) {

    for (int j = i + 1; j < DB_SIZE; ++j) {

         int firstIndex = i;

         int secondIndex = j;

         if (strcmp(property, "name") == 0|| strcmp(property, "socleType") == 0) {

              if ((strcmp(sortType,"asc") == 0) && strcmp(getPropertyValue((*db)[firstIndex],property), getPropertyValue((*db)[secondIndex],property)) >= 0) {

                   swap(db, firstIndex, secondIndex);

              } else if ((strcmp(sortType,"desc") == 0) && strcmp(getPropertyValue((*db)[firstIndex],property), getPropertyValue((*db)[secondIndex],property)) <= 0) {

                   swap(db, firstIndex, secondIndex);

              }

         } else {

              double leftVal = strtod(getPropertyValue((*db)[firstIndex],property), NULL);

              double rightVal = strtod(getPropertyValue((*db)[secondIndex],property), NULL);

 

              if ((strcmp(sortType,"asc") == 0) && leftVal >= rightVal)

                   swap(db, firstIndex, secondIndex);

              else if ((strcmp(sortType,"desc") == 0) && leftVal <= rightVal)

                   swap(db, firstIndex, secondIndex);

         }

    }

}

}

 

int main(int argc, char **argv) {

char *fileName = "data.txt";

if (argc > 1) {

    fileName = argv[1];

}

struct Lamp* db;

db = parseFile(fileName);

if (db == NULL) {

    printf("The %s file is empty. Please, check the source file and try again\n", fileName);

    return -1;

}

printf("Showing help...\n");

showHelp();

char command[512] = "";

while (strcmp(command, "exit") != 0) {

    fgets(command, sizeof(command), stdin);

    

    if (strlen(command) > 1)

         command[strlen(command)-1] = '\0';

    

    char* firstWord = strtok(command, " ");

    char* secondWord = strtok(NULL, " ");

    char* thirdWord = strtok(NULL, " ");

        

    int showFlag = 0;

    if (strcmp(firstWord, "n") == 0) {

         firstWord = "name";

         showFlag++;

    } else if (strcmp(firstWord, "v") == 0) {

         firstWord = "voltage";

         showFlag++;

    } else if (strcmp(firstWord, "f") == 0) {

         firstWord = "frequency";

         showFlag++;

    } else if (strcmp(firstWord, "c") == 0) {

         firstWord = "capacity";

         showFlag++;

    } else if (strcmp(firstWord, "st") == 0) {

         firstWord = "socleType";

         showFlag++;

    }

    if (showFlag == 1) {

         printf("Command: %s %s %s\n", firstWord, secondWord, thirdWord);

         searchItems(db, firstWord, secondWord, thirdWord);

    }

    else {

         if (strcmp(firstWord, "sn") == 0 ) {

              firstWord = "name";

              showFlag++;

         } else if (strcmp(firstWord, "sv") == 0) {

              firstWord = "voltage";

              showFlag++;

         } else if (strcmp(firstWord, "sf") == 0) {

              firstWord = "frequency";

              showFlag++;

         } else if (strcmp(firstWord, "sc") == 0) {

              firstWord = "capacity";

              showFlag++;

         } else if (strcmp(firstWord, "sst") == 0) {

              firstWord = "socleType";

              showFlag++;

         }

         if (showFlag == 1) {

              printf("Sorting...\n");

              sortDb(&db, firstWord, secondWord);

              firstWord = "s";

         }

    }

    if (strcmp(firstWord, "s") == 0 || strcmp(firstWord, "all") == 0)

         printDb(db);

    else if (strcmp(firstWord, "exit") == 0)

         showHelp();

    else if (strcmp(firstWord, "exit") == 0) {

              printf("Exiting...");

              strcpy(command, "exit");

    } else if (showFlag == 0) {

         showHelp();

         printf("Probably there is a mistake in the command. Check the command and try again\n");

    }

}

return 0;

}

 

   


Дата добавления: 2020-04-25; просмотров: 90; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!