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

Тексты заданий (по вариантам);

Тексты программ с комментариями;

Протоколы работы программ;

Выводы по работе.

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

1.  Дайте определение массива.

2.  Как определить переменную типа «массив»?

3.  Как можно задать размерности массива?

4.  Как можно заполнить массив?

5.  В чем состоит особенность организации цикла при обработке массивов?

6.  Какие циклы применяются для обработки многомерных массивов?

7.  Как организовать ввод элементов одномерных массивов и матриц?

8.  Как вывести в общепринятом виде: а) прямоугольную матрицу; б) нижнюю треугольную матрицу; в) верхнюю треугольную матрицу?

9.  Как осуществляется поиск в массиве?

10.  Как ускорить поиск в отсортированном массиве?

11.  Как осуществить циклический сдвиг элементов массива?

12.  Какие методы сортировки вы знаете?

13.  Как заполнить массив случайными числами?

14.  Как задать элементы массива типизированной константой?

15.  Как объединить два упорядоченных массива в один?

16.  Из элементов какого типа может состоять массив?

17.  Чем определяется объем памяти, занимаемый массивом?

18.  Сколько элементов может содержать массив и от чего это зависит?

19.  Какие ошибки могут возникнуть при неаккуратной работе с массивами?

Литература

16.  . С/С++. Программирование на языке высокого уровня. – СПб.: Питер, 2002. – 464с.

17.  , . С/С++. Структурное программирование: практикум. – СПб.: Питер, 2002. – 240с.

НЕ нашли? Не то? Что вы ищете?

18.  Митницкий теории алгоритмов и язык программирования С. Учебное пособие. –М.: МФТИ, 2001. – 180с.

19.  Могилев А. В. и др. Информатика. М.: Изд. центр “Академия”, 2000. – 816 с.

20.  Толковый словарь стандарта языка Си. СПб.: Питер, 1994.

21.  Подбельский С++: Учебное пособие. – М.: Финансы и статистика, 2002 – 560с.

22.  , Фомин на языке Си. – М.: Финансы и статистика, 2002 – 600с.

23.  Алексеев техника и программирование. Практикум по программированию: Практ. пособие. - М.: Высшая школа, 1991. – 400с.

24.  Информатика. Базовый курс. / и др. – СПб.: Питер, 2000. – 640с.

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

Обработка строк

Цели работы:

Научиться разрабатывать программы по обработке символьной информации;

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

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

Язык С++ не содержит стандартного типа данных «строка». Вместо этого он поддерживает массивы символов, завершаемые нуль-символом «\0» (символ с ASCII-кодом 0). Библиотека содержит функции для работы с такими массивами, унаследованные от стандартного языка Си и описанные в заголовочном файле <string. h> . Они позволяют достичь высокой эффективности, но весьма неудобны и небезопасны в использовании, поскольку выход за границы строки не проверяется.

Объявить строку можно 2 способами:

1) Как массив символов:

Char a[21];

2) Как указатель на символьный тип (на начало строки):

Char *a;

При объявлении строки можно проинициализировать:

Char a[21]=”Текст строки”;

Char *a=”Текст строки”; // здесь длина –

В дальнейшем в тексте программы такие присваивания невозможны.

В первом случае под строку отводится 20 символов и один – для хранения нуля. Реально строка в памяти хранится так:

Т

е

к

с

т

с

т

р

о

к

и

\0

Оставшаяся часть строки, после нуль-символа может быть заполнена чем угодно (что было в ячейках памяти).

Первый способ объявления строк (через массив) все же более надежен, так как можно зарезервировать память, достаточную для хранения разных строк, чтобы они не накладывались друг на друга.

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

Указатель на символ удобен для хранения вспомогательных переменных, а также в качестве формального параметра функции. Поскольку имя массива тоже является указателем, оно может быть подставлено при вызове такой функции.

