• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Кое что не получилось!

  • Автор темы Alenushka
  • Дата начала
A

Alenushka

Вот что удалось написать самой ;) Больше не смогла, т.к. в программирование 0 :)

Код:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define N 20
#define G 26
// ПРЕДВАРИТЕЛЬНОЕ ОБЪЯВЛЕНИЕ ФУНКЦИЙ
// Заголовок программы
void Title();
// Ввод предложения1
void InpPredl (char predl[]);
// Выделение из предложения1
void Select(const char *predl, char m[][N],char *sel, int *n);
// Ввод предложения2
void InpPred2 (char pred2[]);
// Выделение из предложения2
void Select(const char *pred2, char m[][N],char *sel, int *n);
// Сборка предложения1
char *Constructor(char slova[][N], int sl);
// Сборка предложения2
char *Constructor(char slova[][N], int s1);
// Вывод результата
void OutPredl(char *s1, char *s2);
// ОСНОВНАЯ ФУНКЦИЯ
int main ()
{
// ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ
char pred1[80]; // Введенное предложение1
char pred2[80]; // Введенное предложение2
char *b ="QWERTYUIOPASDFGHJKLZXCVBNM";// Буквы заглавные
char *r="`!;:,.?- "; // Разделительные знаки
char *res; // Результирующее предложение
char slova[N][N]; // Массив слов в предложении
char razd [N][N]; // Массив разделителей в предложении
int sl=-1,s3=-1, rz=-1; // Счетчики слов и разделителей
// Заголовок программы
Title ();
// Ввод предложения1
InpPred1 (pred1);
// Выделение из предложения1 слов
Select (pred1, slova, r, &sl);
// Выделение из предложения1 разделителей
Select (pred1, razd, b, &rz);
// Ввод предложения2
InpPred2 (pred2);
// Выделение из предложения2 слов
Select (pred2, slova, r, &s3);
// Выделение из предложения2 разделителей
Select (pred2, razd, b, &rz);
// Сборка предложения1
res = Constructor(slova,sl);
// Вывод результата1
OutPredl (pred1, res);
// Сборка предложения2
res = Constructor(slova,s3);
// Вывод результата2
OutPred1 (pred2, res);
//Освобождение ресурсов
free (res);
}
// ОПИСАНИЕ ИСПЛЬЗУЕМЫХ ФУНКЦИЙ
// Заголовок программы(номер лабораторной и задание)
void Title()
{
puts (" Laboratorna9 rabota № 8");
puts (" V dvux predlozenijx naiti i");
puts (" raspechatat sovpadaushie slova.\n");
}
// Ввод предложения1
void InpPredl(char *s)
{
puts(" Vvedite predlogenie1 \n");
strcpy (s," Skolko slov?");
// gets (s);
}
// Ввод предложения2
void InpPred2(char *s)
{
puts(" Vvedite predlogenie2 \n");
strcpy (s," Skolko slov?");
// gets (s);
}
 
V

vital

Выше 2 суппостата. Человек же сам пытался.. rrrFer, тем более ты, учитывая кол-во задач решенных тобой. +- 1..
 
D

DarkKnight

Как то тут все так в одну кучу валено.... Сложно даже от чего оттолкнуться, что бы автору помочь, именно *С его* кодом....
Если честно вообще кроме этого:
char *r="`!;:,.?- "; // Разделительные знаки
И этого:
void Title()
{
puts (" Laboratorna9 rabota № 8");
puts (" V dvux predlozenijx naiti i");
puts (" raspechatat sovpadaushie slova.\n");
}
Ничего конструктивного не увидел.....
Автор надеюсь будет не против, если его код координально видо изменить?
P.S. И вопрос есть, "Совпадающие слова", это "одинаковые слова" - те которые содержатся в двух предложениях как минимум 1 раз...
Или все же слова которые одинаковые как по значению так и индексу расположения в предложении (если считать от (1)-первое слово, (2)-второе )?
 
A

Alenushka

"Автор надеюсь будет не против, если его код координально видо изменить?" - не, не против, главное хочу понять как что делается!

Да, это одинаковые слова которые содержатся в двух предложениях как минимум 1 раз.
 
D

DarkKnight

C++:
#include <iostream>

using namespace std;

void Title()
{
puts (" Laboratorna9 rabota № 8");
puts (" V dvux predlozenijx naiti i");
puts (" raspechatat sovpadaushie slova.\n");
}

void main (void)
{
const char *r="`!;:,.?- "; // Разделительные знаки 
setlocale(LC_ALL,"Russian"); //Для локали *т.к. пишу код в CP1252
Title();
char Str1[128],Str2[128]; //Наши строки (предложения)
char StrResult[128]; //Результирующая строка (встречаемые слова в двух предложениях)
memset(StrResult,0,128); //Обнулим всю память строки StrResult

//Ввод строк (предложений)
cout<<"Введите 1-ое предложение :"<<endl;
cin.getline(Str1,127);
cout<<"Введите 2-ое предложение :"<<endl;
cin.getline(Str2,127);

char buffer[128]; //Буферная переменная, для наших слов
int cnt = 0; //Счетчик для записи слова
memset (buffer,0,128); //Обнулим буферную переменную

for (int i=0; i<=strlen(Str1); i++) //Обойдем каждый символ строк 1
{

bool isRazdel = false; //Предположим, что текущий символ - не разделитель
for (int j=0; j < strlen(r); j++) //Обойдем каждый символ строки-разделителей
{
if (Str1[i] == r[j] || Str1[i]==0) //Если поймем что текущий символ - разделитель, то
{
isRazdel = true; //запишим тру
}
}
if (!isRazdel) //Если у нас не разделитель
{
buffer[cnt] = Str1[i]; //То запишим этот символ в буффер в позицию cnt
cnt++; //Увеличим счетчик cnt
}
else //Если же символ разделитель, что означает конец слова
{
if (strstr(Str2,buffer)) //Если слово встречается во второй строке
{
if (!strstr(StrResult,buffer)) //И если еще не встречается в StrResult
{
strcat(StrResult,buffer); //Запишим его в результирующую строку
strcat(StrResult," "); //Пробел добавим
}
}
cnt = 0;
memset (buffer,0,128);
}
}

cout<<endl<<"Слова которые встречаются в обоих предложениях:"<<endl;
setlocale(LC_ALL,".866");
cout<<StrResult;



}

















/*#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define N 20
#define G 26
// ПРЕДВАРИТЕЛЬНОЕ ОБЪЯВЛЕНИЕ ФУНКЦИЙ
// Заголовок программы
void Title();
// Ввод предложения1
void InpPredl1 (char predl[]);
// Выделение из предложения1
void Select(const char *predl, char m[][N],char *sel, int *n);
// Ввод предложения2
void InpPredl2 (char pred2[]);
// Выделение из предложения2
void Select(const char *pred2, char m[][N],char *sel, int *n);
// Сборка предложения1
char *Constructor(char slova[][N], int sl);
// Сборка предложения2
char *Constructor(char slova[][N], int s1);
// Вывод результата
void OutPredl(char *s1, char *s2);
// ОСНОВНАЯ ФУНКЦИЯ
int main ()
{
// ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ
char pred1[80]; // Введенное предложение1
char pred2[80]; // Введенное предложение2
char *b ="QWERTYUIOPASDFGHJKLZXCVBNM";// Буквы заглавные
char *r="`!;:,.?- "; // Разделительные знаки
char *res; // Результирующее предложение
char slova[N][N]; // Массив слов в предложении
char razd [N][N]; // Массив разделителей в предложении
int sl=-1,s3=-1, rz=-1; // Счетчики слов и разделителей
// Заголовок программы
Title ();
// Ввод предложения1
InpPredl1 (pred1);
// Выделение из предложения1 слов
Select (pred1, slova, r, &sl);
// Выделение из предложения1 разделителей
Select (pred1, razd, b, &rz);
// Ввод предложения2
InpPredl2 (pred2);
// Выделение из предложения2 слов
Select (pred2, slova, r, &s3);
// Выделение из предложения2 разделителей
Select (pred2, razd, b, &rz);
// Сборка предложения1
res = Constructor(slova,sl);
// Вывод результата1
OutPredl (pred1, res);
// Сборка предложения2
res = Constructor(slova,s3);
// Вывод результата2
OutPredl1 (pred2, res);
//Освобождение ресурсов
free (res);
}
// ОПИСАНИЕ ИСПЛЬЗУЕМЫХ ФУНКЦИЙ
// Заголовок программы(номер лабораторной и задание)
void Title()
{
puts (" Laboratorna9 rabota № 8");
puts (" V dvux predlozenijx naiti i");
puts (" raspechatat sovpadaushie slova.\n");
}
// Ввод предложения1
void InpPredl1(char *s)
{
puts(" Vvedite predlogenie1 \n");
strcpy (s," Skolko slov?");
// gets (s);
}
// Ввод предложения2
void InpPredl2(char *s)
{
puts(" Vvedite predlogenie2 \n");
strcpy (s," Skolko slov?");
// gets (s);
}
*/

Добавлено: Если что н понятно по коду, пиши отвечу...
 
A

Alenushka

Весь смысл программы, как я поняла, - как только появляется любой из разделителей - это слово записывается в память и сравнивает, нет ли во второй строке такого же слова.

if (strstr(Str2,buffer)) //Если слово встречается во второй строке -

strstr - ищет слово в строке 2 из буфера ? и если нет то ничего не записывает в результат?
 
D

DarkKnight

Весь смысл программы, как я поняла, - как только появляется любой из разделителей - это слово записывается в память и сравнивает, нет ли во второй строке такого же слова.

if (strstr(Str2,buffer)) //Если слово встречается во второй строке -

strstr - ищет слово в строке 2 из буфера ? и если нет то ничего не записывает в результат?

strstr(Str2,buffer) - Ищит первое вхождение последовательности buffer(в нашем случае, это слово (фрагмент строки ограниченный разделителями)) в строке Str2(наша вторая строка), если вхождение найдено ф-ия возвращает указатель на начало этого вхождения char*, если же нет то возвращает NULL...
Иными словами, выбрав слово из первой строки мы проверяем есть ли это слово(фрагмент) во второй строке...

Да, если вхождения нет - то в результат это не записывается, а еще не записывается, если это слово уже содержится в результе (тоесть уже идет повторение слова в строке Str1)...

В том примере который я запостил, я упустил проверку на слова в которых фрагмент повторятся : типо "дом" "домовой" что бы это реализовать, тебе следует проверить символ который идет за фрагментом в строке Str2 (он должен быть разделителем или Нуль-символом "\0"), примерно так
C++:
if (strstr(Str2,buffer))
{
char *test = strstr(Str2,buffer)+ strlen(buffer); //или char test = strstr(Str2,buffer)[strlen(buffer];
//а далее *test - сравнить с разделителями и с "\0"


}
 
D

DarkKnight

Как то так:
C++:
		else //Если же символ разделитель, что означает конец слова
{
if (strstr(Str2,buffer)) //Если слово встречается во второй строке
{
char *test = (strstr(Str2,buffer))+strlen(buffer);

bool WordTest = false;
for (int j=0; j < strlen(r); j++) //Обойдем каждый символ строки-разделителей
{
if (*test == r[j] || *test==0) //Если поймем что текущий символ - разделитель, то
{
WordTest = true;
}
}

strcat(buffer," ");
if (!strstr(StrResult,buffer) && WordTest) //И если еще не встречается в StrResult
{
strcat(StrResult,buffer); //Запишим его в результирующую строку
}
}
cnt = 0;
memset (buffer,0,128);
}
 
D

DarkKnight

2: vital :
Витал, rrrFer прав, задача была на уровне написания void main(void), кроме шапки ничего дельного не было...
И реально в месяц таких задач только тут решается от 2 и выше...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!