Files
sibsutis/proglabs/lab10/func.c
T
2025-11-26 01:38:59 +07:00

379 lines
12 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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: //Подсчитывает количество знаков препинания (не букв и не цифр).
{
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;
}