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

Лабы 1 курс 2 семестр / ЛР 5 Информатика 2 сем 2020

.pdf
Скачиваний:
11
Добавлен:
15.01.2021
Размер:
930.97 Кб
Скачать

std::cout<<str[i];

if(str[i] == 'A' || str[i] == 'a')

{

std::cout<< str[i];

}

}

}

system("pause");

}

Тесты

Введѐнная

0123456789

Array

abcd*efg

***privet***

AAAAA

строка

 

 

 

 

 

Полученная

0123456789

AArraay

aabcdefg

privet

AAAAAAAAAA

строка

 

 

 

 

 

Полученные результаты полностью соответствую поставленной задаче, программа работает верно.

Задача Б Во введенной строке (не более 100 символов), подсчитать количество слов. Слова разделены пробелами.

Решение

Составим блок-схему Алгоритм решения задачи следующий. Перебираем строку

посимвольно. Когда очередной символ – пробел, значит, мы нашли конец слова. Для подсчѐта слов введѐм дополнительную целочисленную переменную. Каждый раз, как найдѐм пробел, будем увеличивать значение этой переменной на единицу. Для корректной обработки ситуации, когда два слова разделены несколькими пробелами, смотреть нужно не только на текущий, но и на предыдущий символ. Если оба соседних символа – пробелы, значение переменной для подсчѐта слов не меняем – слова между ними не содержится.

90

 

 

 

 

Начало

 

 

 

Символьный массив str из 101 элемента

 

 

 

 

 

Ввод str

 

 

 

Целое неотрицательное число quantity = 0

 

 

 

 

Указатель на символ pointer = str + 1

 

 

 

 

да

нет

 

 

 

 

 

*pointer != '\0'

 

да

*pointer == '

' &&

нет

да

нет

 

 

*(pointer - 1) != ' '

 

 

*(pointer - 1) != ' '

 

 

 

 

 

 

quantity++

 

 

 

quantity++

 

pointer++

Вывод quantity

Конец

Составим программу на основе блок-схемы.

#include <conio.h> #include <iostream>

void main()

{

std::cout<<("Input text:\n") ; char str[101]; std::cin.getline(str, 101);

unsigned int quantity = 0; // Для подсчёта слов в строке

char* pointer = str + 1;

// Указатель на символы строки

while(*pointer != '\0')

// Пока не дошли до конца строки,

{

 

if(*pointer == ' ' && *(pointer - 1) != ' ') // ищем пробелы

(несколько пробелов подряд считаем за один)

{

 

quantity++;

// считаем пробелы

}

 

 

91

pointer++;

// переходим на следующий символ

}

if(*(pointer - 1) != ' ') // если строка оканчиватся не пробелом

{

quantity++; // количество слов на 1 больше количества пробелов

}

std::cout<< "Words quantity = "<< quantity <<"\nPress any key to continue "; // Вывод количества слов

_getch();

}

Тесты

Результаты работы программы показаны в таблице ниже

Введѐнная строка

Количество

слов

 

Hallo word!

2

Veni, vidi, vici

3

Press any key to continue

5

Verify that your new app builds and runs

8

test test test

3

 

0

Они соответствуют действительности, программа работает верно.

92

Задача В Отсортировать числовой массив из 10 элементов по возрастанию (любым способом).

Решение

Возьмѐм алгорим сортировки массива – «вставками». При сортировке вставками массив разбивается на две области: упорядоченную и и неупорядоченную. Изначально весь массив является неупорядоченной областью. При каждом проходе первый элемент из неупорядоченной области изымается и помещается в правильном положении в упорядоченной области. На каждом проходе размер упорядоченной области возрастает на 1, а размер неупорядоченной области сокращается на 1.

Начало

Вещественнный массив arr из 10 элементов

Ввод значений элементов arr

Вещественное число temp = 0 Целое неотрицательное число k = 0 Целое неотрицательное число j = 1

 

 

да

нет

 

 

 

j < 10

 

temp = arr[j]

 

 

 

k = j - 1

 

Вывод массива arr

 

 

 

да

k >= 0 &&

нет

Конец

 

 

 

 

arr[k] > temp

 

 

arr[k+1] = arr[k]; arr[k] = temp;

k--;

j++

93

Реализуем составленный алгоритм. Поскольку размер массива известен заранее, создадим статический массив. Реализуем оба цикла для обработки этого массива при помощи конструкций «for» и «while».

Основной цикл работает в интервале от 1 до size - 1. На j-й итерации элемент [k] вставляется в правильное положение в упорядоченной области. Все элементы упорядоченной области, которые больше, чем [k], сдвигаются на одну позицию вправо. [k] вставляется в интервал между теми элементами, которые меньше [k], и теми, которые больше [k].

#include <iostream> #include <stdlib.h>

void main()

{

const unsigned int size = 10; float arr[size];

// Заполняем массив значениями for(int i = 0; i < size; i++)

{

std::cout<<"input " << i + 1 <<" element:"; std::cin>>arr[i];

}

float temp = 0; unsigned int k = 0;

// Сортируем массив

for(unsigned int j = 1; j < size; j++)

{

temp = arr[j]; k = j - 1;

while(k >= 0 && arr[k] > temp)

{

arr[k+1] = arr[k]; arr[k] = temp; k--;

}

}

// Выводим отсортированный массив на экран std::cout<<"sorted array:";

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

{

std::cout<<" "<<arr[i];

}

system("pause");

}

Тесты

Проверим работу программы, вводя различные значения массива.

94

Вводимые значения массива

Выведенный массив

