Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Static double product (double param1, double param2)




Работа с символьными строками

 

Методические указания

к лабораторной работе № 1 по дисциплине

«Информационные технологии»

для студентов специальности УТС ЗФ

 

 

Тверь, 2016



Цель работы

Приобретение и закрепление знаний о представлении данных типа строка символов и о стандартных функциях, определенных для типов char и string.

Теоретический материал

Работа с текстовыми строками

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

В языках С и C++ стандартные функции, обрабатывающие символы и строки, являются частью библиотеки транслятора. Фактически они уже стали частью этих языков и потому описываются во всех учебниках, посвященных С и C++.

Что же касается языка программирования С#, то для представления текстовых строк в библиотеке классов Microsoft .NET Framework имеется класс System.String. Вместе с набором операций, методов и индексаторов этот класс представляет собой мощное средство обработки строк.

Прежде чем приступить к изучению способов работы с текстовыми строками в С#, уточним, чем строки С# отличаются от строк, с которыми имеют дело программисты С и C++. Прежде всего, программы, составленные а языках С и C++, имеют непосредственный доступ к представлению текстовых строк, хранящихся в оперативной памяти компьютера. Такие программы могут, например, перезаписывать или изменять содержимое строк по месту их расположения.

Что же касается программ С#, то все операции с текстовыми строками выполняются только при помощи методов, предусмотренных в соответствующих классах библиотеки Microsoft .NET Framework.

Далее, программы С и C++ могут работать с различными представлениями текстовых строк, такими, как, например ASCII и UNICODE. В зависимости от представления (или, как еще говорят, кодировки) для хранения каждого символа строки может использоваться 1, 2 или несколько байт памяти. В языке С# текстовые строки представлены только в кодировке UNICODE, предполагающей представление одного текстового символа 2 байтами памяти.

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

string s = "abcdefghij";

Мы можем получить доступ к каждому символу строки и напечатать его с помощью такого цикла:

for(int i = 0; i < s.Length; i++)

{

Console.WriteLine("Element {0} = {1}", i, s[i]);

}

Этот цикл выводит 10 строк текста вроде следующих:

Element 0 = а

Element 1 = b

. . .

Element 9 = j

Однако строки не считаются массивами и присваивание

s[3] = 'х'; //Неверная попытка заменить букву d на букву х

 

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

Базовые операции со строками

Строки символов описываются, инициализируются и присваиваются друг другу подобно другим типам данных C#:

String svarl;             //Объявляем строковую переменную

string svar2 = "строка"; //Объявляем и инициализируем строку

svarl = svar2;            //Присваиваем значение строке

svarl = "строка";         //Присваиваем значение строке

svarl = svar2 + "строка"; //Сцепляем две строки

int len = svarl.Length;   //Получаем длину строки

Строковая переменная, если при ее описании не задается начальное значение, инициализируется специальным значением null (т. е. отсутствие значения). Это совсем не то же самое, что нулевая, или пустая строка. Приведенные ниже строки С# приведут к ошибке времени выполнения:

String si; //Создается строка со значением null

si += "abc"; //Неверно, выполнено не будет!!

Это произойдет потому, что левый операнд в операции сцепления строк не имеет значения. Если, однако, переписать строки следующим образом:

string s2 = "";

s2 += "abc";

то они будут успешно выполнены, и переменная s2 получит в итоге значение "abc".

Функции

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

using System;

Namespace Function1

{

class Program

{

   static void Write()

   {

       Console.WriteLine("Этот текст выведен функцией.");

   }

   static void Main(string[] args)

   {

       Write();

       Console.ReadLine();

   }

}

}

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

В данном случае описание функции состоит из:

· Двух ключевых слов: static и void;

· Имени функции, за которым располагаются параметры: Write();

· Участка выполняемого кода, заключенного в фигурные скобки.

Начало описания функции Write() выглядит почти так же, как и начало главной функции приложения:

static void Main(string[] args)

Это объясняется тем, что весь код, который мы создавали до сих пор, представляет собой тоже часть функции. Эта единственная функция нашего приложения называлась Main(), и от других функций она отличается тем, что определяет точку входа в консольное приложение. Когда запускается приложение, написанное на С#, то происходит вызов содержащейся в нем функции точки входа, а когда эта функция заканчивает свою работу, выполнение приложения завершается. Любой выполняемый код, написанный на С#, должен иметь точку входа.

Еще одно различие между функцией Main() и функцией Write() (не считая тех строк кода, которые в них содержатся) заключается в том, что в круглых скобках, расположенных за именем функции Main, находится некоторый код. Этот код служит для задания параметров данной функции; к более подробному его обсуждению мы вернемся несколько позже.

