【发布时间】:2021-09-15 23:00:19
【问题描述】:
有什么方法可以压缩我的这段代码吗?这是基于 ASCII 值的,我正在尝试为它创建一个表。我可以创建一个可能更简单的地图,但我不知道我的教授是否出于某种原因允许这样做。
如果我确实做了一张地图,我只会创建一个包含所有标准 ascii 值的地图,而不是拥有所有这些语句。但是为了这种方法,我考虑过实现 && 和!和 ||但不知道从哪里开始。
void mark_cells(int row, int _table[][MAX_COLUMNS], const char columns[], int state) {
if (columns == ALFA) {
// A-Z
for (int i = 65; i <= 90; ++i) {
_table[row][i] = state;
}
// a-z
for (int i = 97; i <= 122; ++i) {
_table[row][i] = state;
}
}
else if (columns == DIGITS) {
// 0 - 9
for (int i = 48; i <= 57; ++i) {
_table[row][i] = state;
}
}
else if (columns == OPERATORS) {
// <, =, >
for (int i = 60; i <= 62; ++i) {
_table[row][i] = state;
}
// (,),*,+
for (int i = 40; i <= 43; ++i) {
_table[row][i] = state;
}
// {,|,}
for (int i = 123; i <= 125; ++i) {
_table[row][i] = state;
}
// !
_table[row][33] = state;
// %
_table[row][37] = state;
// &
_table[row][38] = state;
// -
_table[row][45] = state;
}
else if (columns == SPACES) {
_table[row][32] = state;
}
else if (columns == PUNC) {
// ;
_table[row][58] = state;
// :
_table[row][59] = state;
// ?
_table[row][63] = state;
// '
_table[row][39] = state;
// .
_table[row][46] = state;
// ~
_table[row][126] = state;
// !
_table[row][33] = state;
// `
_table[row][96] = state;
// ,
_table[row][44] = state;
// -
_table[row][45] = state;
}
}
此代码标记行和列并将其设置为给定状态:
这是我的常量
#ifndef CONSTANTS_H
#define CONSTANTS_H
const int MAX_COLUMNS = 256;
const int MAX_ROWS = 100;
const int MAX_BUFFER = 200;
const char ALFA[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
const char DIGITS[] = "0123456789";
const char OPERATORS[] = "><=!+-%&|()*";
const char SPACES[] = {' ', '\t', '\n', '\0'};
const char PUNC[] = "?.,:;'`~!";
【问题讨论】:
-
不是一个好的
switch候选人,但std::(unordered_)map<std::string, std::function<(prototype)>可能是一个不错的选择。取决于用例。注意比较char数组和==是行不通的,除非你故意比较指针。如果要比较字符串值,则需要strcmp或迁移到std::string。 -
我看不到重叠,所以我认为您已经建议的地图将是重写它的最佳方式。
-
正如@user4581301 指出的那样,让“列”成为 char[] 是有问题的。如果您可以将其设为
enum,您的地图解决方案会更好。 -
旁注:
for (int i = 65; i <= 90; ++i)使用for (int i = 'A'; i <= 'Z'; ++i)可能更容易阅读 -
我不清楚这个函数在做什么。我认为可能正确的做法是重新设计调用此函数的代码。
标签: c++ data-structures