Всем доброго времени суток! Столкнулся с проблемой - не удается провести тестирование функции в программе. Сама программа все тесты успешно прошла, эти тесты останутся за кадром. Функция distanceBetweenWords должна пройти такие тесты: является ли текст пустым, находятся ли слова на одной строке текста, находятся ли они на разных строках и являются ли одинаковым словами. Я прошу прощения - нет никаких идей, как это реализовать и потому прошу помочь: может быть, идеей - какой код реализовать и в какой участок функции его вписать; может быть, какими-нибудь материалами, но хотелось бы увидеть хотя бы частичный способ решения задачи. Перепробовал все, что знаю.
//Основные функции //Функция для поиска расстояния между словами, заданными своими позициями int distanceBetweenWords(const char text[20][81], int count, const int locationWord1[2], const int locationWord2[2]); //Функция поиска слова в строке int searchWord(const char str[81], const char word[21]);
int main() { //Объявление переменных char word1[21]; // первое слово char word2[21]; // второе слово char text[20][81]; //строковый массив с текстом int length_between_words = 0; //текущее расстояние между искомыми словами int min_length_between_words = 81; //минимальное расстояние между искомыми словами int M; //количество строк int locationWord1[2]; //индекс первого слова int locationWord2[2]; //индекс второго слова bool flagWord1 = false; //флаг наличия первого слова в тексте bool flagWord2 = false; //флаг наличия второго слова в тексте int* ptr = &locationWord1[1]; // указатель на прошлое вхождение первого слова int* ptr2 = &locationWord2[1];// указатель на прошлое вхождение второго слова int mass1[81][2]; // все позиции первого слова int mass2[81][2]; // все позиции второго слова int f = 0, g = 0; // счётчики bool inter1 = true;//флаг наличия первого слова в строке bool inter2 = true;//флаг наличия второго слова в строке /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Ввести первое слово gets_s(word1);
//Ввести второе слово gets_s(word2);
//Ввести количество строк scanf("%d", &M);
//Проверка правильности введенных данных if (M > 20 || M < 1) { error_printf("The number of rows exceeds the specified value"); return 0; }
gets_s(text[0]); // КОСТЫЛЬ!
//Ввести текст input_printf("\nEnter the text:\n"); for (int t = 0; t < M; t++) { gets_s(text[t]); } //Поиск слов //Поиск первого слова for (int t = 0; t < M; t++) {
if (inter1 == false) inter1 = true; if (strcmp(text[t], "")) { locationWord1[1] = searchWord(text[t], word1);
if (locationWord1[1] > -1) // если слово найдено { flagWord1 = true; //флаг наличия первого слова locationWord1[0] = t; //индекс строки mass1[f][0] = locationWord1[1]; mass1[f][1] = locationWord1[0]; f++;
// поиск остальных вхождений слова в строке while (inter1) { locationWord1[1] = searchWord(text[t] + *(ptr)+1, word1) + (*ptr) + 1;
// поиск второго слова for (int t = 0; t < M; t++) { if (inter2 == false) inter2 = true; if (strcmp(text[t], "")) { locationWord2[1] = searchWord(text[t], word2);
if (locationWord2[1] > -1) // если слово найдено { flagWord2 = true; //флаг наличия первого слова locationWord2[0] = t; //индекс строки mass2[g][0] = locationWord2[1]; mass2[g][1] = locationWord2[0]; g++;
// поиск остальных вхождений слова в строке while (inter2) { locationWord2[1] = searchWord(text[t] + *(ptr2)+1, word2) + (*ptr2) + 1;
//Поиск минимального расстояния // если оба слова найдены if (flagWord1 == true && flagWord2 == true) { for (int i = 0; i < f; i++) { for (int j = 0; j < g; j++) { locationWord1[1] = mass1[i][0]; locationWord1[0] = mass1[i][1]; locationWord2[1] = mass2[j][0]; locationWord2[0] = mass2[j][1];
// переход к последнему вхождению слова if ((locationWord1[0] < locationWord2[0]) || (locationWord1[1] < locationWord2[1]) && ((locationWord1[0] < locationWord2[0]) || (locationWord1[0] == locationWord2[0]))) { locationWord1[1] = locationWord1[1] + strlen(word1) + 1; } else { locationWord2[1] = locationWord2[1] + strlen(word2) + 1; // меняем местами int noYou = locationWord1[1]; // вспомогательная переменная locationWord1[1] = locationWord2[1]; locationWord2[1] = noYou; noYou = locationWord1[0]; locationWord1[0] = locationWord2[0]; locationWord2[0] = noYou; } //поиск расстояния length_between_words = distanceBetweenWords(text, M, locationWord1, locationWord2); //проверка является ли рассотяние минимальным if (length_between_words < min_length_between_words && ((locationWord1[0] != locationWord2[0] || locationWord1[1] != locationWord2[1]) || length_between_words > 0)) { if (length_between_words > 0) min_length_between_words = length_between_words; } } } }
//Вывести расстояние между словами, если заданное слово найдено if (min_length_between_words > 0 && min_length_between_words != 81) { printf("%d", min_length_between_words); } else { printf("-1"); }
return 0; }
//Функция для поиска расстояния между словами, заданными своими позициями int distanceBetweenWords(const char text[20][81], int count, const int locationWord1[2], const int locationWord2[2]) /* Входные данные: text – исходный текст count – кол-во строк текста locationWord1, locationWord2 – позиции слов, между которыми определяется расстояние: locationWord1[0], locationWord2[0] – индексы строк текста, locationWord1[1], locationWord2[1] – индексы символов в строках
Выходные данные: возвращаемое значение - кол-во символов между словами */
{
int G; //временная переменная, которая запоминает размер строк int length_between_words = 0; //расстояние между двумя заданными словами bool text_is_void = false;
//Поиск расстояния между двумя заданными словами
if (locationWord1[0] != locationWord2[0])// Если слова на разных строках { for (int t = 0; t < count; t++) { if (!strlen(text[t])) text_is_void = true;
if (t == locationWord1[0]) //Если слово находится на текущей строке { if (locationWord1[1] == strlen(text[t]) + 1) // Если слово находится в конце строки { t++; //переход к следующей строке, так как текущую мы нашли } else { G = strlen(text[t]); //запомнить размер строки length_between_words += (G - locationWord1[1]) + 1; //прибавить размер строки t++; //переход к следующей строке, так как текущую мы нашли } //Пока не дойдем до следующего слова складывать длину строк while (t != locationWord2[0] && t <= count && locationWord1[0] != locationWord2[0]) { G = strlen(text[t]); //запомнить размер строки length_between_words += G + 1; //прибавить размер строки t++; //перейти к следующей строке } if (t == locationWord2[0])// если второе слово в заданной строке { int i = 0; while (i != locationWord2[1])// Пока не дойдёт до первого вхождения второго слова { length_between_words++; i++; } } }
} } if (locationWord1[0] == locationWord2[0]) // Если слова на одной строке { length_between_words = locationWord2[1] - locationWord1[1]; } length_between_words++; return length_between_words; //вернуть расстояние }
//Функция поиска слова в строке int searchWord(const char str[81], const char word[21]) /* Входные данные: str – исходная строка word – искомое слово
Выходные данные: возвращаемое значение - индекс первого вхождения искомого слова в строку; возвращает -1, если слово не найдено */ {
const char* arrow; //Указатель на текст arrow = str; int j = 0; // счётчик
if (strcmp(arrow, "")) { //Если слово первое в строке for (int i = 0; i < strlen(word); i++) { if (arrow[i] == word[i]) { j++; } }
if (j == strlen(word) && !isalpha(*(arrow + strlen(word))))// если слово нашлось { return 0; } else { // поиск слова в строке do { arrow++; arrow = strstr(arrow, word); // Нахождение первого вхождения слова
if (arrow == NULL) //Если строка закончилась { return -1; } //Проверка неявляется ли слово частью другого if (!isalpha(*(arrow - 1)) && !isalpha(*(arrow + strlen(word)))) { return arrow - str; }
if (arrow != NULL) // Переход на следующую позицию { arrow++; }
} while (arrow != NULL); // Пока строка не закончится } } else return -1; }
Если будет возможно - хотелось бы увидеть решение хотя бы одного теста, или какую-нибудь идею, потому что я не знаю, как это сделать. Заранее благодарю.
Прикрепляю код(функция находится на 209 строке): Если будет возможно - хотелось бы увидеть решение хотя бы одного теста, или какую-нибудь идею, потому что я не знаю, как это сделать. Заранее благодарю.
Да всё просто. Для начала определиться, какой библиотекой, фреймворком для юнит тестов будете пользоваться. Хоть бустом, хоть от Гугла или M$, в принципе неважно. Детали в мануале курятся или в примерах по образцу. От Гугла:
#include <gtest/gtest.h>
TEST(MyTestSuitName, MyTestCaseName) { int actual = 1; EXPECT_GT(actual, 0); EXPECT_EQ(1, actual) << "Should be equal to one"; }
Или Буста: #define BOOST_TEST_MODULE MyTest #include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_CASE(MyTestCase) { // To simplify this example test, let's suppose we'll test 'float'. // Some test are stupid, but all should pass. float x = 9.5f;
BOOST_CHECK(x != 0.0f); BOOST_CHECK_EQUAL((int)x, 9); BOOST_CHECK_CLOSE(x, 9.5f, 0.0001f); // Checks differ no more then 0.0001% }
Вызывается ваша функция и сравниваются результаты её работы с тем что ожидается. Всё просто. В примерах для простоты сравниваются значения переменной с разными ожиданиями. Думаю, идея понятно. А частности смотрятся в примерах к фреймворку или курится его мануал. Для distanceBetweenWords подсовываются аргументы для которых известен правильный результат работы этой функции и сравнивается с ожиданием. А для надежности разные варианты аргументов. Как правильные, так и неправильные. Чем больше характерных вариантов, тем надежнее проверка
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения