Лабораторная работа №9
Цель работы:
Написание программы, позволяющей работать с символьными массивами.
План:
1. Практическое задание.
2. Вывод.
3. Практическое задание для самостоятельно работы.
Практическое задание.
Написать функции, исследующие символьные массива:
1. Функции безопасного ввода массива символов с клавиатуры.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* s_gets_c(char* str, unsigned buf_size);
Int main()
{
const unsigned buf_size = 50;
char str1[buf_size];
char *p = s_gets_c(str1, buf_size);
getchar();
return 0;
}
char* s_gets_c(char* str, unsigned buf_size)
{
/*
Безопасная (с точки зрения риска переполнения буфера)
Реализация чтения строки с консоли
Основана на посимвольном чтении потока ввода (getchar)
*/
unsigned i = 0;
int ch;
//из потока ввода забираем всё,
// что есть до символа '\n' (когда будет нажат ввод)
while ((ch = getchar())!= '\n')
if (i < (buf_size - 1))//но записываем только пока есть место в строке
str[i++] = ch;
str[i] = '\0'; //в конце не забываем поставить символ конца строки
return str;
}
На рисунке 1 изображен символьный массив (1), в котором заштрихованы все ячейки, хранящие цифры. Формула (2) показывает вычисление сумму всех цифр, содержащихся в массиве. Формула (3) показывает расчет чисел, содержащихся в символьном массиве.
Рис 1. Сумма цифр и чисел в символьном массиве.
2. Функции для подсчета сумм цифр в строке.
unsigned sum_of_digits(char* str);
printf("Sum of digits: %u", sum_of_digits(str1));//в main
Функция:
unsigned sum_of_digits(char* str)
{
unsigned i = 0, sum = 0;
while (str[i])
{
if (str[i] >= '0'&& str[i] <= '9')
{
//добавляем значение цифры к сумме
//поскольку в кодовой таблице цифры
//записаны подряд, числовое значение
//можно получить вычислив разность
//кода текущего символа с кодом символа '0'
sum = sum + str[i] - '0';
}
i++;
}
return sum;
}
3. Функции для подсчета суммы чисел в строке.
unsigned sum_of_decimals(char* str);
printf("Sum of decimals: %u", sum_of_decimals(str1));//в main
Функция:
unsigned sum_of_decimals(char* str)
{
unsigned i = 0, sum = 0, decimals = 0;
do
{
while (str[i] >= '0'&& str[i] <= '9')
{
decimals = decimals * 10 + (str[i] - '0');
i++;
}
sum = sum + decimals;
decimals = 0;
}
while (str[i++]);
return sum;
}
Рис 2.
4. Функции, ведущей подсчет слов:
На рисунке два представлены символьный массив (1), а также массив разделителей (2). Разделители служат ориентиром того, что слово в символьном массиве закончено. Таким образом, в исходном массиве (1) содержится 4 слова, которые отмечены штриховкой (3).
unsigned count_words(char* str);
unsigned str_char(char symbol, char* str);
printf("Count of words: %u", count_words(str1));//в main
Функция:
unsigned count_words(char* str)
{
unsigned inWord = 0, i = 0, count = 0;
char separator[] = " \t,.!?:;";
do
{
if (str_char(str[i], separator))
{
If (inWord)
count++;
inWord = 0;
}
Else
inWord = 1;
} while (str[i++]);
//при этом символ '\0' тоже будет обработан
return count;
}
unsigned str_char(char symbol, char* str)
{
/*
Функция проверяет, встречается ли символ в строке
Если встречается - возвращаем 1, если нет - 0
Важно!!! Функция написана так,
чтобы анализировать и символ '\0',
который неявно существует в любой строке в C
*/
unsigned i = 0;
do
if (str[i] == symbol)
return 1;
while (str[i++]);
//при такой организации цикла проверяется и символ '\0'
return 0;
}
5. Функции, удаляющей символ из строки.
char* remove_sym(char* str, unsigned index);
printf("Delete symbol index %u: %s\n", f, d);// в main
Функция:
char* remove_sym(char* str, unsigned pos)
{
do
str[pos] = str[pos + 1];
while (str[pos++]);
return str;
}
6. Функции, удаляющей дубликаты из строки.
char* delete_dybsym(char* str);
char* delete_sym2(char* str, char t, unsigned j);
char* sdvig_str(char* str, unsigned n);
printf("Delete dybsym: %s\n", delete_dybsym(str1)); // в main
Функции:
char* delete_dybsym(char* str) // удаление дублирующихся символов
{
int i, j;
for (i = 0; str[i]!= '\0'; i++)
{
for (j = i + 1; str[j]!= '\0'; j++)
{
if (str[i] == str[j])
{
delete_sym2(str, str[j], j);
i = i--;
}
}
}
return str;
}
char* sdvig_str(char* str, unsigned n) //сдвиг строки
{
unsigned a = n;
while (str[a]!= '\0')
{
str[a] = str[a + 1];
a++;
}
return str;
}
char* delete_sym2(char* str, char t, unsigned j) // удаление символа из строки (универсальная)
{
int i=j;
while (str[i])
{
if (str[i] == t)
{
sdvig_str(str, i);
i = i--;
}
i++;
}
return str;
}
Вывод.
В ходе лабораторной работы написана программа, позволяющая работать с символьными массивами. Написаны функции, обеспечивающие вычисление сумм всех цифр и чисел, содержащихся в символьном массиве, и функции, позволяющие удалять символы и дубликаты символов из массива.