Co jest nie tak z tym kodem?
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
unsigned T;
scanf("%u",&T);
while(T--)
{
static char A[1001],B[1001];
scanf(" %1000s %1000s",B,A);
char *a=A;
for(char *b=B;(*a)&&((b=strchr(b,*a))!=0);++a) ++b;
printf("%s\n",*a?"Nie":"Tak");
}
return 0;
}
- stosuje duże litery do zmiennych
- zadanie polega na znalezieniu drugiego ciągu w pierwszym (a tu jest odwrotnie - szukamy a w b)
- rozwiązanie sprowadzone do jednej linijki nie jest ładnym rozwiązaniem - i o tym jest dyskusja w ww wątku
- w standardzie GNU explicite Richard Stallman pisze żeby takich kodów unikać:
GNU C/C++ Coding Standards, Richard Stallman
(avoid assignments inside if-conditions)
http://www.sourceformat.com/pdf/cpp-coding-standard-gnu.pdf
-
@_13th_Dragon powołuje się na Boost i STL (np. STLPort).
W Boost nie znalazłem ani jednego jednolinijkowego for-a z przypisaniem w warunku pętli.
W STLPort nie szukałem, ale chętnie zobacze jakiegoś.
I pytanie:
- kto pisze takie kody i jak mu to usprawnia pracę?
Wersja poglądowa, rozpisana dla ludzi którzy nie mają czasu lub ochoty formatować i analizować jednolinijkowców:
#include <cstdio>
#include <cstring>
using namespace std;
int main() {
unsigned cnt;
scanf("%u", &cnt);
while (cnt--) {
static char atab[1001], btab[1001];
scanf(" %1000s %1000s", atab, btab);
char *a = atab;
char *b = btab;
while(*b) {
a = strchr(a, *b);
if (!a)
break;
++a;
++b;
}
printf("%s\n", *b ? "Nie" : "Tak");
}
return 0;
}
(for zamieniony na while)