Переключите улучшение, используя общий случай - PullRequest
0 голосов
/ 19 марта 2019

Можно ли изменить этот «переключатель»? Сначала я думал, что вместо этого могу использовать «для», но думаю, что в этом больше нет необходимости. Цель состоит в том, чтобы сделать этот код более эффективным. Кто-нибудь знает, как сделать это улучшение, чтобы сделать код более эффективным? Я все еще изучаю программирование, и я не такой опытный. Я уже что-то сделал, но я не знаю, если что-то не хватает, я поместил новый код под старым. Я думаю, что может быть необходимо использовать if вместо for, я создал или другую функцию, потому что я не могу изменить значение PageNumber, я просто должен использовать его. Возможно, мне не нужно ничего использовать, только то, что уже есть в кейсе. Кто-нибудь может мне это уточнить?

switch (PageNumber) {

            case 0x01:
                m = 0;
                for (n = 0; n < 8; n++) {
                    if (n < NumberOfSensor) {
                        if (n < 4) {
                            Write_string("L       ", n, 0);
                            Write_int((n + 1), n, 1);
                            write_CustonCharacter(4, n, 3); //Write the indicator "->"


Write_int(Sensor_Count[n], n, 5);
                            } else if (n > 3) {
                                Write_string("L       ", (n - 4), 10);
                                Write_int((n + 1), (n - 4), 11);
                                write_CustonCharacter(4, (n - 4), 13); //Write the indicator "->"
                                Write_int(Sensor_Count[n], (n - 4), 15);
                            }

                        }
                    }
                    break;


                    /*
                     * PAGE 2
                     */
                case 0x02:

                    m = 0;
                    for (n = 8; n < 16; n++) {
                        if (n < NumberOfSensor) {
                            if (n < 12) {
                                Write_string("L       ", (n - 8), 0);
                                Write_int((n + 1), (n - 8), 1);
                                write_CustonCharacter(4, (n - 8), 3); //Write the indicator "->"
                                Write_int(Sensor_Count[n], (n - 8), 5);
                            } else if (n > 11) {
                                Write_string("L       ", (n - 12), 10);
                                Write_int((n + 1), (n - 12), 11);
                                write_CustonCharacter(4, (n - 12), 13); //Write the indicator "->"
                                Write_int(Sensor_Count[n], (n - 12), 15);
                            }

                        }
                    }
                    break;


                    //...(This part is just repetition)

                    /*
                     * PAGE 8
                     */
                case 0x08:
                    m = 0;
                    for (n = 56; n < 65; n++) {
                        if (n < NumberOfSensor) {
                            if (n < 60) {
                                Write_string("L       ", (n - 56), 0);
                                Write_int((n + 1), (n - 56), 1);
                                write_CustonCharacter(4, (n - 56), 3); //Write the indicator "->"
                                Write_int(Sensor_Count[n], (n - 56), 5);
                            } else if (n > 59) {
                                Write_string("L       ", (n - 60), 10);
                                Write_int((n + 1), (n - 60), 11);
                                write_CustonCharacter(4, (n - 60), 13); //Write the indicator "->"
                                Write_int(Sensor_Count[n], (n - 60), 15);
                            }

                        }
                    }
                    break;
                default:
                    break;
                }
//==========================================================================
                for (PageNumber = 1; PageNumber < 9; PageNumber++) { //actually I think this for is not necessary because it receives PageNumber and then it does what it needs to do.
                    m = 0; //but does it need something else?
                    for (n = (PageNumber * 8 - 8); n < (PageNumber * 8); n++) {
                        if (n < NumberOfSensor) {
                            if (n < (PageNumber * 8 - 4)) {
                                Write_string("L       ", n - (PageNumber * 8 - 8), 0);
                                Write_int((n + 1), n - (PageNumber * 8 - 8), 1);
                                write_CustonCharacter(4, n - (PageNumber * 8 - 8), 3); //Write the indicator "->"
                                Write_int(Sensor_Count[n], n - (PageNumber * 8 - 8), 5);
                            } else if (n > (PageNumber * 8 - 5)) {
                                Write_string("L       ", n - (PageNumber * 8 - 4), 10);
                                Write_int((n + 1), n - (PageNumber * 8 - 4), 11);
                                write_CustonCharacter(4, n - (PageNumber * 8 - 4), 13); //Write the indicator "->"
                                Write_int(Sensor_Count[n], n - (PageNumber * 8 - 4), 15);
                            }

                        }
                    }

                }

1 Ответ

4 голосов
/ 19 марта 2019

Во-первых, я бы сказал, что этот код неэффективен в основном потому, что он повторяется, а не из-за использования памяти.

Как вы можете улучшить его в этом аспекте - у вас может быть только один цикл for и вообще нет переключателя.

Как? Попробуйте выразить цикл for в каждом из случаев как функцию от значения case, а затем обобщить его в соответствии с другими телами for-loop. Например:

Обратите внимание, что для каждого случая:

  • Начальное значение цикла for всегда (PageNumber-1)*8
  • Условие цикла всегда n < PageNumber*8
  • Первая строка в предложении if-then всегда Write_string("L ", (n-((PageNumber-1)*8), 0));

и так далее. Продолжайте обобщать каждое число, которое изменяется как функцию PageNumber, и тогда у вас останется только один цикл for и не будет никакого переключателя.

...