Лабораторная работа № 5. Массивы

Цель работы: получить навыки работы с массивами

Теоретическая часть

Приступая к решению задач этого раздела, следует вспомнить, что:

- каждому символу соответствует число — код символа;

- в C++ строка — это массив символов;

- последним символом строки обязательно должен быть нуль-символ, код которого равен 0, и который в тексте программы изображается так: ‘\0’;

- сообщения или подсказки, используемые в программе, удобно представить как массив указателей на строки и инициализировать массив, задать сообщения в инструкции объявления массива:

char *mes[] ={"Сообщение 1","Сообщение 2", ... ,",Сообщение"} ;

- если вводимая во время работы программы строка содержит пробелы, то функция scanf вводит только часть строки до первого пробела, а функция gets — всю строку, в том числе и соответствующий клавише <Enter> символ ' \ n ' .

Строка представляет собой массив символов, заканчивающийся нуль-символом. Нуль-символ — это символ с кодом, равным 0, что записывается в виде управляющей последовательности \0. По положению нуль-символа определяется фактическая длина строки. Строку можно инициализировать строковым литералом

char str[10] = "Vasia";

// выделено 10 элементов с номерами от О до 9

// первые элементы - 'V. 'а', 's'. '1. 'а'. '\0'

В этом примере под строку выделяется 10 байт, 5 из которых занято под символы строки, а шестой — под нуль-символ. Если строка при определении инициализируется, её размерность можно опускать (компилятор сам выделит соответствующее количество байт):

char str [ ] = "Vasia"; // выделено и заполнено 6 байт

Оператор char *str = "Vasia" создает не строковую переменную, а указатель на строковую константу, изменить которую невозможно (к примеру, оператор str[l]='o' не допускается). Знак равенства перед строковым литералом означает инициализацию, а не присваивание.

Операция присваивания одной строки другой не определена (поскольку строка является массивом) и может выполняться с помощью цикла или функций стандартной библиотеки (<string.h>). Библиотека предоставляет возможности копирования, сравнения, объединения строк, поиска подстроки, определения длины строки и т. д., а также содержит специальные функции ввода строк и отдельных символов с клавиатуры и из файла.

Пример. Программа запрашивает пароль не более трех раз.

#include "stdafx.h"

#include "iostream"

#include "string.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

char s[80], passw[] = "kuku"; // passw - эталонный пароль.

// Можно описать как *passw = "kuku";

int i, k = 0;

for (i = 0; !k && i<3; i++)

{

cout<<"\nEnter password:\n";

gets(s); // функция ввода строки

if (strstr(s,passw))

k = 1; // функция сравнения строк

}

if (k) cout<<"\nOk\n";

else cout<<"\nError!\n";

return 0;

}

В этом разделе мы познакомимся с некоторыми типичными функциями стандартной библиотеки string.h. Это библиотека обработки строк, которая обеспечивает много полезных функций для работы со строковыми данными, например, сравнение строк, поиск в строках символов и других подстрок, разметку строк (разделение строк на логические куски) и определение длины строки.

1. Функция int strlen (const char* s); - определяет длину строки s. Возвращает количество символов, предшествующих завершающему нулевому символу. Обратите внимание, завершающий ноль-символ в длину не включается. Например,

cout << strlen("Hello!"); // на экране будет 6

char *str = "one";

cout << strlen(str); // на экране будет 3

2. Функция char *strcpy(char *s1, const char *s2);- копирует строку s2 в массив символов s1. Возвращает значение s1. Массив символов s1 должен быть достаточно большим, чтобы хранить строку и ее завершающий нулевой символ, который также копируется. Например,

char str[25]; // объявляем символьный массив из 25 элементов

char *ps = new char [25]; /* объявляем указатель на символ и

динамически выделяем память под 25 символов */

strcpy(str, "ABCDE"); // копируем в str строковыю константу "ABCDE"

cout << str; // выводим str на экран. На экране будет ABCDE

strcpy(ps, "QWERTY"); // копируем в ps строковыю константу "QWERTY"

cout << ps; // выводим ps на экран. На экране будет QWERTY

delete[] ps; // освобождаем память

Обратите внимание, если Вы хотите, чтобы одна строка содержала другую, Вы должны скопировать ее содержимое, а не присвоить! Так, например, в данном случае инструкция ps = "QWERTY" была бы ошибочна. Компилятор, встречая такую инструкцию, создают строку "QWERTY", за которой следует нулевой символ и присваивает значение начального адреса этой строки (адреса символа Q) переменной ps. Таким образом, теряется исходное значение ps, а значит невозможно корректно освободить память под ps.

3. Функция int *strcmp(const char *s1, const char *s2);- сравнивает строки s1 и s2 (по ASCII-кодам). Функция возвращает значение 0, если строки s1 и s2 равны, значение меньше ноля, если строка s1 меньше s2, и значение больше ноля, если s1 больше s2. Обратите внимание, строки сравниваются не по длине, а посимвольно, по ASCII-кодам ( т.е. "g" больше "ff"). Например,

cout << strcmp("compare", "string"); /* на экране будет -1, поскольку

"compare" меньше "string" */

cout << strcmp("abcde", "abc"); /* на экране будет 1, поскольку

"abcde" больше "abc" */

cout << strcmp("one", "one"); /* на экране будет 0, поскольку

строки равны */

