Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2013, 21:08   #1
Vasya94
Пользователь
 
Регистрация: 20.04.2013
Сообщений: 55
По умолчанию Модуль пользователя на Си

Создать модуль, содержащий алгоритмы пирамидального сортировки массива и файла. Продемонстрировать возможности модуля на примерах.
Vasya94 вне форума Ответить с цитированием
Старый 05.12.2013, 18:47   #2
Vasya94
Пользователь
 
Регистрация: 20.04.2013
Сообщений: 55
По умолчанию

Что никто не может помочь?
Vasya94 вне форума Ответить с цитированием
Старый 06.12.2013, 00:01   #3
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

Цитата:
Модуль пользователя на Си
Вот тебе накидал простенький пример, а модуль "космического аппарата" сам сделаешь

Код:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <malloc.h>
#define TOKCCH    ",.;:+\t\n\r !?\\/|=*\"'@#$%^&~`[]()<>-{}"\
                         "0123456789"
#define MAX_WORDS  1024

int  _stricmp(const char* s1, const char* s2);
void  swap(char** a, char** b);
void  heapify(char* arr[], int a, int b, int (*cmp)(const char*, const char*));
void  hsort(char* arr[], int cnt, int (*cmp)(const char*, const char*));

// компаратор для лексикографического сравнения в алфавитном порядке
int compare(const char* a, const char* b) {
#ifdef __GNUC__
      return -_stricmp(a, b);
#else
     return -stricmp(a, b);
#endif
}



int main(void){
   char* p, *buf;
   int   i, n;
   long  len;
   char* ws[MAX_WORDS];
 
   FILE* fp = fopen("открываем любой текстовый файл", "rt");
   if(fp == NULL)
        return 1;
   fseek(fp, 0L, SEEK_END);
   len = ftell(fp);
   fseek(fp, 0L, SEEK_SET);

   buf = (char*)malloc((size_t)len + 1);
   if(buf == NULL) {
        fclose(fp);
        return 2;
   }
   len = (long)fread(buf, sizeof(char), (size_t)len, fp);
   buf[len] = '\0';
   fclose(fp);

   // парсим слова
   n = 0;
   for(p = strtok(buf, TOKCCH); p != NULL; p = strtok(NULL, TOKCCH)){
         if(n < MAX_WORDS)
               ws[n++] = p;
         else
               break;
   }

   // сортируем без копирования строк, только обмениваем указатели
   hsort(ws, n, compare);

   // выводим слова
  for(i = 0; i < n; i++)
       printf("%s\n", ws[i]);

   free(buf);
   getchar();
   return 0;
}


// обмен xchg
void swap(char** a, char** b){
    char* p = *a;
    *a = *b;
    *b = p;
}


// функция для восстановления свойства бинарной кучи
void  heapify(char* arr[], int a, int b, int (*cmp)(const char*, const char*)) {
    register int cl = 0;
    register int k  = a * 2;
    while(k < b){
          if(k == b)
               cl = k;
          else if((*cmp)(arr[k], arr[k + 1]) <= 0)
               cl = k;
          else
               cl = k + 1;

          if((*cmp)(arr[a], arr[cl]) > 0){
                 swap(&arr[a], &arr[cl]);
                 a = cl;
                 k = a * 2;
          } else
                break;
     }
}


// сама пирамидальная сортировка
void hsort(char* arr[], int cnt, int (*cmp)(const char*, const char*)){
     int i;
     // в начале из массива делаем make-heap
     for(i = cnt/2-1; i >= 0; i--)
           heapify(arr, i, cnt, cmp);

     //pop_max/pop_min
     for(i = cnt - 1; i >= 0; i--) {
           swap(&arr[0], &arr[i]);
           heapify(arr, 0, i - 1, cmp);
     }
}


// собственный вариант stricmp для gcc
int  _stricmp(const char* s1, const char* s2) {
      while(*s1 && *s2 && !(tolower(*s1) - tolower(*s2))) {
           ++s1;
           ++s2;
      }
      return (tolower(*s1) - tolower(*s2));
}
Nuklon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработать модуль пользователя igagogi Помощь студентам 1 26.12.2012 07:34
Создать собственный модуль и программу, использующую этот модуль. Oraner Паскаль, Turbo Pascal, PascalABC.NET 2 02.12.2012 13:15
Типизированные файлы, модуль Crt, Модуль Graph Kate_Fleur Помощь студентам 1 06.05.2010 17:43
Модуль пользователя Iceman92 Помощь студентам 1 25.03.2010 18:21
Turbo Pascal 7.0 - модуль пользователя Sanyco-007 Помощь студентам 1 09.12.2009 20:14