По заданному тексту сформировать список слов, состоящих только из букв русского либо латинского алфавита - 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.