Прост в реализации.
Алгоритм состоит в том, что выбирается некоторый опорный элемент из массива, запускается рекурсивная процедура разделения массива, которая перемещает все значения, меньшие, либо равные элементу, влево от него, а все значения, большие, либо равные элементу - вправо (теперь массив состоит из двух подмножеств), для обоих подмассивов рекурсивно запускается та же процедура.
алгоритм файл программа справочник
5. Листинг функций программы
5.1 Make-файл
Make-файл предназначен для описывания отношения между файлами моей программы и содержит команды для обновления каждого файла. Файл описаний позволяет утилите make отслеживать зависимости между файлами, составляющими программную систему.
makefile: main.o cor.o del.o menu.o new.o per.o qsort.o qsort1.o save.o sort.o sortChella.o vivod.o vstavka.o vvod.o
gcc main.o cor.o del.o menu.o new.o per.o qsort.o qsort1.o save.o sort.o sortChella.o vivod.o vstavka.o vvod.o -o svet
main.o: main.c my.h-c main.c.o: cor.c my.h-c cor.c.o: del.c my.h-c del.c.o: menu my.h-c menu.c.o: new.c my.h-c new.c.o: per.c my.h-c per.c.o: qsort.c my.h-c qsort.c.o: qsort1.c my.h-c qsort1.c.o: save.c my.h-c save.c.o: sort.c my.h-c sort.c.o: sortChella.c my.h-c sortChella.c.o: vivod.c my.h-c vivod.c.o: vstavka.c my.h-c vstavka.c.o: vvod.c my.h-c vvod.c:
rm -rf *.0 svet
.2 My.h
Заголовочный файл предназначен для определения именованных констант, прототипов функций, директив препроцессора.
my.h
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define KOL 20baza{title[30];svet;Ipr;Tk;Uob;
};menu(void);vvod(struct baza *w);vivod(int kol, struct baza *w);vstavka(struct baza *w,int kol);sortChella(int kol, struct baza *w);sort(int kol, struct baza *w);del(int kol, struct baza *w);per(struct baza *w);cor(int kol, struct baza *w);save(int kol, struct baza *w,char *name);new (int kol, struct baza *w,char *name);qsort2(struct baza *w,int l,int r);qsort1(struct baza *w,int l,int r);
void Clear(void);
5.3 Main.c
В самом начале основной программы мы входим в бесконечный цикл, который завершится только, если мы выберем пункт меню k, и выполнится оператор return 0.
В начале каждого бесконечного цикла, нам предлагается выбрать пункт меню, путём ввода с клавиатуры его порядкового номера. После ввода, мы переходим к конструкции вида:
switch(char){x1:…x2:…
}
Каждая ветвь case x; соответствует пункту меню с порядковым номером x, и в ней выполняется соответствующая функция.
main.c
#include"my.h"main (int argc, char *argv[]){kol=0,met=0;baza w[KOL];name[30];g;(argc!=2){
printf("Вы не указали имя при запуске\n ");("укажите имя\n в случае ошибки, программа завершит работу\n");
fgets(name,30,stdin);=0;((name[g]!='\n')&&(name[g]!='\0'))++;[g]='\0';(strlen(name)==0)0;
}{(name,argv[1]);
}{(menu()){'a':=vvod(w);=1;;'b':(met==1){(kol,w);
break;
}{("Вы не заполнили справочник\n");
break;
}'c':(met==1){(w,kol);;
}
else{("Вы не заполнили справочник\n");
break;
}'d':(met==1){(kol,w);;
}
else{("Вы не заполнили справочник\n");
break;
}'e':(met==1){(kol,w);;
}
else{("Вы не заполнили справочник\n");
break;
}'f':(met==1){=del(kol,w);;
}{("Вы не заполнили справочник\n");
break;
}'g':(met==1){(kol,w);;
}
else{("Вы не заполнили справочник\n");
break;
}'h':(met==1){(kol,w);;
}
else{("Вы не заполнили справочник\n");
break;
}'i':(met==1){(kol,w,name);;
}{("Вы не заполнили справочник\n");
break;
}'j':=new(kol,w,name);
break;'k':("Выход из программы\n");0;:("Нет такого пункта меню\n");;
}
}
5.4 Menu.c
Эта функция предназначена для управления программой при помощи символа пункта меню, на который нужно перейти в главной функции.
menu.c
#include"my.h"menu(void){x;("\t\tМеню:\n");("a-Создание справочника в памяти (Ввод данных)\n");("b-Вывод справочника на экран\n");("c-Сортировка методом вставок по полю строкового типа\n");("d-Сортировка методом Шелла по числовому полю\n");("e-Сортировка методом быстрой сортировки по числовому полю\n");("f-Удаление данных с указанным номером\n");("g-Перемещение указанной записи на новую позицию\n");("h-Корректировка данных с указанным номером\n");("i- Сохранение справочника в файл\n");("j- Задание нового имени файла для открытия\n");("k- Выход из программы\n");
scanf("%c",&x);=tolower(x);
Clear();x;
}
Рисунок 5.1 - Результат выполнения функции menu.c
5.5 Vvod.c
Функция ввода данных предлагает ввести количество данных присваемое переменной kol<KOL, где KOL максимальное количество элементов. Затем функция переходит в цикл, одно выполнение которого позволяет ввести данные об одном элементе. Вводимые данные проверяются путем подсчета символов или цифр после ввода их пользователем и считывания. Если при вводе цифры был применен символ, то пользователю предложится ввести заново эту цифру.
vvod.c
#include "my.h"Clear(){(getchar()!='\n');
return;
}vvod(struct baza *w){
int kol,g,i,j;("Введите количество записей\n");(scanf("%d",&kol)!=1){("Значение не верно\nВведите еще раз");
Clear();
}();(kol<1||kol>KOL){
printf("Количество записей не должно перевышать %d\n",KOL);
return 0;
}
for(i=0;i<kol;i++){("Введите марку светодиода(%d)\n",i+1);
fgets(w[i].title,30,stdin);=0;((w[i].title[g]!='\n')&&(w[i].title[g]!='\0'))++;[i].title[g]='\0';("Введите Uпр(%d)\n",i+1);(scanf("%f",&w[i].svet)!=1){
printf("Значение введено неверно\n");
Clear();
}();("Введите Iпр,мА(%d):\n",i+1);(scanf("%f",&w[i].Ipr)!=1){
printf("Значение введено неверно\n");
Clear();
}();("Введите Tk(%d)\n",i+1);(scanf("%f",&w[i].Tk)!=1){
printf("Значение введено неверно\n");
Clear();
}();("Введите Uob(%d)\n",i+1);(scanf("%f",&w[i].Uob)!=1){("Значение введено неверно\n");
Clear();
}();
}kol;
}
Рисунок 5.2 - Результат выполнения функции vvod.c
5.6 Vivod.c
Функция вывода данных на экран выводит данные на экран из массива структур при помощи указателя *w. Также функция проверят справочник на наличие данных, если их нет, то при вызове функции вывода данных произойдет предупреждение об отсутствии данных и выход в основную программу.
vivod.c
#include "my.h"vivod(int kol,struct baza *w){i;("\tСправочник светодиодов\n");("|============================================|\n");("| N | Марка | Uпр,V | Iпр, mA | Tк , град | Uобр, V |\n");("|=============================================|\n");(i=0;i<kol;i++){
printf("|%5d|%20s|%12f|%12.1f|%14.1f|%18.1f|\n",i+1,w[i].title, w[i].svet, w[i].Ipr,w[i].Tk, w[i].Uob);
} printf("|============================================|\n");;
}
Рисунок 5.3 - Результат выполнения функции vivod.c
5.7 Vstavka.c
Функция, осуществляющая сортировку методом вставок по полю строкового типа. Предлагается выбрать пункт меню, путем ввода с клавиатуры, в котором запрашивается направление сортировки: по убыванию либо по возрастанию.
vstavka.c
#include"my.h"vstavka(struct baza *w,int n){i,j,g,k;baza t;
printf("1-Сортировать по возрастанию\n2-Сортировка по убыванию\n0-Выход\n");(scanf("%d",&g)!=1){("Значение введено неверно\n");
Clear();
}();(g){1:(i=1;i<n;i++)(j=0;j<i;j++){(strcmp(w[i].title,w[j].title)<0){=w[i];(k=i;k>j;k--)[k]=w[k-1];[j]=t;
}
};2:(i=1;i<n;i++)(j=0;j<i;j++){(strcmp(w[i].title,w[j].title)>0){=w[i];(k=i;k>j;k--)[k]=w[k-1];[j]=t;
}
};0:("Выход в меню\n");;:("Такого пункта нет\n");
return;
}("Сортировка завершена успешно\n");;
}
Рисунок 5.4 - Результат выполнения функции vstavka.c по возрастанию
Рисунок 5.5 - Результат выполнения функции vstavka.c по убыванию
5.8 SortChella.c
Функция, осуществляющая сортировку методом Шелла по числовому полю. Предлагается выбрать пункт меню, путем ввода с клавиатуры, в котором запрашивается направление сортировки: по убыванию либо по возрастанию.
sortChella.c
#include"my.h"sortChella(int kol, struct baza *w){baza tm;i,j,g;
int step=kol/2;("1-Сортировать по возростанию\n2-Сортировать по убыванию\n0-Выход\n");(scanf("%d",&g)!=1){("Значение введено неверно\n");
Clear();
}();(g){1:(step > 0){(i = 0; i < (kol - step); i++){= i;((j>=0)&&(w[j].Ipr> w[j + step].Ipr) ){= w[j];[j] = w[j + step];[j + step] = tm;-;
}
}= step / 2;
}
}=step/2;
};0:("Выход в меню\n");
return;
default:
printf("Такого пункта меню нет \n");;
}("Сортировка произошла успешно\n");;
}
Рисунок 5.6 - Результат выполнения функции sortChella.c по возрастанию
Рисунок 5.7 - Результат выполнения функции sortChella.c по убыванию
5.9 Sort.c
Функция, осуществляющая сортировку методом быстрой сортировки по числовому полю. Предлагается выбрать пункт меню, путем ввода с клавиатуры, в котором запрашивается направление сортировки: по убыванию либо по возрастанию.
sort.c
#include"my.h"sort(int kol,struct baza *w){a;("1-По возростанию\n2-По убыванию\n0-Выход в меню\n");(scanf("%d",&a)!=1){("Значение введено не верно\n");
Clear();
}();(a){1:(w,0,kol-1);;2:(w,0,kol-1);0:("Выход в меню\n");;:("Такого пункта нет\n");
break;
};
}
5.10 Qsort.c
Функция, осуществляющая сортировку методом быстрой сортировки по возрастанию, является составной частью функции sort.c.
qsort.c
#include"my.h"qsort2(struct baza *w,int l,int r){
int i=l,j=r;baza sw;x;(l>=r);=w[(r+l)/2].Tk;{(w[i].Tk<x)++;(w[j].Tk>x)-;(i<=j){=w[i];[i]=w[j];[j]=sw;++;-;
}
}while(!(i>j));(w,l,j);(w,i,r);
return;
}
Рисунок 5.8 - Результат выполнения функции qsort.c по возрастанию
5.11 Qsort1.c
Функция, осуществляющая сортировку методом быстрой сортировки по убыванию, является составной частью функции sort.c.
qsort1.c
#include"my.h"qsort1(struct baza *w,int l,int r){
int i=l,j=r;baza sw;x;(l>=r);=w[(r+l)/2].Tk;{(w[i].Tk>x)++;(w[j].Tk<x)-;(i<=j){=w[i];[i]=w[j];[j]=sw;++;-;
}
}while(!(i>j));(w,l,j);(w,i,r);
return;
}
Рисунок 5.9 - Результат выполнения функции qsort1.c по убыванию
5.12 Del.c
Функция предназначена для удаления данных из справочника. Функция сначала проверяет справочник на наличие данных. А затем запрашивает номер элемента, который нужно удалить.
del.c
#include"my.h"del( int kol, struct baza *w){i,a;("Введите номер элемента в справочнике который нужно удалить:\n");(scanf("%d",&a)!=1){("Значение введено не верно\n");
Clear();
}();((a>0)&&(a<=kol)){(i=a-1;i<kol-1;i++)[i]=w[i+1];
}{("В справочнике нет светодиода с данным ноиером\n");kol;
}("Светодиод удален из справочника\n");--kol;
}
Рисунок 5.9 - Результат выполнения функции de1.c
5.13 Per.c
Функция предназначена для перемещения введенных данных. Функция запрашивает элемент, который нужно переместить, а за тем позицию ,на которую необходимо переместить элемент.
per.c
#include"my.h"per(int kol, struct baza *w){
int N,M,i;baza t;
if(kol>0){("Введите номер записи\n");
if((scanf("%d",&N)==1)&&(N>0)&&(N<=kol)){();-;
}{();("Введенно некорректное значение\n");;
}
}{("Справочник пуст\n");;
}("Введите номер позиции куда переместить\n");
if((scanf("%d",&M)==1)&&(M>0)&&(M<=kol)){();-;
}{();("Введенно некорректное значение\n");;
}(N<M){=w[N];(i=N;i<M;i++)[N]=w[N+1];[M]=t;
}{(N>M){=w[N];(i=N;i>M;i--)[i]=w[i-1];[M]=t;
}{("Перемещение не трубуется\n");;
}
};
}
Рисунок 5.10 - Результат выполнения функции per.c
5.14 Cor.c
cor.c
#include"my.h"cor(int kol, struct baza *w){i,k,g;("Введите нормер светодиода ,который нужно отредактировать:\n");(scanf("%d",&k)!=1){("Неправильно введены данные\n");
Clear();
}();((k>0)&&(k<=kol)){
while(1){("Выберите поле которое нужно отредактировать:\n");("1-Марка светодиода\n");("2-Uпр, V\n");
printf("3-Iпр, mA\n");("4-Tk\n");("5-Uобр\n");("0-Выход\n");
while(scanf("%d",&g)!=1){("Неправильно введены данные\n");
Clear();
}();(g){1:
printf("Введите марку %d светодиода\n",k);
fgets(w[k-1].title,20,stdin);=0;((w[k-1].title[i]!='\n')&&(w[k-1].title[i]!='\0'))++;[k-1].title[i]='\0';;2:("Введите Uпр %d\n",k);(scanf("%f",&w[k-1].svet)!=1){
printf("Неправильно введеное значение\n");();
};3:("Введите Iпр %d\n",k);(scanf("%f",&w[k-1].Ipr)!=1){
printf("Неправильно введеное значение\n");
Clear();
};4:("Введите Tk %d\n",k);(scanf("%f",&w[k-1].Tk)!=1){
printf("Неправильно введеное значение\n");
Clear();
};5:("Введите Uобр %d\n",k);(scanf("%f",&w[k-1].Uob)!=1){
printf("Неправильно введеное значение\n");
Clear();
};0:("Выход\n");;:("Такого пункта меню нет\n");
break;
}
}
}{("В справочнике нет светодиода с данным номером\n");;
}("Элемент справочника откорректирован");;
}
Рисунок 5.11 - Результат выполнения функции cor.c
5.15 Save.c
Функция открывает файл с ранее введенным именем в бинарном режиме, проверяет на наличие данных, записывает число элементов в файл, записывает данные в файл. По завершению этих операций закрывает файл.
save.c
#include "my.h"save(int kol, struct baza *w, char *name){
int res=0,i;*fp;((fp=fopen(name,"wb"))==NULL){
printf("Невозможно открыть файл\n");
}(&kol,sizeof(int),1,fp);(i=0;i<kol;i++)+=fwrite(&w[i],sizeof(struct baza),1,fp);
if(res!=kol){("Не все данные загружены\n");("Загружено %d записей\n",res);
}(fp);("Данные отправленны в файл (%s)\n",name);;}
Рисунок 5.13 - Результат выполнения функции save.c
5.15 New.c
Функция загрузки данных из файла, имя которого передано в функцию. Возвращает количество загруженных полей, так же принимает структуру в которую нужно записать данные считаные из файла. Затем меняет имя этого файла на новое.
new.c
#include"my.h"new(int kol,struct baza *w, char *name){
FILE *fp;k[30];i;
printf("Введите имя файла с которого будет загружена база");
fgets(k,15,stdin);(i=0;k[i]!='\n';i++);[i]='\0';
printf("введите новое имя открытого файла");
fgets(name,15,stdin);(i=0;name[i]!='\n';i++);[i]='\0';((fp=fopen(k,"rb"))==NULL){("Невозожно открыть файл (%s)\n",k);kol;
}(&kol,sizeof(int),1,fp);(i=0;i<kol;i++)(&w[i],sizeof(struct baza),1,fp);("Загружено %d записей\n", kol);(fp);((fp=fopen(name,"wb"))==NULL){("Невозможно открыть файл (%s)",name);kol;
}(&kol,sizeof(int),1,fp);(i=0;i<kol;i++)(&w[i],sizeof(struct baza),1,fp);
fclose(fp);("Имя заменено на новое для открытия\n");kol;
}
Рисунок 5.14 - Результат выполнения функции new.c
Заключение
При разработке курсового проекта были закреплены навыки программирования консольных приложений на языка С/С++, а именно:
файловый ввод-вывод на языке С;
вывод данных в файл результатов программы на языке С:
работа с массивами и структурами данных;
изучены различные алгоритмы сортировок.
Также данный курсовой проект явился первым более-менее серьезным приложением созданным мной, что сыграло важную роль в становлении меня как программиста.
Список использованной литературы
1. Герберт Шилдт. Полный справочник по С++. Ossborne. 2003
. Стивен Прата. Язык программирования С. - М. Издательство «Диасофт», 2002. - 896 с.
. Х.М. Дейтел, П. Дж. Дейтел. Как программировать на С. - М. Издательство «Бином», 2006. - 908 с.
. Балащенко, Д.В. Программирование на языке С/С++ : учебно-методическое пособие по дисциплине «Информатика и информационные технологии». Ч. 2 /Д.В. Балащенко; Д.В. Захаров, М-во образования Респ. Беларусь, Белорус. Гос. Ун-т трансп. - Гомель: БелГУТ, 2011
Приложение