Advertisement
Guest User

Untitled

a guest
Nov 19th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.16 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. // отладочный вывод, иногда это удобно
  7. void print_word(const char* word, int n) {
  8.     putc('\n', stderr);
  9.     for (int i = 0; i < n; ++i) {
  10.         fwrite(word + n * i, 1, n, stderr);
  11.         putc('\n', stderr);
  12.     }
  13. }
  14.  
  15.  
  16.  
  17. void sort_strings(char* word, int n)
  18. {
  19.     // Я не понял как оно работает. Но это можно написать короче
  20.     //char *s1 = malloc(sizeof(char)*n);
  21.     //char *s2 = malloc(sizeof(char)*n);
  22.     //int mis = 1;
  23.  
  24.     //while (mis != 0)
  25.     //{
  26.     //    printf("s1 = %s, s2 = %s, mis = %d\n", s1, s2, mis);
  27.     //    print_word(word, n);
  28.     //  mis = 0;
  29.     //  for (int i = 0; i < (n-1); i++)
  30.     //  {
  31.     //      for (int j = 0; j < n; j++)
  32.     //      {
  33.     //          *(s1+j) = *(word + i*n + j);
  34.     //          *(s2+j) = *(word + (i + 1)*n + j);
  35.     //      }
  36.  
  37.     //      if (strcmp(s1, s2) > 0)
  38.     //      {
  39.     //          mis = mis + 1;
  40.     //          for (int j = 0; j < n; j++)
  41.     //          {
  42.     //              *(word + i*n + j) = *(s2+j);
  43.     //              *(word + (i + 1)*n + j) = *(s1+j);
  44.     //          }
  45.     //      }
  46.     //  }
  47.     //}
  48.     //free(s1);
  49.     //free(s2);
  50.  
  51.     qsort(word, n, n, strcmp);
  52. }
  53.  
  54.  
  55. enum { MAX_STR_SIZE = 50 };     // Константы удобно объявлять отдельно
  56.  
  57. int main()
  58. {
  59.     char str[MAX_STR_SIZE];
  60.     //int i = 0, j, n, k; // этих переменных здесь вообще не должно быть
  61.                           // можно писать так:
  62.                           // for (int i = 0; i < smth; ++i) - переменная int i внутри цикла
  63.                           // если указать ключ компиляции -std=c99
  64.  
  65.  
  66.     //  Это можно написать короче:
  67.     //for (i = 0; i < MAX_STR_SIZE; i++)
  68.     //{
  69.     //  s[i] = '>';
  70.     //}
  71.     //num = 0;
  72.     memset(str, '>', MAX_STR_SIZE);
  73.  
  74.  
  75.     // Это тоже
  76.     //scanf("%c", &s[0]);
  77.     //while (s[num] != '\n')
  78.     //{
  79.     //  num++;
  80.     //  scanf("%c", &s[num]);
  81.     //}
  82.     fgets(str, MAX_STR_SIZE, stdin);
  83.     int str_size = strlen(str);
  84.  
  85.     //num = num;      // ЛОЛШТО?
  86.  
  87.  
  88.     printf("%d\n", str_size);
  89.     str[str_size - 1] = '~';
  90.     //n = num+1;    // str_size == num + 1
  91.  
  92.     // И это
  93.     //for (int i = 0; i < str_size; i++)
  94.     //{
  95.     //  printf("%c", s[i]);
  96.     //}
  97.     //printf("\n");
  98.     printf("%s\n", str);
  99.  
  100.  
  101.     char* word = malloc(sizeof(char) * str_size * str_size);      // sizeof(char) == 1 всегда
  102.     // По-хорошему, нужно выделять (str_size + 1) * str_size памяти, чтобы в конец каждой строки
  103.     // можно было дописать нуль-символ. Это позволит использовать стандартные функции
  104.     // (например, strcmp), не боясь выйти за пределы массива. Ну или можно заменять '\n' на '\0', а
  105.     // не на '~', будет то же самое.
  106.     // (сейчас strcmp используется не совсем корректно, если входная строка состоит только
  107.     // из символов '~', программа может упасть (а может и не упасть, это как повезёт))
  108.  
  109.     for (int i = 0; i < str_size; i++)
  110.     {
  111.         for (int j = i; j < str_size; j++)
  112.         {
  113.             *(word + str_size*i + j) = str[j - i];
  114.         }
  115.         for (int k = 0; k < i; k++)
  116.         {
  117.             *(word + str_size*i + k) = str[str_size - i + k];
  118.         }
  119.     }
  120.  
  121.     print_word(word, str_size); // посмотрим, как оно выглядело до сортировки
  122.     sort_strings(word, str_size);
  123.     print_word(word, str_size); // и после
  124.  
  125.     //char* preob = malloc(sizeof(char)*n);
  126.     char* encoded_str = malloc(sizeof(char) * str_size);
  127.     for (int i = 0; i < str_size; i++)
  128.     {
  129.         //*(preob + i) = *(word + i*n + (n - 1));
  130.         encoded_str[i] = word[i*str_size + (str_size - 1)];   // так[] тоже можно
  131.         //printf("%c", *(preob + i));
  132.     }
  133.     printf("\n%s\n", encoded_str);
  134.     //printf("\n");
  135.  
  136.     free(encoded_str);
  137.     free(word);
  138.     // system("Pause"); //вингую, что это Windows-специфичная дичь
  139.     return 0;
  140. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement