Advertisement
xeritt

Сортировка строк по длине первого слова и перестановки

Jul 12th, 2017
305
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAX_LEN 1024 /* максимальная длина строки */
  5.  
  6. int inp_str(char *string, int maxlen){
  7.     char buffer[MAX_LEN];
  8.     scanf("%[^\n]", buffer); // читаем строку в буфер
  9.     getchar();
  10.     strncpy(string, buffer, maxlen); //копируем maxlen
  11.     size_t len = strlen(buffer);
  12.     return (int)len;
  13. }
  14.  
  15. int inp_str2(char**string, int maxlen){
  16.     char buffer[MAX_LEN];
  17.     char bufflen[MAX_LEN];
  18.     sprintf(bufflen, "%%%ds", maxlen);
  19.     scanf(bufflen, buffer); // читаем строку в буфер
  20.     size_t len = strlen(buffer);
  21.     *string = (char *)malloc(sizeof(char)*len); //выделяем память для строки
  22.     strcpy(*string, buffer); //копируем строку из буфера в массив указателей
  23.     return (int)len;
  24. }
  25. char** readMas(int count, char **mas, int maxlen){
  26.     for (int i = 0; i < count ; i++){
  27.         mas[i] = (char *)malloc(sizeof(char)*maxlen); //выделяем память для строки
  28.         inp_str(mas[i], maxlen);
  29.     }
  30.     return mas;
  31. }
  32.  
  33. void printMas(char **mas, int count){
  34.     for (int i = 0; i < count ; i++){
  35.         printf("%s\n", mas[i]);
  36.     }
  37. }
  38.  
  39. void freeMas(char **mas, int count){
  40.     for (int i = 0; i < count; i++){
  41.         free(mas[i]); // освобождаем память для отдельной строки
  42.     }
  43.     free(mas); // освобождаем памать для массива указателей на строки
  44. }
  45.  
  46. int getLenFirst(char *str){
  47.     int len = 0;
  48.     for (int i = 0; i < strlen(str); i++)
  49.     {
  50.         if (str[i]!=' '){
  51.             len++;
  52.         } else{
  53.             break;
  54.         }
  55.     }
  56.     return len;
  57. }
  58.  
  59. static int cmpstringp2(const void *p1, const void *p2){
  60.     int len1 = getLenFirst(*(char * const*)p1);
  61.     int len2 = getLenFirst(*(char * const*)p2);
  62.     return len2 - len1;
  63. }
  64.  
  65. static int cmpstringp(const void *p1, const void *p2){
  66.     char *pp1, *pp2;
  67.     char buff1[MAX_LEN];
  68.     char buff2[MAX_LEN];
  69.     strcpy(buff1, *(char * const*)p1);
  70.     strcpy(buff2, *(char * const*)p2);
  71.     pp1 = strtok (buff1, " ");
  72.     pp2 = strtok (buff2, " ");
  73.     int len = strlen(pp2)- strlen(pp1);
  74.     return len;
  75. }
  76.  
  77. int bubleSort(char **mas, int n){
  78.  int c = 0;
  79.  int d = 0;
  80.  int swichcount = 0;
  81.  char *swap;
  82.   for (c = 0 ; c < ( n - 1 ); c++){
  83.     for (d = 0 ; d < n - c - 1; d++){
  84.       if (getLenFirst(mas[d+1]) > getLenFirst(mas[d])){
  85.         swap     = mas[d];
  86.         mas[d]   = mas[d+1];
  87.         mas[d+1] = swap;
  88.         swichcount++;
  89.       }
  90.     }
  91.   }
  92.   return swichcount;
  93. }
  94.  
  95. int main(int argc, char **argv){
  96.     char **mas = NULL; //указатель на массив указателей на строки
  97.     int count = 3;
  98.     mtrace();
  99.     printf("Введите кол-во строк:");
  100.     scanf("%d", &count);
  101.     getchar();
  102.     mas = (char **)malloc(sizeof(char *)*count);// выделяем память для массива указателей
  103.     mas = readMas(count, mas, MAX_LEN);
  104.    // qsort(mas, count, sizeof(char *), cmpstringp2);
  105.     int swichcount = bubleSort(mas, count);
  106.  
  107.     printMas(mas, count);
  108.     printf("Кол-во перестановок:");
  109.     printf("%d\n", swichcount);
  110.     freeMas(mas, count);
  111. }
Advertisement
RAW Paste Data Copied
Advertisement