Функции для обработки строк могут быть использованы и просто для копирования непрерывных областей памяти из одного места в другое.

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

Например:

Char *S=”Гольф-клуб”;

S[5]=’\0’; // или S[5]=0; - S = ”Гольф”

*S=’Р’; S[4]=0; // S = ”Роль”

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

В примере *S обозначает содержимое адреса памяти, хранящегося в S, а значит – 1-й символ строки, в то время, как S обозначает ссылку на этот символ, то есть адрес, а не символ.

Основные функции для строк из модуля <string. h>:

strcpy(B, A); - В строку В записывается содержимое строки А. Программист должен следить сам, чтобы максимально возможная длина строки В не была превышена. Это же относится и ко всем другим функциям, в которых строка-получатель может изменить свою длину в результате операции. Первый параметр функции должен быть именем переменной, второй – именем переменной или строковой константой, выражением. Например:

char B[40];

strcpy(B, ”Ошибка! Повторите ввод.”);

strncpy(B, A, N); - В строку В записываются N первых символов из строки А. Первый параметр функции должен быть именем переменной, второй – именем переменной или строковой константой, выражением. Третий параметр может быть любым выражением типа unsigned int.

strcat(B, A); - В конец строки В добавляется содержимое строки А. Первый параметр функции должен быть именем переменной, второй – именем переменной или строковой константой, выражением.

strncat(B, A, N); - В конец строки В добавляются N первых символов из строки А. Первый параметр функции должен быть именем переменной, второй – именем переменной или строковой константой, выражением. Третий параметр может быть любым выражением типа unsigned int.

Пример:

char *s1=”портфель”, *s2=”оглавление”;

s1[3]=0; // s1=”пор”

strncat(s1, s2, 2); // s1=”порог”

Нельзя добавить к строке 1 символ или присвоить строке 1 символ. Одиночный символ заключается в одинарные кавычки (апострофы), а строки - в двойные. Для вызова предыдущих функций даже одиночный символ нужно преобразовывать к типу char* путем добавления к нему нулевого символа.

strlen(A) – Возвращает длину строки А (до символа «\0»). Параметр функции должен быть именем переменной, строковой константой или выражением.

Пример:

int LS=strlen(”Системный блок”); // LS=14

strcmp(A, B); - Сравнение строк А и В. Параметры функции могут быть именами переменных, константами, выражениями. Результат – целое число, по знаку которого определяется соотношение между строками.

Пример:

Int k=strcmp(S1, s2);

If (k<0) puts(”s1<s2”);

Else if (k>0) puts(”s1>s2”);

Else puts(”строки идентичны”);

strncmp(A, B, N); - Сравнение N первых символов строк А и В. Параметры функции могут быть именами переменных, константами, выражениями.

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

«BYTE» < «Byte», «BYTE» < «Bit», «bit» < «byte», «bit» < «bitter»

strchr(A, Х); - Ищет символ Х в строке А. Возвращает указатель на первый найденный символ или NULL (если символ не найден). Параметры функции могут быть именами переменных, константами, выражениями.

Пример:

char *s=”портфель”, *p;

p = strchr(s,’т’);

int pos=p-s; // вычитание указателей дает номер символа - 3

strrchr(A, Х); - Ищет символ Х в строке А. Возвращает указатель на последний найденный символ или NULL (если символ не найден). Параметры функции могут быть именами переменных, константами, выражениями.

Пример:

char *s=”телекоммуникации”, *p;

p = strrchr(s,’к’);

int pos=p-s; // вычитание указателей дает номер символа - 11

strpbrk(A, B); - Ищет любой символ из строки В в строке А. Строка B используется как множество символов (например, набор знаков препинания). Возвращает указатель на первый найденный символ или NULL (если символ не найден). Параметры функции могут быть именами переменных, константами, выражениями.

Пример:

char *s=”Длина удава: 2 слона, 7 мартышек, 38 попугаев”;

char *g=””;

