ссылка на коды сданных мною задач (все, кроме 1б, 10).
Все вопросы - в асю, скайп.
Данные задачи выложены для ознакомления. Списывание, в ваших же интересах, не желательно...
Vuvko's Testing Forum |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » Vuvko's Testing Forum » Домашняя работа по праку гр. 104 » Строки (05)
ссылка на коды сданных мною задач (все, кроме 1б, 10).
Все вопросы - в асю, скайп.
Данные задачи выложены для ознакомления. Списывание, в ваших же интересах, не желательно...
Задача 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; }
Задача 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; }
Вы здесь » Vuvko's Testing Forum » Домашняя работа по праку гр. 104 » Строки (05)