lab11 done

This commit is contained in:
2025-11-27 09:36:43 +07:00
parent 16e37228fd
commit 4581ef4a2d
6 changed files with 251 additions and 89 deletions
+229 -50
View File
@@ -7,7 +7,7 @@ int queryinput(int *x, int *inquery, int *query){
//INPUT------------------------------------------------- //INPUT-------------------------------------------------
wint_t ch; wint_t ch;
*inquery = 0; *inquery = 0;
while((ch=getwchar())!='\n'&&ch!='\t'&&ch!=' '&&*inquery<QUERYMAX){ while((ch=getwchar())!=L'\n'&&ch!=L'\t'&&ch!=L' '&&*inquery<QUERYMAX){
*(query+*inquery)=(int)ch; *(query+*inquery)=(int)ch;
(*inquery)++; (*inquery)++;
} }
@@ -18,9 +18,9 @@ int queryinput(int *x, int *inquery, int *query){
//COUNT ------------------------------------------------- //COUNT -------------------------------------------------
int c=0; int c=0;
if(ch=='\n')x[2]++; if(ch==L'\n')x[2]++;
else if(ch=='\t')x[3]++; else if(ch==L'\t')x[3]++;
else if(ch==' ')x[4]++; else if(ch==L' ')x[4]++;
while (c < *inquery) while (c < *inquery)
{ {
@@ -57,7 +57,6 @@ int queryinput(int *x, int *inquery, int *query){
return 0; return 0;
} }
void func1 (char **f, int *x,int inquery, int *query){ void func1 (char **f, int *x,int inquery, int *query){
switch(funcReturn(f[2])){ switch(funcReturn(f[2])){
case 1://Определяет среднюю длину слова в тексте case 1://Определяет среднюю длину слова в тексте
@@ -65,7 +64,6 @@ void func1 (char **f, int *x,int inquery, int *query){
if(x[32]){ if(x[32]){
x[30]/=x[31]; x[30]/=x[31];
printf("\n\tСредняя длинна слова - %d",x[30]); printf("\n\tСредняя длинна слова - %d",x[30]);
count(x);
} }
else{ else{
x[30]+=inquery; x[30]+=inquery;
@@ -94,7 +92,7 @@ void func1 (char **f, int *x,int inquery, int *query){
{ {
if(x[32]); if(x[32]);
else else
put(1,x,inquery,query); put(x,1,inquery,query);
break; break;
} }
@@ -112,8 +110,8 @@ void func1 (char **f, int *x,int inquery, int *query){
printf("\n\t Найти сумму всех цифр - %d",x[31]); printf("\n\t Найти сумму всех цифр - %d",x[31]);
else else
for(int i=0;i<inquery;i++){ for(int i=0;i<inquery;i++){
if(query[i]>='0'&&query[i]<='9'){ if(query[i]>=L'0'&&query[i]<=L'9'){
x[30]=(x[30]*100)+(query[i]-'0'); x[30]=(x[30]*100)+(query[i]-L'0');
} }
} }
x[31]+=x[30]; x[31]+=x[30];
@@ -125,12 +123,12 @@ void func1 (char **f, int *x,int inquery, int *query){
{ {
if(x[32]); if(x[32]);
else{ else{
if(query[inquery-1]=='\n'){ if(query[inquery-1]==L'\n'){
if(query[inquery-2]=='!'||query[inquery-2]=='?'||query[inquery-2]=='.'||query[inquery-2]==',') if(query[inquery-2]==L'!'||query[inquery-2]==L'?'||query[inquery-2]==L'.'||query[inquery-2]==L',')
query[inquery-2]='!'; query[inquery-2]=L'!';
else {query[inquery-1]='!';query[inquery]='\n';} else {query[inquery-1]=L'!';query[inquery]=L'\n';}
x['!'-28]++;inquery++;} x[L'!'-28]++;inquery++;}
put(0,x,inquery,query); put(x,0,inquery,query);
} }
break; break;
} }
@@ -139,12 +137,12 @@ void func1 (char **f, int *x,int inquery, int *query){
{ {
if(x[32]); if(x[32]);
else{ else{
if(query[inquery-1]=='\n'){ if(query[inquery-1]==L'\n'){
if(query[inquery-2]=='!'||query[inquery-2]=='?'||query[inquery-2]=='.'||query[inquery-2]==',') if(query[inquery-2]==L'!'||query[inquery-2]==L'?'||query[inquery-2]==L'.'||query[inquery-2]==L',')
query[inquery-2]='.'; query[inquery-2]=L'.';
else {query[inquery-1]='.';query[inquery]='\n';} else {query[inquery-1]=L'.';query[inquery]=L'\n';}
x['!'-28]++;inquery++;} x[L'!'-28]++;inquery++;}
put(0,x,inquery,query); put(x,0,inquery,query);
} }
break; break;
} }
@@ -177,8 +175,7 @@ void func1 (char **f, int *x,int inquery, int *query){
} }
} }
void func2 (char **f, int *x,int inquery, int *query,int *ch){
printf("\nFunc output:");
switch(funcReturn(f[2])){ switch(funcReturn(f[2])){
case 1: //Подсчитывает, сколько слов начинается с последней буквы первого слова. case 1: //Подсчитывает, сколько слов начинается с последней буквы первого слова.
{ {
@@ -195,45 +192,100 @@ void func1 (char **f, int *x,int inquery, int *query){
else{ else{
if(last(inquery,query))inquery--; if(last(inquery,query))inquery--;
if(strquery(f[3],query))x[30]++; if(strquery(f[3],query))x[30]++;
break;} }
break;
} }
case 3: //Печатает самое длинное слово в тексте. case 3: //Печатает самое длинное слово в тексте.
{ {
int ch[20]; if(x[32]){printf("\n\t");}
if(x[32]){printf("\n\t")}
else{ else{
if(x[31]<include) if(x[31]<inquery){
for(int i = 0;i<inquery;i++)
ch[i]=query[i];
x[31]=inquery; x[31]=inquery;
} }
}
break; break;
} }
case 4: //Подсчитывает количество знаков препинания (не букв и не цифр). case 4: //Подсчитывает количество знаков препинания (не букв и не цифр).
{ {
if(x[32]){printf("Знаков препинания: %d",x[5]+x[16]+x[18]+x[25]); if(x[32]){printf("\n\tЗнаков препинания: %d",x[5]+x[16]+x[18]+x[25]);}
break; break;
} }
case 5: //Сортирует текст в порядке возрастания /*case 5: //Сортирует текст в порядке возрастания
{ {
break; break; Я хз что с этим делать
} }*/
case 6: // Находит слова с тире во введенном тексте. case 6: // Находит слова с тире во введенном тексте.
{ {
if(x[28]);
else{
for(int i = 0;i<inquery;i++){
if(query[i]==L'-'&&inquery>1){
x[30]=x[2];
x[31]=x[3];
x[33]=x[4];
put(x,0,inquery,query);
break;
}
}
}
break; break;
} }
case 7: //Вычисляет количество слов между первой и последней запятой во введенном тексте case 7: //Вычисляет количество слов между первой и последней запятой во введенном тексте
{ {
if(x[32]){printf("\n\tКолличество слов между первой и последней запятой - %d",x[34]);}
else{
if(x[L','-28]>0){
x[31]+=inquery;
if(x[L','-28]>x[33]){
x[34]+=x[31];
x[33]=x[31];
x[31]=0;
}
}
}
break; break;
} }
case 8: //Находит два соседних слова, начинающихся с большой буквы case 8: //Находит два соседних слова, начинающихся с большой буквы
{ {
if(x[28]);
else{
if(*query>=L'А'&&*query<=L'Я'){
x[35]++;
if(x[35]==2){
x[30]=x[2];
x[31]=x[3];
x[33]=x[4];
x[35]=0;
printf("\n\t");
put(x,0,x[34],ch);
printf(" - ");
put(x,0,inquery,query);
printf(" | Находятся друг за другом");
}
for(int i = 0;i<inquery;i++)ch[i]=query[i];
x[34]=inquery;
}
else {x[35] = 0;}
}
break; break;
} }
case 9: //Сортирует строку в тексте по убыванию /*case 9: //Сортирует строку в тексте по убыванию
{ {
Я снова хз
break; break;
} }*/
case 10://Заменяет в каждом слове повторяющиеся буквы на '–' case 10://Заменяет в каждом слове повторяющиеся буквы на L''
{ {
if(x[32]);
else{
for(int i=0;i<inquery;i++){
for(int j=0;j<inquery;j++)
if(query[j]==query[i])query[j]=query[i]=L'-';
}
put(x,0,inquery,query);
}
break; break;
} }
} }
@@ -241,48 +293,175 @@ void func1 (char **f, int *x,int inquery, int *query){
void func3 (char **f, int *x,int inquery, int *query){ void func3 (char **f, int *x,int inquery, int *query){
int alphabet[33*2] = {
L'а',L'б',L'в',L'г',L'д',L'е',L'ё',L'ж',L'з',L'и',L'й',L'к',L'л',L'м',L'н',L'о',
L'п',L'р',L'с',L'т',L'у',L'ф',L'х',L'ц',L'ч',L'ш',L'щ',L'ъ',L'ы',L'ь',L'э',L'ю',L'я',
L'А',L'Б',L'В',L'Г',L'Д',L'Е',L'Ё',L'Ж',L'З',L'И',L'Й',L'К',L'Л',L'М',L'Н',L'О',
L'П',L'Р',L'С',L'Т',L'У',L'Ф',L'Х',L'Ц',L'Ч',L'Ш',L'Щ',L'Ъ',L'Ы',L'Ь',L'Э',L'Ю',L'Я'
};
switch(funcReturn(f[2])){ switch(funcReturn(f[2])){
case 1: //Реверсирует слово. Пример: Привет ->тевирП case 1: //Реверсирует слово. Пример: Привет ->тевирП
{ {
put(inquery-1,x,0,query); put(x,inquery-1,0,query);
break; break;
} }
case 2: //Делит слово на два и меняет начало с концом. Пример: жук -> кжу,солнце -> нцесол case 2: //Делит слово на два и меняет начало с концом. Пример: жук -> кжу,солнце -> нцесол
{ {
put(x,0,inquery/2,query);
put(x,inquery/2,inquery,query);
break; break;
} }
case 3: //После каждой гласной буквы вставляется буква 'c' и гласная повторяется. Пример: кот ->косот. case 3: //После каждой гласной буквы вставляется буква L'c' и гласная повторяется. Пример: кот ->косот.
{ {
int alph[20] = {L'а',L'и',L'е',L'ё',L'о',L'у',L'ы',L'э',L'ю',L'я',
L'А',L'И',L'Е',L'Ё',L'О',L'У',L'Ы',L'Э',L'Ю',L'Я'};
for(int i = 0;i<inquery;i++){
for(int j = 0;j<=20;j++){
if(query[i]==alph[j]){
for(int z = 0;z<inquery-i;z++)
query[inquery+1-z] = query[(inquery-1)-z];
query[i+1]=L'с';
query[i+2]=query[i];
inquery+=2;
i+=2;
}
}
}
put(x,0,inquery,query);
break; break;
} }
case 4: //Каждая буква в слове заменяется на ее позицию в алфавите. Пример: кот ->121620, обработать только буквы. case 4: //Каждая буква в слове заменяется на ее позицию в алфавите. Пример: кот ->121620, обработать только буквы.
{ {
x[25]=-1;
for(int i = 0;i<inquery;i++){
if (query[i] >= L'а' && query[i] <= L'я'){
x[25] = (query[i] - L'а') + 1;
if(query[i]>=alphabet[8])x[25]++;}
else if (query[i] == L'ё')
x[25] = 7;
else if (query[i] >= L'А' && query[i] <= L'Я'){
x[25] = (query[i] - L'А') + 1;
if(query[i]>=alphabet[41])x[25]++;}
else if (query[i] == L'Ё')
x[25] = 7;
if(x[25]!=-1){printf("%d",x[25]);x[25]=-1;}
}
put(x,40,40,query);
break; break;
} }
case 5: //Заменяет буквы верхнего регистра на буквы нижнего и наоборот. Пример: Привет -> пРИВЕТ. case 5: //Заменяет буквы верхнего регистра на буквы нижнего и наоборот. Пример: Привет -> пРИВЕТ.
{ {
for(int i = 0;i<inquery;i++){
for(int j = 0;j<=33*2;j++){
if(query[i]==alphabet[j]&&j<33){
query[i]=alphabet[j+33];
}
else if(query[i]==alphabet[j]&&j>32){
query[i]=alphabet[i-33];
}
}
}
put(x,0,inquery,query);
break; break;
} }
case 6: //Заменяет буквы на их двоичное представление из таблицы ASCII.Пример: кот ->101010101010111011100010 /*case 6: //Заменяет буквы на их двоичное представление из таблицы ASCII.Пример: кот ->101010101010111011100010
{ {
break; break;
} }*/
case 7: /*Заменяет букву на заданное смещение в пределах алфавита (шифр case 7: /*Заменяет букву на заданное смещение в пределах алфавита (шифр
Цезаря), смещение задаётся параметром и может быть положительным или Цезаря), смещение задаётся параметром и может быть положительным или
отрицательным. Пример: кот 3 -> нсх, кот -3 -> злп*/ отрицательным. Пример: кот 3 -> нсх, кот -3 -> злп*/
{ {
while(f[3][x[35]]>=L'0'&&f[3][x[35]]<=L'9'){
x[34] = (x[34]*10)+(f[3][x[35]]-L'0');
x[35]++;
}
for(int i = 0;i<inquery;i++){
for(int j = 0;j<=33;j++){
if(query[i]==alphabet[j]&&j<33){
while(x[34]>33)x[34]-=33;
if(j+x[34]>=33)x[34]-=33;
query[i]=alphabet[j+x[34]];
}
else if(query[i]==alphabet[j]&&j>32){
while(x[34]>33)x[34]-=33;
if(j+x[34]>=66)x[34]-=33;
query[i]=alphabet[j+33+x[34]];
}
}
}
put(x,0,inquery,query);
break; break;
} }
case 8: //Делит слово на два и оставляет большую часть. Пример: жук -> к, солнце -> сол case 8: //Делит слово на два и оставляет большую часть. Пример: жук -> к, солнце -> сол
{ {
if(inquery%2!=0)x[34]=1;
else x[34]=0;
for (int i = 0; i<(inquery/2)+x[34];i++)
x[35] +=query[i];
for (int i = (inquery/2)+x[34]; i<inquery;i++)
x[36] +=query[i];
if(x[35]>x[36])
put(x,0,(inquery/2)+x[34],query);
else
put(x,(inquery/2)+x[34],inquery,query);
break; break;
} }
case 9: //Делит слово на два и оставляет меньшую часть. Пример: жук -> жу, солнце -> нце case 9: //Делит слово на два и оставляет меньшую часть. Пример: жук -> жу, солнце -> нце
{ {
if(inquery%2!=0)x[34]=1;
else x[34]=0;
for (int i = 0; i<(inquery/2)+x[34];i++)
x[35] +=query[i];
for (int i = (inquery/2)+x[34]; i<inquery;i++)
x[36] +=query[i];
if(x[35]<x[36])
put(x,0,(inquery/2)+x[34],query);
else
put(x,(inquery/2)+x[34],inquery,query);
break; break;
} }
case 10://Превращает русский текст в транслит русского текста. Пример кот ->kot, жук -> zhuk case 10://Превращает русский текст в транслит русского текста. Пример кот ->kot, жук -> zhuk
{ {
int translit[43]={
L'a',L'b',L'v',L'g',L'd',L'e' , L'y',/**/L'o' , L'z',/**/L'h' , L'z',L'i',L'y',L'k',L'l',L'm',L'n',L'o',
L'p',L'r',L's',L't',L'u',L'f',L'h',L'c' , L'c',/**/L'h' , L's',/**/L'h' , L's',/**/L'h',/**/L'c',/**/L'h',
L'\'',L'y',L'\'',L'e',L'e' , L'y',/**/L'u' , L'y',/**/L'a'};
for(int i =0;i>inquery;i++){
if(
(query[i] >= alphabet[0] && query[i] <= alphabet[5]) ||
(query[i] >= alphabet[8] && query[i] <= alphabet[23]) ||
(query[i] >= alphabet[27] && query[i] <= alphabet[30]) ||
(query[i] >= alphabet[0+33] && query[i] <= alphabet[5+33]) ||
(query[i] >= alphabet[8+33] && query[i] <= alphabet[23+33]) ||
(query[i] >= alphabet[27+33] && query[i] <= alphabet[30+33]))
{
query[i]=translit[i];
}
else if (query[i] != alphabet[26] || query[i] != alphabet[26+33])
{
for(int z = 0;z<inquery-i;z++)
query[inquery-z] = query[(inquery-1)-z];
query[i]=translit[i];
query[i+1]=translit[i+1];
inquery++;i++;
}
else
{
for(int z = 0;z<inquery-i;z++)
query[inquery-z] = query[(inquery-1)-z];
for(int g =0;g<5;g++)
query[i+g] = translit[i+g];
inquery+=4;i+=4;
}
}
put(x,0,inquery,query);
break; break;
} }
} }
@@ -290,36 +469,36 @@ void func3 (char **f, int *x,int inquery, int *query){
int last(int inquery,int *query){ int last(int inquery,int *query){
if((query[inquery-1]=='.') || if((query[inquery-1]==L'.') ||
(query[inquery-1]==',') || (query[inquery-1]==L',') ||
(query[inquery-1]=='!') || (query[inquery-1]==L'!') ||
(query[inquery-1]=='?')) { (query[inquery-1]==L'?')) {
return 1; return 1;
} }
return 0; return 0;
} }
void put(int i,int *x,int inquery,int *query){ void put(int *x,int i,int inquery,int *query){
if(i<inquery) if(i<inquery)
for(;i<inquery;i++) for(;i<inquery;i++)
putwchar(query[i]); printf("%lc",query[i]);
if(i>inquery) if(i>inquery)
for(;i>inquery;i--) for(;i>inquery;i--)
putwchar(query[i]); printf("%lc",query[i]);
if(x[30]!=x[2]){putwchar('\n');} if(x[30]!=x[2]){putwchar(L'\n');}
if(x[31]!=x[3]){putwchar('\t');} if(x[31]!=x[3]){putwchar(L'\t');}
if(x[33]!=x[4]){putwchar(' ');} if(x[33]!=x[4]){putwchar(L' ');}
x[30]=x[2]; x[30]=x[2];
x[31]=x[3]; x[31]=x[3];
x[33]=x[4]; x[33]=x[4];
} }
void count(int *x){ void printcount(int *x){
int sum = 0; int sum = 0;
printf("\nStatistic"); printf("\nStatistic");
printf("\n\t \"Symb\" - [ammount]\n"); printf("\n\t \"Symb\" - [ammount]\n");
@@ -349,7 +528,7 @@ void count(int *x){
int str(char *a, char *b) { int str(char *a, char *b) {
int i = 0; int i = 0;
while(a[i] != '\0' && b[i] != '\0') { while(a[i] != L'\0' && b[i] != L'\0') {
if(a[i] != b[i]) return 0; if(a[i] != b[i]) return 0;
i++; i++;
} }
+4 -4
View File
@@ -13,15 +13,15 @@ int queryinput(int *x, int *inbuf, int *query);
// FUNC // FUNC
void func1(char **f, int *x, int inquery, int *query); void func1(char **f, int *x, int inquery, int *query);
void func2(char **f, int *x, int inquery, int *query); void func2(char **f, int *x, int inquery, int *query, int *ch);
void func3(char **f, int *x, int inquery, int *query); void func3(char **f, int *x, int inquery, int *query);
int last(int inquery,int *query); int last(int inquery,int *query);
void put(int i,int *x,int inquery,int *query); void put(int *x,int i,int inquery,int *query);
void count(int *x); void printcount(int *x);
int str(char *a,char *b); int str(char *a,char *b);
@@ -32,6 +32,6 @@ int funcReturn(char *f);
// DEFINE // DEFINE
#define clear printf("\n \033[H\033[J \n") #define clear printf("\n \033[H\033[J \n")
#define QUERYMAX 20 #define QUERYMAX 40
#define XMAX 40 #define XMAX 40
#endif #endif
+5 -5
View File
@@ -4,9 +4,11 @@ int main(int argc, char *argv[]){
setlocale(LC_ALL, ""); setlocale(LC_ALL, "");
int query[QUERYMAX]; int query[QUERYMAX];
int assist[QUERYMAX];
int inquery; int inquery;
int x[XMAX]; int x[XMAX];
for (int i = 0;i<XMAX;i++)x[i]=0; for (int i = 0;i<XMAX;i++)x[i]=0;
for (int i = 0;i<QUERYMAX;i++)assist[i]=0;
if ( if (
argc < 2/* ||( argc < 2/* ||(
@@ -39,19 +41,17 @@ int main(int argc, char *argv[]){
break; break;
case 2: case 2:
while(queryinput(x,&inquery,query)!=-1) while(queryinput(x,&inquery,query)!=-1)
func2(argv,x,inquery,query); func2(argv,x,inquery,query,assist);
x[32]=1; x[32]=1;
func2(argv,x,inquery,query); func2(argv,x,inquery,query,assist);
break; break;
case 3: case 3:
while(queryinput(x,&inquery,query)!=-1) while(queryinput(x,&inquery,query)!=-1)
func3(argv,x,inquery,query); func3(argv,x,inquery,query);
x[32]=1;
func3(argv,x,inquery,query);
break; break;
} }
count(x); printcount(x);
return 0; return 0;
} }
Binary file not shown.
+7 -21
View File
@@ -1,26 +1,12 @@
1718103620 1716121 12112 56131 33 206233 156 915132
1 2 3 4 5
Средняя длинна слова - 1
Statistic Statistic
"Symb" - [ammount] "Symb" - [ammount]
"" - [0] "Letters" - [33]
"" - [0] "Digits" - [0]
"\n" - [5] "\n" - [2]
"\t" - [0] "\t" - [0]
" " - [20] "space" - [12]
"5" - [32764] other - [11]
"9" - [32654]
">" - [-1474847549]
other - [991712084]
Statistic
"Symb" - [ammount]
"" - [0]
"" - [0]
"\n" - [5]
"\t" - [0]
" " - [20]
"5" - [32764]
"9" - [32654]
">" - [-1474847549]
other - [991712084]
+2 -5
View File
@@ -1,5 +1,2 @@
asd asd asd dsa ggg qwe asdasdasd qweqweqw Привет Пока как дела я тебя не знаю
а б в г д
a
a