Wyszukiwanie najdłuższego wyrazu w zdaniu. (nie działająca pętla for) problem z wyświetleniem najdłuższego wyrazu.

0

Cześć,
Jestem studentem I roku dopiero co zaczynam naukę C i C++. Program który zamierzam napisać ma wyszukiwać najdłuższy wyraz w podanym zdaniu, wyświetlać jego długość i sam ten wyraz. Postanowiłem wykonać go za pomocą pętli i tablic. Nie wiem dlaczego nie działa pętla for którą podpisałem w kodzie, ani nawet nie wyświetla prostszych informacji (takich jak np: miejsca w tabeli gdzie znajduje się wyraz). Chciał bym aby ostatnie zdanie w tym programie podawało długość wyrazu i ten wyraz. Dziękuję również za wszelkie podpowiedzi dotyczące skrócenia zapisu tej funkcji, bo dopiero co zacząłem uczyć się programowania. Bardzo proszę o pomoc i z góry dziękuję.
Oto kod:

#include<iostream>
using namespace std;


int main()
{
	int wybor;
	char napis[100], wyraz[40];
	int najdluzszy_wyraz = 0, tymczasowo_najdluzszy_wyraz = 0,
		punkt_konca_najdluzszego_wyrazu = 0, punkt_poczatku_najdluzszego_wyrazu = 0;

	cout << "Podaj zdanie : ";
	cin.getline(napis, 100);

	strcat_s(napis, " ");
	cout << "Dlugosci poszczegolnych wyrazow : " << endl;

	for (int i = 0; napis[i] != 0; i++)
	{
		if (napis[i] == ' ')
		{
			if (tymczasowo_najdluzszy_wyraz > najdluzszy_wyraz)
			{
				punkt_konca_najdluzszego_wyrazu = i;
				najdluzszy_wyraz = tymczasowo_najdluzszy_wyraz;
				punkt_poczatku_najdluzszego_wyrazu = punkt_konca_najdluzszego_wyrazu - najdluzszy_wyraz + 1;//dodaje 1 bo przed wyrazem jest spacja.
			}

			cout << tymczasowo_najdluzszy_wyraz << ", ";
			tymczasowo_najdluzszy_wyraz = 0;
		}
		else
		{
			tymczasowo_najdluzszy_wyraz++;
		}


	}
	cout << endl;
	//gdy najdluzszy wyraz jest pierwszy, to nie ma przed nim spacji, wiec nie trzeba dodawac 1. Dlatego tu odejmuje 1.
	if (punkt_poczatku_najdluzszego_wyrazu = 1)
	{
		punkt_poczatku_najdluzszego_wyrazu = 0;
	}
	cout << "Miejsce w tablei \"napis\" gdzie zaczyna sie najdluzszy wyraz : " << punkt_poczatku_najdluzszego_wyrazu << endl;
	// Nie dziala mi ten for. CHODZI O TA PETLE 
	for (int k = punkt_poczatku_najdluzszego_wyrazu; napis[k] == ' '; k++)
	{
		wyraz[k - punkt_poczatku_najdluzszego_wyrazu] = napis[k];
		cout << wyraz[k - punkt_poczatku_najdluzszego_wyrazu];
	}
	
	cout << endl;
	//Ani ten.
	for (int k = punkt_poczatku_najdluzszego_wyrazu; napis[k] == ' '; k++)
	{
		cout << napis[k];
	}
	
	cout << endl;
	//Ani nawet ten.
	for (int k = punkt_poczatku_najdluzszego_wyrazu; napis[k] == ' '; k++)
	{
		cout << k;
	}

	cout << endl;
	// wyraz nie wyswietla sie prawidlowo.
	cout << "Najdlozszy wyraz " << wyraz << " ma " << najdluzszy_wyraz << " liter" << endl;
	system("pause");
	system("cls");
	return 0;
}
1
 if (punkt_poczatku_najdluzszego_wyrazu = 1)

Przypisanie zamiast porównania

cout << "Najdlozszy wyraz " << wyraz << " ma " << najdluzszy_wyraz << " liter" << endl;

0

Jeśli chcesz skrócić kod, to proponuję zrobić to wszystko w jednej pętli. Robisz dwie zmienne "najdluzszyWyraz" oraz "obecnyWyraz" typu "string", zamiast tablic char. Robisz warunek sprawdzający czy znak w stringu to spacja. Jeśli tak, to sprawdzasz czy obecnyWyraz jest dłuższy od "najdluzszyWyraz". Jeśli tak, to przypisujesz do najdłuższego wyrazu obecny i czyścisz zawartość obecnego wyrazu. Jeśli znak to nie spacja, to dopisujesz do zmiennej obecnyWyraz ten znak. Poczytaj sobie o std::string, bo to bezpieczniejsze i dużo wygodniejsze rozwiązanie od tablic char.

3

Jak chcesz skrócić kod i uczynić go bardziej czytelnym, to pisz w C++, nie w C:

int main ()
{
    std::string longest;
    std::string temp;
    std::cout << "Podaj zdanie: \n";
    while(std::cin >> temp) {
        if(temp.size() > longest.size()) {
            longest = temp;
            cout << "Najdluzszy na razie: " << longest << '\n';
        }
    }
    std::cout << "Najdluzszy: " << longest << '\n';
}
1

https://wandbox.org/permlink/qzqiW3sjzyj9Q5PU

    auto it = 
    std::max_element(std::istream_iterator<std::string>(std::cin), {},
                    [](const auto &a, const auto &b)
                     {
                         return a.length() < b.length();
                     }
                    );
    
    std::cout << *it << " " << it->length() << '\n';

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