Программа, разворачивающая список типа 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;
}
Объяснение кода листинга программы
- Программа начинается с подключения заголовочного файла stdio.h, который содержит функции ввода-вывода.
- В функции main() определен массив s1 типа char, содержащий строку
-a-z0-9d-f-. - Также в функции main() определен массив s2 типа char, изначально пустой, который будет заполняться при расширении строки s1.
- Функция expand() вызывается с аргументами s1 и s2.
- Внутри функции expand() определены три переменные: i, j и k.
- Переменная k инициализируется нулем и используется для подсчета количества символов, добавленных в массив s2.
- Используется цикл for для прохода по каждому символу в строке s1.
- Если текущий символ равен
-, то проверяется его позиция в строке. - Если символ является первым или последним в строке, то в массив s2 добавляется символ
-. - В противном случае, в цикле for проходящем от предыдущего до следующего символа после текущего, добавляются все символы в массив s2.
- В конце функции expand() в массив s2 добавляется символ
\0для корректного завершения строки. - В функции main() выводится на экран содержимое обоих массивов.
- Программа завершается возвратом значения 0 из функции main().