Применение языка программирования С/С++ при создании рабочего проекта

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    674,23 kb
  • Опубликовано:
    2012-02-26
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Применение языка программирования С/С++ при создании рабочего проекта

Оглавление

Введение

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

2. Структура данных с указанием типов

3. Структурная схема программы

4. Описание работы программы

5. Описание специальных алгоритмов

6. Листинг программы

7. Результаты сортировки

Заключение

Список литературы

Введение

Целью данной курсовой работы является углубить теоретические знания по языку программирования С\С++ и применение их на практике при создании рабочего проекта, расширить кругозор студентов в вопросах возможности применения ЭВМ в конкретной практической деятельности, овладевания навыками структурного программирования на языке С. В этой работе для выполнения всех требований преподавателя к функциональности рабочего приложения мне будут необходимы знания по всему курсу «Алгоритмизация и программирование на языке «С/С++». При выполнении курсовой работы предстоит:

· изучить теорию и технологию работы со средой программирования С\С++;

· изучить и проанализировать соответствующую литературу;

· провести сравнительный анализ языков программирования этого класса, выявить достоинства и недостатки;

· привести элементы методической работы в виде разработки вариантов заданий.

Таблица 1 - Экспериментальная база реле

Марка реле

R нормальное, Ом

U рабочее, В

I рабочее, А

Масса,  г

1

P1

690

220

1

100

2

P3

690

220

1

110

3

PTK-X(M)

720

220

1

110

4

DSH-15

720

220

1

100

5

ТАМ 112-1М

770

250

6

140

6

ТАМ 103

750

340

3

450

7

ТАМ 123

900

380

5

500

8

Т425

650

110

100

9

МРТ 110

700

220

10

220

10

ТАМ 126

720

250

3

150

11

BI-1-М

150

24

5

400

12

PТСВ

250

24

4

800

13

PТ-СМ-Ех

300

24

2

400

14

TAB102

320

110

5

15

15

Т4М013

800

380

8

150

16

ТАМ 127

720

380

10

240

17

ТАМ133-2М-46

400

250

6

140

18

МРТ 12

150

220

10

220

19

ТРE 974

500

220

5

500

20

ТРE108

650

10

100



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

Создание справочника в памяти (Ввод данных) с использованием функций С.

Вывод справочника на экран (с использованием функций С++).

Удаление записи в справочник.

Сортировка методом Шелла по полю строкового типа (по алфавиту).

Сортировка методом быстрой сортировки по числовому полю (на усмотрение разработчика).

Сортировка методом Шелла по числовому полю (на усмотрение разработчика).

Поиск записи в справочнике по части названия марки радиодетали.

Сохранение справочника в файле с использованием функций языка С++.

Открытие справочника из файла с использованием функций языка С++.

Выход из программы.

Каждая запись должна состоять из 5 полей: марка (строковой тип); остальные 4 поля выбираются самостоятельно из справочников и должны представлять реальные параметры радиодеталей. При работе с программой также должны вводиться реальные марки и соответствующие им параметры деталей. Таблица с параметрами должна быть приведена в приложении.

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

Предусмотреть защиту программы от ввода пользователем некорректных данных.

Курсовая работа выполняется с помощью компилятора gcc.

. Структура данных с указанием типов

rele s[20] - структура, содержащая информацию о 20 реле;U - рабочее напряжение на реле, вещественный тип данных;marka[15] - наименование реле, символьный массив, максимальное количество символов в котором равно 15;R,I,massa - номинальное сопротивление, рабочая сила тока, масса, целочисленный тип данных;i - глобальная переменная целочисленного типа, используется как количество вводимых реле.

. Структурная схема программы

Прототипы функций:vvod()- функция, использующаяся для ввода данных о реле в справочник, хранится в модуле vvod.с;vivod()- функция, использующаяся для вывода на экран информации о всех введенных в справочник реле, хранится в модуле vivod.c;shell()-функция, предназначенная для сортировки реле по их маркам по полю строкового типа методом Шелла, хранится в модуле shell.c;q_sort(int l, int r)- функция, предназначенная для сортировки реле по числовому полю (I) методом быстрой сортировки, хранится в модуле q_sort.c;shell_str()-функция, предназначенная для сортировки реле по числовому полю (U) методом Шелла, хранится в модуле shell_str.c;save(char *)- функция, предназначенная для сохранения справочника в файле, хранится в модуле save.c;open(char *)- функция, предназначенная для открытия справочника из файла, хранится в модуле open.c;del()-функция, предназначенная для удаления записи из справочника, хранится в модуле del.c.search()-функция, предназначенная для поиска записи в справочнике по части названия марки реле, хранится в модуле search.c;

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

