#c #stdin #stress-testing
#c #stdin #стресс-тестирование
Вопрос:
рассмотрим функцию cpp solve()
. Строка a
чисел (пример тестовой строки) передается функции solve()
в качестве аргументов. Я хотел stdin
прочитать числа в строке a
.
На самом деле это стресс-тест. Итак, в этом стресс-тесте этой функции solve()
предоставляется строка с return
результатом, который будет проверен на соответствие другому результату, полученному из другой функции solveFast()
.
ПРИМЕЧАНИЕ: — Алгоритм в функции
solve()
уже предоставлен нам. Я хочу провести стресс-тестирование этого алгоритма на основе моего собственного алгоритма (insolveFast()
). Гарантируется, что алгоритм в функцииsolve()
обеспечивает корректный вывод по сравнению с его тестовыми входными данными
#include <bits/stdc .h>
using namespace std;
int solve(string s) {
// below given: an algorithm that
//uses stdin to take input sample test case (i.e.,not string s)
int n; //number of integers in string s
//ignore the purpose of the code below.
//Just observe that it is taking the inputs as cin (not from string s.
cin >> n;
int first, second, large;
for (int i = 0; i < n - 1; i ) {
if (i == 0) {
cin >> first >> second;
large = (second > first) ? second : first;
if (second < first) first = second;
} else {
cin >> second; // new num
if (second > large) {
first = large;
large = second;
}
else if(second > first){
first = second;
}
}
}
int result = large * first;
return resu<
}
int solveFast(string s) {
/*
* my solution here
*/
return resu<
}
int32_t main() {
//stress-testing code starts here
while (true) {
string a;
/*
* generating a sample test case and storing it in a string 'a'
*/
int res1 = solve(a);
int res2 = solveFast(a);
if(res1!=res2){
cout << "Wrong answer: " << res1 << " " << res2 << endl;
break;
}
else{
cout << "OKn";
}
}
//stress-testig code ends
/*
for (int i = 1; i <= t; i) {
int n;
cin >> n;
vector<int> numbers(n);
for (int i = 0; i < n; i ) {
cin >> numbers[i];
}
auto result = solve(numbers);
cout << result << endl;
}
*/
return 0;
}
Комментарии:
1.
std::stringstream
имеет>>
оператор точно так же, какstd::cin
имеет
Ответ №1:
Передайте a std::istream
в вашу функцию, а затем создайте istream из строки. Как правило, не используйте глобальные переменные (например std::cin
) в коде, который предназначен для модульного тестирования.
#include <sstream>
#include <iostream>
int solve(std::istreamamp; input, std::string s) {
std::string variable;
input >> variable;
return 0;
}
void unit_test_solve() {
std::istringstream input("some string");
solve(input, "bla");
}
int real_code() {
solve(std::cin, "bla");
}
Комментарии:
1. в строке 3 мы можем написать
std::istringstreamamp; input
вместоstd::istreamamp; input
? Я знаю, чтоistringstream
это контейнер… но как насчетistream
? Этоistream
тоже контейнер? извините за этот глупый вопрос … но мне нужно знать … пожалуйста, пожалуйста, объясните немного..2. Я не понимаю. Пожалуйста, изучите, как и что такое наследование. Нет, вы не можете писать
solve(std::istringstreamamp;
, потомуstd::cin
что этоstd::istream
тип иstd::istream
не наследуется отstd::istringstream
.Is istream a container too?
Ну, я бы сказал, что оба являются «потоками». cppreference I / O — отличный ресурс, но я рекомендую хорошую книгу по C .