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

Лаб.практикум_2

.pdf
Скачиваний:
27
Добавлен:
27.03.2016
Размер:
699.3 Кб
Скачать

Министерство образования и науки Российской Федерации

Московский государственный институт электронной техники (технический университет)

_____________________________________________________

Н.Ю. Соколова

Лабораторный практикум по курсу «Информатика и программирование» Часть 2

Утверждено редакционно-издательским советом института

Москва 2010

PDF created with pdfFactory Pro trial version www.pdffactory.com

УДК 004.9(07)

Рецензент доц. А.Л. Ездаков

Соколова Н.Ю.

Лабораторный практикум по курсу «Информатика и программирование»: в 2-х частях. Ч. 2. − М.:

МИЭТ, 2010. – 100 с.: ил.

Рассмотрены задачи программирования на С++ в среде Visual Studio 2005 с использованием строково- го и комбинированного типов данных, файловых потоков, классов. Практикум состоит из пяти лаборатор- ных работ, каждая из которых включает теоретические сведения, примеры программирования и индивиду- альные задания по программированию.

Предназначен для студентов, обучающихся по направлениям «Прикладная информатика» и «Информа- тика и вычислительная техника».

© МИЭТ, 2010

PDF created2with pdfFactory Pro trial version www.pdffactory.com

Соколова Натэлла Юрьевна

Лабораторный практикум по курсу «Информатика и программирование». Часть 2

Редактор А.В. Тихонова. Технический редактор Л.Г. Лосякова. Корректор Л.Г. Лосякова. Верстка авторов.

Подписано в печать с оригинал-макета. 25.06.2010. Формат 60х84 1/16. Печать офсетная. Бумага офсетная. Гарнитура

Times New Roman. Усл. печ. л. 5,8.

Уч.-изд. л. 5,0. Тираж 150 экз. Заказ 65.

Отпечатано в типографии ИПК МИЭТ.

124498, Москва, Зеленоград, проезд 4806, д. 5, МИЭТ

3

PDF created with pdfFactory Pro trial version www.pdffactory.com

Лабораторная работа № 1. Программирование задач с использованием строк

Цель работы: изучение возможности программирования задач с использованием строкового типа дан- ных; получение практических навыков программирования с использованием строк.

Теоретические сведения

Строка это набор символов. Признаком конца строки служит 0.

Общий вид описания переменных строкового типа:

char имя_массива[кол-во символов в строке]; char имя_массива[];

char *имя_массива Например:

char str[25]; char my_str[]; char *str_1;

Инициализация переменных строкового типа. Для задания значений переменным строкового типа достаточно при объявлении переменной присвоить строку символов, заключенных в кавычки. Размер стро- ки можно не указывать, компилятор вычислит размер строки самостоятельно. Можно выделять динамиче- скую область памяти для строковых переменных.

Примеры инициализации:

char str[25]=“The first string”; char my_str[]=“The second string”;

char *str_1=new char[25]; str_1=“The third string”;

Инициализация массива строк. Инициализация массивов строк выполняется аналогично инициализа- ции элементов одномерного массива:

char mas_words[3][10]={“one”,”two”,”three”,”four”};

Ввод строки с клавиатуры. Для ввода строки с клавиатуры используется функция gets(строковая_переменная);

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

Вывод строки на экран. При выводе строки можно использовать cout и puts. puts(строковая_переменная);

cout<<строковая_переменная;

Функции обработки строк. В Visual Studio имеется набор библиотечных функций обработки строк. Некоторые функции приведены в Приложении 1. Для использования библиотечных функций необходимо использовать директиву препроцессору #include <cstring>;

Способы выделения слова из строки символов. Часто при программировании задач с использовани- ем строк необходимо выделить слово (слова). Это можно реализовать с помощью:

1)формирования слова путем анализа каждого символа исходной строки;

2)формирования слова с помощью функции strtok;

3)формирования слова с помощью функции strpbrk.

PDF created4with pdfFactory Pro trial version www.pdffactory.com

Рассмотрим эти способы.

Формирование слова путем анализа символов исходной строки. Для формирования слова необходи-

мо объявить переменную строкового типа, в которую будем заносить символы исходной строки, пока не встретится символ «пробел» или признак окончания строки '\0'. Перед формированием слов пропустим на- чальные пробельные символы.

Текст программы:

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

{

char str[60];

// исходная строка

char word[60];

//

слово

gets(str);

//

ввод строки

int k=0;int j=0;int i=0;

if(str[0]==' ') // если в начале исходной //строки есть пробелы

{

//пока встречается пробел, считаем количество //пробелов

while(str[k++]==' '); k--;

}

//цикл от первого непробельного символа до

//конца строки for(i=k;i<strlen(str);i++)

{

/* если текущий символ не пробел и не признак конца строки, запишем его в переменную word*/

if(str[i]!=' ' && str[i]!='\0') word[j++]=str[i];

// встретили пробел или признак окончания строки else

{

if(j!=0)// слово было сформировано?

{

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

word[j]='\0';

puts(word); // вывод слова на экран j=0; // обнулить значение j для

//формирования нового слова

}

}

}

}