p = strchr(s, p); // поиск цифры в строке s

int pos=p-s; // вычитание указателей дает номер символа - 13

strcspn(A, B); - Ищет любой символ из строки В в строке А. Функция является аналогом функции strpbrk, но возвращает не указатель на первый найденный символ, а его номер в строке А (начиная с нуля) или позицию нуль-символа (если символ не найден). Параметры функции могут быть именами переменных, константами, выражениями.

strspn(A, B); - Ищет любой символ в строке А, которого нет в строке В. Функция возвращает не указатель на первый найденный символ, а его номер в строке А (начиная с нуля) или позицию нуль-символа (если символ не найден). Параметры функции могут быть именами переменных, константами, выражениями.

strstr(A, B); - Ищет подстроку В строке А. Возвращает указатель на первый найденный символ или NULL (если символ не найден). Параметры функции могут быть именами переменных, константами, выражениями.

Пример: Вывод строки по словам

#include <string. h>

#include <stdio. h>

#include <conio. h>

int main(void)

{

clrscr();

char *sx="В этой строке - несколько слов, разделенных знаками препинания."

" Даже несколько предложений!!! "

" Хотите знать, как они выводятся? Запустите эту программу!";

char *r=" -,.;:?!\t<>{}[]()"; // символы-разделители

char *s=sx;

puts(sx);

puts("-------");

int cnt=0; // счетчик подряд стоящих разделителей

while (*s) { // просмотр строки по символам:

if (strchr(r,*s)) { // Символ является разделителем?

if (!cnt) printf("\n"); // если 1-й разделитель, перевести курсор

cnt++; // увеличить счетчик разделителей

}

else { printf("%c",*s); cnt=0; } // Нет, символ относится к слову:

// вывести символ и обнулить счетчик разделителей

*s++; // следующий символ

}

getch();

return 0;

}

ЗАМЕЧАНИЕ. В этом примере объявлена строка sx. В одну строку она не помещается, поэтому в С++ есть возможность записывать длинные строки в виде нескольких строковых констант, заключенных в кавычки. Если между двумя такими константами нет значащих символов, их текст трактуется как одна строка.

Рассмотрим работу со строками без использования функций.

Пример: различные способы вычисления длины строки

typedef unsigned int word;

// Длина строки через индексы

char* str;

word k;

for (k=0;str[k];k++);

// k – длина строки str

// Длина строки через указатели: 1-й способ

char* str, *p=str;

word k=0;

while (*p++) k++;

// k – длина строки str

// Длина строки через указатели: 2-й способ

char* str

char *p=str;

while (*p++);

k=p-str-1; // из-за s++ нужно вычесть 1

}

Вспомогательный указатель p вводится, чтобы не потерять начало строки, на которое указывает str.

Функции преобразования строк в числа и наоборот

Если в кавычках записано число, оно трактуется как строка. Но такую строку можно преобразовать в число, чтобы проводить с ним математические операции. Иногда требуется наоборот преобразовать число в строку, например, чтобы вставить его в какой-нибудь текст. Для этого в языке Turbo C++ есть несколько функций, находящихся в разных библиотечных модулях.

Функция

Модуль

Назначение

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

atoi

STDLIB. H

Число типа int

atol

STDLIB. H

Число типа long int

atof

STDLIB. H

Число типа double

_atold

MATH. H

Число типа long double

strtol

STDLIB. H

Число типа long int

strtoul

STDLIB. H

Число типа unsigned long int

strtod

STDLIB. H

Число типа double

_strtold

STDLIB. H

Число типа long double

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

itoa

STDLIB. H

Число типа int

ltoa

STDLIB. H

Число типа int

ultoa

STDLIB. H

Число типа int

gcvt

STDLIB. H

Число типа int

При преобразовании некоторые функции для работы с целыми числами позволяют использовать разные системы счисления с основаниями от 2 до 32.

