Vuvko's Testing Forum

Объявление

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Строки (05)

Сообщений 1 страница 3 из 3

1

ссылка на коды сданных мною задач (все, кроме 1б, 10).
Все вопросы - в асю, скайп.

Данные задачи выложены для ознакомления. Списывание, в ваших же интересах, не желательно...

0

2

Задача 05-10-Вёрстка для начинающих.

решение этой задачи основывается на задачах 2(Форматирование) и 8(Выравнивание абзаца), которые фактически являются подзадачами данной задачи.

Возьмём процедуру вывода отформатированной строки из 8й задачи (printfstr) и вместо вывода на консоль сделаем вывод в массив строк out. Остаётся только следить за тем, чтобы функция писала данные в нужное место и добавлять пробелы между столбцами. Как только матрица заполнена, выводим её, обнуляем, делаем переводы строк, и работаем дальше.

Код:
#include <stdio.h>
#include <stdlib.h>

void
inputstr(char *s)
{
    int i;
    char c;
    do{
        c = getchar();
    }while(c == '\n' || c == ' ');
    *s = c;
    for(i = 1; (c = getchar()) != '\n'; i++){
        *(s + i) = c;
    }
    *(s + i) = 0;
}

int
strlen(char *s)
{
    int i;
    for(i = 0; s[i]; i++);
    return i;
}

void
printstr(char *s)
{
    int i;
    for(i = 0; s[i]; i++){
        printf("%c", s[i]);
    }
    printf("\n");
}

void
printfstr(char *s, char *out, int len, int m, int n)
{
    if(n == 0){
        int i;
        for(i = 0; i < len; i++, m--){
            *(out + i) = s[i];
        }
        while(m > 0){
            *(out + i) = ' ';
            i++;
            m--;
        }
    } else {
        len--;
        int k1 = (m - len) / n, k2 = (m - len) % n, j, k, i;
        for(i = 0, j = 0; j < len;j++, m--){
            *(out + i) = s[j];
            i++;
            if(s[j] == ' '){
                for(k = 0; k < k1; k++){
                    *(out + i) = ' ';
                    i++;
                    m--;
                }
                if(k2 > 0){
                    *(out + i) = ' ';
                    i++;
                    m--;
                    k2--;
                }
            }
        }
    }
}

void
clearout(int s, int max_len, char out[s][max_len + 1])
{
    int i, j;
    for(i = 0; i < s; i++){
        for(j = 0; j <= max_len; j++){
            out[i][j] = 0;
        }
    }
}

void
add_col(int max_len, char out[max_len + 1], int k)
{
    if(k > 0){
        out[k] = ' ';
        out[k + 1] = ' ';
        out[k + 2] = ' ';
        out[k + 3] = ' ';
    }
}

void
printout(int s, int max_len, char out[s][max_len + 1])
{
    int i;
    for(i = 0; out[i][0] && i < s; i++){
        printstr(out[i]);
    }
}

int
main(void)
{
    char str[1000001];
    int i, j, c, s, k, len, p1 = -1, p2 = -1, spaces = 0, out_string, col;
    scanf("%d%d%d", &k, &c, &s);
    int max_len = c * (k + 4);
    char out[s][max_len + 1];
    clearout(s, max_len, out);
    inputstr(str);
    len = strlen(str) + 1;
    str[len] = 0;
    str[len - 1] = ' ';
    out_string = 0;
    for(i = 0, j = k, col = 0; i < len; i++, j--){
        if(str[i] == ' '){
            p2 = i;
            spaces++;
        }
        if(j <= 0){
            add_col(max_len, out[out_string], (col - 1) * (k + 4) + k);
            printfstr(str + p1 + 1, out[out_string] + col * (k + 4), p2 - p1, k, spaces - 1);
            p1 = p2;
            spaces = 0;
            j = k - i + p2 + 1;
            out_string++;
        }
        if(out_string >= s){
            out_string = 0;
            col++;
        }
        if(col >= c){
            col = 0;
            printout(s, max_len, out);
            clearout(s, max_len, out);
            out_string = 0;
            printf("\n");
            printf("\n");
        }
    }
    add_col(max_len, out[out_string], (col - 1) * (k + 4) + k);
    printfstr(str + p1 + 1, out[out_string] + col * (k + 4), p2 - p1, k, spaces - 1);
    printout(s, max_len, out);
    return 0;
}

0

3

Задача 05-1-b-Большие префиксы и суффиксы

Зная, что префикс-функция возвращает максимальный префикс строки, являющийся её же суффиксом, мы можем фактически решить задачу, если из двух введённых строчек мы сделаем одну. Так как по условию длины строк могут быть различны, то нужно установить порог, который бы не позволял данной функции "убегать" за границы. Так как в условии сказано, что ни одна из строчек не содержит пробелов, то возьмём за этот порог символ пробела, находящийся между исходными строчками.

Код:
#include <stdio.h>
#include <stdlib.h>

enum{
    MAX_LEN = 1000001
};

int
prefix (char *s)
{
    int i, k = 0;
    char p[2 * MAX_LEN];
    p[0] = 0;
    for(i = 1; s[i]; i++){
        while(k > 0 && s[k] != s[i]){
            k = p[k - 1];
        }
        if(s[k] == s[i]){
            k++;
        }
        p[i] = k;
    }
    return p[i - 1];
}

int
main(void)
{
    char s1[MAX_LEN], s2[MAX_LEN], s[2 * MAX_LEN], c;
    int i, j;
    for(i = 0; (c = getchar()) != '\n'; i++){
        s1[i] = c;
        s[i] = c;
    }
    int len1 = i;
    s1[len1] = 0;
    s[len1] = ' ';
    for(j = 0; (c = getchar()) != '\n'; j++){
        s2[j] = c;
        s[len1 + 1 + j] = c;
    }
    int len2 = j;
    s2[len2] = 0;
    s[len1 + 1 + len2] = 0;
    printf("%d ", prefix(s));
    for(i = 0; s2[i]; i++){
        s[i] = s2[i];
    }
    s[len2] = ' ';
    for(j = 0; s1[j]; j++){
        s[len2 + 1 + j] = s1[j];
    }
    s[len1 + 1 + len2] = 0;
    printf("%d\n", prefix(s));
    return 0;
}

0