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;
    }
}

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

  1. В функции main создаются две строки: s1 и s2.
  2. Строка s1 содержит сокращенную запись, а строка s2 предназначена для расширенной записи.
  3. Функция expand() вызывается для замены сокращенной записи на полную.
  4. В функции expand() используется цикл for для прохода по каждому символу в строке s1.
  5. Если текущий символ равен -, то проверяется следующий символ.
  6. Если следующий символ является буквой (прописной или строчной) и предыдущий символ также является буквой или цифрой, то выполняется замена.
  7. Для замены используется временная переменная tmp, которая увеличивается на единицу и затем добавляется в строку s2 до тех пор, пока не будет достигнуто значение следующего симвома.
  8. Если текущий символ не равен -, то он просто добавляется в строку s2.
  9. По завершении функции expand(), строка s2 будет содержать расширенную запись.
  10. В функции main выводится расширенная запись s2.
  11. Также выводится исходная сокращенная запись s1.
  12. Программа возвращает 0, что означает успешное выполнение.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

11   голосов , оценка 4.364 из 5