Лаб.практикум_2
.pdfМинистерство образования и науки Российской Федерации
Московский государственный институт электронной техники (технический университет)
_____________________________________________________
Н.Ю. Соколова
Лабораторный практикум по курсу «Информатика и программирование» Часть 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