По заданному тексту сформировать список слов, состоящих только из букв русского либо латинского алфавита - 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;
- }
Объяснение кода листинга программы
- Создание списка, состоящего только из букв русского либо латинского алфавита, представленных в виде слов, по заданному тексту.
- Разбивка строки на слова с использованием функции
s_token
. - Добавление каждого слова в список с использованием функции
add
. - Сортировка списка по-алфавиту с использованием функции
sort_abc
. - Вывод списка на консоль с использованием цикла
while
и функцииmove
. - Удаление списка с использованием функции
clear
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д