lol
unknown
c_cpp
2 years ago
6.2 kB
7
Indexable
#include <iostream>
void input_text(char** str, int& lenght);
void input_int(int& a);
void input_str(char* str);
bool check_end(char* str);
void find_and_replace_words_in_string(char* str);
void replace_word(char* str, char* substr, int left, int right, int n);
void write_text(char** text, int lenght);
void delete_text(char** text);
int strlen(char* str);
void turn_all_chars_left(char* str, int left, int turn);
void turn_all_chars_right(char* str, int left, int turn);
void check_exit(bool& exit);
int main()
{
std::cout << "The task was completed by a student of the 353505 group - Denis Anufriev\n\n"
<< "The program processes an array of strings (the length of each string is no more than 100 characters).\n"
<< "If a string contains a sequence of identical characters, the program replaces them with code 255,\n"
<< "followed by the code of this character and the number of identical characters..\n\n";
bool exit;
check_exit(exit);
while (!exit)
{
int lenght;
char* str = new char[1001];
char** text = new char* [100];
for (int i = 0; i < 100; i++) text[i] = new char[1000];
std::cout << "Enter your text (if you have finished typing, type 'end.' in the last separate line)\n";
input_text(text, lenght);
for (int i = 0; i < lenght; i++)
{
find_and_replace_words_in_string(text[i]);
}
write_text(text, lenght);
delete_text(text);
check_exit(exit);
}
return 0;
}
void input_text(char** str, int& lenght)
{
bool isTyping = true;
for (int i = 0; isTyping; i++)
{
bool isCorrect;
int index = 0;
char c = getchar();
do
{
isCorrect = true;
str[i][index] = c;
index++;
if (index > 100)
{
isCorrect = false;
index = 0;
while ((c = getchar()) && c != '\n');
std::cout << "The number of characters in a line of text exceeds 100 characters!\n";
}
} while (((c = getchar()) && c != '\n') || !isCorrect);
str[i][index] = '\0';
if (check_end(str[i]))
{
isTyping = false;
lenght = i;
}
}
}
void input_int(int& a)
{
char* str = new char[1001]();
bool isIncorrect;
do
{
isIncorrect = false;
input_str(str);
for (int i = 0; str[i] != '\0'; i++)
{
if ((str[i] > '9' || str[i] < '0') && str[i] != '+')
{
std::cout << "You entered a non-natural number! Repeat the input: ";
isIncorrect = true;
break;
}
}
a = atoi(str);
} while (isIncorrect);
}
void input_str(char* str)
{
bool isCorrect;
int index = 0;
char c = getchar();
do
{
isCorrect = true;
str[index] = c;
index++;
if (index > 1000)
{
isCorrect = false;
index = 0;
while ((c = getchar()) && c != '\n');
std::cout << "The number of characters in a string exceeds 1000 characters!\n";
}
} while (((c = getchar()) && c != '\n') || !isCorrect);
str[index] = '\0';
}
void find_and_replace_words_in_string(char* str)
{
bool isOkay = true, searching_left = true, searching_right = true;
int left = 0, right = 0;
char symbol;
char* substr = new char[300]();
for (int i = 0; isOkay; i++)
{
if (str[i] != '\0')
{
if (searching_left && str[i + 1] == str[i])
{
symbol = str[i];
left = i;
searching_left = false;
}
else if (!searching_left && searching_right)
{
if (str[i] == symbol)
{
right = i;
}
else searching_right = false;
}
}
else if ((str[i] == '\0') && !searching_left && searching_right)
{
searching_right = false;
if (str[i] == '\0') isOkay = false;
}
if (!searching_left && !searching_right)
{
int value = right - left + 1;
if (value > 1)
{
substr[0] = char(255);
substr[1] = symbol;
if (value < 10)
{
substr[2] = (char(value) + '0');
substr[3] = '\0';
}
else if (value >= 10 && value < 100)
{
substr[2] = (char(value / 10) + '0');
substr[3] = (char(value % 10) + '0');
substr[4] = '\0';
}
else
{
substr[2] = '1';
substr[3] = '0';
substr[4] = '0';
substr[5] = '\0';
}
replace_word(str, substr, left, right, value);
if (strlen(substr) < value)
{
i -= (value - strlen(substr));
}
else if (strlen(substr) > value)
{
i += (strlen(substr) - value);
}
}
searching_left = true;
searching_right = true;
}
}
}
int strlen(char* str)
{
bool search = true;
int lenght;
for (int i = 0; search; i++)
{
if (str[i] == '\0')
{
search = false;
lenght = i;
}
}
return lenght;
}
void turn_all_chars_left(char* str, int left, int turn)
{
bool isOkay = true;
for (int i = left; isOkay; i++)
{
str[i] = str[i + turn];
if (str[i] == '\0')
{
str[i + turn] = 'a';
isOkay = false;
}
}
}
void turn_all_chars_right(char* str, int left, int turn)
{
bool isOkay = true;
for (int i = strlen(str) + turn; isOkay; i--)
{
str[i] = str[i - turn];
if (i - turn == left) isOkay = false;
}
}
void replace_word(char* str, char* substr, int left, int right, int n)
{
int lensubstr = strlen(substr);
if (lensubstr == n)
{
for (int i = left; i <= right; i++)
{
str[i] = substr[i - left];
}
}
else if (lensubstr < n)
{
for (int i = left; i <= left + (lensubstr - 1); i++)
{
str[i] = substr[i - left];
}
turn_all_chars_left(str, left + lensubstr, n - lensubstr);
}
else if (lensubstr > n)
{
turn_all_chars_right(str, right + 1, lensubstr - n);
for (int i = left; i <= left + (lensubstr - 1); i++)
{
str[i] = substr[i - left];
}
}
}
void write_text(char** text, int lenght)
{
std::cout << "The received text:\n";
for (int i = 0; i < lenght; i++)
{
for (int j = 0; text[i][j] != '\0'; j++)
{
std::cout << text[i][j];
}
std::cout << '\n';
}
}
void delete_text(char** text)
{
for (int i = 0; i < 100; i++)
{
delete[] text[i];
}
delete[] text;
}
bool check_end(char* str)
{
if (strncmp(str, "end.", 4) == 0) return true;
else return false;
}
void check_exit(bool& exit)
{
int check_exit = -1;
std::cout << "Enter 1 to start executing the program function.\nEnter 0 to exit the program\n\n";
while (check_exit != 0 && check_exit != 1)
{
input_int(check_exit);
if (check_exit != 0 && check_exit != 1) std::cout << "You entered neither 1 nor 0!\n";
}
exit = (check_exit) ? false : true;
}Editor is loading...
Leave a Comment