c++ - 如何压缩此代码?if 语句过多
问题描述
有什么方法可以压缩我的代码吗?这是基于 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[] = "?.,:;'`~!";
解决方案
首先,我不知道这应该如何工作:
if (columns == ALFA)
如果columns
是类型char[]
。那是指针比较还是字符串比较?如果是后者,它不会做你认为它会做的事情(可靠地)。
如果是字符串比较,则改为column
type const std::string&
。然后那些与定义的文字的比较会更好。
对于初学者,有一个辅助函数来执行不断重复的循环。
void setStateOnRange(int table[][MAX_COLUMNS], int row, int start, int end, int state) {
for (int i = start; i <= end; ++i) {
table[row][i] = state;
}
}
然后你的函数变得更容易编写:
void mark_cells(int row, int _table[][MAX_COLUMNS], const string& columns, int state) {
if (columns == ALFA) {
// A-Z
setStateOnRange(_table, row, 'A','Z');
setStateOnRange(_table, row, a','z');
}
else if (columns == DIGITS) {
// 0 - 9
setStateOnRange(_table, row, '0','9');
}
...
另一个想法是有一个静态表,将每个 ascii 值映射到您期望的列范围。我会让你相应地初始化表格。实现变得非常短。
void mark_cells(int row, int _table[][MAX_COLUMNS], const string& columns, int state) {
static string columnmap[128] = {
/* 0..31*/ NONE, NONE, NONE, ... <32 NONES in a row>,
/* 32-47*/ SPACE, PUNC, PUNC, PUNC....
/*48-57*/ DIGIT, DIGIT, DIGIT....
PUNC, PUNC, PUNC...
/*65-90*/ ALFA, ALFA, etc....
...};
for (int i = 0; i < 128; i++) {
if (columnmap[i] == columns) {
table[row][i] = state;
}
}
}
推荐阅读
- php - 将对象推送到 JSON 文件
- python - 无法导入 OpenGL.GL
- c# - 方法能否在运行时确定参数是否已默认?
- c# - ASP.NET CodeBehind System.Web.UI.Control.Controls 返回一个元素
- angular - Angular/Typescript:编写一个工厂返回从基类派生的类型
- string - 在字符串中查找匹配项的开始和结束位置
- c - 如何链接应用程序以通过 RTEMS 进行动态加载?
- python - 将用户输入与方法 Python 进行比较的函数的问题
- android - 启动接收器在模拟器中不起作用
- php - 获取具有特定值的中继器中的特定行