Который неявно существует в любой строке в C




Лабораторная работа №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;

}

Вывод.

 

 

В ходе лабораторной работы написана программа, позволяющая работать с символьными массивами. Написаны функции, обеспечивающие вычисление сумм всех цифр и чисел, содержащихся в символьном массиве, и функции, позволяющие удалять символы и дубликаты символов из массива.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-12-18 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: