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

MU_LR_Informatika_1

.pdf
Скачиваний:
13
Добавлен:
12.03.2015
Размер:
1.91 Mб
Скачать

Лабораторная работа №3

«Работа со строками»

3.1 Варианты индивидуальных заданий

Задание: Разработать алгоритм и программу поиска объектов в тексте в соответствии с индивидуальным заданием.

 

Объект

Действие

 

 

 

 

A

B

 

 

 

1

Предлоги

Удалить

 

 

 

2

Союзы

Копировать

 

 

 

3

Гласные

Определить количество

 

 

 

4

Имена прилагательные

Заменить на

 

 

 

5

Числительные

 

 

 

 

6

Удвоенные согласные

 

 

 

 

7

Удвоенные гласные

 

 

 

 

8

Двухзначные числа

 

 

 

 

9

Трехзначные числа

 

 

 

 

10

Слова

 

 

 

 

11

Знаки препинания

 

 

 

 

12

Слова начинаются с одной буквы

 

 

 

 

13

Слова начинаются и

 

 

заканчиваются с одной буквы

 

 

 

 

14

Цифры

 

 

 

 

3.2 Краткие сведения

3.2.1 Символьный тип char

Для хранения символьных данных предназначен тип char. Переменную типа char можно рассматривать двояко: как целое число, занимающее 1 байт и способное принимать значения от 0 до 255 (тип unsigned char) или от -128 до 127 (тип signed char) и как один текстовый символ. Сам же тип char может оказаться как знаковым, так и беззнаковым, в зависимости от операционной системы и компилятора. Поэтому использовать тип char не рекомендуется, лучше явно указывать будет ли он знаковым (signed) или беззнаковым

(unsigned).

Как и целые числа, данные типа char можно складывать, вычитать, умножать, делить, а можно выводить на экран в виде одного символа. Именно это и происходит при выводе символа через объект cout. Если же нужно вывести числовое значение символа (также называемый ASCII-кодом), то значение символа необходимо преобразовать к типу int. Например:

31

#include<iostream> using namespace std; int main()

{

unsigned char c='A'; // Константы char заключаются в одинарные кавычки

cout<<c<<" "<<(int)c<<endl;

c=126; // char можно присвоить и числовое значение cout<<c<<" "<<(int)c<<endl;

return 0;

}

В этом примере переменной с типа char присваивается значение, равное символу 'A' (константы типа char записываются как символы в одинарных кавычках), затем на экран выводится значение c, как символа и его ASCII-код, потом переменной c присваивается значение 126 (то есть символ с ASCII-кодом 126) и снова выводится на экран символ и его

ASCII-код.

Организовать последовательное посимвольное считывание всего входного потока можно при помощи цикла while:

#include<iostream> using namespace std; int main()

{

unsigned char c;

while(cin>>c) // Цикл пока считывание успешно

{// Делаем необходимые действия

}

return 0;

}

В этом примере программа будет посимвольно считывать входной поток (по умолчанию — ввод с клавиатуры), пока не встретит признак конца файла. Для того, чтобы сообщить программе о завершении файла при вводе с клавиатуры необходимо нажать клавиши Ctrl-d (В Windows – Ctrl-z).

Эта программа при считывании данных будет игнорировать символы– разделители: пробелы, символы новой строки и табуляции. Если нужно, чтобы в переменную c считывались все символы, в том числе и разделители, то необходимо для потока ввода cin установить манипулятор noskipws при помощи инструкции cin>>noskipws;.

3.2.2 C-строки

Строка в языке C — это обычный массив символов, то есть массив данных типа char. Если объявить строку S в виде char S[100], то для хранения этой строки будет отведено 100 байт памяти. К каждому символу строки можно обращаться, как к элементу массива:

32

