有什么辦法可以壓縮我的這段代碼嗎?這是基于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;
//&/span>
_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;
/ /span> ~
_table[row][126] = state;
//!
_table[row][33] = state。
/ `
_table[row][96] = state;
// ,
_table[row][44] = state;
/-
_table[row][45] = state。
}
}
uj5u.com熱心網友回復:
首先,我不知道這應該是如何作業的:
if (columns == ALFA)
如果columns是char[]的型別。 這是一個指標比較還是一個字串比較? 如果是后者,它不會做你想做的事(可靠地)。
如果是字串比較,把column改為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'/span>,'Z'/span>)。
setStateOnRange(_table, row, a','z')。
}
else if ( columns == DIGITS) {
// 0 - 9
setStateOnRange(_table, row, '0'/span>,'9'/span>)。
}
...
另一個想法是有一個靜態表,將每個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。
}
}
}
uj5u.com熱心網友回復:
我只會在開始時讓每一組字符成為一個字串。 例如:
const char* allAlpha = "QWERTYUIOPASDFGHJKLZXCVBNM"
"qwertyuiopasdfghjklzxcvbnm"。
const char* allDigits = "1234567890"/span>;
const char* allOperators = "<=> ,* !%&-"。
...
同樣地,對于其他人來說。 那么你的邏輯將選擇一個:
const char* selected = nullptr。
if ( columns == ALFA)
selected = allAlpha;
else if (columns == DIGITS)
selected = allDigits;
else if (columns == OPERATORS)
selected = allOperators;
...
最后,如果你選擇了一些東西,你可以可以走過它來標記所有這些狀態:
if (selected)
{
for (const char* p = selected; *p != ' '; p)
_table[row][(unsigned char)*p] = state;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/306736.html
標籤:
