Программа, разворачивающая список типа a-z в полный список abc.xyz - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Буду благодарен, если кто-то объяснит, как работает данная программа построчно (отлично будет, если написать комментарии к каждой строке (кроме самых очевидных)), либо напишет программу попроще. Задача была следующая: напишите функцию expand(s1,s2), которая бы разворачивала сокращенную запись наподобие a-z в строке s1 в полный список abc...xyz в строке s2. Учитывайте буквы в любом регистре, цифры, а также записи вида a-b-c, a-z0-9 и -a-z. Сделайте так, чтобы знаки - в начале и в конце строки воспринимались буквально, а не как символы развертывания. Спасибо.
void expand(char s1[], char s2[])
{
    int i, j, k;
    k = 0;
    for (i = 0; s1[i] != '\0'; i++)
        if (s1[i] == '-')
            if (i == 0 || s1[i+1] == '\0')
                s2[k++] = '-';
            else
                for (j = s1[i-1]; j <= s1[i+1]; j++)
                    s2[k++] = j;
    s2[k] = '\0';
}
 
int main(void)
{
    char s1[] = "-a-z0-9d-f-";
    char s2[128] = "";
    expand(s1, s2);
    printf("s1=%s\ns2=%s\n", s1, s2);
    return 0;
}
}

Решение задачи: «Программа, разворачивающая список типа a-z в полный список abc.xyz»

textual
Листинг программы
#include <stdio.h>
 
 
//сперва вспомним. \0 - знак в конце строки. Тоесть если \0 находиться в ячейке К, то последний символ в К-1 ячейке
//Каждый символ чар представлен ASCII кодом, тоесть его можно инкрементировать и получать следующий символ с таблицы.
 
void expand(char s1[], char s2[])
{
    int i, j, k;
    k = 0;
    //исходя из того что первый и последний "-" знаки развертывания
    for (i = 0; s1[i] != '\0'; i++)
        if (s1[i] == '-')                   //если наткнулись на "-"
            if (i == 0 || s1[i+1] == '\0')  //если он первый либо последний
                s2[k++] = '-';              //делаем это
            else                            //иначе
                for (j = s1[i-1]; j <= s1[i+1]; j++)//берем предыдущий знак. если например 0-7, то берем 0
                                                    //присваиваем его переменной и инкрементируем ее.
                                                    //и так, пока не дойдем до последнего символа
                    s2[k++] = j;
    s2[k] = '\0';                                   //присваиваем значение "\0" в конце для нормального отображения
}
 
int main(void)
{
    char s1[] = "-a-z0-9d-f-";
    char s2[128] = "";
    expand(s1, s2);
    printf("s1=%s\ns2=%s\n", s1, s2);
    return 0;
}

Объяснение кода листинга программы

  1. Программа начинается с подключения заголовочного файла stdio.h, который содержит функции ввода-вывода.
  2. В функции main() определен массив s1 типа char, содержащий строку -a-z0-9d-f-.
  3. Также в функции main() определен массив s2 типа char, изначально пустой, который будет заполняться при расширении строки s1.
  4. Функция expand() вызывается с аргументами s1 и s2.
  5. Внутри функции expand() определены три переменные: i, j и k.
  6. Переменная k инициализируется нулем и используется для подсчета количества символов, добавленных в массив s2.
  7. Используется цикл for для прохода по каждому символу в строке s1.
  8. Если текущий символ равен -, то проверяется его позиция в строке.
  9. Если символ является первым или последним в строке, то в массив s2 добавляется символ -.
  10. В противном случае, в цикле for проходящем от предыдущего до следующего символа после текущего, добавляются все символы в массив s2.
  11. В конце функции expand() в массив s2 добавляется символ \0 для корректного завершения строки.
  12. В функции main() выводится на экран содержимое обоих массивов.
  13. Программа завершается возвратом значения 0 из функции main().

Оцени полезность:

11   голосов , оценка 4.182 из 5
Похожие ответы