4. Функция char *strcat(char *s1, const char *s2); - добавляет строку s2 к строке s1. Первый символ строки s2 записывается поверх ноль-символа строки s1. Возвращает s1. Под s1 должно быть выделено памяти не меньше чем (strlen(s1)+strlen(s2)+1). Например,

char st1[25] = "День";

cout << strcat(st1, " добрый!"); // на экране будет День добрый!

5. Функция char *strncpy(char *s1, const char *s2, int n); - копирует не болеее n символов строки s2 в массив символов s1. Возвращает s1.

6. Функция char *strncmp(char *s1, const char *s2, int n); - сравнивает до n символов строки s1 со строкой s2. Возвращает 0, меньше, чем 0 или больше, чем 0, если s1 соответственно равен, меньше или больше s2.

7. Функция char *strncat(char *s1, const char *s2, int n); - присоединяет первые n символов строки s2 в строку s1. Возвращает s1.

8. Функция char *strchr(const char *s, int c); - проверяет строку s на содержание символа хранящегося в c. Результатом функции является адрес первого вхождения символа c в строку s. Если символ не найден, возващается NULL. Например,

char str[20] = "ABCDEXYZ";

cout << strchr(str, 'X'); // на экране будет XYZ

или

char str[20] = "ABCDEXYZ";

if (strchr(str, 'q') == NULL) cout << "Нет такого символа!";

9. Функция char *strstr(const char *s1, const char *s2); - проверяет строку s1 на содержание подстроки s2. Результатом функции является адрес первого вхождения подстроки s2 в строку s1. Если подстрока не найдена, возващается NULL. Например,

char str[20] = "ABCDEXYZ";

char *ps = strstr(str, "DEX");

if (ps != NULL)

cout << ps;

else

cout << "Нет такой подстроки!";

// На экране будет DEXYZ

10. Функция char *strlwr(char *s); - конвертирует строку к нижнему регистру (т.е. переводит строку в строчные символы). Например,

char str[30] = "ABCDE_123_ijk_XYZ";

cout << strlwr(str);

// на экране будет abcde_123_ijk_xyz

11. Функция char *strupr(char *s); - конвертирует строку к верхнему регистру (т.е. переводит строку в прописные символы).

12. Функция char *strset(char *s, int ch); - заменяет ВСЕ символы в строке s на символ ch. Например,

char str[30] = "ABCDE";

cout << strset(str, 'x'); // на экране будет xxxxx

13. Функция char *strnset(char *s, int ch, int n); - заменяет первые n символов в строке s на символ ch.

14. Функция char *strrev(char *s); - меняет порядок следования символов в строке на противоположный (меняет первый символ с последним, второй символ с предпоследним и т.д.). Например,

char str[30] = "12345";

cout << strrev(str); // на экране будет 54321

5.2 Задания

1. Написать программу, которая запрашивает у пользователя имя и отчество, затем здоровается с ним. Для ввода используйте функцию getch().

2. Напишите программу, которая вычисляет длину введенной с клавиатуры строки.

3. Напишите программу, которая выводит на экран сообщение в "телефафном" стиле: буквы сообщения должны появляться по одной, с некоторой задержкой.

4. Напишите программу, которая выводит код введенного пользователем символа. Программа должна завершать работу в результате ввода, например, точки. Рекомендуемый вид экрана во время выполнения программы приведен ниже (данные, введенные пользователем, выделены полужирным шрифтом).

Введите символ и нажмите <Enter>.

Для завершения введите точку.

-> 1

Символ: 1 Код: 49

-> 2

48

Символ: 2 Код: 50

-> ы

Символ: ы Код: 235

- > .

5.Написать программу, которая выводит на экран первую часть таблицы кодировки символов (символы с кодами от 0 до 127). Таблица должна состоять из восьми колонок и шестнадцати строк. В первой колонке должны быть символы с кодом от 0 до 15, во второй — от 16 до 31 и т. д.

6. Написать программу, которая в введенной с клавиатуры строке преобразует строчные буквы латинского алфавита в прописные (учтите, что стандартная функция upcase с символами русского алфавита не работает). Рекомендуемый вид экрана во время выполнения программы приведен ниже (данные, введенные пользователем, выделены полужирным шрифтом).

Введите строку текста и нажмите <Enter>

-> изучив основы C++, можно начать программировать под

Windows

Строка, преобразованная к верхнему регистру:

ИЗУЧИВ ОСНОВЫ C++, МОЖНО НАЧАТЬ ПРОГРАММИРОВАТЬ ПОД WINDOWS

7.Написать программу, которая проверяет, является ли введенная с клавиатуры строка целым числом. Рекомендуемый вид экрана во время выполнения программы приведен ниже (данные, введенные пользователем, выделены полужирным шрифтом).

Введите число и нажмите <Enter>

-> 23.5

Введенная строка не является целым числом.

8.Написать программу, которая проверяет, является ли введенная с клавиатуры строка двоичным числом.

9. Написать программу, которая проверяет, является ли введенная с клавиатуры строка шестнадцатеричным числом.

10.Написать программу, которая проверяет, является ли введенная с клавиатуры строка дробным числом.

11.Написать программу, которая преобразует введенное с клавиатуры восьмиразрядное двоичное число в десятичное. Рекомендуемый вид экрана во время выполнения программы приведен ниже (введенные пользователем данные выделены полужирным

шрифтом).

Введите восьмиразрядное двоичное число

и нажмите <Enter>

-> 11101010

Двоичному числу 11101010 соответствует десятичное 234

Для завершения нажмите <Enter>__.

Наши рекомендации