Оператор Switch с несколькими приращениями - C ++ - PullRequest
0 голосов
/ 10 апреля 2020

Вместо того, чтобы делать это так

int j = 0, k = 0, l = 0, m = 0, n = 0, o = 0, p = 0, q = 0, r = 0, t = 0;

case '1':
  j++;
  break;
case '2':
  k++;
  break;
case '3':
  l++;
  break;
case '4':
  m++;
  break;
case '5':
  n++;
  break;

cout << "Numbers that end with 1" << j << endl;
cout << "Numbers that end with 2" << k << endl;
cout << "Numbers that end with 3" << j << endl;

Что может быть более эффективным способом, поэтому я использую только одну переменную, но могу вывести количество чисел, заканчивающихся определенным числом?

Ответы [ 5 ]

3 голосов
/ 10 апреля 2020

Лучший способ - использовать массив для хранения вашего счета, использовать остаток в качестве индекса. Здесь я предполагаю, что входная переменная n.

int count[10] = { 0 };

count[n % 10]++;

for (int i = 0; i < 10; i++) {
   cout << "Numbers that end with " << i << count[i] << endl;
}
2 голосов
/ 10 апреля 2020

Вы можете использовать массив или std::map, где переключаемый символ используется в качестве индекса / ключа, а сохраненное значение является счетчиком.

int counts[5] = {};
...
char c = ...;
switch (c) {
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
        counts[c-'1']++;
        break;
}
...
for (int i = 0; i < 5; i++) {
    cout << "Numbers that end with " << i+1 << ": " << counts[i] << endl;
}
#include <map>

std::map<char, int> counts;
...
char c = ...;
switch (c) {
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
        counts[c]++;
        break;
}
...
for (auto &entry: counts) {
    cout << "Numbers that end with " << entry.first << ": " << entry.second << endl;
}
1 голос
/ 10 апреля 2020

Наверное, самый простой способ - это массив. Смотрите пример ниже. В этом примере я также обрабатываю край, в котором строка заканчивается символом, отличным от 0-9. В этом случае я считаю эти случаи; другие возможные решения игнорируют или генерируют ошибку.

#include <array>
#include <iostream>
#include <iomanip>

int main() {
  std::array<int, 11> counts{0};
  char end = '0';


  if (end < '0' || end > '9') counts[10] += 1; else 
    counts[end - '0'] += 1;

  for (int i = 0; i < 11; ++i) {
    if (i == 10) std::cout << "Other: "; else
      std::cout << std::setw(5) << i << ": ";
    std::cout << counts[i] << "\n";
  }

  return 0;
}

Более гибкое решение - map. Упрощает подсчет всех типов последних букв, но может также усложнить задачу, если вы заинтересованы только в подсчете символов 0-9.

#include <map>
#include <iostream>
#include <iomanip>

int main() {
  std::map<char, int> counts;
  char end = '0';

  counts[end] += 1;

  for (auto p = counts.begin(); p != counts.end(); ++p) {
    std::cout << p->first << ": " << p->second << "\n";
  }

  return 0;
}
1 голос
/ 10 апреля 2020

Вы можете создать массив int вместо создания множества переменных.

int arr[5];

В каждом случае увеличивайте индекс, назначенный для каждого случая (вам нужно будет решить, какой случай принадлежит какому индексу) , В конце выведите ваш массив.

1 голос
/ 10 апреля 2020
map<char, int> freq_table;

freq_table[ch]++;

for (map<string, int>::iterator it = freq_table.begin(); i != freq_table.end(); it++) {
    cout << (*it).first << ": " << (*it).second << eol;
}

или лучше, как прокомментировал @ Jarod42:

for (auto [c, count] : freq_table) {
    std::cout << c << ":" << count << std::endl;
}
...