По заданному тексту сформировать список слов, состоящих только из букв русского либо латинского алфавита - C (СИ)

Узнай цену своей работы

Формулировка задачи:

задание: По заданному тексту сформировать список слов, состоящих только из букв русского либо латинского алфавита. Для русских букв используется кодировка Кириллица-DOS. Упорядочить полученный список слов по алфавиту. Количество имен в списке заранее не известно. проверьте код:
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. int main(void)
  6. {
  7. char *a =(char *)malloc(512*sizeof(char)),*temp2,*ptr;
  8. char **str=(char **)malloc(512*sizeof(char));
  9. int k=0,w,h;
  10. double *b =(double *)malloc(k*sizeof(double)),q,min,temp;
  11. fflush(stdin);
  12. fgets(a, 512, stdin);
  13. str[k]=(char *)malloc(512*sizeof(char));
  14. ptr = str[k];
  15. for(unsigned int i=0;i<strlen(a);i++)
  16. {
  17. if ((a[i]!=' ') && (i!=strlen(a)-1))
  18. {
  19. *ptr++ = a[i];
  20. }
  21. else
  22. {
  23. *ptr = '\0';
  24. k++;
  25. str[k]=(char *)malloc(512*sizeof(char));
  26. ptr = str[k];
  27. }
  28. }
  29. for (int i = 0;i<k;i++)
  30. {
  31. q = 100;
  32. b[i] = 0;
  33. for (unsigned int j = 0;j<strlen(str[i]) ;j++)
  34. {
  35. h=str[i][j];
  36. if (h>='a') h-=('a'-'A');
  37. b[i] += (h * q);
  38. q /= 1000;
  39. }
  40. }
  41. for(int i = 0 ;i<k-1;i++)
  42. {
  43. min = 1e308;
  44. for(int j = i;j<k;j++)
  45. {
  46. if (b[j] < min)
  47. {min = b[j];
  48. w = j;
  49. }
  50. }
  51. temp=b[i];
  52. b[i]=b[w];
  53. b[w]=temp;
  54. temp2=str[i];
  55. str[i]=str[w];
  56. str[w]=temp2;
  57. }
  58. for (int i=0;i<k;i++)
  59. printf("%s\n",str[i]);
  60. getch();
  61. return 0;
  62. }

Решение задачи: «По заданному тексту сформировать список слов, состоящих только из букв русского либо латинского алфавита»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <ctype.h>
  4. #define BUFSIZE  32
  5. char*  s_copy(char* dst, const char* src);
  6. char*  s_token(char* dst, char* str);
  7.  
  8. typedef struct _node {
  9.   char buf[BUFSIZE];
  10.   struct _node*  next;
  11. } node;
  12.  
  13. node* add(node* lst, const char* str);
  14. node* move(node* iter, node* lst);
  15. node* sort_abc(node* lst);
  16. void  clear(node* lst);
  17.  
  18.  
  19. int  main(void) {
  20.   node*  lst  = NULL;
  21.   node*  iter = NULL;
  22.   char*  ptr;
  23.   char  buf[BUFSIZE];
  24.   char  str[512] = "World, zex, apple, ZED:cool-ART, xor, nots, BIOS.";
  25.   // gets(str);
  26.  
  27.   // разбиваем строку на слова добавляя в список
  28.   for(ptr = s_token(buf, str); ptr; ptr = s_token(buf, ptr))
  29.       lst = add(lst, buf);
  30.  
  31.   // сортируем список по-алфавиту
  32.   lst = sort_abc(lst);
  33.  
  34.   // выводим список в консоль
  35.   while((iter = move(iter, lst)) != NULL)
  36.       puts(iter->buf);
  37.  
  38.   // удаляем список
  39.   clear(lst);
  40.   lst = NULL;
  41.   getchar();
  42.   return 0;
  43. }
  44.  
  45. // добавление списка по FIFO(первым пришёл, первым вышел) или в хвост
  46. node*  add(node* lst, const char* str) {
  47.    node* ptr = (node*) malloc(sizeof(node));
  48.    s_copy(ptr->buf, str);
  49.    if(! lst) {
  50.         lst = ptr;
  51.         lst->next = lst;
  52.     } else {
  53.         ptr->next = lst->next;
  54.         lst = lst->next = ptr;
  55.     }
  56.     return lst;
  57. }
  58.  
  59. // передвижение по списку от начало до конца(в право)
  60. node* move(node* iter, node* lst) {
  61.     if(iter == NULL)
  62.          return lst->next;
  63.     if(iter == lst)
  64.          return NULL;
  65.     return iter->next;
  66. }
  67.  
  68. // удаление всего списка с освобождением динамической памяти
  69. void clear(node* lst) {
  70.    node* tmp;
  71.    while(1) {
  72.        if(lst == lst->next) {
  73.             free(lst);
  74.             return;
  75.        }
  76.        tmp = lst->next;
  77.        lst->next = tmp->next;
  78.        free(tmp);
  79.    }
  80. }
  81.  
  82. // сортировка списка методом пузырка(примитивный способ)
  83. node* sort_abc(node* lst) {
  84.   int repeat;
  85.   char buf[BUFSIZE];
  86.   node* ia, *ib;
  87.   do {
  88.        repeat = 0;
  89.        for(ia = lst->next, ib = lst->next->next; ib != lst->next; ia = ia->next, ib = ib->next) {
  90.             if(toupper(ia->buf[0]) > toupper(ib->buf[0])) {
  91.                   s_copy(buf, ia->buf);
  92.                   s_copy(ia->buf, ib->buf);
  93.                   s_copy(ib->buf, buf);
  94.                   repeat = 1;
  95.             }
  96.         }
  97.    } while(repeat);
  98.    return lst;
  99. }
  100.  
  101. // аналог стандартной функции (strcpy)
  102. char*  s_copy(char* dst, const char* src) {
  103.    char* tmp = dst;
  104.    while( *dst++ = *src++);
  105.    return tmp;
  106. }
  107.  
  108. //циклическая функция по разбивки строки на слова :alnum:=alpha+digit
  109. char*  s_token(char* dst, char* ptr) {
  110.     char* tmp = dst;
  111.     while(! isalnum(*ptr) && *ptr)
  112.            *ptr++;
  113.     do {
  114.            *dst++ = *ptr++;
  115.     } while(isalnum(*ptr) && *ptr);
  116.     *dst = '\0';
  117.     return (*tmp) ? ptr : NULL;
  118. }

Объяснение кода листинга программы

  1. Создание списка, состоящего только из букв русского либо латинского алфавита, представленных в виде слов, по заданному тексту.
  2. Разбивка строки на слова с использованием функции s_token.
  3. Добавление каждого слова в список с использованием функции add.
  4. Сортировка списка по-алфавиту с использованием функции sort_abc.
  5. Вывод списка на консоль с использованием цикла while и функции move.
  6. Удаление списка с использованием функции clear.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы