• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dlaczego cout wypisuje mi odpowiedź podwójnie?

VPS Starter Arubacloud
0 głosów
209 wizyt
pytanie zadane 13 maja 2018 w C i C++ przez SzaaBao Początkujący (380 p.)

Hej, zrobiłem proste zadanko i wszystko pięknie wychodzi tylko mam dylemat dlaczego gdy daje na koniec cout to zamiast wypisać mi raz 70 to program wypisuje 2 razy 70 pod sobą. Wygląda to tak:

70

70

Czemu tak jest?

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    string s1[200],s2[200];
    ifstream napisy;
    napisy.open("napisy.txt");
    while(!napisy.eof())
    {
        for(int i=0; i<200; i++)
        {
            napisy>>s1[i];
            napisy>>s2[i];

        }
        int licznik=0;
        for(int i=0; i<200; i++)
        {
            if(s1[i].size()>=s2[i].size()*3||s1[i].size()*3<=s2[i].size())
            {
                licznik++;
            }
        }

    cout<<licznik<<endl;
    }
    napisy.close();
    return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 13 maja 2018 przez kevin Mądrala (5,010 p.)

Bo jest w pętli while i jeżeli wypisuje się dwa razy to znaczy że pętla wykonuje się dwa razy. Jeżeli pętla wykona się trzy razy to cout wypisze się trzy razy. Jeżeli pęta wykona się raz to cout wypisze się tylko raz.

komentarz 13 maja 2018 przez SzaaBao Początkujący (380 p.)

Okej, a jak zrobić żeby wypisywało sięraz? W tym kodzie np wypisuje się tylko raz:

 

#include <iostream>
#include <fstream>


using namespace std;
bool jednolity(string s)
{
for(int i=0; i<s.length(); i++)
if (s[i]==s[i-1])
return true;
return false;
}
bool tesame(string s1, string s2)
{
    for(int i=0; i<s1.length(); i++)
    {
        for(int j=0; j<s1.length()-1; j++)
        {
            if( s1[ j ] > s1[ j + 1 ] )
            swap( s1[ j ], s1[ j + 1 ] );
        }
    }
    //wyraz2
        for(int i=0; i<s2.length(); i++)
    {
        for(int j=0; j<s2.length()-1; j++)
        {
            if( s2[ j ] > s2[ j + 1 ] )
            swap( s2[ j ], s2[ j + 1 ] );
        }
    }
    if(s1==s2)
    return true;
    return false;
}



int main()
{
    string s1[1000],s2[1000];
    ifstream dane;
    dane.open("dane.txt");
    while(!dane.eof())
    {
        for(int i=0; i<1000; i++)
        {
        dane>>s1[i];
        dane>>s2[i];
        }
        int licznik=0;
        int licznik2=0;
        for (int i=0; i<1000; i++)
        {
            if (jednolity(s1[i]))
            {
                if (s1[i]==s2[i])
                    {
                    licznik++;
                    }
            }
        }
        for(int i=0; i<1000; i++)
        {
        if(tesame(s1[i],s2[i]))
            {
                licznik2++;
            }

        }


        cout<<"Odpowiedz do a to: "<<licznik<<endl;
        cout<<"Odpowiedz do b to: "<<licznik2<<endl;
    }
    dane.close();
    return 0;
}

 

komentarz 13 maja 2018 przez adrian17 Ekspert (344,100 p.)

Okej, a jak zrobić żeby wypisywało sięraz? 

Um... nie umieszczaj go w pętli?

komentarz 13 maja 2018 przez SzaaBao Początkujący (380 p.)
Wtedy pojawia się komunikat że nie zostało zadeklarowane, a jak zadeklaruje licznik przed whilem to już wogóle dubluje i odpowiedź to 140..
komentarz 13 maja 2018 przez adrian17 Ekspert (344,100 p.)
Być może cała pętla nie ma sensu.

Jaka jest treść zadania?
komentarz 13 maja 2018 przez RafalS VIP (122,820 p.)
Nie analizowałem całości, ale zachowanie, które chcesz osiągnąć można zrobić w nastepujący sposób: deklaracja licznika przed pętlę, na początek pętli zerowanie licznika a cout za pętlą. Wtedy będziesz miał raz wypisane 70, tak jak chcesz.
Dodam tylko, że zerowanie licznika jest troszke głupie, bo jeśli pętla wykona się 100 razy to wykorzystasz tylko setną ostatnią wartość licznika, całą resztę ignorując pomimo, że obliczasz osobny licznik w każdej ze 100 obiegów pętli - sugeruje to błędy w logice programu.
komentarz 13 maja 2018 przez adrian17 Ekspert (344,100 p.)
Ogólnie to .eof() i pętla po 100 elementach wygląda dość podejrzanie - pierwsze zazwyczaj się stosuje (well, nie stosuje, bo są lepsze sposoby), gdy nie wiadomo, ile będzie wejść; drugie, gdy wiadomo. (dlatego zapytałem o treść zadania)
0 głosów
odpowiedź 13 maja 2018 przez Huberti Gaduła (4,500 p.)
edycja 13 maja 2018 przez Huberti

Cześć. Dużo zależy od pliku napisy.txt, czy jest w nim dokładnie lub mniej niż 400 słów. Jeżeli jest więcej, to wynik zostanie pokazany kilkukrotnie. Źródłem problemów jest pętla:

while(!napisy.eof())

Sprawdzasz w niej czy dotarłeś do końca pliku. Lepiej byłoby uzyskać warunek, z którego dowiesz się ile porcji danych jest w pliku. Taką wiedzę możesz później wykorzystać w dalszej części programu.

Przepisałem to dla Ciebie tutaj:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
	string s1[200], s2[200];
	ifstream napisy;
	napisy.open("napisy.txt");
	if (napisy.good())
	{
		int ilosc = 0;
		while (napisy >> s1[ilosc] && napisy >> s2[ilosc])
			ilosc++;

		int licznik = 0;
		for (int i = 0; i < ilosc; i++)
		{
			if (s1[i].size() >= s2[i].size() * 3 || s1[i].size() * 3 <= s2[i].size())
			{
				licznik++;
			}
		}
		cout << licznik << endl;
	}
	else
		cout << "Nie udalo sie otworzyc pliku lub plik nie istnieje." << endl;

	napisy.close();
	return 0;
}

Poniższa instrukcja warunkowa sprawdza czy udało się otworzyć plik. 

if (napisy.good())

Zawsze w przypadku pobierania danych z pliku do programu warto mieć w kodzie tego typu warunek.

1
komentarz 13 maja 2018 przez SzaaBao Początkujący (380 p.)
Dziękuję

Podobne pytania

0 głosów
2 odpowiedzi 141 wizyt
pytanie zadane 3 grudnia 2017 w JavaScript przez DariuszH Gaduła (3,100 p.)
0 głosów
3 odpowiedzi 197 wizyt
+1 głos
1 odpowiedź 92 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...