S[0], S[1] и т.д. При этом длина строки может быть и меньше 100 символов. Признаком окончания строки является символ с нулевым ASCII-кодом, то есть если в строке S записано слово `С++', то S[0]=='C', S[1]=='+', S[2]=='+', S[3]==0, а во всех остальных элементах массива S могут быть записаны произвольные символы. Таким образом, максимальная длина строки, объявленной как char S[n] может быть n-1 символ, поскольку один символ требуется для хранения нулевого символа, завершающего строку. При работе со строками надо быть аккуратными и не вылезать за границы массива– строки, поскольку язык C++ не контролирует подобные ошибки. Ошибки, связанные с переполнением текстовых строк являются основными причинами уязвимостей системного программного обеспечения.

Ввод и вывод текстовых строк осуществляется так же, как и ввод– вывод чисел:

cin>>S; // считать строку S с клавиатуры

cout<<S; // вывести строку S на экран

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

char S1[100], S2[100], S3[100]; // объявили 3 строки

cin>>S1>>S2>>S3;

ввести строку `Мама мыла раму' (с произвольным количеством пробелов между словами), то в массив S1 будет записана строка "Мама", в S2 "мыла", в S3 "раму". При этом каждая строка будет дополнена завершающим нулевым символом.

Таким образом, организовать считывание всего файла по словам, можно следующим образом:

char S[1000]; // Максимально возможный размер слова

while(cin>>S) // Цикл до тех пор, пока считывание успешно

{

// Выполнить необходимые действия

}

Заметим, что если во входном массиве будет слово, которое не помещается в массиве S, то программа будет работать некорректно (например, завершит свою работу с ошибкой типа

Segmentation fault).

Часто бывает необходимо считывать данные из входного потока не по словам, а по строкам, считая, что строки разделены символом перевода строки. Тогда нужно использовать метод getline потока cin в следующем виде:

const int n=1000; // константа - максимальный размер строки char S[n]; // массив-строка из n элементов

while( cin.getline(S,n) ) // считываем не более n символов

{ // Сделать необходимые действия

}

У метода getline два аргумента. Первый аргумент — идентификатор массива– строки, в который будет записан результат ввода. Второй аргумент: максимальное число символов, которое будет считано. Таким образом, метод getline является более

33

безопасным, поскольку задав параметр n мы можем избежать проблемы переполнения строки.

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

#include<cstring>.

Строки в языке C++

На языке C++ программист должен постоянно проверять, не произошло ли переполнение строки при различных операциях типа копирования или считывания строки со стандартного ввода или из файла. Кроме того, для копирования строк необходимо было вызывать специальную функцию strcpy. Поэтому в C++ были добавлены новые строки: объекты класса string. Для этих объектов определен оператор конкатенации +, оператор присваивания = и при работе с таким строками автоматически проходит проверка переполнения строки и увеличение ее размера при необходимости.

Основные приемы работы с объектами string проиллюстрированы в программе:

string S, S1, S2;

// Объявление трех строк

cin>>S1;

// Считали строку S1

S2="Привет, ";

// Присвоили строке значение

S=S2+S1;

// Использование конкатенации

cout<<S<<endl;

// Вывод строки на экран

cout<<S.length();

// Длина строки S

Обращаться к отдельному символу строки string можно как и к отдельному элементу массива: S[0], S[1] и т.д. Если необходимо преобразовать объект string к C-строке, необходимо вызвать для него метод c_str(): S.c_str().

Как и в случае C-строк, при считывании строки при помощи cin>>S строка считывается до появления первого пробельного символа, при этом все пробельные символы игнорируются. Если необходимо считывать строку вместе с пробелами до появления символа конца строки, нужно использовать функцию getline, указав в качестве первого параметра – имя входного потока, в качестве второго параметра – идентификатор строки:

getline(cin,S1);

3.3Контрольные вопросы

1.Для чего используется символьный тип данных?

2.Функции ввода строк?

3.Что такое ASCII код?

4.Чем отличаются строки от массивов данных символьного типа?

5.Функции ввода/вывода строк на языке С++?

6.Описание и назначение типа данных char?

7.Максимальный размер строки на языке С?

8.Какие конструкции циклов используются для работы со строками?

9.Можно ли складывать переменные типа char?

34

Лабораторная работа №4

«Структуры»

3.1 Варианты индивидуальных заданий

Задание: Разработать алгоритм и программу для создания пользовательской базы данных (не менее 3 полей), предусмотреть инструменты для ввода/вывода, а также сортировки базы данных по заданному критерию. Исходную базу данных и результаты сортировки сохранить в файлах.

