Z
zorra123
почти все работает, но есть маленький недочет, сортировка происходит только по фамилии, т.е. предположим, есть 2 человека с одинаковыми фамилиями, то моя программа их не отсортирует, та же фигня, если и фамилия и имя одинаковы, должна происходить сортировка по отчеству, но и она не фурычит. использовал алгоритм qsort(но не через стандартную функцию)
P.S. через qsort как функцию уже вбитую в си, написал, все збс робит, но это не по заданию(
P.S. через qsort как функцию уже вбитую в си, написал, все збс робит, но это не по заданию(
C++:
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;
struct people
{
char surname[70];
char name[70];
char otchestvo[70];
int nomer;
};
void swap(people *a, people *b)
{
people t;
t = *a, *a = *b, *b = t;
}
int compare (const void *p1,const void *p2)
{
struct people* ps1 = (struct people*)p1;
struct people* ps2 = (struct people*)p2;
if (strcmp(ps1->surname,ps2->surname)==0)
if(strcmp(ps1->name,ps2->name)==0)
return strcmp(ps1->otchestvo,ps2->otchestvo);
else return strcmp(ps1->name,ps2->name);
else return strcmp(ps1->surname,ps2->surname);
}
void qs(people* a, int l, int r)
{
int high = r, low = l;
int m = (r + l)/2;
do {
while(compare(&a[l],&a[m])==-1) l++;
while(compare(&a[r],&a[m])==1) r--;
if(l <= r)
{
swap(&a[l],&a[r]);
l++; r--;
}
} while(l <= r);
if(high > l) qs(a, l, high);
if(low < r) qs(a,low, r);
}
int main(void)
{
int d =0,c=1, k=0,x=0,n_u =0,n_a=1;
FILE *in = fopen("H:/data.txt","r");
if (in==NULL )
{
printf ("No file");
return 1;
}
people* mas = (people*)malloc(sizeof(people)*1);
for (;;)
{
if (n_u>=n_a)
if (people *mas2 = (people*) realloc(mas, sizeof(people)*(n_a*2)))
{
mas=mas2;
n_a*=2;
}
else if (people *mas2 = (people*) realloc(mas, sizeof(people)*(n_a+1)))
{
mas=mas2;
n_a++;
}
if (fscanf(in, "%20s %20s %20s %i", mas[n_u].surname, mas[n_u].name, mas[n_u].otchestvo, &mas[n_u].nomer) == 4)
n_u++;
else
break;
}
qs(mas,0,n_u);
for(int i =0; i<n_u; i++)
{
printf("%s %s %s %i \n", mas[i].surname, mas[i].name, mas[i].otchestvo,mas[i].nomer);
}
fclose(in);
return 0;
}