strict.h — библиотека, решающая типовые задачи, возникающие при проверке корректности входных данных в олимпиадных задачах по программированию.
Во время подготовки комплекта тестов можно легко забыть учесть какое-либо ограничение, поставить лишний пробел или перевод строки там, где его не должно быть. Кроме того можно изменить ограничения в генераторах тестов и забыть изменить в условии — в результате у многих участников соревнования могут возникнуть проблемы. Валидаторы же не допустят наличия некорректных тестов. Написание валидаторов с нуля — непростая задача. Возникает множество тонкостей при считывании данных: многие стандартные средства не способны строго контролировать расстановку пробельных символов.
Библиотека strict.h призванна облегчить написание валидаторов. С ее помощью типичные валидаторы получаются предельно просты, но при этом строго проверяют соответствие формата входных данных.
Версии:
strict.h 0.1
strict.h 0.2
strict.h 0.3
Библиотека протестирована со следующими компиляторами:
class Input
{
public:
Input();
Input(const char* fileName);
~Input();
bool isSpace() const;
bool isWhitespace() const;
bool isEoln() const;
bool isEof() const;
void readSpace();
void readOneOrMoreSpaces();
void readEoln();
void readSpaceOrEoln();
void readEof();
int readChar();
std::string readToken();
// charPattern is a list of correct chars like "SWNE" or a range of chars like "0-9"
// or a combination of them like "-_a-zA-Z"
std::string readToken(int minLength, int maxLength, const char* charPattern);
// read whole line and advance to the beginning of the next line
std::string readLine();
int readInt(int minValue, int maxValue);
long long readLong(long long minValue, long long maxValue);
unsigned long long readULong(unsigned long long minValue, unsigned long long maxValue);
double readDouble(double minValue, double maxValue, int maxDigits);
// read an array of ints separated by single spaces
std::vector<int> readIntVector(int count, int minValue, int maxValue);
void _assert(bool noerror, const char* expr);
void error(const char* fmt, ...);
};
#define assert(expr) _assert((expr), #expr)
void error(const char* fmt, ...);
bool isConnected(int n, const std::vector< std::pair<int, int> >& edges);
void assertTree(const std::vector< std::pair<int, int> >& tree);
void assertConnected(int n, const std::vector< std::pair<int, int> >& edges);
void assertPrime(int p);
#include "strict.h"
using namespace std;
const int MAXLEN = 250000;
const int MINLEN = 2;
int main()
{
Input in;
int n = in.readInt(MINLEN, MAXLEN);
in.readEoln();
string T = in.readToken(n, n, "A-Z");
in.readEoln();
in.readEof();
return 0;
}
Примеры сообщений об ошибке:
Input: 1 A Output: Line 1, pos 2: integer 1 is out of bounds [2, 250000]
Input: 2 AB Output: Line 1, pos 1: SPACE instead of number
Input: 2 Ab Output: Line 2, pos 2: character 'b' is not match pattern 'A-Z'
#include "strict.h"
using namespace std;
const int MAXN = 1000;
const int MAXCOORD = 10000;
int main()
{
Input in;
int n = in.readInt(2, MAXN);
in.readEoln();
for (int i = 0; i < n; ++i)
{
in.readInt(-MAXCOORD, MAXCOORD);
in.readSpace();
in.readInt(-MAXCOORD, MAXCOORD);
in.readEoln();
}
in.readEoln();
vector< pair<int, int> > edges;
for (int i = 0; i < n - 1; ++i)
{
int a = in.readInt(1, n);
in.readSpace();
int b = in.readInt(1, n);
in.readEoln();
edges.push_back(make_pair(a, b));
}
in.readEof();
assertTree(edges);
return 0;
}
Пример сообщения об ошибке:
Input: 4 0 0 0 1 1 0 1 1 1 2 1 3 2 3 Output: Graph is not a tree
© Владимир Яковлев, Егор Щелконогов 2011-2012