• 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?

Object Storage Arubacloud
0 głosów
214 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,860 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,860 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,860 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 142 wizyt
pytanie zadane 3 grudnia 2017 w JavaScript przez DariuszH Gaduła (3,100 p.)
0 głosów
3 odpowiedzi 202 wizyt
+1 głos
1 odpowiedź 95 wizyt

92,566 zapytań

141,420 odpowiedzi

319,615 komentarzy

61,952 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...