Zadanie Flamaster ze SPOJ – nie rozumiem do końca co się dzieje w pętli w funkcji main

0

W skrócie - zrobiłem zadanie i spoj go zaakceptował, jednak jedna rzecz nie daje mi spokoju. Otóż nie rozumiem do końca co się dzieje w pętli w funkcji main. Gdyby wyciąć linie

C +=1; 

to np dla C=2 pętla powinna wykonywać się 2 razy(i wydaje mi się ze wykonuje). Jednak po wpisaniu w konsoli pierwszego ciągu znaków program się zamyka. Po prostu wygląda to tak jakby pętla kończyła się o jeden obrót za szybko.

Ciężko jest mi opisać o co mi dokładnie chodzi, ale mam nadzieje, że zrozumieliście.

Mój kod:

 
#include <iostream>
#include <cstdio>

using namespace std;


void test(char *tab)
{
	for(int j=0; tab[j]!='\n' ; ++j)
	{
		int counter=0; // licznik
		for(; tab[j] == tab[j+1] ; ++j)
		{
			counter++;
		}
		cout << tab[j];
		if(counter>=2)
			cout << counter+1;
		if(counter == 1)
			j--;
	}
}

int main()
{
	int C;
	
	cin >> C;
	C +=1;

	for(int j = 0; j<C ; ++j)
	{
		char a=0, tab[200];
		for(int i = 0; a!='\n' ; ++i)
		{ 
			a = getchar();
			tab[i] = a;	
		}
		test(tab);
		if(j>0) cout << '\n';
	}
}
0

Skoro zrobiłeś zadanie to powinieneś wiedzieć jak to działa

2

Przed pierwszym obrotem pętli

for(int i = 0; a!='\n' ; ++i)
        { 
            a = getchar();
            tab[i] = a;    
        }

Musisz wyczyścić bufor standardowego wejścia, ponieważ coś w nim zalega po

cin >> C;

W związku czym pierwszy obrót wyżej wymienionej pętli for wykonuje się dla a = '\n'.
Czyli w zasadzie się nie wykonuje.

Możesz go wyczyścić np używając funkcji getchar():

while ( getchar() != '\n' );

Wrzucisz to po cin>>C i wszystko będzie śmigać już bez C+= 1 :)

1

Nie musisz gromadzić nic w tablicach, wystarczy tyle:

#include <iostream>
using namespace std;

int main()
  {
   ios::sync_with_stdio(false);
   cin.tie(0);
   unsigned T;
   for(cin>>T>>ws;T--;)
     {
      for(int count=0,prev=EOF,ch=EOF;ch!='\n';prev=ch,++count)
        {
         if(prev!=(ch=cin.get()))
           {
            if(count>2) cout<<count; else if(count>1) cout<<(char)prev;
            cout<<(char)ch;
            count=0;
           }
        }
     }
   return 0;
  }
0

http://ideone.com/EOWr6K

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