Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Rendll
0 / 1 / 0
Регистрация: 04.12.2008
Сообщений: 63
#1

Сортировка массива структур - C++

26.12.2008, 21:14. Просмотров 1127. Ответов 1
Метки нет (Все метки)

Помогите с сортировкой даных в массиве структур. Мне нужно реализовать сортировку по любому заданному полю. Вот программа:

Код
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>

///////////////////////////////STRUCTURA//////////////////////////////////////

int n; // kilkist' zapusiv
char filename [80];
FILE *file;
struct STUDENT
{
  char name[20];
  char databirth[20];
  char group[10];
  char ses1[10];
  char ses2[10];
  char ses3[10];
  char ses4[10];
  char ses5[10];
}R[100];

/////////////////////////////vukluk funkciy////////////////////////////

void menu();
void input();
void load();
void edit();
void find();
void sort();
void add();
void pokaz();
void del();

/////////////////////////////////////////////////////////////////////////////

 int r;
void main()
{
 for(r=0;;r++)
 {
	menu();
 }
}

///////////////////////////////GOLOVNE  MENU///////////////////////////////////////

 int zx;
void menu(void)
{
clrscr();

  printf("    Меню користувача\n\n");
  printf("Введiть ваш вибiр та натиснiть ENTER:\n\n");
  printf("   1 - Створити базу\n"); //ok
  printf("   2 - Показати базу\n"); //ok
  printf("   3 - Редагування записiв\n");
  printf("   4 - Пошук записiв\n");  //ok
  printf("   5 - Добавити записи\n");  //ok
  printf("   6 - Видалити записи\n");
  printf("   7 - Показати базу з файлу\n");
  printf("   8 - Сортування записiв\n");
  printf("   0 - Завершити виконання програми\n\n"); //ok?
scanf("%d",&zx);
  if(zx==1) input();
  if(zx==2) load();
  if(zx==3) edit();
  if(zx==4) find();
  if(zx==5) add();
  if(zx==6) del();
  if(zx==7) pokaz();
  if(zx==8) sort();
  if(zx==0) exit(-1);
getch();
}

//##############################//funktsii//###############################//

 void input()    //vvedennya  (1)
 {
clrscr();
 printf("Введiть iмя файлу для збереження:");
 scanf("%s", filename);
 file=fopen(filename,"w+");
 fclose(file);
 printf("Введiть кiлькiсть студентiв:\t");
 scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("\nСтудент %d\n\t   Iмя:\t",i+1);
scanf("%s",&R[i].name);
printf("\t   Дата нароження:\t\t");
scanf("%s",&R[i].databirth);
printf("\t   Група:\t\t\t");
scanf("%s",&R[i].group);
printf("\t   Результат 1-го екзамену:\t");
scanf("%s",&R[i].ses1);
printf("\t   Результат 2-го екзамену:\t");
scanf("%s",&R[i].ses2);
printf("\t   Результат 3-го екзамену:\t");
scanf("%s",&R[i].ses3);
printf("\t   Результат 4-го екзамену:\t");
scanf("%s",&R[i].ses4);
printf("\t   Результат 5-го екзамену:\t");
scanf("%s",&R[i].ses5);
}

{
if((file=fopen(filename,"wt"))==NULL)
{
printf("Не можливо вiдкрити файл\n");
exit(0);
}
for(int j=0;j<n;j++)
{
 fprintf(file,"%s\n",R[j].name);
 fprintf(file,"%s\n",R[j].databirth);
 fprintf(file,"%s\n",R[j].group);
 fprintf(file,"%s\n",R[j].ses1);
 fprintf(file,"%s\n",R[j].ses2);
 fprintf(file,"%s\n",R[j].ses3);
 fprintf(file,"%s\n",R[j].ses4);
 fprintf(file,"%s\n",R[j].ses5);
}
fclose(file);
}

printf("\nБаза успiшно створена!\nДля повернення в головне меню натистiть будь-яку клавiшу\n");
}
/////////////////////////////////////////////////////////////////////////////

