//Программа создает файл строк. Признак окончания ввода - ввод пустой строки.
//Слово - это последовательность русских букв. Между словами не менее одного
//пробела. Затем строки считываются и программа печатает те слова из каждой
//строки, которые содержат равное количество гласных и согласных букв.
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
const FNAME = "C:\\stroka.txt\0"; //имя файла объявлено константой
void make_file(char *fname); //создание файла
void pro_verka(char *fname); //чтение и обработка строк файла
int glasn(char ch); //проверка на гласность
int so_glasn(char ch); //проверка на согласность
void main()
{clrscr();
char fname[20] = FNAME;
make_file(fname);
pro_verka(fname);
}
//Функция проверяет, является ли символ гласной русской буквой
int glasn(char ch)
{static char gl[] = "АаЕеИиОоУуЫыЭэЮюЯя\0";
int i = 0;
while(gl[i] && gl[i]!= ch)
i++;
if(gl[i])
return(1); //значит буква - гласная
else return(0); //значит буква - не гласная
}
//Функция проверяет, является ли символ согласной русской буквой
int so_glasn(char ch)
{static char so_gl[] = "БбВвГгДдЖжЗзКкЛлМмНнПпРрСсТтФфХхЦцЧчШшЩщ\0";
int i = 0;
while(so_gl[i] && so_gl[i]!= ch)
i++;
if(so_gl[i])
return(1); //значит буква - согласная
else return(0); //значит буква - не согласная
}
//Функция создания текстового файла
void make_file(char *fname)
{unsigned char st[80]; //исходная строка
FILE *in; //текстовый файл
puts("\nСоздание файла");
puts("После ввода каждой строки нажмите <Enter>.");
puts("Признак окончания ввода - ввод пустой строки\n");
//Открываем файл в режиме записи (w) текста (t)
//Если файл с таким именем уже есть, то новые данные
//будут дописаны поверх старых
if((in = fopen(fname, "wt")) == NULL)
{printf("Ошибка открытия файла для записи. Нажмите <Enter>");
getchar();
exit(0);
}
printf("Введите строку и нажмите <Enter>\n");
printf("->");
gets(st); //функция вводит всю строку, включая
//пробелы и символ \n
while(strlen(st)!= 0)
{fprintf(in, "%s\n", st);
printf("\nВведите строку и нажмите <Enter>\n");
printf("->");
gets(st);
}
fclose(in); //закрываем файл
}
//читаем и обрабатываем строки файла
void pro_verka(char *fname)
{FILE *in; //текстовый файл
unsigned char st[80]; //исходная строка
unsigned char sr[80]; //результирующая строка
unsigned char pr[80]; //обрабатываемое слово
int i,j,k; //номер обрабатываемого символа
int gl = 0; //число гласных букв в слове
int sogl = 0; //число согласных букв в слове
int ok; //признак гласной (согласной) буквы
int n; //длина результирующей строки
int m; //максимально возможная длина строки
//Открываем файл в режиме чтения (r) текста (t)
if((in = fopen(fname, "rt")) == NULL)
{printf("Ошибка открытия файла для чтения");
getchar();
exit(0);
}
printf("\nРезультат:\n");
m = 80;
fgets(st,m,in); //читаем строку файла
while(!feof(in))
{i = 0;
n = 0;
sr[i] = '\0';
while(st[i]) //обрабатываем строку
{k = 0;
while(st[i]!= ' ' && st[i+1]) //копируем слово
{pr[k] = st[i];
k++;
i++;
}
pr[k] = '\0';
j = 0; //обрабатываем слово
gl = 0;
sogl = 0;
while(pr[j])
{ok = glasn(pr[j]); //считаем гласные
if(ok)
gl++;
ok = so_glasn(pr[j]); //считаем согласные
if(ok)
sogl++;
j++;
}
if(gl == sogl)
{for(j = 0; j < k; j++,n++)
sr[n] = pr[j];
if(st[i])
sr[n] = ' ';
n++;
}
i++;
}
sr[n] = '\0';
printf("\n%s",sr);
fgets(st,m,in);
}
fclose(in); //Закрываем файл
printf("\nДля завершения нажмите <Enter>");
getch();
}