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

Тема в разделе "Общие вопросы по С и С++", создана пользователем Gera, 17 май 2007.

  1. Gera

    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&copy;
    {
    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 КБ
      Просмотров:
      53
  2. SunSanych

    SunSanych Well-Known Member

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

    Gera Гость

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

    Folderx Гость

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

    SunSanych Well-Known Member

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

    Gera Гость

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

    SunSanych Well-Known Member

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

    Folderx Гость

    Код (Text):
    LIST studentu[Nm];
    void Sortirovka(LIST a[], int n, int p)
    Код (Text):
    case '3': /*sortirovka*/
    Sortirovka(studentu,n,p);
    break;
    Код (Text):
    a[j]=b[j];
    Почему здесь передаётся не как Sortirovka(&studentu,n,p) и почему в определении не Sortirovka(LIST (*a)[], int n, int p).
    В функцию надо передавать указатель на структуру, в данном случае если это массив структур, то передавать надо указатель на массив структур.
    ;)
     
Загрузка...
Похожие Темы - Цифровая(поразрядная) сортировка
  1. vera2014
    Ответов:
    0
    Просмотров:
    1.070
  2. Liori
    Ответов:
    2
    Просмотров:
    1.005
  3. FCDK
    Ответов:
    0
    Просмотров:
    1.264
  4. ленарано
    Ответов:
    1
    Просмотров:
    1.103
  5. Creder
    Ответов:
    0
    Просмотров:
    1.345

Поделиться этой страницей