Данная программа будет работать корректно, если после ввода с клавиатуры всех символов строки бу- дет введен пробел. Если пробел не ввести, то последнее слово не выведется на экран. Подумайте почему?

Результат выполнения имеет вид:

5

PDF created with pdfFactory Pro trial version www.pdffactory.com

Формирования слова с помощью функции strtok. Функция strtok позволяет выделять из строки слова, разделенные символами-разделителями, при этом портит содержимое исходной строки.

Приведем фрагмент программы выделения слова из строки символов с использованием данной функ-

ции:

 

 

char *word=new char[80];

// слово

char str[80];

//

исходная строка

gets(str);

//

ввод строки

/*выделить слово из строки. Символом-разделителем является символ из набора символов , . ? */

word=strtok(str," ,.?");

while(word)

// пока word не пусто

{

 

// вывод на экран слова

puts(word);

word=strtok(NULL," ,.?");// переход к

//следующему слову

}

Результат выполнения программы с использованием функции strtok:

Формирования слова с помощью функции strpbrk. Функция strpbrk находит в анализируемой строке str первое местоположение любого из заданных символов-разделителей. При этом содержимое исходной строки не изменяется. Фрагмент программы с использованием данной функции имеет следующий вид:

char *word=new char[80];

// слово

char *str=new char[80];

// исходная строка

gets(str);

// ввод строки

char* w; //указатель на первый символ-

//неразделитель

 

int n; // размер слова

// нахождение первого

w=strpbrk(str," ,.?");

 

//символа-неразделителя

while(w!=NULL)// пока в строке есть символы-

{

//разделители

// вычисление размера слова

n=w-str;

// формирование слова путем копирования //n символов

strncpy(word,str,n);

PDF created6with pdfFactory Pro trial version www.pdffactory.com

word[n++]='\0';// установить признак конца //строки

puts(word); // вывести слово на экран str+=n; // перейти к следующему слову w=strpbrk(str," ,.?");// продолжить поиск

//разделителя в строке

}

// формирование последнего слова if(strlen(str)!=0)strcpy(word,str);

puts(word); // вывод последнего слова на экран

Результат выполнения программы, соответствующей данному фрагменту, имеет вид:

Примеры программирования

Пример 1. Дана строка символов. Вывести на экран четыре самых коротких слова исходной строки. Решение: сформируем массив из слов исходной строки, отсортируем данный массив по длине слов и

выведем на экран первые четыре элемента отсортированного массива. При сортировке массива слов вос- пользуемся алгоритмом сортировки, описанным в лабораторной работе № 4 «Программирование задач с использованием одномерных массивов» (см. Ч. 1).

Текст программы:

#include <iostream>

 

 

 

 

#include <iomanip>

 

 

 

 

#include <string>

 

 

 

 

#include <cstdio>

 

 

 

 

using namespace std;

 

 

 

 

int main()

 

 

 

 

{

// str - исходная строка

 

 

char str[80];

 

 

cout<<"input string

>";

 

 

gets(str);

 

// word - массив слов

 

 

char word[10][20];

 

 

int k=0; // k - количество слов в строке str

 

 

/*Формирование массива слов word из строки str*/

 

 

for(int i=0;i<strlen(str);i++) // Пока не конец

 

 

{

 

//строки

 

 

 

 

int j=0;

//

while(str[i]==' ')i++; // Пропуск пробелов

Количество символов в слове

// word[k]

/* Пока текущий символ не пробел и не нуль-символ */ while(str[i]!=' ' && str[i]!='\0')

//Формирование k-го слова в массиве word word[k][j++]=str[i++];

word[k++][j]='\0'; // Нуль-символ в конец слова

}

/*Сортировка слов в порядке увеличения их длины*/ char* sh_word=new char[20]; // sh_word –

7

PDF created with pdfFactory Pro trial version www.pdffactory.com

//короткое слово из неотсортированных for(int i=0;i<k;i++)// Цикл по всем словам

//массива word

{

//Пусть i-е слово будет самым коротким strcpy(sh_word,word[i]);

int num=i; // Номер короткого слова в массиве

/* Поиск короткого слова среди неотсортированных в массиве слов */ for(int j=i;j<k;j++)

/* Если длина текущего слова меньше, чем длина короткого слова */ if(strlen(word[j])<strlen(sh_word))

{

/*Короткое слово - это текущее слово */ strcpy(sh_word,word[j]);

num=j; /*Номер короткого слова в массиве*/

}

strcpy(word[num],word[i]);// Обмен местами

// i-го слова и короткого слова strcpy(word[i],sh_word);

}

delete[] sh_word;/* Освобождение динамической памяти */ // Вывод на экран четырех коротких слов

for(int i=0;i<4;i++) cout<< word[i]<<" "<<endl;

}

Результат выполнения программы:

Пример 2. Дана строка символов, разделенных пробелами, точками, запятыми. Сформировать новую строку, содержащую слова исходной строки, поставив перед самыми короткими словами в строке символ * (звездочка).

Текст программы:

#include <iostream> #include <iomanip> #include <string> #include <cstdio> using namespace std;

int main()

 

{

 

= new char[80];/*исходная строка*/

char* str

char* word

= new char[20];/* слово в строке*/

char* newstr

= new char[80];/*новая строка*/

cout<<"Input

string >";

gets(str);

// Ввод строки

/* Пусть длина

самого короткого слова = длине строки */

int

minlen

= strlen(str);

/* stroka = str + 'пробел'*/

char* stroka

= new char[strlen(str)+2];

strcpy(stroka,str); strcat(stroka," "); word=strtok(str," ,.?");

while(word) // word - первое слово в строке

{

PDF created8with pdfFactory Pro trial version www.pdffactory.com

/* Если длина короткого слова меньше длины текущего слова, то длина короткого слова = длине текущего слова */

if(minlen>strlen(word)) minlen=strlen(word); word=strtok(NULL," ,.?"); /* Следующее слово*/

}

 

*/

/* Выделение динамической памяти

word=new char[20];

 

 

/* Формирование новой строки */

 

int n;

// newstr - пустая строка

newstr[0]='\0';

str[0]='\0';// str - пустая строка

// word указывает на символ-разделитель в stroka word=strpbrk(stroka," ,.?");

while(word!=NULL) // Цикл по всем словам

{

// n

- длина слова

n=word-stroka;

strncpy(str,stroka,n);

/* str - текущее слово*/

str[n++]='\0';

 

 

/* Если длина текущего слова равна длине самого короткого слова, то в newstr заносим символ '*' */

if(strlen(str)==minlen) strcat(newstr,"*"); strcat(newstr,str); /* В newstr записывается текущее слово*/ strcat(newstr," "); /* В newstr записывается пробел*/ stroka+=n;/*переход к следующей части строки*/

// Поиск символа разделителя в stroka word=strpbrk(stroka," ,.?");

}

cout<<"Out string >";

puts(newstr);// Вывод новой строки на экран

}

Пояснения к программе. В первой части программы осуществляется поиск длины самого короткого слова. Далее формируется новая строка путем копирования слов из исходной строки. Если длина выделен- ного слова исходной строки равна длине минимального слова, то сначала будет записан символ *, а затем скопировано слово исходной строки.

Результат выполнения данной программы:

Пример 3. Дана строка. В строке имеются символы '*'. Подсчитать количество подстрок, заключенных между символами '*'. Определить самую длинную подстроку.

Текст программы:

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

{

char*

str = new char[80];/* str - исходная строка */

cout<<"Input string >";

gets(str);

// Ввод строки

int

count = 0, // Количество подстрок

maxlen = 0,// Длина наибольшей подстроки

pos =

0,

// Номер текущей позиции в str

9

PDF created with pdfFactory Pro trial version www.pdffactory.com

j = 0; // Счетчик символов в подстроке

char* substr = new char[80];/* substr - текущая подстрока*/ char maxstr[80]; /* maxstr - наибольшая подстрока */ maxstr[0]='\0'; // maxstr - пустая строка

for(int i=0;i<strlen(str);i++)/* Цикл - по всей исходной строке */ if(str[i]=='*') // Если текущий символ = '*'

{

/* Формирование подстроки */ substr[j]='\0';

count++;/* Увеличение количества подстрок на 1 */ if(count>1) /* Если это не первый символ '*' */

{

if(maxlen<=i-pos)

/* Если длина наибольшей подстроки меньше или равна длине текущей подстроки, то длина наибольшей подстроки = длине текущей подстроки, а наибольшая подстрока = текущей подстроке */

{

maxlen=i-pos; strcpy(maxstr,substr);

}

}

substr[0]='\0';// substr - пустая строка

pos=i+1;/* Переход к следующей части исходной строки */ j=0; // Установка начальных значений

}

/* Если текущий символ не '*', то переписываются текущие символы из исходной строки в подстроку */

else substr[j++]=str[i]; // Вывод результатов

cout<<"cout substr >"<<--count<<endl;

cout<<"max substring >"<< maxstr<< "len="<< maxlen << endl;

}

Пояснения к программе. Зададим начальное значения самой длинной подстроки равное 0. В первой части программы формируется подстрока, заключенная между *, и вычисляется длина подстроки. Если дли- на подстроки оказывается больше, чем ранее определенная, то теперь эта подстрока будет максимальной. После просмотра всех возможных подстрок определяется истинное значение максимальной подстроки.

Результат выполнения программы:

Порядок выполнения работы

1.Разработать и выполнить программу в соответствии со своим вариантом задания.

2.Результаты выполнения программы занести в отчет по работе.

3.Показать результаты работы преподавателю.

Требования к отчету

Отчет должен содержать:

1) наименование лабораторной работы;

10

PDF created with pdfFactory Pro trial version www.pdffactory.com

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