void pokaz(void)   //  pokaz bazu z file (7)
{
  int a,i;
  printf("Введiть назву файлу який хочете вiдкрити:");
  scanf("%s",filename);
  if((file=fopen(filename,"r"))==NULL)
  {
    printf("Не вдалося вiдкрити файл \nПеревiрте чи створений цей файл.\n");
    exit(-1);
  }

  a=0;
  n=0;
	  do{
    if(feof(file)){ 
break;
}
    fgets(R[a].name,19,file); 
for(i=0;i<=strlen(R[a].name);i++) {
      if(R[a].name[i]=='\n') {
        R[a].name[i]='\0';
break;
  }  
}
    fgets(R[a].databirth,19,file); 
for(i=0;i<=strlen(R[a].databirth);i++) {
      if(R[a].databirth[i]=='\n') {
	R[a].databirth[i]='\0'; 
break;
  }
}
    fgets(R[a].group,9,file);  
for(i=0;i<=strlen(R[a].group);i++) {
      if(R[a].group[i]=='\n') {
	R[a].group[i]='\0';
 break; 
  } 
}
    fgets(R[a].ses1,9,file);  
for(i=0;i<=strlen(R[a].ses1);i++) {
      if(R[a].ses1[i]=='\n') {
	R[a].ses1[i]='\0'; 
break; 
  }  
}
    fgets(R[a].ses2,9,file);  
for(i=0;i<=strlen(R[a].ses2);i++) {
      if(R[a].ses2[i]=='\n') {
	R[a].ses2[i]='\0'; 
break;
  }
}
    fgets(R[a].ses3,9,file);  
for(i=0;i<=strlen(R[a].ses3);i++) {
      if(R[a].ses3[i]=='\n') {
	R[a].ses3[i]='\0'; 
break; 
  }  
}
    fgets(R[a].ses4,9,file);  
for(i=0;i<=strlen(R[a].ses4);i++) {
      if(R[a].ses4[i]=='\n') {
	R[a].ses4[i]='\0'; 
break;
  }  
}
    fgets(R[a].ses5,9,file);  
for(i=0;i<=strlen(R[a].ses5);i++) {
      if(R[a].ses5[i]=='\n') {
	R[a].ses5[i]='\0'; 
break; 
  }  
}
      a++;
      n++;
     }while(!feof(file));
 fclose(file);
printf("\nIмя\tДата народження\tГрупа\tЕкз 1\tЕкз 2\tЕкз 3\tЕкз 4\tЕкз 5\n");
for(int f=0;f<n;f++){
  printf("%s\t",R[f].name);
  printf("%s\t",R[f].databirth);
  printf("%s\t",R[f].group);
  printf("%s\t",R[f].ses1);
  printf("%s\t",R[f].ses2);
  printf("%s\t",R[f].ses3);
  printf("%s\t",R[f].ses4);
  printf("%s\n",R[f].ses5);
}
printf("\n\tIнформацiю з файла успiшно зчитано\n Для повернення в головне меню натистiть будь-яку клавiшу\n");
}

/////////////////////////////////////////////////////////////////////////////

void load(void)     //  2
{
printf("\nIмя\tДата народження\tГрупа\tЕкз 1\tЕкз 2\tЕкз 3\tЕкз 4\tЕкз 5\n");
for(int f=0;f<n;f++){
  printf("%s\t",R[f].name);
  printf("%s\t",R[f].databirth);
  printf("%s\t",R[f].group);
  printf("%s\t",R[f].ses1);
  printf("%s\t",R[f].ses2);
  printf("%s\t",R[f].ses3);
  printf("%s\t",R[f].ses4);
  printf("%s\n",R[f].ses5);
}
printf("\n Для повернення в головне меню натистiть будь-яку клавiшу\n");
}
/////////////////////////////////////////////////////////////////////////////