Для функций atoi, atol, atof, _atold аргументом должно быть число в десятичной системе счисления.

Для функций strtol, strtoul:

1-й аргумент - преобразуемая строка (переменная, константа, выражение);

2-й аргумент - адрес переменной-строки, в которую записывается остаток преобразуемой строки, если после числа есть другие символы;

3-й аргумент – основание системы счисления (переменная, константа, выражение).

Для функций strtod, strtold:

1-й аргумент - преобразуемая строка (переменная, константа, выражение);

2-й аргумент - адрес переменной-строки, в которую записывается остаток преобразуемой строки, если после числа есть другие символы.

Для функций itoa, ltoa,ultoa:

1-й аргумент - преобразуемое число (переменная, константа, выражение);

2-й аргумент - переменная-строка, в которую записывается результат преобразования;

3-й аргумент – основание системы счисления (переменная, константа, выражение).

Для функции gcvt:

1-й аргумент - преобразуемое число (переменная, константа, выражение);

2-й аргумент – общее число цифр (до и после запятой);

3-й аргумент - переменная-строка, в которую записывается результат преобразования.

Пример: Сумма целых чисел строки

// Условие: За последним числом не должно быть ничего!

#include <string. h>

#include <stdio. h>

#include <stdlib. h>

#include <conio. h>

int main(void){

clrscr();

char *sx=""; // строка для хранения чисел

char *endp; // строка для необработанной части строки sx

long num, sum=0;

do {

num=strtol(sx,&endp,10); // Взять первое число в строке sx

sum+=num;

strcpy(sx, endp); // Теперь в sx остаток строки

} while (*sx); // Повторять, пока есть остаток

printf("Сумма=%ld\n",sum);

getch();

return 0;

}

Задания для самостоятельной подготовки

1.  Изучить:

-  ввод и вывод строк и символов;

-  операции, которые можно производить со строками;

-  присваивание и добавление частей строк;

преобразования строк;

-  поиск подстрок и символов;

-  сравнение строк;

-  получение характеристик строк;

-  работу со строками через индексы и указатели.

2.  Разработать алгоритм решения задачи в соответствии с заданием;

3.  Составить программу решения задачи;

4.  Подготовить текстовый вариант исходных данных.

Задания к работе

Напишите программу согласно варианту:

1.  Написать программу, которая проверяет баланс скобок в математическом выражении. Кроме этого, при перемещении курсора вправо-влево по строке парные скобки, на одной из которых находится курсор, должны выделяться цветом.

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

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

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

5.  В строке выражения найти все математические функции и вывести информацию о том, сколько раз встречается каждая из функций. Список функций задайте массивом срок.

6.  Отредактировать строку, убрав из нее все лишние пробелы. Между словами должно быть по одному пробелу. Перед знаками препинания не должно быть пробелов.

7.  Изменить строку таким образом, чтобы все слова располагались в ней в обратном порядке. Например:
«Вычисление абсолютного значения» - «значения абсолютного Вычисление»

8.  Найти в строке самое длинное симметричное слово, например «казак».

9.  Поменять местами самое длинное и самое короткое слова строки.

10.  Изменить строку таким образом, чтобы каждое слово читалось справа налево, например:
«Операционная система MS DOS» - «яанноицарепО аметсис SM SOD»

11.  Поменять местами слова в каждой паре, например:
«Белеет парус одинокий в тумане моря голубом» -
«парус Белеет в одинокий моря тумане голубом».

12.  В строке есть слова и целые числа в произвольном порядке. Сформировать новую строку, в которой все числа будут увеличены в два раза.

13.  В строке слова могут повторяться. Получить новую строку, в которой все слова встречаются только один раз.

14.  Сформируйте новую строку, в которой все слова старой строки будут идти в порядке увеличения длины.

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

16.  Найти в строке самую длинную последовательность пробелов и заменить ее точками.

17.  Записать в строке в справа налево те слова, в которых первый и последний символы совпадают.

