Всем доброго времени суток! Столкнулся с проблемой - не удается провести тестирование функции в программе. Сама программа все тесты успешно прошла, эти тесты останутся за кадром. Функция distanceBetweenWords должна пройти такие тесты: является ли текст пустым, находятся ли слова на одной строке текста, находятся ли они на разных строках и являются ли одинаковым словами. Я прошу прощения - нет никаких идей, как это реализовать и потому прошу помочь: может быть, идеей - какой код реализовать и в какой участок функции его вписать; может быть, какими-нибудь материалами, но хотелось бы увидеть хотя бы частичный способ решения задачи. Перепробовал почти все.
Прикрепляю код(функция находится на 209 строке):
Код:
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable : 4996)
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
#include <ctype.h>
#include <iostream>
#include <regex>
//Основные функции
//Функция для поиска расстояния между словами, заданными своими позициями
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;
if ((locationWord1[1] - mass1[f - 1][0]) == 0)
{
inter1 = false;
}
else if (locationWord1[1] > -1)
{
mass1[f][0] = locationWord1[1];
mass1[f][1] = locationWord1[0];
f++;
}
}
}
}
}
// поиск второго слова
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 ((locationWord2[1] - mass2[g - 1][0]) == 0)
{
inter2 = false;
}
else if (locationWord2[1] > -1)
{
mass2[g][0] = locationWord2[1];
mass2[g][1] = locationWord2[0];
g++;
}
}
}
}
}
//Поиск минимального расстояния
// если оба слова найдены
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;
}
Если будет возможно - хотелось бы увидеть решение хотя бы одного теста, или какую-нибудь идею, потому что я не знаю, как это сделать. Заранее благодарю.