C++ программа, чтобы взять 2 предложения и найти общие буквы?
Я пытаюсь написать программу на с ++, чтобы найти общие буквы в 2 предложениях, введенных пользователем, код, который я ввел ниже, но по какой-то причине он не работает, функция должна возвращать все общие буквы между двумя предложениями. Заранее спасибо!
#include<iostream>
#include<cstring>
using namespace std;
int findSharedLetters(const char line1[], const char line2[]);
void main()
{
char line1[100] , line2[100];
cout<<"Enter line 1 : ";
cin.getline(line1 , 100);
cout<<"Enter line 2 : ";
cin.getline(line2 , 100);
char result = findSharedLetters(line1,line2);
cout<<"shared letters : "<<result<<endl;
system("pause");
}
int findSharedLetters(const char line1[], const char line2[])
{
for(int i = 0;i<line1[100];i++)
{
for(int x = 0;x<line2[100];x++)
{
if(line1[i] == line2[x])
{
return line1[i];
}
}
}
}
2 ответа
Одно из возможных решений основано на использовании классов std::string
а также std::set
и стандартный алгоритм std::set_intersection
Вот пример программы
#include <iostream>
#include <string>
#include <set>
#include <algorithm>
#include <iterator>
std::set<char> FindSharedLetters( const std::string &s1, const std::string &s2 )
{
std::set<char> st1( s1.begin(), s1.end() );
std::set<char> st2( s2.begin(), s2.end() );
std::set<char> st0;
std::set_intersection( st1.begin(), st1.end(),
st2.begin(), st2.end(),
std::inserter( st0, st0.end() ) );
return ( st0 );
}
int main()
{
std::string s1( "DCAB" );
std::string s2( "FRDC" );
for ( char c : FindSharedLetters( s1, s2 ) ) std::cout << c << ' ';
std::cout << std::endl;
return 0;
}
Выход
C D
Решение чувствительно к регистру букв.
Задача является более сложной, если вам нужно найти только общие буквенные символы, не зависящие от регистра.
Вот как это можно сделать, используя те же контейнеры и алгоритм, что и выше.
#include <iostream>
#include <string>
#include <set>
#include <algorithm>
#include <iterator>
#include <cctype>
std::set<char> FindSharedLetters( const std::string &s1, const std::string &s2 )
{
std::set<char> st1;
std::set<char> st2;
for ( char c : s1 )
{
if ( std::isalpha( c ) ) st1.emplace( std::toupper( c ) );
}
for ( char c : s2 )
{
if ( std::isalpha( c ) ) st2.emplace( std::toupper( c ) );
}
std::set<char> st0;
std::set_intersection( st1.begin(), st1.end(),
st2.begin(), st2.end(),
std::inserter( st0, st0.end() ) );
return ( st0 );
}
int main()
{
std::string s1( "12dCAB$" );
std::string s2( "#FRDc12" );
for ( char c : FindSharedLetters( s1, s2 ) ) std::cout << c << ' ';
std::cout << std::endl;
return 0;
}
Снова вывод
C D
Вы возвращаетесь из функции, когда нашли пару букв. Сохраните буквы в строке и верните их.
#include <iostream>
#include<cstring>
using namespace std;
std::string findSharedLetters(const char line1[], const char line2[]);
int main(int argc, const char * argv[])
{
char line1[100] , line2[100];
line1[0] = '\0'; // make sure it's empty
line2[0] = '\0'; // make sure it's empty
cout<<"Enter line 1 : ";
cin.getline(line1 , 100);
cout<<"Enter line 2 : ";
cin.getline(line2 , 100);
std::string result = findSharedLetters(line1,line2); // function returns string now
cout<<"shared letters : "<<result<<endl;
// removed system("pause"); as my compiler cried...
return 0;
}
std::string findSharedLetters(const char line1[], const char line2[]){
std::string returnLine = ("");
for(int i = 0;i<(sizeof(line1)/sizeof(*line1));i++) // iterate through size of array
{
for(int x = 0;x<(sizeof(line2)/sizeof(*line2));x++) // iterate through size of array
{
if(line1[i] == line2[x])
if (!(line1[i]=='\0')) { // if empty space detected, it skips
returnLine += line1[i]; // add matching char to string
}
}
}
return returnLine; //return the string
}