лабы / лаба 4 инфа
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра Вычислительной техники
отчет
по лабораторной работе №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