void edit(void)      //redahuvannya 4
{         /////????????????????????????
int w=0,k;
printf("Введiть номер запису для редагування : ");
scanf("%d",&k);
		w=k-1;
printf("\t\tВведiть новi данi:\n");
 printf("Студент %d\t   Iмя\t\t\t\t%s",k,R[k].name);
		k=k+50;

printf("\nСтудент %d",n);
printf("\t   Iмя\t\t\t",n);
scanf("%s",&R[k].name);
printf("\t   Дата народження\t\t\t");
scanf("%s",&R[k].databirth);
printf("\t   Група\t\t\t");
scanf("%s",&R[k].group);
printf("\t   Результат 1-го екзамену\t\t");
scanf("%s",&R[k].ses1);
printf("\t   Результат 2-го екзамену\t\t");
scanf("%s",&R[k].ses2);
printf("\t   Результат 3-го екзамену\t\t");
scanf("%s",&R[k].ses3);
printf("\t   Результат 4-го екзамену\t\t");
scanf("%s",&R[k].ses4);
printf("\t   Результат 5-го екзамену\t\t");
scanf("%s",&R[k].ses5);

	R[w]=R[k];
printf("\nРедагування запису %d завершено\n Для повернення в головне меню натистiть будь-яку клавiшу\n",w+1);
}
/////////////////////////////////////////////////////////////////////////////

 char p1[20],p2[20],p3[10],p4[10],p5[10],p6[10],p7[10],p8[10];
void find(void)      //poshuk 5
{
int w=0,a=0,i,c;
int ii[100];
printf("\nВведiть число для пошуку за вiдповiдним полем запису:\n ");
  printf("\n1 - За Iмям");
  printf("\n2 - За датою народження");
  printf("\n3 - За групою");
  printf("\n4 - За екзаменом 1");
  printf("\n5 - За екзаменом 2");
  printf("\n6 - За екзаменом 3");
  printf("\n7 - За екзаменом 4");
  printf("\n8 - За екзаменом 5");
  printf("\n0 - Для повернення в головне меню\n");
  scanf("%d",&c);
    c=c+50;
if(c==50){menu();}
//////////
if(c==51)
{
	printf("\nВведiть Iмя для пошуку : ");
	scanf("%s",&p1);
	for(i=0;i<=n;i++)
	{
	 if(!strcmp(p1,R[i].name))
	 {
		w=1;
		ii[a]=i;
		a++;
	 }
	}
}

///////////
if(c==52)
{
printf("\nВведiть дату народження для пошуку : ");
scanf("%s",&p2);
 for(i=0;i<=n;i++)
 {
	if(!strcmp(p2,R[i].databirth))
	{
		w=1;
		ii[a]=i;
		a++;
	}
 }
}
//////////
if(c==53)
{
printf("\nВведiть групу для пошуку : ");
scanf("%s",&p3);
 for(i=0;i<=n;i++)
 {
 if(!strcmp(p3,R[i].group))
	{
		w=1;
		ii[a]=i;
		a++;
	}
 }
}
//////////
if(c==54)
{
printf("\nВведiть результат 1-го екзамену для пошуку : ");
scanf("%s",&p4);
	for(i=0;i<=n;i++)
	{
	if(!strcmp(p4,R[i].ses1))
	{
		w=1;
		ii[a]=i;
		a++;
	}
 }
}
///////////////
if(c==55)
{
printf("\nВведiть результат 2-го екзамену для пошуку : ");
scanf("%s",&p5);
	for(i=0;i<=n;i++)
	{
	if(!strcmp(p5,R[i].ses2))
	{
		w=1;
		ii[a]=i;
		a++;
	}
 }
}
////////////////
if(c==56)
{
printf("\nВведiть результат 3-го екзамену для пошуку : ");
scanf("%s",&p6);
	for(i=0;i<=n;i++)
	{
	if(!strcmp(p6,R[i].ses3))
	{
		w=1;
		ii[a]=i;
		a++;
	}
 }
}
/////////////////////////
if(c==57)
{
printf("\nВведiть результат 4-го екзамену для пошуку : ");
scanf("%s",&p7);
	for(i=0;i<=n;i++)
	{
	if(!strcmp(p7,R[i].ses4))
	{
		w=1;
		ii[a]=i;
		a++;
	}
 }
}
////////////////////
if(c==58)
{
printf("\nВведiть результат 5-го екзамену для пошуку : ");
scanf("%s",&p8);
	for(i=0;i<=n;i++)
	{
	if(!strcmp(p8,R[i].ses5))
	{
		w=1;
		ii[a]=i;
		a++;
	}
 }
}

			if(w==1)
			{
		 for(i=0;i<a;i++)
		 {
			printf("\nСтудент %d\nIмя\tДата Народження\tГрупа\tЕкзамен 1\tЕкзамен 3\tЕкзамен 3\tЕкзамен 4\tЕкзамен 5\n",ii[i]+1);
			printf("%s\t",R[ii[i]].name);
			printf("%s\t",R[ii[i]].databirth);
			printf("%s\t",R[ii[i]].group);
			printf("%s\t",R[ii[i]].ses1);
			printf("%s\t",R[ii[i]].ses2);
			printf("%s\t",R[ii[i]].ses3);
			printf("%s\t",R[ii[i]].ses4);
			printf("%s",R[ii[i]].ses5);
		 }
		}
		else{
		 printf("\nНемає такого запису в базi даних\n");}
printf("\n Для повернення в головне меню натистiть будь-яку клавiшу\n");
}
//////////////////////////////////////////////////////////////////////////////