Программа начинается с цикла, который завершится только если переменная “х” получит не нулевое значение, что и происходит при выборе от а до q пункта меню и выполнится оператор continue;

Далее при помощи конструкции

(x)

{a:…b:…

}

В программе реализованы следующие функции:Создание справочника в памяти(ввод данных) с использованием функция языка С.Вывод справочника на экран с использованием потоковых классов языка С++-Удаление записи из справочникаСортировка методом Шелла по полю строкового типаБыстрая сортировка по числовому полю (I)-Сортировка методом Шелла по числовому полю (U)Поиска записи в справочнике по части названия марки Сохранение справочника в файле с использованием потоковых классов С++Открытие справочника из файла с использованием потоковых классов С++Выход из программы

. Описание специальных алгоритмов

Сортировка Шелла:

Конкретная последовательность шагов может быть и другой. Единственное правило состоит в том, чтобы последний шаг был равен 1. Например, такая последовательность: 9, 5, 3, 2, 1 дает хорошие результаты и применяется в показанной здесь реализации сортировки Шелла.

shell(char *items, int count) {int i, j, gap, k;x, a[5];[0]=9; a[1]=5; a[2]=3; a[3]=2; a[4]=1;(k=0; k < 5; k++) {= a[k];(i=gap; i < count; ++i) {= items[i];(j=i-gap; (x < items[j]) && (j >= 0); j=j-gap)[j+gap] = items[j];[j+gap] = x;

}

}

Вы могли заметить, что внутренний цикл for имеет два условия проверки. Очевидно, что сравнение x<items[j] необходимо для процесса сортировки. Выражение j>=0 предотвращает выход за границу массива items. Эти дополнительные проверки в некоторой степени понижают производительность сортировки Шелла.

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

Анализ сортировки Шелла связан с очень сложными математическими задачами, которые выходят далеко за рамки этой книги. Примите на веру, что время сортировки пропорционально  при сортировке n элементов. Тем не менее, не стоит чрезмерно восхищаться сортировкой Шелла - быстрая сортировка еще лучше.

Быстрая сортировка:

Быстрая сортировка построена на идее деления. Общая процедура заключается в том, чтобы выбрать некоторое значение, называемое компарандом (comparand)[10], а затем разбить массив на две части. Все элементы, большие или равные компаранду, перемещаются на одну сторону, а меньшие - на другую. Потом этот процесс повторяется для каждой части до тех пор, пока массив не будет отсортирован. Например, если исходный массив состоит из символов fedacb, а в качестве компаранда используется символ d, первый проход быстрой сортировки переупорядочит массив следующим образом:

Начало f e d a c b

Проход 1 b c a d e f

Затем сортировка повторяется для обеих половин массива, то есть bса и def. Как вы видите, этот процесс по своей сути рекурсивный, и, действительно, в чистом виде быстрая сортировка реализуется как рекурсивная функция.

Значение компаранда можно выбирать двумя способами - случайным образом либо усреднив небольшое количество значений из массива. Для оптимальной сортировки необходимо выбирать значение, которое расположено точно в середине диапазона всех значений. Однако для большинства наборов данных это сделать непросто. В худшем случае выбранное значение оказывается одним из крайних. Тем не менее, даже в этом случае быстрая сортировка работает правильно. В приведенной ниже версии быстрой сортировки в качестве компаранда выбирается средний элемент массива.

алгоритмизация программирование справочник шелл

/* Функция, вызывающая функцию быстрой сортировки. */quick(char *items, int count){(items, 0, count-1);

}

/* Быстрая сортировка. */qs(char *items, int left, int right){int i, j;x, y;= left; j = right;= items[(left+right)/2]; /* выбор компаранда */{

          while((items[i] < x) && (i < right)) i++;

         while((x < items[j]) && (j > left)) j--;

          if(i <= j) {

                    y = items[i];

                   items[i] = items[j];

                   items[j] = y;

                    i++; j--;

          }

} while(i <= j);(left < j) qs(items, left, j);(i < right) qs(items, i, right);

}

В этой версии функция quick() готовит вызов главной сортирующей функции qs(). Это обеспечивает общий интерфейс с параметрами items и count, но несущественно, так как можно вызывать непосредственно функцию qs() с тремя аргументами.

Необходимо упомянуть об одном особенно проблематичном аспекте быстрой сортировки. Если значение компаранда в каждом делении равно наибольшему значению, быстрая сортировка становится "медленной сортировкой" со временем выполнения порядка n2. Поэтому внимательно выбирайте метод определения компаранда. Этот метод часто определяется природой сортируемых данных. Например, в очень больших списках почтовой рассылки, в которых сортировка происходит по почтовому индексу, выбор прост, потому что почтовые индексы довольно равномерно распределены - компаранд можно определить с помощью простой алгебраической функции. Однако в других базах данных зачастую лучшим выбором является случайное значение. Популярный и довольно эффективный метод - выбрать три элемента из сортируемой части массива и взять в качестве компаранда значение, расположенное между двумя другими.

6. Листинг программы

служит для компиляции всех функций, используемых в программе в один исполняемый файл rele.exe : vvod.o menu.o vivod.o shell_str.o save.o open.o q_sort.o shell.o del.o search.o++ -o rele vvod.o menu.o vivod.o shell_str.o save.o open.o q_sort.o shell.o del.o search.o.o: menu.c rele.h++ -c menu.c.o: vvod.c rele.h++ -c vvod.c.o: vivod.cpp rele.h++ -c vivod.cpp.o: save.cpp rele.h++ -c save.cpp.o: open.cpp rele.h++ -c open.cpp.o: shell.c rele.h++ -c shell.c_str.o: shell_str.c rele.h++ -c shell_str.c_sort.o: q_sort.c rele.h++ -c q_sort.c.o: del.c rele.h++ -c del.c.o: search.c rele.h++ -c search.c: -rf *.o rele .h

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

#include <iostream>

#include <fstream>

#include <stdio.h>

#include <ctype.h>

#include <stdlib.h>

#include <string.h>namespace std;

/*прототип функций*/vvod();vivod();shell();q_sort(int l, int r);shell_str();save(char *);open(char *);del();search();

/* объявление структуры*/rele{U;marka[15];R,I,massa;

.c.c содержит функцию main(int argc,char *argv[]), в которой реализуется буквенное меню справочника реле, и вызов всех, необходимых функций, по запросу пользователя.

#include "rele.h"i=0;rele s[20];

/* argc-количество аргументов командной строки при запуске программы*/

/*argv[]-массив указателей на строки*/main(int argc, char *argv[]){("clear");x;c[100];(argc==1){("\nИмя файла не было указано при запуске!\n\n"

"Укажите его сейчас: ");("%90s",c);(getchar()!= '\n');

}else{(c,argv[1]);

}(1){("Справочник РЕЛЕ \n\n");(" A.Ввод данных с использованием функций С\n");(" B.Вывод данных c использованием функций С++\n");(" C.Удаление записи из справочника\n");(" D.Сортировка методом Шелла по полю строкового типа\n");(" E.Быстрая сортировка по числовому полю (I)\n");(" F.Сортировка методом Шелла по числовому полю (U) \n");(" G.Поиск записи в справочнике по части названия марки\n");(" S.Сохранение справочника в файле с использованием потоковых классов С++\n");(" O.Открытие справочника из файла с использованием потоковых классов С++\n");(" Q.Выxод\n");("\nВведите необходимый пункт меню: ");= tolower(getchar());(getchar()!= '\n');(x){

         case 'a': vvod(); break;

         case 'b': vivod(); break;'c': del(); break;

         case 'd': shell_str(); break;

         case 'e': q_sort(0,i-1);

                   if(i>1)          printf("\n\nСортировка прошал успешно!\n\n");

                   break;

         case 'f': shell();

                   break;

         case 'g': search();

                   break;

         case 's': save(c);break;

         case 'o': open(c);break;

         case 'q': printf("Выход из программы\n"); return 0;

         default:{

                   printf("\n\nНеправильно выбран пункт меню.\n");

                   printf("Попробуйте выбрать снова\n");

                   continue;

         }

}

}

}

.c

В файле vvod.c описана функция vvod (), выполняющая ввод данных в справочник с помощью стандартных функций ввода языка С. При вводе данных в справочник проверяется корректность вводимой информации.

#include"rele.h"

/*указывает компилятору на необходимость поиска определяющих объявлений в другом файле*/int i;struct rele s[20];vvod(){c;n;("clear");(1){(i==20){("clear");("\n\nСправочник заполнен!\n\n");;

}("Введите марку %d реле: ",i+1);(s[i].marka,20,stdin);(n = 0; s[i].marka[n]!= '\n'; n++);[i].marka[n] = '\0';(strlen(s[i].marka) == 0){("\nВведите данные\n");;

}(1){("Введите номинальное сопротивление (R,Ом) %d реле: ",i+1);(!(scanf("%d",&s[i].R)) || s[i].R <= 0){(getchar()!='\n');("clear");("Введены некорректные данные!\n");

}{(getchar()!='\n');;

}

}        (1){("Введите рабочее напряжение (U,в) %d реле: ",i+1);(!(scanf("%f",&s[i].U)) || s[i].U <= 0){(getchar()!='\n');("clear");("Введены некорректные данные!\n");

}{(getchar()!='\n'); ;

}

}

while(1){("Введите рабочую силу тока(I,mA) %d реле: ",i+1);(!(scanf("%d",&s[i].I)) || s[i].I <= 0){(getchar()!='\n');("clear");("Введены некорректные данные!\n");

}{(getchar()!='\n');;

}

}(1){("Введите массу (г) %d реле: ",i+1);(!(scanf("%d",&s[i].massa)) || s[i].massa <= 0){

         while(getchar()!='\n');("clear");("Введены некорректные данные!\n");

}{

         while(getchar()!='\n');

         break;

}

}++;("\n\nХотите ввести ещё данные?(Y/N): ");=getchar();(c=='\n'){("clear");;

}(getchar()!='\n');(c=='N' || c=='n'){("clear");;

}else (c=='Y' || c=='y'){

         system("clear");

         continue;

}else{

          system("clear");

          printf("Введён неизветсный оператор! Переход в главное меню\n");

          break;

         }

};

}

.cpp

в файле vivod.cpp находится описание функции вывода созданного справочника на экран с помощью потоков языка С++.

#include "rele.h"vivod(){struct rele s[20];int i;("clear");(i==0){<< "\n\nОшибка!!!!\n\nСправочник пуст\n\n";;

}<< "Справочник РЕЛЕ\n";.setf(ios::right);<< \n";<< "| N|Марка РЕЛЕ |R номинальное|U рабочее |I рабочее| масса |\n";<< \n";(int a=0;a<i;a++){<< "|";.width(2);<< a + 1 << "|";.width(15);<< s[a].marka << "|";.width(13);<< s[a].R<< "|";.width(10);<< s[a].U << "|";.width(9);<< s[a].I << "|";.width(7);<< s[a].massa << "|\n";

}<<"=\n";

}