Как уже отмечено, обе функции — и Main(), и Write() — описываются с использованием ключевых слов static (статический) и void (отсутствующий).

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

Ключевое слово void, напротив, объяснить очень просто. Оно указывает, что функция не возвращает никакого значения. Далее в данном разделе рассматривается, что необходимо писать в тех случаях, когда у функции имеется возвращаемое значение.

Продолжая рассматривать приложение, мы обнаруживаем код, который осуществляет вызов функции:

Write();

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

Возвращаемые значения

Самый простой способ обмена данными с функциями — использование возвращаемого значения. Функции, которые имеют возвращаемые значения, могут быть использованы в арифметических выражениях, как и любые переменные. Аналогично переменным возвращаемые значения обладают типом.

Например, можно описать функцию с именем getString(), возвращаемое значение которой будет иметь тип string, и использовать ее в своей программе:

string myString;

myString = getString();

Аналогично можно описать функцию с именем getVal(), которая будет возвращать значение типа double, и использовать ее в математическом выражении:

double myVal;

double multiplier = 5.3;

myVal = getVal() * multiplier;

Если функция должна обладать возвращаемым значением, то необходимо внести два изменения:

· В описании функции вместо ключевого слова void указать тип возвращаемого значения.

· По завершении всех вычислений в функции использовать ключевое слово return и передать возвращаемое значение вызывающей функции.

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

static <возвращаемыйТип> <имяФункции>()

{

. . .

return <возвращаемоеЗначение>;    

}

Единственным ограничением в данном случае является требование, гласящее, что <возвращаемоеЗначение> должно иметь тип <возвраща­емыйТип> или же должна существовать возможность его неявного преобразования в этот тип. Вообще говоря, <возвращаемыйТип> может быть любым, включая самые сложные типы данных.

В простейшем случае это может выглядеть следующим образом:

Static double getVal()

{

return 3.2;

}

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

Когда при выполнении программы достигается оператор return, управление немедленно передается обратно в вызывающий код. Никакие строки кода после этого оператора выполняться не будут. Отсюда, однако, совершенно не следует, что в теле функции оператор return обязательно должен быть последним. Он может быть использован и раньше, например, при ветвлении по какому-либо условию. Включение оператора return в цикл for, в блок if или в какую-нибудь другую структуру приведет к немедленному окончанию выполнения как этой структуры, так и всей функции в целом. Например:

Static double getVal()

{

double checkVal;

// присваивание переменной checkVal некоторого значения,

// полученного в результате некоторых вычислений.

if (checkVal < 5)

return 4.7;

return 3.2;

}

 

В данном случае будет возвращено одно из двух значений — в зависимости от значения переменной checkVal.

Имеется единственное ограничение: оператор return должен выполняться до того, как будет достигнута закрывающая фигурная скобка } данной функции. Следующий код является недопустимым:

Static double getVal()

{

double checkVal;

// присваивание переменной checkVal значения,

// полученного в результате некоторых вычислений.

if (checkVal < 5)

return 4.7;

}

Если checkVal >= 5, то не встретится ни одного оператора return, а это запрещено. Все ветви должны оканчиваться этим оператором.

И последнее замечание: оператор return может применяться в функциях, объявленных с использованием ключевого слова void (у них отсутствует какое-либо возвращаемое значение). В таких случаях функция просто прекращает работу. Поэтому при использовании оператора return будет ошибкой размещать возвращаемое значение между ключевым словом return и следующей за ним точкой с запятой.

Передача параметров

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

Если функция должна получать параметры, то необходимо задать:

· Список принимаемых функцией параметров в ее описании, а также тип каждого параметра;

· Совпадающий по количеству значений список параметров при каждом вызове функции.

Это предполагает использование следующего кода:

static <возвращаемыйТип> <имяФункции>{<типПараметра> <имяПараметра>, . . . )

{

...

return <возвращаемоеЗначение>;

}

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

Например, следующая простая функция принимает два параметра типа double и возвращает их произведение:

static double product (double param1, double param2)

{

return param1 * param2;

}

Следующая функция принимает в качестве параметра массив целых чисел и возвращает наибольшее из них. Ее описание имеет следующий вид:

static int maxValue(int[] intArray)

{

int maxVal = intArray[0];

for (int i = 1; i < intArray.Length; i++)

{

if (intArray[i] > maxVal)

maxVal = intArray[i];

}

return maxVal;

}

Данная функция — maxValue() —имеет один параметр, который описан как массив типа int с именем intArray. Возвращаемое значение также имеет тип int.

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