void add()             //dobavlennya 6
{
n++;
file=fopen(filename,"a");
printf("\nСтудент %d\n\t   Iмя\t\t\t\t",n);
scanf("%s",&R[n-1].name);
fprintf(file,"%s\n",R[n-1].name);
printf("\t   Дата народження\t\t\t");
scanf("%s",&R[n-1].databirth);
fprintf(file,"%s\n",R[n-1].databirth);
printf("\t   Група\t\t\t");
scanf("%s",&R[n-1].group);
fprintf(file,"%s\n",R[n-1].group);
printf("\t   Результат 1-го екзамену\t\t");
scanf("%s",&R[n-1].ses1);
fprintf(file,"%s\n",R[n-1].ses1);
printf("\t   Результат 2-го екзамену\t\t");
scanf("%s",&R[n-1].ses2);
fprintf(file,"%s\n",R[n-1].ses2);
printf("\t   Результат 3-го екзамену\t\t");
scanf("%s",&R[n-1].ses3);
fprintf(file,"%s\n",R[n-1].ses3);
printf("\t   Результат 4-го екзамену\t\t");
scanf("%s",&R[n-1].ses4);
fprintf(file,"%s\n",R[n-1].ses4);
printf("\t   Результат 5-го екзамену\t\t");
scanf("%s",&R[n-1].ses5);
fprintf(file,"%s\n",R[n-1].ses5);
fclose(file);
printf("\nДо даної бази успiшно добавлено %d-ий запис\n Для повернення в головне меню натистiть будь-яку клавiшу\n",n);
}
//////////////////////////////////////////////////////////////////////////////

void del(void)   //sterty zapys 7
{
 int pov,i,k;
	 printf("Ви дiйсно хочете знищити запис?? Якщо ТАК, натиснiть 0 та натиснiть ENTER");
	 printf("\nДля повернення в головне меню введiть число вiдмiнне вiд числа '0': ");
	 scanf("%d",&pov);

if(pov==0)
{
printf("\nВведiть номер поля який потрiбно видалити: ");
////////???????????????????????????????????????prymitka/////////////////////
scanf("%d",&k);
if(k!=n)
{    /******/
 for(i=k-1;i<n-1 ;i++)
 {
	R[i]=R[i+1];
 }
}   /******/
else
{   /////
R[k-1].name[0]=0;
R[k-1].databirth[0]=0;
R[k-1].group[0]=0;
R[k-1].ses1[0]=0;
R[k-1].ses2[0]=0;
R[k-1].ses3[0]=0;
R[k-1].ses4[0]=0;
R[k-1].ses5[0]=0;
}  /////
 n--;
 printf("\nЗапису %d бiльше не iснує\n",k);
 printf("Для повернення в головне меню натистiть будь-яку клавiшу\n");
}


else{menu();}
}      
///////////////////////SORT///////////////////////////

void sort(void)      //sort
{
int w=0,a=0,i,c;
int ii[100];
printf("\nВведiть число для сотування за вiдповiдним полем запису:\n ");
  printf("\n1 - За Iмям");
  printf("\n2 - За датою народження");
  printf("\n3 - За групою");
  printf("\n4 - За екзаменом 1");
  printf("\n5 - За екзаменом 2");
  printf("\n6 - За екзаменом 3");
  printf("\n7 - За екзаменом 4");
  printf("\n8 - За екзаменом 5");
  printf("\n0 - Для повернення в головне меню\n");
  scanf("%d",&c);
    c=c+50;
if(c==50){menu();}
//////////
if(c==51)
{
	printf("\nВведiть поле для сортування : ");
	scanf("%s",&p1);
	for(i=0;i<=n;i++)
	{
	 if(!strcmp(p1,R[i].name))
	 {
		w=1;
		ii[a]=i;
		a++;
	 }
	}
}
}
    //kinets programmu