18.  Переверните каждое число, которое встретится в строке. Числа только целые.

19.  Определите, чего в строке больше: отдельных предложений или слов в самом большом предложении. Самое большое предложение определяется по количеству отдельных слов, а не символов.

20.  Измените строку, заключив каждое число в ней в кавычки.

Содержание отчета

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

Тексты заданий (по вариантам);

Тексты программ с комментариями;

Протоколы работы программ;

Выводы по работе.

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

1.  Как в языке Turbo C++ можно объявить строку?

2.  Как строки хранятся в памяти?

3.  Какие есть способы ввода и вывода символьных данных?

4.  Какие функции для обработки строк вы знаете?

5.  Как преобразовать число в строку?

6.  Как преобразовать строку в число?

7.  Как найти в тексте словосочетание и заменить его другим?

8.  Как определить количество слов в тексте?

9.  Какой может быть максимальная длина строки?

10.  Как добавить один символ в конец строки?

11.  Как обеспечить безопасность данных при работе со строками?

Литература

25.  . С/С++. Программирование на языке высокого уровня. – СПб.: Питер, 2002. – 464с.

26.  , . С/С++. Структурное программирование: практикум. – СПб.: Питер, 2002. – 240с.

27.  Митницкий теории алгоритмов и язык программирования С. Учебное пособие. –М.: МФТИ, 2001. – 180с.

28.  и др. Информатика. М.: Изд. центр “Академия”, 2000. – 816 с.

29.  Толковый словарь стандарта языка Си. СПб.: Питер, 1994.

30.  Подбельский С++: Учебное пособие. – М.: Финансы и статистика, 2002 – 560с.

31.  , Фомин на языке Си. – М.: Финансы и статистика, 2002 – 600с.

32.  Информатика. Базовый курс. / и др. – СПб.: Питер, 2000. – 640с.

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

Модульное программирование

Цели работы:

Научиться разрабатывать программы с использованием функций пользователя;

Научиться оформлять программы в виде отдельных взаимосвязанных функционально законченных блоков;

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

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

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

При создании средних по размеру приложений (несколько тысяч строк исходного кода) используется структурное программирование, идея которого заключается в том, что структура программы должна отражать структуру решаемой задачи, чтобы алгоритм решения был ясно виден из исходного текста. Для этого надо иметь средства для создания программы не только с помощью трех простых операторов, но и с помощью средств, более точно отражающих конкретную структуру алгоритма. С этой целью в программирование введено понятие подпрограммы - набора операторов, выполняющих нужное действие и независящих от других частей исходного кода. Программа разбивается на множество мелких подпрограмм (занимающих до 50 операторов - критический порог для быстрого понимания цели подпрограммы), каждая из которых выполняет одно из действий, предусмотренных исходным заданием. Комбинируя эти подпрограммы, удается формировать итоговый алгоритм уже не из простых операторов, а из законченных блоков кода, имеющих определенную смысловую нагрузку, причем обращаться к таким блокам можно по названиям. Получается что подпрограммы – это новые операторы или операции языка, определяемые программистом.

Возможность применения подпрограмм относит язык программирования к классу процедурных языков. В языке С++ роль подпрограмм выполняют функции.

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

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

Немаловажно, что небольшие подпрограммы значительно проще отлаживать, что существенно повышает общую надежность всей программы.

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

Особенности подпрограмм в языке Си

Программа на языке Си состоит из функций. Все функции находятся на одном уровне, то есть нет функций, описываемых внутри других функций, как в языке Паскаль. Но из любой функции могут вызываться другие функции, в том числе функция может вызывать сама себя (рекурсивная). Одни функции предназначены для выполнения действий (в языке Паскаль они называются процедурами), другие – для возврата результата, а некоторые выполняют и то и другое. В языке Си понятия «процедура» нет, да и термин «подпрограмма» практически не применяется.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10