Базы данных

 

 

 

1

База данных автомобилей

 

 

2

База данных фильмов

 

 

3

База данных книг

 

 

4

База данных аудиозаписей

 

 

5

База данных группы студентов

 

 

6

База данных ноутбуков

 

 

7

База данных ПК

 

 

8

База данных сотовых телефонов

 

 

9

База данных факультетов ИжГТУ

 

 

10

База данных химических элементов

 

 

11

База данных металлов

 

 

12

База данных мониторов

 

 

13

База данных операционных систем

 

 

14

База данных языков программирования

 

 

15

База данных процессоров

 

 

16

База данных микроконтроллеров

 

 

17

База данных принтеров

 

 

18

База данных инструмента

 

 

19

База данных видеокамер

 

 

20

База данных фотоаппаратов

 

 

35

3.2 Краткие сведения

Структуры в языке Си

Структура - это совокупность переменных, объединенных под одним именем. С помощью структур удобно размещать в смежных полях связанные между собой элементы информации. Объявление структур создает шаблон, который можно использовать для создания ее объектов, то есть экземпляров этой структуры. Переменные, из которых состоит структура, называются членами. Члены структуры еще называют элементами или полями.

Как правило, члены структуры связаны друг с другом. Например, элемент списка рассылки, состоящий из имении адреса, логично представить в виде структуры. В объявлении структуры используется ключевое слово struct. Оно сообщает компьютеру, что объявляется (декларируется) структура.

Общий вид объявления структуры :

struct тег {

тип имя-члена; тип имя-члена; тип имя-члена;

...

} переменные-структуры;

Причем параметры : переменные-структуры являются необязательными, так как переменные можно объявить позже.

Пример инициализации структуры: struct addr

{

char name[30]; char street[40]; char city[20]; char state[3];

unsigned long int zip; };

Объявление завершается точкой с запятой. Это потому, что объявление структуры является оператором. Кроме того, тег структуры addr идентифицирует эту конкретную структуру данных и является спецификатором ее типа. В данном случае определяется вид данных. Чтобы объявить переменную типа addr, то есть физический объект, необходимо написать следующее:

struct addr addr_1;

Обращение к полям структуры осуществляется с помощью оператора. Например, addr_1.name = “ Ivanov”; addr_1.zip = 426000;

Инициализация массива подобных объектов выполняется подобно созданию массивов элементов стандартных типов данных, например struct addr Izhevsk_addr[1000];

Тогда доступ к элементам массива осуществляется Izhevsk_addr[0].zip = 426000.

36

Пример выполнения программы согласно заданию: Создать базу данных квартир и выполнить поиск по критерию стоимости.

#include<iostream> #include<conio.h> #include<string.h> #include<stdlib.h> using namespace std; struct flat

{

char adres[30]; int kolvo;

long int stoimost; double ploshad;

};

int main()

{

const int n=3; int i,j;

flat s[n],t; cout.setf(ios::left);

for(i=0;i<=n-1;i++)

 

 

 

{

 

 

 

 

cout<<"

Vvedite adress\n";

 

 

cin>>s[i].adres;

 

 

 

cout<<"

Vvedite kolichestvo komnat\n";

 

 

cin>>s[i].kolvo;

 

 

 

cout<<"

Vvedite ploshad\n";

 

 

cin>>s[i].ploshad;

 

 

 

cout<<"

Vvedite stoimost\n";

 

 

cin>>s[i].stoimost;

 

 

 

cout<<"\n";

 

 

 

 

}

 

 

 

 

cout<<"\n Adress

Kolichestvo_komnat

Ploshad

Stoimost\n\n";

for(i=0;i<=n-1;i++)

 

 

 

{

 

 

 

 

cout.width(20);cout<<s[i].adres;

 

 

cout.width(20);cout<<s[i].kolvo;

 

 

cout.width(15);cout<<s[i].ploshad;

 

 

cout.width(15);cout<<s[i].stoimost<<"\n";

 

 

}

 

 

 

 

int stoimost;

 

 

 

cout<<"\n\n

Vvedute stoimost kvartirbl za kv metr\n";

 

cout<<"\n";

 

 

 

 

cin>>stoimost; for(i=0;i<=n-1;i++) if(s[i].stoimost<=stoimost)

{

cout.width(20);cout<<s[i].adres;

cout.width(20);cout<<s[i].kolvo;

cout.width(20);cout<<s[i].ploshad; cout.width(20);cout<<s[i].stoimost<<"\n";

}

getch();

}

