Conversation with Merlin [email protected] · Mon Dec 25 2023

Напиши функцию, проверяющую наличие "struct" в начале переданной строки

#include #include #include

using namespace std;

bool find_first_keyword(string& fileContent) {

};

int main() { string filename = "input.txt"; // Имя файла который вы хотите прочитать ifstream file(filename); // Открываем файл для чтения string fileContent;

if (file.is_open()) { // Проверяем, удалось ли открыть файл char character; while (file.get(character)) { fileContent += character; // Добавляем символ к строке fileContent } cout << "Содержимое файла: " << endl; cout << fileContent << endl; file.close(); // Закрываем файл } else { cerr << "Не удалось открыть файл" << endl; } return 0;

}

Для создания функции find_first_keyword для проверки наличия слова "struct" в начале переданной строки, вы можете воспользоваться следующим кодом:

#include <iostream> #include <fstream> #include <string> using namespace std; bool find_first_keyword(const string& fileContent) { string keyword = "struct"; // Проверяем, начинается ли строка с ключевого слова if (fileContent.substr(0, keyword.length()) == keyword) { return true; } else { return false; } } int() { string filename = "input.txt"; // Имя файла который вы хотите прочитать ifstream file(filename); // Открываем файл для чтения string fileContent; if (file.is_open()) { // Провер, удалось ли открыть файл char character; while (file.get(character)) { fileContent += character; // Добавляем символ к строке fileContent } cout << "Содержимое файла: " << endl; cout << fileContent << endl; // Выз функцию для проверки наличия ключевого слова в начале строки if (find_first_keyword(fileContent)) { cout << "Строка начинается с 'struct'" << endl; } else { << "Строка не начинается с 'struct'" <<; } file.close(); // Закрываем файл } else { cerr << "Не удалось открыть файл" << endl; } return 0; }

В этом пример функция find_first_keyword принимает строку fileContent в качестве параметра и использует метод substr для проверки наличия ключевого слова "" в начале строки. В функции main вызывается эта функция для проверки и выводится соответствующее сообщение в зависимости от результата проверки

Теперь напишиследующую функцию, проверяющую, что после ключевого слова стоит название, не являющееся ключевым словом и не имеющая запрещенных символов. Не используй при этом новые библиотеки

Для создания функции, которая будет проверять, что посл ключевого слова стоит допустимое название, можно использовать следующий код:

#include <iostream> #include <fstream> #include <string> using namespace std; bool is_valid_variable_name(const string& name) { string keywords[] = {"int", "char", "float", "double", "bool"}; stringChars = "!@#$%^&*()-+=~`{}[]|\\:;\"'<>,.?/"; // Проверяем, является ли переданное название ключевым словом for (const string& keyword : keywords) { if (name == keyword) { return false; } } // Проверяем, содержит ли название запрещенные символы for (char c : name) { if (forbiddenChars(c) != string::npos) { return false; } } // Если название прошло все проверки, возвращаем true return true; } bool find_first_keyword(const string& fileContent) { size_t pos = fileContent.find("struct"); if (pos != string::npos) { //щем первое слово после "struct" size_t start = pos + 6; // Длина слова "" size_t end = fileContent.find_first_of(" \n", start); string variableName = fileContent.substr(start, end - start); // Проверяем, что название является допустимым return is_valid_variable_name(variable); } return false; } int main() { // ... (код изыдущего примера) // Вызываем функцию для проверки ключевого слова допустимого названия if (find_first_keyword(fileContent)) { cout << "Послеstruct' идет допустимое название переменной" << endl; } else { cout << "Название переменной после 'struct' недопустимо" <<; } // ... (код из предыдего примера) return 0; }

В этом примере функция is_valid_variable_name проверяет, что переданное название не является ключевым словом и не содержит запрещенных символов. Функция find_first_keyword ищет первое слов после "struct" в строке fileContent и затем вызывает функцию is_valid_variable_name для проверки допустимости названия переменной.

теперь напиши функцию которая ищет в строке открывающую фигурную скобку и разбивает на слова все элементы после нее, до закрывающей фигурной скобки

Конечно, вот пример функции, которая выполняет описанные вами задачи:

#include <iostream> #include <string> #include <vector> using namespace std; vector<string> split_after_opening_brace(const string& line) { size_t openingBracePos = line.find('{'); size_t closingBracePos = line.find('}'); vector<string> words; if (openingBracePos != string::npos && closingBracePos != string::npos) { string contentInsideBraces = line.substr(openingBracePos + 1, closingBracePos - openingBracePos - 1); string word; for (char c : contentInsideBraces) { if (c == ' ') { if (!word.empty()) { words.push_back(word); word.clear(); } } else { word += c; } } if (!word.empty()) { words.push_back(word); } } return words; } int main() { string testString = "Some text before {word1 word2 word3} some text after"; vector<string> wordsAfterOpeningBrace = split_after_opening_brace(testString); cout << "Words after opening brace: "; for (const auto& word : wordsAfterOpeningBrace) { cout << word << " "; } cout << endl; return 0; }

В этом примере функция split_after_opening_brace находит позицию открывающей и закрывающей фигурных скобок в строке, затем извлекает подстроку между ними и разбивает эту подстроку на отдельные слова, используя пробел в качестве разделителя. Результат сохраняется в векторе words, который возвращается из функции.

Сделай это через массив

Конечно, вот пример функции, которая работает с массивом вместо вектора:

#include <iostream> #include <string> using namespace std; void split_after_opening_brace(const string& line, string* words, int& wordCount) { size_t openingBracePos = line.find('{'); size_t closingBracePos = line.find('}'); wordCount = 0; if (openingBracePos != string::npos && closingBracePos != string::npos) { string contentInsideBraces = line.substr(openingBracePos + 1, closingBracePos - openingBracePos - 1); string word; for (char c : contentInsideBraces) { if (c == ' ') { if (!word.empty()) { words[wordCount++] = word; word.clear(); } } else { word += c; } } if (!word.empty()) { words[wordCount++] = word; } } } int main() { string testString = "Some text before {word1 word2 word3} some text after"; string words[100]; int wordCount; split_after_opening_brace(testString, words, wordCount); cout << "Words after opening brace: "; for (int i = 0; i < wordCount; ++i) { cout << words[i] << " "; } cout << endl; return 0; }

В этом примере функция split_after_opening_brace теперь принимает массив words вместо вектора для хранения найденных слов. Размер массива также передается в функцию в виде переменной wordCount, которая обновляется внутри функции для отслеживания количества найденных слов.

Напиши для этого кода функцию, которая проверяет, что в строке нет ничего кроме пробелов или табуляции между идентификатором и первой открывающейся фигурной скобкой.

#include #include #include #include

using namespace std;

int head;

bool find_first_keyword(string& fileContent) { string keyword = "struct";

// Проверяем, начинается ли строка с ключевого слова if (fileContent.substr(0, keyword.length()) == keyword) { head += keyword.length(); return true; } return false;

};

bool is_valid_variable_name(const string& name) { string keywords[] = { "int", "char", "float", "double", "bool" }; string forbiddenChars = "!@#$%^&*()-+=~`{}[]|\:;"'<>,.?/";

// Проверяем, является ли переданное название ключевым словом for (const string& keyword : keywords) { if (name == keyword) { return false; } } // Проверяем, начинается ли с цифры if (isdigit(name[0])) { return false; } // Проверяем, содержит ли название запрещенные символы for (char c : name) { if (forbiddenChars.find(c) != string::npos) { return false; } } // Если название прошло все проверки, возвращаем true return true;

}

bool find_first_word(const string& fileContent) { size_t pos = fileContent.find("struct");

if (pos != string::npos) { // Ищем первое слово после "struct" size_t start = head+1; // Длина слова "struct" + пробел size_t end = fileContent.find_first_of(" \n\t", start); string variableName = fileContent.substr(start, end - start); // Проверяем, что название является допустимым return is_valid_variable_name(variableName); } return false;

}

int main() { string filename = "C:/Users/MSI/Desktop/С_С++/proga_laba3/input.txt"; // Имя файла который вы хотите прочитать ifstream file(filename); // Открываем файл для чтения string fileContent;

if (file.is_open()) { // Проверяем, удалось ли открыть файл char character; while (file.get(character)) { fileContent += character; // Добавляем символ к строке fileContent } cout << "File content: " << endl; cout << fileContent << endl; file.close(); // Закрываем файл } else { cerr << "Unable to open file" << endl; } find_first_keyword(fileContent); find_first_word(fileContent); return 0;

}

Вот функция, которая проверяет, что в строке нет ничего кроме пробелов или табуляции между идентификатором и первой открывающейся фигурной скобкой:

bool is_valid_spacing(const string& fileContent, size_t startPos) { size_t openingBracePos = fileContent.find('{', startPos); size_t endPos = fileContent.find_first_not_of(" \t", startPos); // Находим первый символ, отличный от пробела или табуляции после startPos if (openingBracePos != string::npos && endPos != openingBracePos && endPos != string::npos) { // Если первый символ после startPos не равен открывающейся фигурной скобке // и позиция этого символа меньше позиции открывающейся фигурной скобки return false; } return true; }

Вы можете использовать эту функцию, передавая ей строку fileContent и позицию startPos, с которой вы хотите начать проверку наличия пробелов или табуляций перед открывающейся фигурной скобкой.