Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


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

 





Поделиться с друзьями:


Дата добавления: 2016-12-17; Мы поможем в написании ваших работ!; просмотров: 522 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Начинать всегда стоит с того, что сеет сомнения. © Борис Стругацкий
==> читать все изречения...

2359 - | 2118 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.01 с.