Код, расположенный в Main(), объявляет и инициализирует простой целый массив, который будет использоваться совместно с функцией maxValue():

int[] myArray = {1, 8, 3, 6, 2, 5, 9, 3, 0, 2};

При вызове функции maxValue() значение присваивается переменной maxVal типа int:

int maxVal = maxValue(myArray);

Полученное значение можно вывести на экран с помощью Console.WriteLine() или использовать каким-либо иным способом:

Console.WriteLine("Максимум в массиве myArray равен {0}", maxVal);

Вся программа будет иметь вид:

using System;

Namespace Function2

{

class Program

{

   static void Main(string[] args)

   {

       int[] myArray = { -1, 8, 3, 6, 2, 5, -9, 3, 0, 2 };

       int maxVal = maxValue(myArray);

       Console.WriteLine("Максимум в массиве myArray равен {0}",

                          maxVal);

       Console.ReadLine();

   }

   static int maxValue(int[] intArray)

   {

       int maxVal = intArray[0];

       for (int i = 1; i < intArray.Length; i++)

       {

           if (intArray[i] > maxVal)

               maxVal = intArray[i];

       }

       return maxVal;

   }

}

}

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

Указания к работе

Разработать функцию, выполняющую заданную операцию над данными типа string языка C#. Предусмотреть и описать реакцию на некорректное задание параметров.

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

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

N п/п Имя процедуры/функции Уровень сложности Назначение
1 Copy(s,n) 14 Копирование строки s в новую строкуn раз
2 Words(s) 14 подсчет числа слов в строке s
3 SymCount(s, с) 14 определить количество заданных символов cв строке s
4 PairCount(s, с) 14 определить количество пар рядом расположенных символов cв строке s
5 FirstLetter(s, c) 14 Подсчет количества слов в строке, начинающихся на заданную букву
6 WordsCount(s, n) 14 Подсчет количества слов в строке, состоящих из n символов
7 SameCount(s, n) 14 Подсчет количества слов в строке, начинающихся и заканчивающихся на одну и ту же букву
8 IsSameLength(s) 14 Проверка, имеют ли все слова в строке одинаковую длину
9 IsSortedLen(s) 14 Проверка, все ли слова в строке упорядочены по возрастанию их длины
10 IsSortedABC(s) 14 Проверка, упорядочены ли слова в строке по алфавиту
    X2  
11 Left(s,m,c) 14 x2 выравнивание строки sслева до длины m, добавляя заданный символ с
12 Right(s,m,c) 14 x2 выравнивание строки s справа до длиныm, добавляя заданный символ с
13 LastPos(s,s1) 14 x2 поиск позиции последнего вхождения подстроки s1 в строку s
14 WordLength(s,n) 14 x2 определение длины слова с номеромn
15 StrLWord(s,k) 14 x2 определить количество слов длиной больше, чем длина слова с номером кв строке s
16 AddLetterLen(s, c, k) 14 x2 Добавить к каждому слову строки слева символ с, если это слово короче к символов, и справа – если длиннее
17 OddLenWords(s) 14 x2 Составить новую строку из слов четной длины исходной строки
18 EvenWords(s) 14 x2 Составить новую строку из слов исходной строки с нечетными номерами
19 SwapWords(s) 14 x2 Поменять местами первое и последнее слово в строке
20 LengthWords(s) 14 x2 Вернуть строку, содержащую длины всех слов исходной строки, разделенные одним пробелом

 

ПРИМЕЧАНИЕ: Везде под словом понимается последовательность символов, ограниченная пробелами или началом/концом строки. Несколько следующих подряд пробелов между словами интерпретируются как один пробел.

Оформление отчета

В отчет включить:

· Тема и цель работы;

· Задание на выполнение;

· Алгоритм программы в виде псевдокода;

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

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

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

1. Требования по каждому критерию оценки:

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

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

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

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

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

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

1.7. Основными конструкциями, используемыми в данной программе, являются циклы for. Использование других видов циклов (while и do-while) не исключается, но должно иметь четкое обоснование. Принципиально важным в большинстве вариантов задания является порядок записи в программе и правильная вложенность циклов. При необходимости использования операторов управления циклами break и continue делайте это корректно.


 

Приложение: Оформление титульного листа

 

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

Тверской государственный технический университет

Кафедра автоматизации технологических процессов

 

Отчет к лабораторной работе № 1

по дисциплине «Информационные технологии»

Работа с символьными строками

 

Выполнил:

(Номер группы)

(Фамилия И.О.)

 

Принял:

 

Тверь, 2017










Последнее изменение этой страницы: 2018-04-12; просмотров: 151.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...