Цифровая(поразрядная) сортировка

  • Автор темы Gera
  • Дата начала
G

Gera

Программа не выдает ошибок при компиляции, но на сортировку вообщу не реагирует. Нужна именно реализация цифровой сортировки.
Умные люди, посмотрите, может, что глупое в коде найдете.
[codebox]
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define LIST struct list
#define Nm 100
#define Nmax 30
#define M 8
LIST
{
char Name[Nmax];
int year;
int month;
int day;
};
LIST studentu[Nm];
int maxday[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int n;
void FormList() /*formirovanie spiska*/
{
int i;
printf("Vvedite kolichestvo studentov: ");
do
scanf("%d",&n);
while(n<0 || n>Nm);
for (i=0; i<n; i++)
{
printf("%d.Vvedite familiu i inicialu studenta: ",i+1);
scanf("%s",studentu.Name);
printf("Vvedite god rojdeniya: ");
scanf("%d",&studentu.year);
printf("Vvedite mesyac rojdeniya: ");
scanf("%d",&studentu.month);
printf("Vvedite den' rojdeniya: ");
scanf("%d",&studentu.day);
}
}
int Nomercifru(int k, int m, int lp) /*k-число, m-номер цифры в числе, lp-максимальное количество цифр*/
{
int lpm,q,i0,it;
float d;
lpm=lp-m+1;
q=10;
for (it=1; it<lpm; it++)
{
q=q*10;
}
i0=(int)k/q;
d=1.0*k/q;
return((int)((d-i0)*10));
}
void Sortirovka(LIST a[], int n, int p)
{
int i,j,j0,l,m;
int s[10];
LIST b[Nm];
for (m=p; m>0; m--)
{
for(i=0; i<10; i++)
{
s=0;
}
for(j=0; j<n; j++)
{
l=Nomercifru(a[j].year,m,p);
s[l]++;
}
for (i=1; i<10; i++)
{
s+=s[i-1];
}
for(j0=1; j0<=n; j0++)
{
j=n-j0+1;
l=Nomercifru(a[j-1].year,m,p);
i=s[l]-1;
b=a[j-1];
s[l]--;
}
for (j=0; j<n; j++)
{
a[j]=b[j];
}
}
return;
}
void PrintList(int n) /*pechat' spiska*/
{
int i;
printf(" # Familiya i inicialu God rojdeniya Mesyac rojdeniya Den' rojdeniya\n");
for (i=0; i<n; i++)
printf(" %-6d%-22s%-16d%-16d%-2d\n", i+1, studentu.Name, studentu.year, studentu.month, studentu.day);
}
main()
{
int c,p;
clrscr();
do
{
window(1,1,80,80);
gotoxy(1,1);puts("1.Formirovanie spiska studentov odnogo kursa");
gotoxy(1,2);puts("2.Pechat' spiska");
gotoxy(1,3);puts("3.Sortirovka");
gotoxy(1,4);puts("4.Vuhod");
c=getch();
window(1,6,80,80);
clrscr();
switch©
{
case '1':
FormList(); /*formirovanie spiska*/
clrscr();
break;
case '2':
PrintList(n); /*pechat' spiska*/
getch();
clrscr();
break;
case '3': /*sortirovka*/
Sortirovka(studentu,n,p);
break;
case '4': /*vuhod*/
break;
}
}while (c>'0' && c<'4');
return c;
}
[/codebox]
 

Вложения

  • STUDENTU.CPP
    2,5 КБ · Просмотры: 371
S

SunSanych

Первое, что бросилось в глаза это не инициализируемая переменная p передаётся в функцию Sortirovka. Правда может в прикреплённом файле всё нормально, не смотрел.
А при компиляции должно выводится предупреждение, а не ошибка, что переменная используется без инициализации, если конечно эта функция не отключена или ещё чего. В Borlandе не скажу, а в MS VisualC предупреждения выводятся при компиляции после изменения кода, если повторить компиляцию предупреждения появляться не будут до следующего изменения кода.
 
G

Gera

Это я случайно не исправила, но даже если поставить в объявлении функции вместо параметра р цифру 4, то сортировка происходит как бы только у двух чисел, которые стоят не на своем месте, т.е. как будто сортируется один раз. :)
 
F

Folderx

А вы как структуру передаёте в функцию
Код:
a[j]=b[j];
Почему нет указателя
 
S

SunSanych

Зря ты Gera на себя наговариваешь, всё работает. Надо просто смотреть что ты в функцию передаёшь. Например при вызове функции Sortirovka с параметрами n=4, p=4 всё работает.
Если конечно сортировка по дате - это то, что требуется :D .
 
G

Gera

А вы как структуру передаёте в функцию
Я что-то не поняла суть вопроса, у меня и массив а, и массив b оба структуры. И в функции параметром является структура.
Например при вызове функции Sortirovka с параметрами n=4, p=4 всё работает.
Спасибо за подсказку, в принципе я переделала прогу с другой сортировкой. Но у меня вопрос, как можно ограничивать n=4, ведь n - это глобальная переменная, к тому же значение n зависит от того, сколько записей я сформирую? ;)
 
S

SunSanych

Пока n не константа её можно инициализировать где угодно. А на счет зависимости от кол-ва записей, то это зависит от того, откуда они берутся. Если из БД, то там есть функции возвращающие кол-во записей в таблице, если их пользователь вводит, то можно подсчитать, сколько он их ввёл, или придумать какой-нибудь признак конца (например последний элемент полностью нулевой).
 
F

Folderx

Я что-то не поняла суть вопроса, у меня и массив а, и массив b оба структуры. И в функции параметром является структура.
Код:
LIST studentu[Nm];
void Sortirovka(LIST a[], int n, int p)
Код:
case '3': /*sortirovka*/
Sortirovka(studentu,n,p);
break;
Код:
a[j]=b[j];

Почему здесь передаётся не как Sortirovka(&studentu,n,p) и почему в определении не Sortirovka(LIST (*a)[], int n, int p).
В функцию надо передавать указатель на структуру, в данном случае если это массив структур, то передавать надо указатель на массив структур.
;)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!