#include #include #include #include #define BUFSZ 80 #define SIZE 5 #define OP_QUIT 0 #define OP_ADD 1 #define OP_MUL 2 #define OP_DEL 3 #define OP_INS 4 #define RANGE_INVALID -1 #define RANGE_ALL 0 #define RANGE_ONE 1 #define RANGE_TWO 2 typedef struct Cell_t { int valid; int row,col; } cell; typedef struct Range_t { int Type; cell From; cell To; } range; double sheet[SIZE][SIZE]; int clearSheet() { int row,col; for (row=0;row= 0 && row < SIZE) && (col >= 0 && col < SIZE)) { sheet[row][col] = val; } else { return -1; } return 0; } double getSheet(int row, int col) { return sheet[row][col]; } void doOperation(int op, range r, double insval) { double result = 0; switch(op) { case OP_QUIT: // invalid operation for this function break; case OP_ADD: if (r.Type == RANGE_ALL) { int row, col; result = 0.0; for (row = 0; row < SIZE; row++) for (col = 0; col < SIZE; col++) result += getSheet(row, col); } else if (r.Type == RANGE_ONE) { // invalid range for this operation } else if (r.Type == RANGE_TWO) { } fprintf(stderr, "%1.2lf\n", result); break; case OP_MUL: if (r.Type == RANGE_ALL) { int row, col; result = 1; for (row = 0; row < SIZE; row++) for (col = 0; col < SIZE; col++) result *= getSheet(row, col); } else if (r.Type == RANGE_ONE) { // invalid range for this operation } else if (r.Type == RANGE_TWO) { } fprintf(stderr, "%1.2lf\n", result); break; case OP_DEL: if (r.Type == RANGE_ALL) { clearSheet(); } else if (r.Type == RANGE_ONE) { int row = r.From.row; int col = r.From.col; sheet[row][col] = 0.0; } else if (r.Type == RANGE_TWO) { int row, col; for (row = r.From.row; row <= r.To.row; row++) for (col = r.From.col; col <= r.To.col; col++) sheet[row][col] = 0.0; } break; case OP_INS: if (r.Type == RANGE_ALL) { int row, col; for (row = 0; row < SIZE; row++) for (col = 0; col < SIZE; col++) sheet[row][col] = insval; } else if (r.Type == RANGE_ONE) { int row = r.From.row; int col = r.From.col; sheet[row][col] = insval; } else if (r.Type == RANGE_TWO) { int row, col; for (row = r.From.row; row <= r.To.row; row++) for (col = r.From.col; col <= r.To.col; col++) sheet[row][col] = insval; } break; default: break; } } int main(int argc, char **argv) { range r; double val; r.Type = RANGE_ALL; clearSheet(); fprintf(stderr, ">> INS() 1.2;\n"); doOperation(OP_INS, r, 1.2); // Set all cell to 1.2 printSheet(); r.Type = RANGE_ONE; r.From.row = 0; // row '1' r.From.col = 1; // col 'B' fprintf(stderr, ">> INS(B1) 9.99;\n"); doOperation(OP_INS, r, 9.99); // Set B1 to 9.99 printSheet(); // This actually invalid rage from the question, but the subroutine support this r.Type = RANGE_TWO; r.From.row = 1; // From: row '2' r.From.col = 2; // col 'C' r.To.row = 4; // To: row '5' r.To.col = 4; // col 'E' fprintf(stderr, ">> INS(C2:E5) 7.89;\n"); doOperation(OP_INS, r, 7.89); // Set C2:E5 to 9.99 printSheet(); fprintf(stderr, ">> DEL(C1:C5);\n"); r.Type = RANGE_TWO; r.From.row = 0; // From: row '1' r.From.col = 2; // col 'C' r.To.row = 4; // To: row '5' r.To.col = 2; // col 'C' doOperation(OP_DEL, r, 0.0); // DEL printSheet(); fprintf(stderr, ">> ADD();\n"); r.Type = RANGE_ALL; doOperation(OP_ADD, r, 0.0); // ADD ALL return 0; }