Рисунок 4.1 – Текст программы

37

4.3Контрольные вопросы

1.Определение структур?

2.Для чего используются структуры?

3.Формат инициализации структур?

4.Как представлены структуры в памяти ЭВМ?

5.Как инициализировать массив структур?

6.Чем отличается структура от массива?

7.Какие функции языка С используются для работы со структурами?

8.Как осуществляется доступ к элементу структуры?

9.Какие параметры являются обязательными при инициализации структуры?

38

Список рекомендуемой литературы

а) Основная литература

1.Джордж Шеферд. Программирование на Microsoft Visual C++ .NET (+ CD-ROM) -

Санкт Петербург: Питер,Русская Редакция , 2005 - 928 с.

2.Эндрю Троелсен. Язык программирования С# 2005 и платформа .NET 2.0. Вильямс, 2007 - 1168 с.

3.Лафоре, Р. Объектно-ориентированное программирование в С++=Object-Oriented Programming in C++/Р. Лафоре ; [пер. с англ.: А. Кузнецов, М. Назаров, В. Шрага].-4-е

изд.-СПб., [и др.]:Питер, 2012 - 924 с.

4.Чиртик, А. А. Программирование на С++/Александр Чиртик.-СПб. [и др.]:Питер,2010 - 346 с.

5.Ишкова, Э. А. С++:начала программирования/Э. А. Ишкова.-4-е изд., испр. и доп .-

М. : Бином, 2012 - 368 с.

6.Павловская, Т. А. С/С ++:Программирование на языке высокого уровня : учебник для вузов /Т. А. Павловская. - СПб.[и др.]: Питер, 2010 - 460 с.

7.Информационные технологии:учебник для вузов/Б. Я. Советов, В. В. Цехановский.- Изд. 5-е, стер.-М. :Высшая школа, 2009 - 262 с.

8.Акулов, О. А. Информатика: базовый курс : учебник для вузов/О. А. Акулов, Н. В. Медведев.-5-е изд., испр. и доп.-М. : Омега-Л, 2008 - 574 с.

б) Дополнительная литература

1.Архангельский А.Я. C++ Builder. Справочное пособие. Книга 1. Язык С++. – М.:

Бином, 2002. – 544 с.:ил.

2.Архангельский А.Я. C++ Builder. Справочное пособие. Книга 2. Классы и компоненты.

– М.: Бином, 2002. – 528 с.:ил.

3.Архангельский А.Я. Интегрированная среда обработки С++ Builder 5 – М ЗАО «Издательство БИНОМ». 2000. – 272 с.

4.Технологии объектно-ориентированного программирования:учеб. пособие для вузов/П. Б. Хорев.-М. :Академия, 2004.-446 с.

5.Павловская Т.А. С/С++. Структурное программирование. Практикум. Учебное пособие для ВУЗов. – СПб.:Питер, – 2002– 240 с.:ил.

6.Харви Дейтел, Пол Дейтел. Как программировать на С: Пер. с англ. – М.: ЗАО «Издательство БИНОМ», 2000 г. -1008 с.:ил.

7.Герберт Шилдт: C++: руководство для начинающих. Пер с англ. – М. : “ Вильямс”, 2005. – 672 с.

39

ПРИЛОЖЕНИЕ А (справочное)

Пример оформления отчета по лабораторной работе

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

«Ижевский государственный технический университет имени М.Т. Калашникова»

(ФГБОУ ВПО «ИжГТУ имени М.Т. Калашникова»)

Кафедра «Мехатронные системы»

Лабораторная работа №1

Дисциплина «Информатика»

Тема: «Изучение среды разработки Visual Studio 2010. Базовые структуры»

Выполнил:

студент группы Б01-311-1

И.В. Студентов

Проверил:

Старший преподаватель Ю.Л. Караваев

Ижевск 2013

40

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]