380 lines
12 KiB
C
380 lines
12 KiB
C
#include "head.h"
|
||
|
||
|
||
int queryinput(int *x, int *inquery, int *query){
|
||
setlocale(LC_ALL, "");
|
||
|
||
//INPUT-------------------------------------------------
|
||
wint_t ch;
|
||
*inquery = 0;
|
||
while((ch=getwchar())!='\n'&&ch!='\t'&&ch!=' '&&*inquery<QUERYMAX){
|
||
*(query+*inquery)=(int)ch;
|
||
(*inquery)++;
|
||
}
|
||
//______________________________________________________
|
||
|
||
if(ch == WEOF)return -1;
|
||
|
||
//COUNT -------------------------------------------------
|
||
int c=0;
|
||
|
||
if(ch=='\n')x[2]++;
|
||
else if(ch=='\t')x[3]++;
|
||
else if(ch==' ')x[4]++;
|
||
|
||
while (c < *inquery)
|
||
{
|
||
int sym = query[c];
|
||
if ((sym >= L'а' && sym <= L'я') ||
|
||
(sym >= L'А' && sym <= L'Я'))
|
||
{
|
||
x[0]++;
|
||
c++;
|
||
continue;
|
||
}
|
||
if (sym >= L'0' && sym <= L'9')
|
||
{
|
||
x[1]++;
|
||
c++;
|
||
continue;
|
||
}
|
||
if (sym > 32 && sym <= 47) {
|
||
x[sym - 28]++;
|
||
c++;
|
||
continue;
|
||
}
|
||
if (sym > 58 && sym <= 64) {
|
||
x[sym - 38]++;
|
||
c++;
|
||
continue;
|
||
}
|
||
x[33]++;
|
||
c++;
|
||
}
|
||
//________________________________________________________
|
||
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
void func1 (char **f, int *x,int inquery, int *query){
|
||
switch(funcReturn(f[2])){
|
||
case 1://Определяет среднюю длину слова в тексте
|
||
{
|
||
if(x[32]){
|
||
x[30]/=x[31];
|
||
printf("\n\tСредняя длинна слова - %d",x[30]);
|
||
count(x);
|
||
}
|
||
else{
|
||
x[30]+=inquery;
|
||
x[31]++;
|
||
}
|
||
break;
|
||
}
|
||
|
||
case 2://Подсчитывает количество слов, длина которых не превышает 5 символов.
|
||
{
|
||
if(x[32]){
|
||
printf("\n\tВсего слов <5 букв - %d",x[30]);
|
||
}
|
||
else if(inquery<5)x[30]++;
|
||
break;
|
||
}
|
||
|
||
case 3://Определяет количество букв после первого и до последнего слова.
|
||
{
|
||
if(x[31]);
|
||
else {x[30]-=x[0];x[31]=1;}
|
||
if(x[32]){x[30]+=x[0];printf("\n\tКолл-во букв после 1 и до последнего слова - %d",x[30]);}
|
||
break;
|
||
}
|
||
case 4://Удаляет первую букву каждого слова и выводит результат.
|
||
{
|
||
if(x[32]);
|
||
else
|
||
put(1,x,inquery,query);
|
||
break;
|
||
}
|
||
|
||
case 5://определяет, сколько в заданном тексте слов, начинающихся с буквы,заданной пользователем.
|
||
{
|
||
if(x[32])
|
||
printf("\n\t Слов начинающихся на %c - %d",f[4][0],x[30]);
|
||
else
|
||
if(query[0]==f[3][0])x[30]++;
|
||
break;
|
||
}
|
||
case 6://находит сумму всех цифр в введенном предложении. (если в тексте нетцифр, добавить) предусмотреть обработку шаблонов (12word, wo12rd,word12)
|
||
{
|
||
if(x[32])
|
||
printf("\n\t Найти сумму всех цифр - %d",x[31]);
|
||
else
|
||
for(int i=0;i<inquery;i++){
|
||
if(query[i]>='0'&&query[i]<='9'){
|
||
x[30]=(x[30]*100)+(query[i]-'0');
|
||
}
|
||
}
|
||
x[31]+=x[30];
|
||
x[30]=0;
|
||
break;
|
||
}
|
||
|
||
case 7:// вставляет восклицательный знак в конце каждой строки текста.
|
||
{
|
||
if(x[32]);
|
||
else{
|
||
if(query[inquery-1]=='\n'){
|
||
if(query[inquery-2]=='!'||query[inquery-2]=='?'||query[inquery-2]=='.'||query[inquery-2]==',')
|
||
query[inquery-2]='!';
|
||
else {query[inquery-1]='!';query[inquery]='\n';}
|
||
x['!'-28]++;inquery++;}
|
||
put(0,x,inquery,query);
|
||
}
|
||
break;
|
||
}
|
||
|
||
case 8://проверяет заканчивается ли каждая строка точкой и добавляет ее при необходимости, считает сколько точек было добавлено
|
||
{
|
||
if(x[32]);
|
||
else{
|
||
if(query[inquery-1]=='\n'){
|
||
if(query[inquery-2]=='!'||query[inquery-2]=='?'||query[inquery-2]=='.'||query[inquery-2]==',')
|
||
query[inquery-2]='.';
|
||
else {query[inquery-1]='.';query[inquery]='\n';}
|
||
x['!'-28]++;inquery++;}
|
||
put(0,x,inquery,query);
|
||
}
|
||
break;
|
||
}
|
||
|
||
case 9://определяет сколько раз в введенной строке встречается слово,заданное пользователем.
|
||
{
|
||
if(x[32])
|
||
printf("\n\t Слово %s встречается - %d раз",f[4],x[30]);
|
||
else{
|
||
if(last(inquery,query))inquery--;
|
||
x[30]+=strquery(f[3],query);}
|
||
break;
|
||
}
|
||
|
||
case 10://подсчитывает количество букв в каждом втором слове.
|
||
{
|
||
x[34] = x[0] - x[33];
|
||
if(x[32]){
|
||
x[31]=x[33]-x[31];
|
||
printf("\n\t Сумма букв в четных словах - %d",x[31]);
|
||
}
|
||
else{
|
||
if(x[30]%2==0)
|
||
x[31]+=x[34];
|
||
x[33]+=x[33];
|
||
x[30]++;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
printf("\nFunc output:");
|
||
switch(funcReturn(f[2])){
|
||
case 1: //Подсчитывает, сколько слов начинается с последней буквы первого слова.
|
||
{
|
||
if(x[32]){
|
||
printf("\n\t Количество букв начинающихся с %c - %d",x[32],x[34]);
|
||
}
|
||
else if(!(x[31])){x[31]=0;x[33]=query[inquery-1];}
|
||
else{if (query[0]==x[33]){x[34]++;}}
|
||
break;
|
||
}
|
||
case 2: //Подсчитывает, сколько слов имеют указанную пользователем длину.
|
||
{
|
||
if(x[32])printf("\n\t Слов имеющих указанную длинну - %d",x[30]);
|
||
else{
|
||
if(last(inquery,query))inquery--;
|
||
if(strquery(f[3],query))x[30]++;
|
||
break;}
|
||
}
|
||
case 3: //Печатает самое длинное слово в тексте.
|
||
{
|
||
int ch[20];
|
||
if(x[32]){printf("\n\t")}
|
||
else{
|
||
if(x[31]<include)
|
||
x[31]=inquery;
|
||
}
|
||
break;
|
||
}
|
||
case 4: //Подсчитывает количество знаков препинания (не букв и не цифр).
|
||
{
|
||
if(x[32]){printf("Знаков препинания: %d",x[5]+x[16]+x[18]+x[25]);
|
||
break;
|
||
}
|
||
case 5: //Сортирует текст в порядке возрастания
|
||
{
|
||
break;
|
||
}
|
||
case 6: // Находит слова с тире во введенном тексте.
|
||
{
|
||
break;
|
||
}
|
||
case 7: //Вычисляет количество слов между первой и последней запятой во введенном тексте
|
||
{
|
||
break;
|
||
}
|
||
case 8: //Находит два соседних слова, начинающихся с большой буквы
|
||
{
|
||
break;
|
||
}
|
||
case 9: //Сортирует строку в тексте по убыванию
|
||
{
|
||
break;
|
||
}
|
||
case 10://Заменяет в каждом слове повторяющиеся буквы на '–'
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
void func3 (char **f, int *x,int inquery, int *query){
|
||
switch(funcReturn(f[2])){
|
||
case 1: //Реверсирует слово. Пример: Привет ->тевирП
|
||
{
|
||
put(inquery-1,x,0,query);
|
||
break;
|
||
}
|
||
case 2: //Делит слово на два и меняет начало с концом. Пример: жук -> кжу,солнце -> нцесол
|
||
{
|
||
break;
|
||
}
|
||
case 3: //После каждой гласной буквы вставляется буква 'c' и гласная повторяется. Пример: кот ->косот.
|
||
{
|
||
break;
|
||
}
|
||
case 4: //Каждая буква в слове заменяется на ее позицию в алфавите. Пример: кот ->121620, обработать только буквы.
|
||
{
|
||
break;
|
||
}
|
||
case 5: //Заменяет буквы верхнего регистра на буквы нижнего и наоборот. Пример: Привет -> пРИВЕТ.
|
||
{
|
||
break;
|
||
}
|
||
case 6: //Заменяет буквы на их двоичное представление из таблицы ASCII.Пример: кот ->101010101010111011100010
|
||
{
|
||
break;
|
||
}
|
||
case 7: /*Заменяет букву на заданное смещение в пределах алфавита (шифр
|
||
Цезаря), смещение задаётся параметром и может быть положительным или
|
||
отрицательным. Пример: кот 3 -> нсх, кот -3 -> злп*/
|
||
{
|
||
break;
|
||
}
|
||
case 8: //Делит слово на два и оставляет большую часть. Пример: жук -> к, солнце -> сол
|
||
{
|
||
break;
|
||
}
|
||
case 9: //Делит слово на два и оставляет меньшую часть. Пример: жук -> жу, солнце -> нце
|
||
{
|
||
break;
|
||
}
|
||
case 10://Превращает русский текст в транслит русского текста. Пример кот ->kot, жук -> zhuk
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
int last(int inquery,int *query){
|
||
if((query[inquery-1]=='.') ||
|
||
(query[inquery-1]==',') ||
|
||
(query[inquery-1]=='!') ||
|
||
(query[inquery-1]=='?')) {
|
||
return 1;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
|
||
void put(int i,int *x,int inquery,int *query){
|
||
|
||
if(i<inquery)
|
||
for(;i<inquery;i++)
|
||
putwchar(query[i]);
|
||
|
||
if(i>inquery)
|
||
for(;i>inquery;i--)
|
||
putwchar(query[i]);
|
||
|
||
if(x[30]!=x[2]){putwchar('\n');}
|
||
if(x[31]!=x[3]){putwchar('\t');}
|
||
if(x[33]!=x[4]){putwchar(' ');}
|
||
x[30]=x[2];
|
||
x[31]=x[3];
|
||
x[33]=x[4];
|
||
}
|
||
|
||
|
||
void count(int *x){
|
||
int sum = 0;
|
||
printf("\nStatistic");
|
||
printf("\n\t \"Symb\" - [ammount]\n");
|
||
printf("\n\t \"Letters\" - [%d]",x[0]);
|
||
printf("\n\t \"Digits\" - [%d]",x[1]);
|
||
printf("\n\t \"\\n\" - [%d]",x[2]);
|
||
printf("\n\t \"\\t\" - [%d]",x[3]);
|
||
printf("\n\t \"space\" - [%d]",x[4]);
|
||
|
||
for (int i = 33; i <= 47; i++) {
|
||
if (x[i-28] > 10)
|
||
printf("\n\t \"%c\" - [%d]", i, x[i-28]);
|
||
else
|
||
sum+=x[i-28];
|
||
}
|
||
|
||
for (int i = 58; i <= 64; i++) {
|
||
if(x[i-38]>10)
|
||
printf("\n\t \"%c\" = [%d]", i, x[i-32]);
|
||
else
|
||
sum+=x[i-38];
|
||
}
|
||
|
||
printf("\n\t other - [%d]",sum+x[33]);
|
||
}
|
||
|
||
|
||
int str(char *a, char *b) {
|
||
int i = 0;
|
||
while(a[i] != '\0' && b[i] != '\0') {
|
||
if(a[i] != b[i]) return 0;
|
||
i++;
|
||
}
|
||
return a[i] == b[i];
|
||
}
|
||
|
||
|
||
int strquery(char *a, int *b){
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
int funcReturn(char *f){
|
||
int swt=0;
|
||
if(str(f,"1"))swt=1;
|
||
if(str(f,"2"))swt=2;
|
||
if(str(f,"3"))swt=3;
|
||
if(str(f,"4"))swt=4;
|
||
if(str(f,"5"))swt=5;
|
||
if(str(f,"6"))swt=6;
|
||
if(str(f,"7"))swt=7;
|
||
if(str(f,"8"))swt=8;
|
||
if(str(f,"9"))swt=9;
|
||
if(str(f,"10"))swt=10;
|
||
return swt;
|
||
}
|