Вывести на экран все слова, состоящие только из латинских букв - C (СИ)
Формулировка задачи:
З клавіатури вводиться текстовий рядок. Розробити програму, яка реалізує вказані дії.
а) підраховує кількість чисел у тексті (не цифр, а саме чисел);
б) виводить на екран всі слова, що складаються тільки з латинських літер;
в) видаляє кожне друге слово.
--------------------------------------------------------------------------------------------------------------------------------
С клавиатуры вводится строка . Разработать программу , которая реализует указанные действия .
а ) подсчитывает количество цифр в тексте ( не цифры , а именно чисел) ;
б) выводит на экран все слова , состоящие только из латинских букв ;
в) удаляет каждое второе слово.
Решение задачи: «Вывести на экран все слова, состоящие только из латинских букв»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <locale.h>
#define N 256
int v_Slove(char *ps)
{
char d[]=" .,;:!?\n\0";
char *pa=ps;
int i;
for(i=0;i<9;i++)
{
if(*pa==d[i])return 0;
}
return 1;
}
int kol_simv(char *ps)
{
int c=0;
char *pps=ps;
while(v_Slove(pps))
{
c++;
pps++;
}
return c;
}
int chislo(char *ch)
{
return (*ch>='0'&&*ch<='9');
}
int nachalo_chisla(char * ch)
{
return (chislo(ch)&&(!chislo(ch-1)));
}
int kol_chisel_v_texte(char *ps)
{
int i,c;
for(i=0,c=0;ps[i]!='\0';i++)
{
if(nachalo_chisla(&ps[i]))
{
while(chislo(&ps[i++]));
c++;i--;
}
}
return c;
}
int latin_bukva(char *lat)
{
return ((*lat>='\x61')&&(*lat<='\x7a'))||((*lat>='\x41')&&(*lat<='\x5a'));
}
int slovo_is_latin_bukv(char *ps)
{
char*pps=ps;
int c=kol_simv(ps);
while(v_Slove(pps)&&latin_bukva(pps))
{
--c;
pps++;
}
return (c==0)?1:0;
}
void vivod_slov_is_lat_bukv(char *a)
{
int i;
char *n;
for(i=0;a[i]!='\0';i++)
{
if(v_Slove(&a[i])&&(i==0||!v_Slove(&a[i-1])))
{
if(slovo_is_latin_bukv(&a[i]))
{
n=&a[i];
while(v_Slove(n))
{
printf("%c",*n);
n++; i++;
}
printf("\n");
}
}
}
}
char *udal_kazd_2_slovo(char *a)
{
int c,i;
char *k;
for(i=0,c=1;a[i]!='\0';i++)
{
if(v_Slove(&a[i])&&(i==0||!v_Slove(&a[i-1])))
{
if(c%2==0)
{
k=&a[i]+kol_simv(&a[i]);
a[i]='\0';
strcat(&a[i],k);
}
c++;
}
}
return a;
}
int main(void)
{
setlocale(LC_ALL,"RU");
char A[N]=" арвр swap, папа мыл no 345 2пол и 3три fgbvff. ";
printf("Исходная строка: %s\n",A);
printf("Количество чисел в тексте: %d\n",kol_chisel_v_texte(A));
vivod_slov_is_lat_bukv(A);
printf("Строка с удалённым каждым вторым словом: %s\n",udal_kazd_2_slovo(A));
return (0);
}
Объяснение кода листинга программы
- Переменная
dобъявлена как массив символов, который содержит символы, обозначающие окончания слов в русском языке. - Функция
v_Sloveпроверяет, является ли текущий символ окончанием слова. - Функция
kol_simvсчитает количество символов в слове, которые не являются окончаниями. - Функция
chisloпроверяет, является ли символ числом. - Функция
nachalo_chislaпроверяет, является ли текущий символ началом числа. - Функция
kol_chisel_v_texteсчитает количество чисел в тексте. - Функция
latin_bukvaпроверяет, является ли символ латинской буквой. - Функция
slovo_is_latin_bukvпроверяет, является ли слово латинским. - Функция
vivod_slov_is_lat_bukvвыводит на экран все слова, состоящие только из латинских букв. - Функция
udal_kazd_2_slovoудаляет каждое второе слово в строке. - В функции
mainзадается исходная строка и выполняются все функции.