.cpp

в файле save.cpp описана функция сохранения справочника в дисковом файле с помощью функций языка С++.

#include "rele.h"save(char * file){("clear");struct rele s[20];int i;(i == 0){<< "\nСправочник пуст\n";;

}

.cpp

в файле open.cpp описана функция, предназначенная для открытия справочника из файла с помощью функций языка С++.

#include "rele.h"open(char * file){("clear");int i;struct rele s[20];is(file, ios::in | ios::binary);(!is){<< "\nНевозможно открыть файл\n";;

}= 0;(1){.read((char*)(&s[i]), sizeof(rele));(!is)

         break;++;

}<< "\nСправочник загружен" << "\n";;

}

.c

в файле shell.c описана функция, предназначенная для сортировки реле по их маркам по полю строкового типа методом Шелла с помощью потоков языка С.

#include "rele.h"shell(){("clear");struct rele s[20];rele temp;int i;(i<2){("Справочник пуст либо присутствует только 1 запись\n"); ;

}a=0,j;step = i / 2;(step > 0){(a=0;a<(i-step);a++){=a;((j >= 0) && (s[j].U > s[j + step].U)){= s[j];[j] = s[j + step];[j + step] = temp;-;

}

}= step / 2;

}("\n\nСортировка прошла успешно\n\n");;

}

