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

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

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

задание: По заданному тексту сформировать список слов, состоящих только из букв русского либо латинского алфавита. Для русских букв используется кодировка Кириллица-DOS. Упорядочить полученный список слов по алфавиту. Количество имен в списке заранее не известно. проверьте код:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
 
int main(void)
{
    char *a =(char *)malloc(512*sizeof(char)),*temp2,*ptr;
    char **str=(char **)malloc(512*sizeof(char));
    int k=0,w,h;
    double *b =(double *)malloc(k*sizeof(double)),q,min,temp;
 
    fflush(stdin);
    fgets(a, 512, stdin);
 
    str[k]=(char *)malloc(512*sizeof(char));
    ptr = str[k];
 
    for(unsigned int i=0;i<strlen(a);i++)
    {
        if ((a[i]!=' ') && (i!=strlen(a)-1))
        {
            *ptr++ = a[i];
        }
        else 
        {
            *ptr = '\0';
            k++;
            str[k]=(char *)malloc(512*sizeof(char));
            ptr = str[k];
        }
    }
 
    for (int i = 0;i<k;i++)
    {
        q = 100;
        b[i] = 0;
 
        for (unsigned int j = 0;j<strlen(str[i]) ;j++)
        {
            h=str[i][j];
            if (h>='a') h-=('a'-'A');
            b[i] += (h * q);
            q /=  1000;
        }
    }
 
    for(int  i = 0 ;i<k-1;i++)
    {
        min = 1e308;
        for(int j = i;j<k;j++)
        {
            if (b[j] < min) 
            {min = b[j];
            w = j;
            }
        }
 
        temp=b[i];
        b[i]=b[w];
        b[w]=temp;
 
        temp2=str[i];
        str[i]=str[w];
        str[w]=temp2;
    } 
 
    for (int i=0;i<k;i++)
        printf("%s\n",str[i]);
 
    getch();
    return 0;
}

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

textual
Листинг программы
#include <stdio.h>
#include <malloc.h>
#include <ctype.h>
#define BUFSIZE  32
char*  s_copy(char* dst, const char* src);
char*  s_token(char* dst, char* str);
 
typedef struct _node {
  char buf[BUFSIZE];
  struct _node*  next;
} node;
 
node* add(node* lst, const char* str);
node* move(node* iter, node* lst);
node* sort_abc(node* lst);
void  clear(node* lst);
 
 
int  main(void) {
  node*  lst  = NULL;
  node*  iter = NULL;
  char*  ptr;
  char  buf[BUFSIZE];
  char  str[512] = "World, zex, apple, ZED:cool-ART, xor, nots, BIOS.";
  // gets(str);
 
  // разбиваем строку на слова добавляя в список
  for(ptr = s_token(buf, str); ptr; ptr = s_token(buf, ptr)) 
      lst = add(lst, buf);
 
  // сортируем список по-алфавиту
  lst = sort_abc(lst);
 
  // выводим список в консоль
  while((iter = move(iter, lst)) != NULL)
      puts(iter->buf);
 
  // удаляем список
  clear(lst);
  lst = NULL;
  getchar();
  return 0;
}
 
// добавление списка по FIFO(первым пришёл, первым вышел) или в хвост
node*  add(node* lst, const char* str) {
   node* ptr = (node*) malloc(sizeof(node));
   s_copy(ptr->buf, str);
   if(! lst) {
        lst = ptr;
        lst->next = lst;
    } else {
        ptr->next = lst->next;
        lst = lst->next = ptr;
    }
    return lst;
}
 
// передвижение по списку от начало до конца(в право)
node* move(node* iter, node* lst) {
    if(iter == NULL) 
         return lst->next;
    if(iter == lst) 
         return NULL;
    return iter->next;
}
 
// удаление всего списка с освобождением динамической памяти
void clear(node* lst) {
   node* tmp;
   while(1) {
       if(lst == lst->next) {
            free(lst);
            return;
       }
       tmp = lst->next;
       lst->next = tmp->next;
       free(tmp);
   }
}
 
// сортировка списка методом пузырка(примитивный способ)
node* sort_abc(node* lst) {
  int repeat;
  char buf[BUFSIZE];
  node* ia, *ib;
  do {
       repeat = 0;
       for(ia = lst->next, ib = lst->next->next; ib != lst->next; ia = ia->next, ib = ib->next) {
            if(toupper(ia->buf[0]) > toupper(ib->buf[0])) {
                  s_copy(buf, ia->buf);
                  s_copy(ia->buf, ib->buf);
                  s_copy(ib->buf, buf);
                  repeat = 1;
            }
        }
   } while(repeat);
   return lst;
}
 
// аналог стандартной функции (strcpy)
char*  s_copy(char* dst, const char* src) {
   char* tmp = dst;
   while( *dst++ = *src++);
   return tmp;
}
 
//циклическая функция по разбивки строки на слова :alnum:=alpha+digit
char*  s_token(char* dst, char* ptr) {
    char* tmp = dst;
    while(! isalnum(*ptr) && *ptr)
           *ptr++;
    do {
           *dst++ = *ptr++;
    } while(isalnum(*ptr) && *ptr);
    *dst = '\0';
    return (*tmp) ? ptr : NULL;
}

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

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

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


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

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

7   голосов , оценка 4 из 5
Похожие ответы