Это мой txt
файл, где первая строка - это номер dataSets
. 2-я строка (переменная size1) равна количеству элементов в 3-й строке (массив A1), а 4-я строка (переменная size2) равна числу элементов в 5-й строке (массив A2). Моя функция readFile должна перезаписывать переменные и массивы, перечисленные выше, без перезаписи dataSets
переменной.
Моя countElementsInArray
функция предназначена для подсчета количества появлений цифр из массива A2
в массиве A1
. Моя программа работает с одним dataSet (5 строк в txt), но когда дело доходит, например, до 3 dataSets (13 строк), моя функция readFile останавливается при возврате результатов в вектор с именованным числом. У меня вопрос, почему это неправильно и как его заменить?
txt:
3
4
-5 -1 0 8
7
7 9 2 0 -7 2 -5
4
1 2 3 4
2
1 1
5
0 0 0 0 0
1
3
Result for above input should be:
Dataset1:
0 0 0 1 0 0 1
Dataset2:
1 1
Dataset3:
0
int main() {
int dataSets = 0, size1 = 0, size2 = 0;
std::fstream file;
openFile(file);
int *A1 = new int[size1];
int *A2 = new int[size2];
readFile(file, dataSets, size1, size2, A1, A2);
}
void readFile(std::fstream &file, int &dataSets, int &size1, int &size2, int *&A1, int *&A2) {
std::vector<int> counts;
file >> dataSets;
for (size_t i = 0; i < dataSets; i++) {
file >> size1;
for (size_t j = 0; j < size1; j++)
file >> A1[j];
file >> size2;
for (size_t j = 0; j < size2; j++)
file >> A2[j];
for (size_t j = 0; j < size2; j++) {
int searchValue = A2[j];
counts.push_back(countElementsInArray(A1, size1, searchValue));
}
int numberOfDataSet = i + 1;
std::cout << "Dataset" << numberOfDataSet << ":" << std::endl;
for (size_t j = 0; j < size2; j++) {
std::cout << counts[j] << " ";
}
std::cout << std::endl;
}
}
int countElementsInArray(int *A, int size, int searchValue) {
int count = 0, first = 0, last = size;
int i = 1;
int j = 1;
while (first <= last) {
int mid = first + (last - 1) / 2;
if (A[mid] == searchValue) {
count++;
do {
if (A[mid + i] == searchValue && A[mid - j] == searchValue) {
count += 2;
i++;
j++;
} else if (A[mid + i] == searchValue) {
count++;
i++;
} else if (A[mid - j] == searchValue) {
count++;
j++;
}
return count;
} while (A[mid + i] == searchValue || A[mid - j] == searchValue);
} else if (searchValue < A[mid])
last = mid - 1;
else if (searchValue > A[mid])
first = mid + 1;
}
return count;
}