_str.c

в файле shell_str.c описана функция, предназначенная для сортировки реле по числовому полю (U) методом Шелла.

#include "rele.h"shell_str(){("clear");struct rele s[20];rele temp;int i;(i<2){("Справочник пуст либо присутствует только 1 запись\n"); ;

}f=0,j;step = i / 2;(step > 0){(f = 0; f < (i - step); f++){= f;((j >= 0) && (strcmp(s[j].marka, s[j + step].marka))>0){= s[j];[j] = s[j + step];[j + step] = temp;-;

}

}= step / 2;

}("\n\nСортировка прошла успешно\n\n");

}

_sort.c

в файле q_sort.c описывается функция, предназначенная для сортировки реле по числовому полю (I) методом быстрой сортировки.

#include "rele.h"q_sort (int l, int r) {("clear");(r<1){("\nСправочник пуст либо присутствует только 1 запись\n\n");;

}struct rele s[20];rele swap;(l>=r);i = l, j = r;x = s[(r+l)/2].I;{(s[i].I < x) i++;(s[j].I > x) j--;(i<=j){= s[i];[i] = s[j];[j] = swap;++;-;

}

} while(!(i>j));_sort(l, j);_sort(i, r);;

.c

в файле del.c описывается функция, предназначенная для удаления записи из справочника.

#include "rele.h"int i;struct rele s[20];del(){a,j;c;("clear");(1){(i==0){("\n\nСправочник пуст\n\n");;

}("\nВведите номер удаляемой записи (всего %d записей): ",i);(scanf("%d",&a)!=1){("clear");("Неккоректный ввод.повторите\n");(getchar()!='\n');;

}else(a < 1 || a > i){("\n\nЗапись N%d отсутствует\n\n",i);;

}(getchar()!='\n');-;(j=a-1;j<i;j++){[j]=s[j+1];

}("clear");("\nЗапись успешно удалена\n");("\nХотите ещё удалить данные?(Y/N): ");=getchar();(c=='\n'){("\nПереход в главное меню\n\n");;

}(getchar()!='\n');(c=='N' || c=='n'){("clear");;

}else(c=='Y' || c=='y'){("clear");;

}else{("Введён неизвесный оператор\nПереход в главное меню\n");(getchar()!='\n');("clear");;

}

};

}

.c

в файле search.c описывается функция, предназначенная для поиска записи в справочнике по части названия марки реле.

#include"rele.h"struct rele s[20];int i;search(){("clear");(i==0){("\n\nСправочник пуст\n");;

}a,r[i],j=0;g[16];("Введите часть марки детали: ");(g,15,stdin);(a = 0; g[a]!= '\n'; a++);[a] = '\0';(a=0;a<i;a++)(strstr(s[a].marka,g)!=NULL){[j]=a;++;

}(j==0){("Нет данных содержащих \"%s\"\n",g);;

}("Записи содержащие подстроку \"%s\"\n",g);(a=0;a<j;a++)("|%2d|%15s|%13d|%10.1f|%9d|%7d|\n",a+1,s[r[a]].marka,s[r[a]].R,s[r[a]].U,s[r[a]].I,s[r[a]].massa);;

}

7. Результаты сортировки

Исходный справочник


Сортировка методом Шелла по полю строкового типа



Сортировка методом быстрой сортировки по числовому полю (I):


Сортировка методом Шелла по числовому полю (U):



Заключение

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

При разработке курсового проекта были закреплены навыки программирования консольных приложений на языка С/С++, а именно:

файловый ввод-вывод на языке С;

ввод-вывод на консоль на языке С++:

работа с массивами и структурами данных;

изучены различные алгоритмы сортировок.

Си - стандартизированный процедурный язык программирования, разработанный в начале 1970-х годов сотрудниками Bell Labs Кеном Томпсоном и Денисом Ритчи как развитие языка Би. Си был создан для использования в операционной системе UNIX. Си ценят за его эффективность. Он является самым популярным языком для создания системного программного обеспечения. В языке C++ соединены воедино три различных принципа программирования: процедурное программирование (представленное языком С), объектно-ориентированное программирование (представленное таким понятием, как класс, что повышает мощность языка C++ по сравнению с языком С) и обобщенное программирование (представленное шаблонами языка C++). Одна из причин применения языка C++ - это возможность использовать преимущества объектно-ориентированного программирования. Для этого необходимо прочное знание стандартного языка С, так как основные типы данных, операции, управляющие структуры и синтаксические правила были позаимствованы из этого языка.

Список литературы

1. Х.М.Дейтел, П.Дж.Дейтел./ Как программировать на С/С++. Издательство «Бином» 2005г.

. Стивен Прата./ Язык программирования С- М. Издательство "Диасофт", 2002. - 896 с

. Глушаков, Коваль, Смирнов «Язык программирования C++. Стандарт NSI/ISO» Издательства « АСТ, Фолио» 2001 г.

. Шилдт Г. Справочник программиста по С/С++, 3-е изд.: Пер. с англ. - М.: Издательский дом «Вильямс», 2003.- 432с.

Похожие работы на - Применение языка программирования С/С++ при создании рабочего проекта

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!