5 8 1 23 -8 4 -6 0 1 17

-8 -6 0 1 1 4 5 8 17 23

35 22.7 22.4 10 3.9 0.1 0 -0.1 -4.2 -4.8

-4.8 -4.2 -0.1 0 0.1 3.9 10 22.4 22.7 35

-5 7 3.4 -5 -3.4 3.2 7 -5 3.3 -3.4

-5 -5 -5 -3.4 -3.4 3.2 3.3 3.4 7 7

Результат работы программы соответствует поставленной задаче – сортировке массива по возрастанию, программа работает верно.

Задача Г Создать числовую матрицу (m, n). Изменить знак всех элементов матрицы на противоположный.

Решение

Составим блок-схему:

95

 

Начало

 

Целое неотрицательное число M

Целое неотрицательное число N

 

Ввод значений M, N

 

Создание массива matr типа «указатель на

 

число» размера M

 

Целое неотрицательное число i = 0

Целое неотрицательное число j = 0

да

 

 

 

i < M

нет

 

 

Создание массива matr[i]

 

 

типа число

 

 

 

 

i=0

i++

 

 

да

 

нет

 

i < M

 

да

нет

j < N

i=0

Ввод элемента матрицы matr[i][j]

j=0

j++ i++

Вывод элементов матрицы на экран

Изменение знаков элементов матрицы на противоположные

Вывод элементов матрицы на экран

Конец

96

Вывод элементов матрицы на экран и изменение их знаков организованы по аналогии ввода элементовматрицы – при помощи двух вложенных циклов, на блок-схеме это не детализировано

Составим программу на основе блок-схемы

#include <iostream> #include <stdlib.h>

void main()

{

unsigned int M; std::cout<<"input M:"; std::cin>>M;

unsigned int N; std::cout<<"input N:"; std::cin>>N;

//запись float** означает указатель на указатель на значение типа float

//то есть мы сначала создаём массив указателей

float** matr = new float*[M];

//а затем записываем в него указатели на создаваемые массивы float for(unsigned int i = 0; i < M; i++)

{

matr[i] = new float[N];

}

//Таким образом, мы получили массив массивов - матрицу

//Зададим значения элементов матрицы, вводя их с клавиатуры std::cout<<"input elements:\n";

for(unsigned int i = 0; i < M; i++) for(unsigned int j = 0; j < N; j++)

std::cin>>matr[i][j];

//Выведем матрицу на экран

for(unsigned int i = 0; i < M; i++)

{

for(unsigned int j = 0; j < N; j++)

{

std::cout<<"\t"<<matr[i][j];

}

std::cout<<"\n\n";

}

std::cout<<"\n\n";

//Изменим знак всех элементов матрицы на противоположный

//И снова выведем матрицу на экран

for(unsigned int i = 0; i < M; i++)

{

for(unsigned int j = 0; j < N; j++)

{

matr[i][j] = -matr[i][j]; std::cout<<"\t"<<matr[i][j];

}

std::cout<<"\n\n";

}

std::cout<<"\n\n";

// Освобождаем динамически выделенную память for(unsigned int i = 0; i < M; i++)

97

{

delete[] matr[i];

}

delete[] matr;

system("pause");

}

Тесты Проверим работу программы, вводя различные значения матрицы.

Введѐнные значения

Исходная матрица

Полученная матрица

M

2

1

2

3

-1

-2

-3

N

3

 

 

 

 

 

 

elements

1 2 3 4 5 6

4

5

6

-4

-5

-6

 

 

 

 

 

 

M

3

-5

7

3.4

5

-7

-3.4

N

3

0

2

-18.7

-0

-2

18.7

elements

-5 7 3.4 0 2 -8.7

 

 

 

 

 

 

0 -4 10

0

-4

10

-0

4

-10

 

Результат работы программы соответствует поставленной задаче, программа работает верно.

98

6.4Задания:

В заданиях к данной лабораторной работе предполагается, что длина вводимой с клавиатуры строки не превышает 100 символов, если другое не указано явно.

Задача 5.1.1. Вывести на экран введенную строку, предварительно добавив в начало и в конец каждого слова символ «*» (слова разделяются пробелами).

Задача 5.1.2. Вывести на экран введенную строку, предварительно заменив знак препинания «?» на «!» и наоборот.

Задача 5.1.3. Вывести на экран введенную строку, предварительно добавив после знаков препинания «.», «,», «:» и «;» переход на новую строку.

Задача 5.1.4. Вывести на экран введенную строку, предварительно заменив пробелы символами табуляции и удалив знаки препинания «,»

и «;».

Задача 5.1.5. Вывести на экран введѐнную строку, предварительно заменив строчные буквы латинского алфавита «k», «l» и «m» на заглавные.

Задача 5.1.6. Вывести на экран введѐнную строку, предварительно заменив заглавные гласные буквы латинского алфавита на строчные.

Задача 5.1.7. Во введѐнной строке подсчитать количество слов, начинающихся со строчных латинских гласных букв. Слова разделены пробелами. Результат вывести на экран.

Задача 5.1.8. Во введѐнной строке подсчитать количество слов, содержащих строчные буквы «t» и «s», стоящие на соседних местах. Слова разделены пробелами. Результат вывести на экран.

Задача 5.1.9. Во введѐнной строке подсчитать количество слов, содержащих букву «q» и не содержащих букву «p». Слова разделены пробелами. Результат вывести на экран.

Задача 5.1.10. Определить, сколько слов во введѐнной строке начинаются и оканчиваются одной и той же буквой. Слова разделены пробелами. Результат вывести на экран.

99