napis skladajacy sie z samych zer

0

Zadanie 4. Napisy (10 pkt)
W pliku napisy.txt znajduje się 1000 napisów o długościach od 2 do 16 znaków, każdy
napis w osobnym wierszu. W każdym napisie mogą wystąpić jedynie dwa znaki: „0” lub „1”.
W wybranym przez siebie języku programowania napisz program, za pomocą którego
uzyskasz odpowiedzi na poniższe polecenia. Odpowiedzi zapisz w pliku zadanie4.txt,
a odpowiedź do każdego podpunktu poprzedź literą oznaczającą ten podp

c) Podaj, ile jest napisów składających się z samych zer

 int main ()
{ 	
	ifstream in ("napisy.txt");
	ofstream out("zadanie4.txt");
	string slowo;
	int ile0=0,ilenapisow=0;
	while (!in.eof())
	{
		in>>slowo;
		for (int j=0; j<=slowo.size()-1;j++)
		{
			if (slowo[j]=='0') ile0++;
			else break;
		}
		if (ile0/slowo.size()==1) 
		ilenapisow++;
	}
cout<<ilenapisow;	

moj wynik 76, poprawny 32

4
j<=slowo.size()-1
if (ile0/slowo.size()==1)

kreatywnie :D

Nie zerujesz ile0 dla kolejnych słów.

Przy okazji, lekko nadużywając algorytmów jest to do zrobienia prawie w 1. linijce:

	auto all_zeroes = count_if(istream_iterator<string>(in), istream_iterator<string>(),
						   [](auto const& s){
		return all_of(s.cbegin(), s.cend(), bind(equal_to<>{}, placeholders::_1, '0'));
	});

http://melpon.org/wandbox/permlink/rcaD7vB67paJWpyJ

2
  1. smrodek przy inkrementacji: http://4programmers.net/Forum/1101404
  2. bezsensowne operacje przy porównywaniu: j<=slowo.size()-1 zamiast: j<slowo.size()
  3. bezsensowne operacje przy sprawdzaniu: ile0/slowo.size()==1 zamiast: ile0==slowo.size()
  4. brak wyzerowania ile0
0
_13th_Dragon napisał(a):

smrodek przy inkrementacji: http://4programmers.net/Forum/1101404

  1. bezsensowne operacje przy porównywaniu: j<=slowo.size()-1 zamiast: j<slowo.size()
  2. bezsensowne operacje przy sprawdzaniu: ile0/slowo.size()==1 zamiast: ile0==slowo.size()
  3. brak wyzerowania ile0

licznik wyzerowany program działa jak nalezy, e tam Od razu bezsenswne ja bym nazwał je tak jak kolega wyżej kreatywnymi :D

2

standardowy błąd: while (!in.eof())
to powoduje, że ostatnią linię przetwarzasz dwa razy
powinno być:

    while (in>>slowo)
    {
        for (int j=0; j<=slowo.size()-1;j++)
0
MarekR22 napisał(a):

standardowy błąd: while (!in.eof())
to powoduje, że ostatnią linię przetwarzasz dwa razy
powinno być:

    while (in>>slowo)
    {
        for (int j=0; j<=slowo.size()-1;j++)

w takim razie mam dwa zasadnicze pytania :

  1. Czemu od początku programowania w szkole sredniej uczą nas uzywania wlasnie tej funkcji eof()
  2. Skoro jest to błędem to czemu program działa poprawnie ?
1
  1. Niestety w szkołach średnich poziom nauczania jest jaki jest
  2. ostatnia linia jest pusta w Twoim pliku. Usuń ostatni znak nowej linii i powtórz eksperyment.
0
Wielki Kaczor napisał(a):

W liceum używaliśmy eof() i mieliśmy sytuację, kiedy program wczytywał ostatnią linijkę z pliku 2 razy jeśli kończyła się \n. Nauczycielka stwierdziła, że wie, że tak się dzieje, ale nie wie dlaczego.

eof nie jest informacją o tym, że właśnie osiągnięto koniec pliku, ale to jest flaga BŁĘDU informująca o tym, że próbowano czytać poza końcem pliku.

0

eof() w C++ jest zepsute a przez to bezużyteczne. nie używać.

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