Там где void sort(void) там должна быть сортировка.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.12.2008, 21:14     Сортировка массива структур
Посмотрите здесь:

Сортировка массива структур - C++
Не могу понять как отсортировать массив структур по убыванию, попробовал несколько алгоритмов,но не получается....программа должна выводить...

Сортировка массива структур - C++
Дана структура WORKER и массив из 10 стркутур. Нужно 1)сортировать список 2) вывести на экран рабочих чей стаж больше числа введённого с...

Сортировка массива структур - C++
Разьясните пожалуйста в как можно поступить по другому. Не выделяя, как у меня дополнительный массив. #include&lt;iostream&gt; const...

Сортировка массива структур - C++
Имеется массив структур, который необходимо отсортировать по числовому ключу. Я написал код, но он не работает, поэтому просьба указать на...

Сортировка массива структур - C++
Имеется структура : struct Data_base { string team_name; string city; int scored_goals; int missed_goals;...

Сортировка массива структур - C++
Здравствуйте! Помогите пожалуйста реализовать сортировку массива структур по полю &quot;date&quot; (все записи должны быть отсортированны по дате)....

Сортировка массива структур... - C++
Здравствуйте! Не могли бы вы выложить примеры или кинуть ссылочку на интересную статью по сортировке массива структур. Имеется массив...

Сортировка массива структур - C++
Ругается на использование структуры, соответственно не работает вся программа. Задача: отсортировать массив по типу культур. struct...

Сортировка массива структур - C++
Разработать программу, реализующую сортировку массива структур (50 элементов). В качестве элемента массива выбрать структуру,...

Сортировка массива структур - C++
Есть файл с текстом(this is spartaaaaaa!), нужно посчитать количество повторений каждого символа, вывести все это в консоль, затем...

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

Сортировка массива структур - C++
Господа есть массив структур, необходимо его отсортировать по полю name с помощью функции qsort. Вроде как написал без ошибок, но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.12.2008, 23:35     Сортировка массива структур #2
Код
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define asize(a)  (sizeof (a) / sizeof (a)[0])

typedef struct {
    char s1[100];
    char s2[100];
    char s3[100];
} Unit;

/* сортирует структуры по выбранному полю */
main()
{
    int unitcmp_s1(Unit *, Unit *);
    int unitcmp_s2(Unit *, Unit *);
    int unitcmp_s3(Unit *, Unit *);
    int (*fp)(Unit *, Unit *);
    int i;
    Unit arr[] = {
        { "A", "B", "C" },
        { "C", "C", "B" },
        { "D", "D", "A" },
        { "B", "A", "D" }
    };
    
    fp = &unitcmp_s2;   /* выбор поля */
    
    for (i = 0; i < asize(arr); i++)
        printf("%s %s %s\n", arr[i].s1, arr[i].s2, arr[i].s3);
    putchar('\n');
    qsort(arr, asize(arr), sizeof arr[0],
        (int (*)(const void *, const void *)) fp);
    for (i = 0; i < asize(arr); i++)
        printf("%s %s %s\n", arr[i].s1, arr[i].s2, arr[i].s3);
    return 0;
}

/* unitcmp_s1:  сравнивает поля s1 структур u1 и u2 */
int unitcmp_s1(Unit *u1, Unit *u2)
{
    return strcmp(u1->s1, u2->s1);
}

/* unitcmp_s2:  сравнивает поля s2 структур u1 и u2 */
int unitcmp_s2(Unit *u1, Unit *u2)
{
    return strcmp(u1->s2, u2->s2);
}

/* unitcmp_s3:  сравнивает поля s3 структур u1 и u2 */
int unitcmp_s3(Unit *u1, Unit *u2)
{
    return strcmp(u1->s3, u2->s3);
}
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru