Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лабы / лаба 4 инфа

.docx
Скачиваний:
4
Добавлен:
05.01.2021
Размер:
184.78 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра Вычислительной техники

отчет

по лабораторной работе №4

по дисциплине «Введение в информационные технологии»

Студент гр. 9494

Лобазев Н. А.

Преподаватель

Гречухин М. Н.

Санкт-Петербург

2020

Оглавление

Цель работы 2

Блок-схема 3

Протокол 5

Контрольные примеры 8

Цель работы

Ввести массив символов-разделителей заданной пользователем длины, а затем строку текста, общее количество символов в которой (символы, составляющие слова+ разделители) заранее неизвестно. Признаком окончания ввода строки является ввод двух одинаковых слов подряд. Если суммарная длина всех нечётных слов (в данном задании счёт слов в строке идёт от единицы) больше суммарной длины всех чётных слов, заменить последнее слово в строке другим словом, заранее введенным пользователем.

Блок-схема

Протокол

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include "stdbool.h"

bool is_delimeter(char* dlm, int n, char c)

{

bool res = false;

for (int i = 0; i < n; i++)

{

if (c == dlm[i])

{

res = true;

break;

}

}

return res;

}

char* split_and_replace(char* str, char* repl, char* dlm, int n)

{

char* w = NULL;

int odd = 0, even = 0, idx = 0, i = 0, wl = 0;

//считаем суммы длин слов

while (i != strlen(str))

{

//считываем слово

if (!is_delimeter(dlm, n, str[i]))

{

w = (char*)realloc(w, (wl + 1) * sizeof(char));

w[wl] = str[i];

wl += 1;

i += 1;

}

else

{

idx += 1; //номер слова

//printf("%d. [%s]\n", idx, w);

if (idx % 2 == 0)

{

even += strlen(w);

}

else

{

odd += strlen(w);

}

w = NULL;

wl = 0;

while (i != strlen(str) && is_delimeter(dlm, n, str[i]))

{

i += 1;

}

}

}

if (w != NULL)

{

idx += 1;

//printf("%d. [%s]\n", idx, w);

if (idx % 2 == 0)

{

even += strlen(w);

}

else

{

odd += strlen(w);

}

}

//printf("\nodd: %d, even: %d\n", odd, even);

if (odd > even)

{

i = strlen(str) - 1;

while (i != 0 && !is_delimeter(dlm, n, str[i]))

{

i -= 1;

}

char* res = (char*)malloc(strlen(str) + strlen(repl));

strncpy(res, str, i + 1);

strcat(res, repl);

return res;

}

else

{

return str;

}

}

int main()

{

int D = 0;

printf("Vvedite kolichestvo razdelitelej: ");

scanf("%d", &D);

getchar();

//ввод символов-разделителей

char* delim = malloc(sizeof(char) * D);

for (int i = 0; i < D; i++)

{

printf("Vvedite razdelitel' %d: ", i);

scanf("%c", &delim[i]);

getchar();

}

bool two_same = false;

char* s = NULL; //вводимая строка

int l = 0; //ее длина

char* w = NULL, *p = NULL;

int wsize = 0;

char c;

printf("Vvedite stroku: ");

while (!two_same)

{

c = getc(stdin);

//printf("[%c]\n", c);

if (!is_delimeter(delim, D, c) && c != '\n')

{

w = (char*)realloc(w, (wsize + 1) * sizeof(char));

w[wsize] = c;

wsize++;

//printf("%s\n", w);

}

else

{

if (w != NULL)

{

//printf("Trying to add %s\n", w);

if (p != NULL && strcmp(w, p) == 0)

{

two_same = true;

s = (char*)realloc(s, (l + strlen(w)) * sizeof(char));

strcat(s, w);

l = strlen(s);

break;

}

else

{

s = (char*)realloc(s, (l + strlen(w)) * sizeof(char));

//printf("Adding %s to [%s]\n", w, s);

strcat(s, w);

//printf("Schitano: %s\n", s);

l = strlen(s);

p = malloc(strlen(w));

strcpy(p, w);

w = NULL;

wsize = 0;

}

}

s = (char*)realloc(s, (l + 1) * sizeof(char));

s[l] = c;

l++;

}

}

s[l] = '\0';

printf("Poluchena stroka: %s\n", s);

while ((c = getchar()) != '\n' && c != EOF) { }

char* r = (char*)malloc(256);

printf("Vvedite slovo dlya zameny poslednego: ");

scanf("%s", r);

char* result = split_and_replace(s, r, delim, D);

printf("Rezultat: %s\n", result);

system("pause");

return 0;

}

Контрольные примеры

Пример 1(с заменой)

Исходные данные: 4; 2,4,6,0; 1111111234567890505; privet

Ожидаемый результат: 111111123456789050privet

Пример 2(без замены)

Исходные данные: 4; 2,4,7,0; 123456789056756; privet

Ожидаемый результат: 123456789056756

Пример 3.

Исходные данные: 2; -5; 8; 9; 7; -4; -9; 5

Ожидаемый результат: 9; 8; -5; 7; -4; 5

Соседние файлы в папке лабы