Я только что закончил работу над мини-задачей, описанной в блоке комментариев в приведенном ниже коде, но я пытался сделать код лучше, объединив getRareDigits
и displayRareDigits
в одну функцию. Независимо от того, что я делаю, логика всегда заканчивается. Может ли кто-нибудь объяснить мне, возможно ли, чтобы эти две функции были объединены? Спасибо^_^Можно ли объединить эти две функции в одну?
/*
Written by: Stephanie Yumiko
* This program will ask the user
for a series of integers, defined by
the user.
* The program will display back to the
user the number of rare digits, digits
that only occur once in a single integer,
but not the rest.
* The program will then sort the integers
based on the number of occurrences of
rare digits it contains, from greatest
to least.
*/
#include <iostream>
using namespace std;
bool num_contains(int, int);
void showRareDigits(int*, int);
void sortRareDigits(int*, int* , int);
bool num_contains(int digit, int n) {
while (n) {
if (digit == n % 10) return true;
n /= 10;
}
return false;
}
void getRareDigits(int *arr, int *ordered, int len) {
for (int index = 0; index < len; ++index) {
int n = arr[index];
if (n < 0)
n *= -1;
int d = 0;
while (n) {
d = n % 10;
int i; // keep track of loop counter outside the loop
int stop = 0; // to break out loop
for (i = 0; i < len; ++i) {
if (i != index && num_contains(d, arr[i]))
stop = 1;
}
// only increment the array if the loop exited before
// completing (implying the goto would have happened)
if (!stop) {
++ordered[index];
}
// always execute
n /= 10;
}
}
for (int i = 0; i<len; i++) {
for (int j = 0; j<len - i - 1; j++) {
if (ordered[j]<ordered[j + 1]) {
int temp = ordered[j];
ordered[j] = ordered[j + 1];
ordered[j + 1] = temp;
int temp2 = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp2;
}
}
}
cout << "\nArray after sort:\n";
for (int i = 0; i < len; i++) {
cout << arr[i] << endl;
}
}
void showRareDigits(int* iAry, int size) {
const int size2 = 10;
int* tmpAry = new int[size];
int totalCount[size2] = { 0 };
int currentCount[size2] = { 0 };
int totalUncommon = 0;
int i, j;
int* ordered;
ordered = new int[size];
for (i = 0; i < size; i++) {
ordered[i] = 0;
tmpAry[i] = iAry[i];
if (tmpAry[i] < 0)
tmpAry[i] *= -1;
for (j = 0; j < size2; j++)
currentCount[j] = 0;
if (tmpAry[i] == 0) {
currentCount[0] = 1;
}
while (tmpAry[i]/10 != 0 || tmpAry[i] % 10 != 0){
currentCount[tmpAry[i] % 10] = 1;
tmpAry[i] /= 10;
}
for (j = 0; j < size2; j++) {
totalCount[j] += currentCount[j];
}
}
for (i = 0; i < size2; i++) {
if (totalCount[i] == 1) {
totalUncommon++;
}
}
cout << "\nTotal rare digits: " << totalUncommon << endl
<< "\nThe rare digits:\n";
if (totalUncommon == 0) {
cout << "\nNo rare digits found.";
}
else {
for (i = 0; i < size2; i++) {
if (totalCount[i] == 1) {
cout << i << endl;
}
}
}
getRareDigits(iAry, ordered, size);
delete[] tmpAry;
delete[] ordered;
return;
}
int main() {
int size;
int* arr;
cout << "Enter # of integers: ";
cin >> size;
arr = new int[size];
for (int i = 0; i < size; i++) {
cout << "Enter the value for #" << i << " : ";
cin >> arr[i];
}
cout << "Array before sorting:\n";
for (int i = 0; i < size; i++) {
cout << arr[i] << endl;
}
showRareDigits(arr, size);
delete[] arr;
return 0;
}
* Может кто-нибудь объяснить мне, если это возможно для того, чтобы эти две функции были объединены? * Сложно объединить две функции. Мое предложение не будет даже пытаться это сделать. Лучше иметь меньшие и четко определенные функции, чем одна большая функция. –
Я предлагаю писать небольшие функции, которые делают вещи, которые можно использовать более одного раза.Таким образом, если функция предназначена для вычисления чего-то, основанного на некоторых входах, она должна возвращать результаты этого вычисления вызывающему, а не печатать их на экране и ничего не возвращать. Создайте свой код из небольших функций, подобных этому, и объедините их в «приложение». – juanchopanza
Фактические улучшения состоят в том, чтобы использовать 'std :: vector' и отделить задачи * больше *, не менее. Если вы не можете описать, что делает каждая отдельная функция, это одно предложение без использования слов «и» или «или», это, вероятно, слишком сложно. – molbdnilo