Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2017
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.02 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <memory.h>
  4. #define MAX_CHAR 1024
  5.  
  6. int isVozr(char *ch, int dlinna);
  7. int isUbyv(char *ch, int dlinna);
  8. void sort(char *arr, int size);
  9. void Print2(char **slova, int n, int * m);
  10. void toBinFile(char **slova, int n, int * m);
  11. void fromBinFile(char ***slova, int *n, int ** m);
  12. int kolSlov(char *text);
  13. void analiz (int n, int * m, char ** slova);
  14. void allocmem(char * text, int n, char *** slova, int ** m);
  15. void analiz (int n, int * m, char ** slova);
  16. void sortVozr (int n, int * m, char ** slova2);
  17. void sortUbiv (int n, int * m, char ** slova2);
  18.  
  19. int main()
  20. {
  21.     system("chcp 1251 > NUL");
  22.     printf("\nЛабораторная работа №6 \
  23.         \nВыполнил студент гр. Хайкин Р.А. \
  24.         \nЗадание: Заполнить двумерный массив (каждая строка массива заполняется в\
  25.          соответствии с заданием по теме №5).\
  26.         \nОпределите, в каких словах буквы расположены в порядке возрастания их кодов,\
  27.         \nв каких в порядке убывания, и прочие слова.\
  28.         \nРазместите эти слова в отдельные массивы.\
  29.         \nПроизведите сортировку полученных массивов.\
  30.         \nДля контроля результата сделайте распечатку массивов,\
  31.         \nв том числе исходного. ");
  32.     puts("");
  33.  
  34.     char text[MAX_CHAR]; // массив символов
  35.     char ** slova, ** slova2, ** slovaVozr, ** slovaUbiv;
  36.     int n = 0, n2 = 0; // количество слов
  37.     int * m, *m2; // количество букв в словах
  38.     int * mVozr;
  39.     int * mUbiv;
  40.     int i, j = 0; //счетсики
  41.     int nach_slova = 0; //начало слова в предложениии
  42.  
  43.  
  44.     printf("\n\nВведите текст slova[%c]");  // ввод предложения с клавиатуры
  45.     gets(&text);  // сканирование введенного текста
  46.     printf("введеный текст: %s\n", text);  // распечатка введенного текста
  47.     //for (i = 0; i < strlen(text); i++)   // считаем количество слов в предложении
  48.       //  if (!isalpha(text[i]))
  49.         //    n++;
  50.     //n++;
  51.     n = kolSlov(text);
  52.  
  53.     printf("Количество слов n=%i", n);
  54.  
  55.     allocmem(text, n, &slova, &m);
  56.     allocmem(text, n, &slovaVozr, &mVozr);
  57.     allocmem(text, n, &slovaUbiv, &mUbiv);
  58.  
  59.     //slova = (char**)calloc(n, sizeof(char*)); // выделяем память под слова
  60.     //m = (int *)malloc(sizeof(int) *n);
  61.     //j = 0;
  62.     //for (i = 0; i <= strlen(text); i++)
  63.     //{
  64.       //  if (!isalpha(text[i]))
  65.         //{
  66.           //  m[j] = i - nach_slova; //вычисляем длинны слов
  67.             //slova[j] = (char*)calloc(m[j], sizeof(char)); // выделяем память для них
  68.             //memcpy(slova[j], &text[nach_slova], m[j]); // копируем найденное слово
  69.             //j++;
  70.             //nach_slova = i + 1; //увеличивается счетчик слов
  71.         //}
  72.     //}
  73.     printf("\nВеденые слова:\n");
  74.     analiz (n, m, slova);
  75.  
  76.     // в двоичный файл
  77.     toBinFile(slova, n, m);
  78.  
  79.     // из двоичного
  80.     fromBinFile(&slova2, &n2, &m2);
  81.  
  82.     printf("\nСчитанные из бинарного файла слова:\n");
  83.     Print2(slova2, n2, m2);
  84.  
  85.     //for (i = 0; i < n2; i++)
  86.     //{
  87.       //  printf("Строка %d, элементов %d: ", i, m2[i]); //распечатка введеных слов по одному.
  88.         //for (j = 0; j < m2[i]; j++)
  89.           //  printf("%c", slova2[i][j]);
  90.         //printf("\n");
  91.         //if (isVozr(slova2[i], m2[i]))
  92.             //printf("Слово расположено в порядке возростания кодов\n\n");
  93.         //if (isUbyv(slova2[i], m2[i]))
  94.             //printf("Слово расположено в порядке убывания кодов\n\n");
  95.     //}
  96.     printf("\nСортировка слов по возрастанию\n\n");
  97.     sortVozr(n , mVozr, slovaVozr);
  98.     print(n, mVozr, slovaVozr);
  99.  
  100.     printf("\nСортировка слов по убыванию\n\n");
  101.     sortUbiv(n, mUbiv, slovaUbiv);
  102.     print (n, mUbiv, slovaUbiv);
  103.     //for (i = 0; i < n2; i++)
  104.     //{
  105.         //sort(slova2[i], m2[i]);
  106.     //}
  107.     Print2(slova2, n2, m2);
  108.  
  109.     // освобождение памяти
  110.     for (i = 0; i < n; i++)
  111.     {
  112.         free(slova[i]);
  113.         free(slova2[i]);
  114.     }
  115.     free(slova);
  116.     free(slova2);
  117.     free(m);
  118.     free(m2);
  119.     system("pause");
  120.     return 0;
  121. }
  122.  
  123. int kolSlov(char * text)
  124. {
  125.     int i;
  126.     int n = 0;
  127.     for (i = 0; i < strlen(text); i++)   // считаем количество слов в предложении
  128.         if (!isalpha(text[i]))
  129.             n++;
  130.     n++;
  131.  
  132.     return n;
  133. }
  134.  
  135. void allocmem(char * text, int n, char *** slova, int ** m)
  136. {
  137.     int i;
  138.     int j;
  139.     int nach_slova = 0;
  140.  
  141.     *slova = (char**)calloc(n, sizeof(char*)); // выделяем память под слова
  142.     *m = (int *)malloc(sizeof(int) *n);
  143.     j = 0;
  144.     for (i = 0; i <= strlen(text); i++)
  145.     {
  146.         if (!isalpha(text[i]))
  147.         {
  148.             (*m)[j] = i - nach_slova; //вычисляем длинны слов
  149.             (*slova)[j] = (char*)calloc((*m)[j], sizeof(char)); // выделяем память для них
  150.             memcpy((*slova)[j], &text[nach_slova], (*m)[j]); // копируем найденное слово
  151.             j++;
  152.             nach_slova = i + 1; //увеличивается счетчик слов
  153.         }
  154.     }
  155. }
  156.  
  157.  
  158. int isVozr(char *ch, int dlinna) // функция по возрастанию
  159. {
  160.     int i;
  161.     for (i = 1; i < dlinna; i++)
  162.         if (ch[i - 1] > ch[i])
  163.             return 0;
  164.     return 1;
  165. }
  166.  
  167.  
  168. int isUbyv(char *ch, int dlinna) // функция по убыванию
  169. {
  170.     int i;
  171.     for (i = 1; i < dlinna; i++)
  172.         if (ch[i - 1] < ch[i])
  173.             return 0;
  174.     return 1;
  175. }
  176.  
  177. void sort(char *arr, int size)
  178. {
  179.     char temp; // временная переменная для обмена элементов местами
  180.     int i;
  181.     int j;
  182.  
  183.     // Сортировка массива пузырьком
  184.     for (i = 0; i < size - 1; i++)
  185.     {
  186.         for (j = 0; j < size - i - 1; j++)
  187.         {
  188.             if (arr[j] > arr[j + 1])  // если сменить знак, то сортировка будет по убыванию.
  189.             {
  190.                 // меняем элементы местами
  191.                 temp = arr[j];
  192.                 arr[j] = arr[j + 1];
  193.                 arr[j + 1] = temp;
  194.             }
  195.         }
  196.     }
  197. }
  198. // Распечатка одномерного массива
  199. void Print(char m[], int n)
  200. {
  201.     int i;
  202.     for (i = 0; i<n; i++)
  203.         printf("%2c", m[i]);
  204. }
  205.  
  206. void Print2(char ** slova, int Nr, int * m)
  207. {
  208.     int i;
  209.     for (i = 0; i<Nr; i++)
  210.     {
  211.         Print(slova[i], m[i]); // распечатка одномерного массива
  212.         printf("\n");
  213.     }
  214. }
  215.  
  216. void toBinFile(char ** slova, int n, int * m)
  217. {
  218.     int i,j;
  219.     FILE *out = NULL;
  220.     out = fopen("file.bin", "wb");
  221.     fwrite(&n, sizeof(int), 1, out);
  222.     for (i = 0; i<n; i++)
  223.         fwrite(&m[i], sizeof(int), 1, out);
  224.     for (i = 0; i<n; i++)
  225.         for (j = 0; j<m[i]; j++)
  226.             fwrite(&slova[i][j], sizeof(char), 1, out);
  227.     fclose(out);
  228. }
  229.  
  230. void fromBinFile(char *** slova, int *n, int ** m)
  231. {
  232.     int i, j;
  233.     FILE *in = NULL;
  234.     in = fopen("file.bin", "rb");
  235.     fread(&(*n), sizeof(int), 1, in);
  236.     *slova = (char**)calloc((*n), sizeof(char*)); // выделяем память под слова
  237.     *m = (int *)malloc(sizeof(int) * (*n));
  238.  
  239.     for (i = 0; i < *n; i++)
  240.     {
  241.         fread(&((*m)[i]), sizeof(int), 1, in);
  242.     }
  243.     for (i = 0; i < *n; i++)
  244.     {
  245.         (*slova)[i] = (char*)calloc((*m)[i], sizeof(char)); // выделяем память для них
  246.         for (j = 0; j < (*m)[i]; j++)
  247.         {
  248.             fread(&((*slova)[i][j]), sizeof(char), 1, in);
  249.         }
  250.     }
  251.     fclose(in);
  252. }
  253.  
  254. void analiz (int n, int * m, char **slova)
  255. {
  256.     int i;
  257.     int j;
  258.  
  259.     for (i = 0; i < n; i++)
  260.     {
  261.         printf("Строка %d, элементов %d: ", i, m[i]); //распечатка введеных слов по одному.
  262.         for (j = 0; j < m[i]; j++)
  263.             printf("%c", slova[i][j]);
  264.         printf("\n");
  265.         if (isVozr(slova[i], m[i]))
  266.             printf("Слово расположено в порядке возростания кодов\n\n");
  267.         if (isUbyv(slova[i], m[i]))
  268.             printf("Слово расположено в порядке убывания кодов\n\n");
  269.     }
  270. }
  271.  
  272. void sortVozr (int n, int * m, char ** slova2)
  273. {
  274.     int i;
  275.     int j;
  276.  
  277.     for (i = 0; i < n; i++)
  278.     {
  279.         sortVz(slova2[i], m[i]);
  280.     }
  281. }
  282.  
  283. void sortUbiv (int n, int * m, char ** slova2)
  284. {
  285.     int i;
  286.     int j;
  287.  
  288.     for (i = 0; i < n; i++)
  289.     {
  290.         sortUb(slova2[i], m[i]);
  291.     }
  292. }
  293.  
  294. void analiz (int n, int * m, char **slova)
  295. {
  296.     int i;
  297.     int j;
  298.  
  299.     for (i = 0; i < n; i++)
  300.     {
  301.         printf("Строка %d, элементов %d: ", i, m[i]); //распечатка введеных слов по одному.
  302.         for (j = 0; j < m[i]; j++)
  303.             printf("%c", slova[i][j]);
  304.         printf("\n");
  305.         if (isVozr(slova[i], m[i]))
  306.             printf("Слово расположено в порядке возростания кодов\n\n");
  307.         if (isUbyv(slova[i], m[i]))
  308.             printf("Слово расположено в порядке убывания кодов\n\n");
  309.     }
  310. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement