Wychodzi mi co innego niżbym chciał...

0

Hej, trochę się już pogubiłem, super byłoby gdyby ktoś mi podpowiedział jak to zrobić poprawnie logicznie.
Chcę żeby sprawdzało mi po kolei każdą liczbe wpisanego słowa, które składa się z liter a i b, czy zawiera te litery, jeśli nie to żeby kazało wpisać liczbę ponownie, a jeżeli wszystko jest poprawnie, to żeby program mógł pójść dalej. Domyslam się że jest to proste, jednak no, już się trochę zamotałem. Pozdrawiam :)

#include <iostream>
#include <string>
using namespace std;


int main(){
	
string slowoA;
string slowoB;
int A = 0;
int B = 0;
   	cout << "Slowo A skladajace sie z liter a i b: " << slowoA;
   	getline( cin, slowoA );
for(int i = 0; i<slowoA.size();i++)//sprawdza po kolei kazda litere podanego slowa
    {
        if(slowoA[i] == 'a' && 'b')A++;
        else 
		cout << "slowo A zawiera inne litery niz a i b." << endl;
		cout << "Podaj jeszcze raz:";
		getline( cin, slowoA );
    }
   	cout << "Slowo B skladajace sie z liter a i b: " << slowoB;
	getline( cin, slowoB );	
for(int i = 0; i<slowoB.size();i++)//sprawdza po kolei kazda litere podanego slowa
    {
        if(slowoB[i] == 'a' && 'b')B++; 
        else 
		cout << "slowo B zawiera inne litery niz a i b." << endl;
		cout << "Podaj jeszcze raz:";
		getline( cin, slowoB );	
    }
}
3

slowoA[i] == 'a' && 'b'
Jeśli chcesz sprawdzić czy wartość jest równa a lub b to slowoA[i] == 'a' || slowoA[i] 'b'

0

Wciąż jednak jest ten sam efekt, czyli:

2

Ach, gdybyś formatował kod to byś zauważył:

#include <iostream>
#include <string>
using namespace std;

int main()
{

    string slowoA;
    string slowoB;
    int A = 0;
    int B = 0;
    cout << "Slowo A skladajace sie z liter a i b: " << slowoA;
    getline(cin, slowoA);
    for (int i = 0; i < slowoA.size(); i++) //sprawdza po kolei kazda litere podanego slowa
    {
        if (slowoA[i] == 'a' && 'b')
            A++;
        else
            cout << "slowo A zawiera inne litery niz a i b." << endl;
        cout << "Podaj jeszcze raz:";
        getline(cin, slowoA);
    }
    cout << "Slowo B skladajace sie z liter a i b: " << slowoB;
    getline(cin, slowoB);
    for (int i = 0; i < slowoB.size(); i++) //sprawdza po kolei kazda litere podanego slowa
    {
        if (slowoB[i] == 'a' && 'b')
            B++;
        else
            cout << "slowo B zawiera inne litery niz a i b." << endl;
        cout << "Podaj jeszcze raz:";
        getline(cin, slowoB);
    }
}

Jak chcesz w if/else wykonać więcej niż jedną instrukcję to użyj klamer.

0

Dziękuję!

4

Podstawowa zasada DRY - Dont Repeat Youself

#include <iostream>
#include <string>
using namespace std;

bool check_ab(const string &s)
{
	for(char ch:s) if((ch!='a')&&(ch!='b')) return false;
	return true;
}

bool read_and_check_ab(ostream &s,string &str) { return (getline(s,str))&&(check_ab(str)); }

string read_ab(char name,ostream &s)
{
	string str;
   	cout<<"Slowo "<<name<<" skladajace sie z liter a i b: ";
	while(!read_and_check_ab(cin,str)) cout<<"slowo "<<name<<" zawiera inne litery niz a i b."<<endl<<"Podaj jeszcze raz: ";
	return str;
}

int main()
{
	string slowoA=read_ab('A',cin),slowoB=read_ab('B',cin);
	return 0;
}
0

Mam kolejny problem, bo moja wiedza jest niestety na tyle mała, że nie wiem co zrobić. Teraz, kiedy te slowa są już sprawdzone czy zawieraja tylko a lub b, chciałbym z tych dwóch podanych słów wypisać pierwsze leksykograficznie słowo C, zawierające te dwa słowa:

#include <iostream>
#include <string>
#include <cstring>
using namespace std;

int main()
{

    string slowoA;
    string slowoB;
    cout << "Slowo A skladajace sie z liter a i b: " << slowoA;
    getline(cin, slowoA);
    for (int i = 0; i < slowoA.size(); i++) //sprawdza po kolei kazda litere podanego slowa
    {
        if (slowoA[i] == 'a' || slowoA[i] == 'b');
		
        else	{
            cout << "slowo A zawiera inne litery niz a i b." << endl;
        cout << "Podaj jeszcze raz:";
        getline(cin, slowoA);
    }
    }
    cout << "Slowo B skladajace sie z liter a i b: " << slowoB;
    getline(cin, slowoB);
    for (int i = 0; i < slowoB.size(); i++) //sprawdza po kolei kazda litere podanego slowa
    {	
        if (slowoB[i] == 'a' || slowoB[i] == 'b');

        else	{
            cout << "slowo B zawiera inne litery niz a i b." << endl;
        cout << "Podaj jeszcze raz:";
        getline(cin, slowoB);
    }}

int stricoll( const string slowoA, const string slowoB);
cout << stricoll << endl;

}

i chciałem do tego uzyc funkcji stricoll, jednak wynik jest 1, nie ważne jakie słowa podam. Chciałby ktoś pokazać, jak można to zrobić?

0

W jakim sensie zawierające?
ab i baa wynik abaa czy aab?
abb i baa wynik aabb czy abbaa?

0

ab i aa wynik abaa oraz abb i baa wynik abbaa.

0

to najmnijejsze leksykograficznie stawiasz jako pierwsze, sprawdzasz czy początek pokrywa się z końcem, w X kroków gdzie X najmniejsza długość z dwóch ciągów.
abb i baa:
abb***
***baa

abb**
**baa

abb*
*baa

abb
baa

0

Jasne, myślę że rozumiem, tylko jak sprawdzić programowo, które jest mniejsze leksykograficznie? Używając if, czy tej funkcji wbudowanej (stricoll) którą chciałem użyc?

0

Dokładnie tak jak napisałem w poprzednim poście.

1 użytkowników online, w tym zalogowanych: 0, gości: 1