K&R exercise 3.3 - C (СИ)
Формулировка задачи:
Упражнение 3.3. Напишите функцию expand(s1, s2), заменяющую сокращенную запись наподобие a-z в
строке s1 эквивалентной полной записью abc. . . xyz в s2. В s1 допускаются буквы (прописные и строчные) и
цифры. Следует уметь справляться с такими случаями, как a-b-c, a-z0-9 и -а-b. Считайте знак - в начале или в
конце s1 обычным символом минус
Что-то у меня совсем далеко(
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> int main() { int c, i; char a[30], b[30]; for (i = 0; (a[i] = getchar()) != EOF; i++) ; a[i] = '\0'; for (i = 0; a[i] != '\0'; i++) printf("%c", a[i]); expand (a, b); printf("b: "); for (i = 0; b[i] != '\0'; i++) printf("%c", b[i]); return 0; } void expand(char s1[], char s2[]) { if (s1 == NULL || s2 == NULL) return; int c,i,j,k = 0; for (i = 0; i < (strlen(s1) - 2); i++) { c = s1[i]; j = i; if (isdigit(c)) if ((s1[++i] == '-') && isdigit(s1[++i]) && (c - s1[i]) > 1) for (; j <= i; j++) { s2[k++] = s1[j]; } else if ((s1[++i] == '-') && (!isdigit(s1[++i])) && (c - s1[i]) > 1) for (; j <= i; j++) { s2[k++] = s1[j]; } } s2[k] = '\0'; }
Решение задачи: «K&R exercise 3.3»
textual
Листинг программы
#include <stdio.h> #include <ctype.h> /*Упражнение 3.3. Напишите функцию expand(s1, s2), заменяющую сокращенную запись наподобие a-z в строке s1 эквивалентной полной записью abc. . . xyz в s2. В s1 допускаются буквы (прописные и строчные) и цифры. Следует уметь справляться с такими случаями, как a-b-c, a-z0-9 и -а-b. Считайте знак - в начале или в конце s1 обычным символом минус*/ void expand(char *, char *); int main() { char s1[] = "-a-z-0-9a-b-c-d-i-o675-1-2-3g-l-k-4-0-"; char s2[BUFSIZ] = ""; expand(s1, s2); puts(s2); puts(s1); return 0; } void expand(char *str1, char *str2) { char tmp, *b; for(b = str1; *b; b++){ if(*b == '-'){ if(b == str1 || !*(b + 1)) *str2++ = *b; else{ if((isalpha(*(b - 1)) && isalpha(*(b + 1))) || (isdigit(*(b - 1)) && isdigit(*(b + 1)))){ tmp = *(b - 1); tmp++; if(tmp > *(b + 1)) *str2++ = *b; while(tmp < *(b + 1)) *str2++ = tmp++; } else *str2++ = *b; } } else *str2++ = *b; } }
Объяснение кода листинга программы
- В функции main создаются две строки: s1 и s2.
- Строка s1 содержит сокращенную запись, а строка s2 предназначена для расширенной записи.
- Функция expand() вызывается для замены сокращенной записи на полную.
- В функции expand() используется цикл for для прохода по каждому символу в строке s1.
- Если текущий символ равен
-
, то проверяется следующий символ. - Если следующий символ является буквой (прописной или строчной) и предыдущий символ также является буквой или цифрой, то выполняется замена.
- Для замены используется временная переменная tmp, которая увеличивается на единицу и затем добавляется в строку s2 до тех пор, пока не будет достигнуто значение следующего симвома.
- Если текущий символ не равен
-
, то он просто добавляется в строку s2. - По завершении функции expand(), строка s2 будет содержать расширенную запись.
- В функции main выводится расширенная запись s2.
- Также выводится исходная сокращенная запись s1.
- Программа возвращает 0, что означает успешное выполнение.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д